@revojs/translate 0.1.56 → 0.2.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/dist/index.d.ts CHANGED
@@ -1,7 +1,14 @@
1
- import { App, Module } from "revojs";
2
-
3
- //#region src/index.d.ts
4
- declare function addLocales(app: App, path: string): void;
5
- declare function translate(): Module;
6
- //#endregion
7
- export { addLocales, translate };
1
+ import { type Scope, type Source, type SourceScope, type SourceTypeProperty } from "revojs";
2
+ export type RouteKey<TSource extends Source<Locale>, TScope extends SourceScope<TSource>> = Extract<keyof NonNullable<SourceTypeProperty<TSource, TScope, "routes">>, string>;
3
+ export type MessageKey<TSource extends Source<Locale>, TScope extends SourceScope<TSource>> = Extract<keyof NonNullable<SourceTypeProperty<TSource, TScope, "messages">>, string>;
4
+ export interface Locale {
5
+ routes?: Record<string, string>;
6
+ messages?: Record<string, string>;
7
+ }
8
+ export declare function useTranslate<TSource extends Source<Locale> = typeof import("#locales").default, TScope extends SourceScope<TSource> = SourceScope<TSource>>(scope: Scope, scopeName: TScope): Promise<{
9
+ language: string;
10
+ resolveLocale: (target: string) => Promise<void>;
11
+ route: <TRoute extends RouteKey<TSource, TScope>>(route: TRoute | Array<string>) => string;
12
+ translate: <TMessage extends MessageKey<TSource, TScope>>(message: TMessage) => string;
13
+ }>;
14
+ export declare function defineLocale<T extends Locale>(locale: T): T;
package/dist/index.js CHANGED
@@ -1,14 +1,53 @@
1
+ import locales from "#locales";
2
+ import options from "#config/translate";
3
+ import { useHeaders, useParameters, useQuery } from "@revojs/server";
4
+ import { Router, fillSegments, toSegments } from "revojs";
1
5
  //#region src/index.ts
