@sveltebase/i18n 0.1.0 → 0.1.1

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/dist/index.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- import * as use_intl_core from 'use-intl/core';
2
- import { State, PersistentState } from '@svelte-essentials/state';
3
- import { z } from 'zod';
1
+ import { AppConfig } from 'use-intl/core';
4
2
 
5
3
  type MessageValue = string | {
6
4
  [key: string]: MessageValue;
@@ -17,58 +15,34 @@ type FormatOptions = {
17
15
  preset?: "default" | "custom" | "birthday" | "month" | "timestring" | "full";
18
16
  withTime?: boolean;
19
17
  };
20
- declare function getLanguage<const TLanguages extends readonly LanguageDefinition[]>(languages: TLanguages, locale: TLanguages[number]["code"], fallbackLocale?: TLanguages[number]["code"]): LanguageDefinition<string, Messages>;
21
- declare function createLocaleTranslator<const TLanguages extends readonly LanguageDefinition[]>(languages: TLanguages, locale: TLanguages[number]["code"], fallbackLocale?: TLanguages[number]["code"]): use_intl_core._Translator<Messages, never>;
22
- declare function createLocaleFormatter<TLocale extends string>(locale: TLocale, timeZone?: string): {
23
- dateTime: {
24
- (value: Date | number, options?: use_intl_core.DateTimeFormatOptions): string;
25
- (value: Date | number, format?: string, options?: use_intl_core.DateTimeFormatOptions): string;
26
- };
27
- number: {
28
- (value: number | bigint, options?: use_intl_core.NumberFormatOptions): string;
29
- (value: number | bigint, format?: string, options?: use_intl_core.NumberFormatOptions): string;
30
- };
31
- relativeTime: {
32
- (date: number | Date, now?: use_intl_core.RelativeTimeFormatOptions["now"]): string;
33
- (date: number | Date, options?: use_intl_core.RelativeTimeFormatOptions): string;
34
- };
35
- list: {
36
- <Value extends string | ReactElement<unknown, any>>(value: Iterable<Value>, options?: Intl.ListFormatOptions): Value extends string ? string : Iterable<ReactElement>;
37
- <Value extends string | ReactElement<unknown, any>>(value: Iterable<Value>, format?: string, options?: Intl.ListFormatOptions): Value extends string ? string : Iterable<ReactElement>;
38
- };
39
- dateTimeRange: {
40
- (start: Date | number, end: Date | number, options?: use_intl_core.DateTimeFormatOptions): string;
41
- (start: Date | number, end: Date | number, format?: string, options?: use_intl_core.DateTimeFormatOptions): string;
42
- };
43
- };
44
- declare function createFormatForLocale<const TLanguages extends readonly LanguageDefinition[]>(languages: TLanguages, locale: TLanguages[number]["code"], fallbackLocale?: TLanguages[number]["code"], timeZone?: string): (value?: Date | number | string, options?: FormatOptions) => string | undefined;
45
18
 
46
- type LocaleSchema<TLocale extends string> = z.ZodType<TLocale>;
47
- type LocaleState<TLocale extends string> = State<TLocale> | PersistentState<LocaleSchema<TLocale>>;
48
- interface CreateI18nOptions<TLanguages extends readonly LanguageDefinition[], TFormat> {
49
- languages: TLanguages;
50
- fallbackLocale: TLanguages[number]["code"];
51
- signatureLocale?: TLanguages[number]["code"];
52
- storageKey?: string;
53
- timeZone?: string;
54
- createFormat(args: {
55
- locale: TLanguages[number]["code"];
56
- fallbackLocale: TLanguages[number]["code"];
57
- signatureLocale?: TLanguages[number]["code"];
58
- languages: TLanguages;
59
- timeZone?: string;
60
- }): TFormat;
61
- }
62
- declare function defineLanguages<const TLanguages extends readonly LanguageDefinition[]>(languages: TLanguages): TLanguages;
63
- declare function createI18n<const TLanguages extends readonly LanguageDefinition[], TFormat>(options: CreateI18nOptions<TLanguages, TFormat>): {
64
- languages: TLanguages;
65
- fallbackLocale: TLanguages[number]["code"];
66
- signatureLocale: TLanguages[number]["code"] | undefined;
67
- localeState: LocaleState<TLanguages[number]["code"]>;
68
- setLocale: (locale: TLanguages[number]["code"]) => void;
69
- getTranslations: (locale?: TLanguages[number]["code"]) => use_intl_core._Translator<Messages, never>;
70
- getFormat: (locale?: TLanguages[number]["code"]) => TFormat;
71
- getLanguage: (locale?: TLanguages[number]["code"]) => LanguageDefinition<string, Messages>;
19
+ type Cookie = {
20
+ name: string;
21
+ value: string;
72
22
  };
23
+ type LocaleCode<TLanguages extends readonly LanguageDefinition[]> = TLanguages[number]["code"];
24
+ type CurrentLanguage<TLanguages extends readonly LanguageDefinition[]> = TLanguages[number];
25
+ type TranslationValues = Record<string, string | number | Date>;
26
+ type Join<TKey extends string, TValue extends string> = `${TKey}.${TValue}`;
27
+ type MessageKeys<TMessages> = TMessages extends string ? never : {
28
+ [TKey in Extract<keyof TMessages, string>]: TMessages[TKey] extends string ? TKey : TMessages[TKey] extends Record<string, unknown> ? Join<TKey, MessageKeys<TMessages[TKey]>> : never;
29
+ }[Extract<keyof TMessages, string>];
30
+ type AppConfigMessages = AppConfig extends {
31
+ Messages: infer TMessages;
32
+ } ? TMessages : never;
33
+ type RegisteredMessages = AppConfigMessages;
34
+ type MessageKey = Extract<MessageKeys<RegisteredMessages>, string> extends never ? string : Extract<MessageKeys<RegisteredMessages>, string>;
35
+ type Translate = <TKey extends MessageKey>(key: TKey, values?: TranslationValues) => string;
36
+ type Format = (value?: Date | number | string, options?: FormatOptions) => string | undefined;
37
+ interface I18nInstance<TLanguages extends readonly LanguageDefinition[]> {
38
+ readonly languages: TLanguages;
39
+ locale: LocaleCode<TLanguages>;
40
+ readonly currentLanguage: CurrentLanguage<TLanguages>;
41
+ init(cookies?: Cookie[]): void;
42
+ }
43
+ declare function getTranslations(): Translate;
44
+ declare function getFormat(): Format;
45
+ declare function createI18n<const TLanguages extends readonly LanguageDefinition[]>(languages: TLanguages, localeStorageKey?: string): I18nInstance<TLanguages>;
46
+ type CreateI18nReturn<TLanguages extends readonly LanguageDefinition[]> = I18nInstance<TLanguages>;
73
47
 
74
- export { type FormatOptions, type LanguageDefinition, type MessageValue, type Messages, createFormatForLocale, createI18n, createLocaleFormatter, createLocaleTranslator, defineLanguages, getLanguage };
48
+ export { type CreateI18nReturn, type CurrentLanguage, type Format, type FormatOptions, type I18nInstance, type LanguageDefinition, type LocaleCode, type MessageKey, type MessageValue, type Messages, type RegisteredMessages, type Translate, type TranslationValues, createI18n, getFormat, getTranslations };
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  // src/create-i18n.ts
2
- import { PersistentState, State } from "@svelte-essentials/state";
2
+ import { createContext } from "svelte";
3
+ import { PersistentState } from "@sveltebase/state";
3
4
  import { z } from "zod";
4
5
 
5
6
  // src/utils.ts
@@ -36,9 +37,6 @@ var UZ_MONTHS = [
36
37
  "Noyabr",
37
38
  "Dekabr"
38
39
  ];
39
- function getLocaleCodes(languages) {
40
- return languages.map((language) => language.code);
41
- }
42
40
  function getLanguage(languages, locale, fallbackLocale) {
43
41
  return languages.find((language) => language.code === locale) ?? (fallbackLocale ? languages.find((language) => language.code === fallbackLocale) : void 0) ?? languages[0];
44
42
  }
@@ -157,14 +155,74 @@ function createFormatForLocale(languages, locale, fallbackLocale, timeZone = "As
157
155
  }
158
156
 
159
157
  // src/create-i18n.ts
160
- function defineLanguages(languages) {
161
- return languages;
158
+ var DEFAULT_LOCALE_STORAGE_KEY = "locale";
159
+ var i18nInternals = /* @__PURE__ */ new WeakMap();
160
+ var getI18nContextBase = null;
161
+ var setI18nContextBase = null;
162
+ function ensureContext() {
163
+ if (!getI18nContextBase || !setI18nContextBase) {
164
+ [getI18nContextBase, setI18nContextBase] = createContext();
165
+ }
166
+ return {
167
+ get: getI18nContextBase,
168
+ set: setI18nContextBase
169
+ };
170
+ }
171
+ function getLocaleCodes(languages) {
172
+ return languages.map((language) => language.code);
173
+ }
174
+ function getDefaultLocale(languages) {
175
+ const [defaultLocale] = getLocaleCodes(languages);
176
+ if (!defaultLocale) {
177
+ throw new Error("[i18n] createI18n requires at least one language.");
178
+ }
179
+ return defaultLocale;
180
+ }
181
+ function getI18nInternal(i18n) {
182
+ const internal = i18nInternals.get(i18n);
183
+ if (!internal) {
184
+ throw new Error("[i18n] Internal i18n state was not found for this instance.");
185
+ }
186
+ return {
187
+ languages: internal.languages,
188
+ fallbackLocale: internal.fallbackLocale,
189
+ localeState: internal.localeState
190
+ };
191
+ }
192
+ function getI18nFromContext() {
193
+ const { get } = ensureContext();
194
+ return get();
195
+ }
196
+ function getTranslations() {
197
+ return ((key, values) => {
198
+ const i18n = getI18nFromContext();
199
+ const { languages, fallbackLocale } = getI18nInternal(i18n);
200
+ const translate = createLocaleTranslator(
201
+ languages,
202
+ i18n.locale,
203
+ fallbackLocale
204
+ );
205
+ return translate(key, values);
206
+ });
207
+ }
208
+ function getFormat() {
209
+ return (value, options) => {
210
+ const i18n = getI18nFromContext();
211
+ const { languages, fallbackLocale } = getI18nInternal(i18n);
212
+ const format = createFormatForLocale(
213
+ languages,
214
+ i18n.locale,
215
+ fallbackLocale
216
+ );
217
+ return format(value, options);
218
+ };
162
219
  }
163
- function createI18n(options) {
164
- const { languages, fallbackLocale, signatureLocale, storageKey, timeZone, createFormat } = options;
220
+ function createI18n(languages, localeStorageKey = DEFAULT_LOCALE_STORAGE_KEY) {
221
+ ensureContext();
165
222
  const localeCodes = getLocaleCodes(languages);
166
- const localeSchema = z.string().transform((value, context) => {
167
- const nextLocale = value || fallbackLocale;
223
+ const fallbackLocale = getDefaultLocale(languages);
224
+ const localeSchema = z.string().optional().transform((value, context) => {
225
+ const nextLocale = value ?? fallbackLocale;
168
226
  if (localeCodes.includes(nextLocale)) {
169
227
  return nextLocale;
170
228
  }
@@ -174,44 +232,44 @@ function createI18n(options) {
174
232
  });
175
233
  return z.NEVER;
176
234
  });
177
- const localeState = storageKey ? new PersistentState(storageKey, localeSchema) : new State(fallbackLocale);
178
- function getLocale(locale) {
179
- return locale ?? localeState.current;
180
- }
181
- function setLocale(locale) {
182
- localeState.current = localeSchema.parse(locale);
183
- }
184
- function getTranslations(locale) {
185
- return createLocaleTranslator(languages, getLocale(locale), fallbackLocale);
186
- }
187
- function getFormat(locale) {
188
- return createFormat({
189
- locale: getLocale(locale),
190
- fallbackLocale,
191
- signatureLocale,
192
- languages,
193
- timeZone
194
- });
195
- }
196
- function getCurrentLanguage(locale) {
197
- return getLanguage(languages, getLocale(locale), fallbackLocale);
198
- }
199
- return {
235
+ const localeState = new PersistentState(
236
+ localeStorageKey,
237
+ localeSchema
238
+ );
239
+ const i18n = {
240
+ get languages() {
241
+ return languages;
242
+ },
243
+ get locale() {
244
+ return localeState.current;
245
+ },
246
+ set locale(nextLocale) {
247
+ localeState.current = localeSchema.parse(nextLocale);
248
+ },
249
+ get currentLanguage() {
250
+ return getLanguage(
251
+ languages,
252
+ localeState.current,
253
+ fallbackLocale
254
+ );
255
+ },
256
+ init(cookies) {
257
+ if (cookies) {
258
+ localeState.init(cookies);
259
+ }
260
+ const { set } = ensureContext();
261
+ set(i18n);
262
+ }
263
+ };
264
+ i18nInternals.set(i18n, {
200
265
  languages,
201
266
  fallbackLocale,
202
- signatureLocale,
203
- localeState,
204
- setLocale,
205
- getTranslations,
206
- getFormat,
207
- getLanguage: getCurrentLanguage
208
- };
267
+ localeState
268
+ });
269
+ return i18n;
209
270
  }
210
271
  export {
211
- createFormatForLocale,
212
272
  createI18n,
213
- createLocaleFormatter,
214
- createLocaleTranslator,
215
- defineLanguages,
216
- getLanguage
273
+ getFormat,
274
+ getTranslations
217
275
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltebase/i18n",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -18,7 +18,7 @@
18
18
  }
19
19
  },
20
20
  "dependencies": {
21
- "@sveltebase/state": "0.1.0",
21
+ "@sveltebase/state": "0.1.1",
22
22
  "date-fns": "^4.1.0",
23
23
  "use-intl": "^4.4.0",
24
24
  "zod": "^4.1.11"