@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 +29 -55
- package/dist/index.js +103 -45
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import
|
|
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
|
|
47
|
-
|
|
48
|
-
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
161
|
-
|
|
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(
|
|
164
|
-
|
|
220
|
+
function createI18n(languages, localeStorageKey = DEFAULT_LOCALE_STORAGE_KEY) {
|
|
221
|
+
ensureContext();
|
|
165
222
|
const localeCodes = getLocaleCodes(languages);
|
|
166
|
-
const
|
|
167
|
-
|
|
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 =
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
214
|
-
|
|
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.
|
|
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.
|
|
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"
|