2
- function addLocales(app, path) {
3
- app.config.sources.locales?.entries.push(path);
6
+ async function useTranslate(scope, scopeName) {
7
+ let language = options.defaultLocale;
8
+ for (const detect of options.detect) {
9
+ let detection;
10
+ if (detect.type === "query") detection = useQuery(scope)[detect.name];
11
+ if (detect.type === "parameter") detection = useParameters(scope)[detect.name];
12
+ if (detect.type === "header") detection = useHeaders(scope)[detect.name];
13
+ if (detection) {
14
+ language = detection;
15
+ break;
16
+ }
17
+ }
18
+ let locale;
19
+ let router;
20
+ const languages = new Set(Object.keys(locales[scopeName] ?? {}));
21
+ const resolveLocale = async (target) => {
22
+ language = target;
23
+ locale = await locales[scopeName]?.[target]?.();
24
+ router = new Router();
25
+ for (const [from, to] of Object.entries(locale?.routes ?? {})) {
26
+ const translation = toSegments(to);
27
+ if (target !== options.defaultLocale) translation.unshift(target);
28
+ router.use(toSegments(from), translation);
29
+ }
30
+ };
31
+ const route = (route) => {
32
+ const segments = toSegments(Array.isArray(route) ? route.join("/") : route);
33
+ if (languages.has(segments.at(0) ?? "")) segments.shift();
34
+ const context = router.match(segments);
35
+ if (context.match) return "/" + fillSegments(context.match, context.parameters).join("/");
36
+ return "/" + (language === options.defaultLocale ? segments : [language, ...segments]).join("/");
37
+ };
38
+ const translate = (message) => {
39
+ return locale?.messages?.[message] ?? message;
40
+ };
41
+ await resolveLocale(language);
42
+ return {
43
+ language,
44
+ resolveLocale,
45
+ route,
46
+ translate
47
+ };
4
48
  }
5
- function translate() {
6
- return { setup() {
7
- return { sources: { locales: {
8
- match: ["**/*.json"],
9
- entries: ["./locales"]
10
- } } };
11
- } };
49
+ function defineLocale(locale) {
50
+ return locale;
12
51
  }
13
52
  //#endregion
14
- export { addLocales, translate };
53
+ export { defineLocale, useTranslate };
@@ -0,0 +1,11 @@
1
+ export type DetectType = "query" | "parameter" | "header";
2
+ export interface Detect {
3
+ type: DetectType;
4
+ name: string;
5
+ }
6
+ export interface TranslateConfig {
7
+ defaultLocale: string;
8
+ detect: Array<Detect>;
9
+ }
10
+ declare const _default: import("revojs/module").Module<"translate", TranslateConfig, []>;
11
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import { defineModule, useModule } from "revojs/module";
2
+ //#region src/module/index.ts
3
+ var module_default = defineModule({
4
+ name: "translate",
5
+ config: () => ({
6
+ defaultLocale: "en",
7
+ detect: []
8
+ }),
9
+ setup() {
10
+ const { fromModule } = useModule(import.meta.url);
11
+ return { sources: {
12
+ plugins: { from: [fromModule("../plugins")] },
13
+ locales: {
14
+ match: ["**/*.js", "**/*.ts"],
15
+ from: ["./locales"]
16
+ }
17
+ } };
18
+ }
19
+ });
20
+ //#endregion
21
+ export { module_default as default };
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ setup(scope: import("revojs").Scope): Promise<void>;
3
+ };
4
+ export default _default;
@@ -0,0 +1,29 @@
1
+ import locales from "#locales";
2
+ import options from "#config/translate";
3
+ import { ROUTE_RESOLVER_CONTEXT, Router, definePlugin, fillSegments, setContext, toSegments } from "revojs";
4
+ //#region src/plugins/index.ts
5
+ var plugins_default = definePlugin({ async setup(scope) {
6
+ const routers = /* @__PURE__ */ new Map();
7
+ const languages = new Set(Object.values(locales).flatMap((source) => Object.keys(source)));
8
+ const resolveRouter = async (language) => {
9
+ let router = routers.get(language);
10
+ if (router === void 0) {
11
+ router = new Router();
12
+ for (const name in locales) {
13
+ const locale = await locales[name]?.[language]?.();
14
+ for (const [route, translation] of Object.entries(locale?.routes ?? {})) router.use([language, ...toSegments(translation)], toSegments(route));
15
+ }
16
+ routers.set(language, router);
17
+ }
18
+ return router;
19
+ };
20
+ setContext(scope, ROUTE_RESOLVER_CONTEXT, async (segments) => {
21
+ const language = segments.at(0);
22
+ if (language === options.defaultLocale) return false;
23
+ if (language === void 0 || !languages.has(language)) return segments;
24
+ const context = (await resolveRouter(language)).match(segments);
25
+ return context.match ? [language, ...fillSegments(context.match, context.parameters)] : segments;
26
+ });
27
+ } });
28
+ //#endregion
29
+ export { plugins_default as default };
@@ -0,0 +1,14 @@
1
+ declare module "#locales" {
2
+ import type { Locale } from "@revojs/translate";
3
+ import type { Source } from "revojs";
4
+
5
+ const entries: Source<Locale>;
6
+ export default entries;
7
+ }
8
+
9
+ declare module "#config/translate" {
10
+ import type { TranslateConfig } from "@revojs/translate/module";
11
+
12
+ const config: TranslateConfig;
13
+ export default config;
14
+ }
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@revojs/translate",
3
- "version": "0.1.56",
3
+ "version": "0.2.0",
4
4
  "license": "MIT",
5
- "repository": "tellua/revojs",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/tellua/revojs.git"
8
+ },
6
9
  "files": [
7
10
  "dist",
8
11
  "src/types"
@@ -15,12 +18,18 @@
15
18
  ".": {
16
19
  "types": "./dist/index.d.ts",
17
20
  "import": "./dist/index.js"
21
+ },
22
+ "./module": {
23
+ "types": "./dist/module/index.d.ts",
24
+ "import": "./dist/module/index.js"
18
25
  }
19
26
  },
20
27
  "scripts": {
21
- "build": "revojs module build"
28
+ "build": "vite build",
29
+ "watch": "vite build --watch"
22
30
  },
23
31
  "dependencies": {
32
+ "@revojs/server": "*",
24
33
  "revojs": "*"
25
34
  },
26
35
  "devDependencies": {
@@ -0,0 +1,14 @@
1
+ declare module "#locales" {
2
+ import type { Locale } from "@revojs/translate";
3
+ import type { Source } from "revojs";
4
+
5
+ const entries: Source<Locale>;
6
+ export default entries;
7
+ }
8
+
9
+ declare module "#config/translate" {
10
+ import type { TranslateConfig } from "@revojs/translate/module";
11
+
12
+ const config: TranslateConfig;
13
+ export default config;
14
+ }
@@ -1,5 +0,0 @@
1
- declare module "#locales" {
2
- const entries: Record<string, Array<Record<string, string>>>;
3
-
4
- export default entries;
5
- }
@@ -1,5 +0,0 @@
1
- declare module "#locales" {
2
- const entries: Record<string, Array<Record<string, string>>>;
3
-
4
- export default entries;
5
- }