@konce-pt/i18n 0.12.0 → 0.15.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 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 — Angular component library" width="100%" />
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 — jedno źródło prawdy
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–10 z 42'
23
+ // '1-10 z 42'
24
24
 
25
25
  translate(KPT_MESSAGES_PL, 'nope.missing');
26
- // 'nope.missing' — brak klucza spada na EN, a potem na sam klucz
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 & {})` — otwarty kod języka |
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 → EN → klucz |
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 — wyliczają się z `Intl` dla aktywnego locale, więc
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 — kontrakt tłumaczeń i słowniki bazowe Koncept UI.
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…Nd). */
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ń…grudzień / January…December). */
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` — sterowane bieżącym locale i18n.
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 „Sun”, a styczeń
9
- * był podpisany „December”.
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…Nd). */
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ń…grudzień / January…December). */
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
+ }
@@ -1,4 +1,4 @@
1
- /** Kod języka. Otwarty string — EN/PL mają podpowiedzi, ale dozwolony dowolny. */
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. „W" w „W35". */
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 — nie ma przy nim widocznej etykiety. */
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 „dodaj lokalizację" poza wspólnymi komunikatami. */
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`) — nazwą zostaje jej wartość. */
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} — w to miejsce trafia `hintAction` pogrubione. Zwykły tekst, bez HTML:
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 („Kliknij”). */
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 — czeka na koniec. */
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–4). */
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 — czytnik mówi „karuzela” zamiast „region”. */
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 „+N”. Interpolacja: {count}. */
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 „Normalny" (select). */
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 „Własny…" przy pickerze koloru. */
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} — minimalna długość hasła. */
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} — nazwa dostawcy (etykieta przycisku). */
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 — zachęca do trybu przeciwnego niż bieżący. */
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} — pisze jedna osoba. */
550
+ /** Interpolacja: {name} - pisze jedna osoba. */
532
551
  typing: string;
533
- /** Interpolacja: {count} — piszą co najmniej dwie osoby. */
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} — wiadomości czekające na wysłanie. */
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} — autor cytowanej wiadomości. */
574
+ /** Interpolacja: {author} - autor cytowanej wiadomości. */
556
575
  replyTo: string;
557
576
  cancelReply: string;
558
577
  react: string;
559
- /** Etykiety wybieraka reakcji — kolejność jak w `KPT_CHAT_REACTIONS`. */
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} — plakietka nieprzeczytanych na docku. */
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 — to czysty TypeScript/JSON.
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}–{end} of {total}',
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} – {end}',
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}–{end} z {total}',
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 „{label}" jest wymagane',
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} – {end}',
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ń — czysty TypeScript, bez zależności od frameworka.
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 — dla nadpisań/częściowych słowników. */
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 — wspólna dla portu Angulara i Reacta. */
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'`…). `t()` przyjmuje go
23
- * z podpowiedziami w edytorze, ale nadal też dowolny napis — klucze składane dynamicznie i klucze
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.12.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.",
3
+ "version": "0.15.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/",