@geenius/i18n 0.1.0 → 0.3.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 +134 -1
- package/package.json +16 -3
- package/packages/convex/dist/index.d.ts +62 -0
- package/packages/convex/dist/index.js +157 -0
- package/packages/convex/dist/index.js.map +1 -0
- package/packages/react/README.md +1 -1
- package/packages/react/dist/index.d.ts +100 -0
- package/packages/react/dist/index.js +284 -0
- package/packages/react/dist/index.js.map +1 -0
- package/packages/react-css/README.md +1 -1
- package/packages/react-css/dist/index.d.ts +34 -0
- package/packages/react-css/dist/index.js +134 -0
- package/packages/react-css/dist/index.js.map +1 -0
- package/packages/shared/README.md +1 -1
- package/packages/shared/dist/index.d.ts +77 -0
- package/packages/shared/dist/index.js +158 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/solidjs/README.md +1 -1
- package/packages/solidjs/dist/index.d.ts +105 -0
- package/packages/solidjs/dist/index.js +328 -0
- package/packages/solidjs/dist/index.js.map +1 -0
- package/packages/solidjs-css/README.md +1 -1
- package/packages/solidjs-css/dist/index.d.ts +59 -0
- package/packages/solidjs-css/dist/index.js +244 -0
- package/packages/solidjs-css/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.nvmrc +0 -1
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -16
- package/CONTRIBUTING.md +0 -26
- package/SECURITY.md +0 -15
- package/SUPPORT.md +0 -8
- package/packages/convex/package.json +0 -42
- package/packages/convex/src/index.ts +0 -3
- package/packages/convex/src/mutations.ts +0 -65
- package/packages/convex/src/queries.ts +0 -54
- package/packages/convex/src/schema.ts +0 -26
- package/packages/convex/tsconfig.json +0 -18
- package/packages/convex/tsup.config.ts +0 -17
- package/packages/react/package.json +0 -51
- package/packages/react/src/components/index.tsx +0 -87
- package/packages/react/src/hooks/index.ts +0 -4
- package/packages/react/src/hooks/useI18n.tsx +0 -50
- package/packages/react/src/hooks/useI18nAdmin.ts +0 -12
- package/packages/react/src/hooks/useLocaleDetect.ts +0 -10
- package/packages/react/src/hooks/useTranslations.ts +0 -11
- package/packages/react/src/index.tsx +0 -8
- package/packages/react/src/pages/I18nAdminPage.tsx +0 -42
- package/packages/react/src/pages/LocalePreviewPage.tsx +0 -54
- package/packages/react/src/pages/index.ts +0 -2
- package/packages/react/tsconfig.json +0 -19
- package/packages/react/tsup.config.ts +0 -12
- package/packages/react-css/package.json +0 -36
- package/packages/react-css/src/components/index.tsx +0 -66
- package/packages/react-css/src/hooks/index.ts +0 -4
- package/packages/react-css/src/index.tsx +0 -4
- package/packages/react-css/src/pages/LocaleSettingsPage.tsx +0 -74
- package/packages/react-css/src/pages/TranslationsPage.tsx +0 -98
- package/packages/react-css/src/styles.css +0 -210
- package/packages/react-css/tsconfig.json +0 -19
- package/packages/react-css/tsup.config.ts +0 -10
- package/packages/shared/package.json +0 -44
- package/packages/shared/src/__tests__/i18n.test.ts +0 -78
- package/packages/shared/src/config.ts +0 -344
- package/packages/shared/src/index.ts +0 -106
- package/packages/shared/src/types.ts +0 -51
- package/packages/shared/tsconfig.json +0 -18
- package/packages/shared/tsup.config.ts +0 -11
- package/packages/shared/vitest.config.ts +0 -4
- package/packages/solidjs/package.json +0 -47
- package/packages/solidjs/src/components/LocaleCard.tsx +0 -44
- package/packages/solidjs/src/components/LocaleStatsCard.tsx +0 -35
- package/packages/solidjs/src/components/LocaleSwitcher.tsx +0 -65
- package/packages/solidjs/src/components/MissingKeyAlert.tsx +0 -21
- package/packages/solidjs/src/components/RTLWrapper.tsx +0 -13
- package/packages/solidjs/src/components/TranslationKeyRow.tsx +0 -41
- package/packages/solidjs/src/components/index.ts +0 -6
- package/packages/solidjs/src/index.tsx +0 -8
- package/packages/solidjs/src/pages/I18nAdminPage.tsx +0 -188
- package/packages/solidjs/src/pages/LocalePreviewPage.tsx +0 -99
- package/packages/solidjs/src/pages/index.ts +0 -2
- package/packages/solidjs/src/primitives/I18nProvider.tsx +0 -56
- package/packages/solidjs/src/primitives/createI18nAdmin.ts +0 -7
- package/packages/solidjs/src/primitives/createLocaleDetect.ts +0 -8
- package/packages/solidjs/src/primitives/createTranslations.ts +0 -22
- package/packages/solidjs/src/primitives/index.ts +0 -4
- package/packages/solidjs/tsconfig.json +0 -20
- package/packages/solidjs/tsup.config.ts +0 -12
- package/packages/solidjs-css/package.json +0 -33
- package/packages/solidjs-css/src/components/LocaleCard.tsx +0 -45
- package/packages/solidjs-css/src/components/LocaleStatsCard.tsx +0 -43
- package/packages/solidjs-css/src/components/LocaleSwitcher.tsx +0 -51
- package/packages/solidjs-css/src/components/MissingKeyAlert.tsx +0 -24
- package/packages/solidjs-css/src/components/RTLWrapper.tsx +0 -16
- package/packages/solidjs-css/src/components/TranslationKeyRow.tsx +0 -47
- package/packages/solidjs-css/src/components/index.ts +0 -6
- package/packages/solidjs-css/src/i18n.css +0 -1322
- package/packages/solidjs-css/src/index.tsx +0 -3
- package/packages/solidjs-css/src/pages/I18nAdminPage.tsx +0 -134
- package/packages/solidjs-css/src/pages/LocalePreviewPage.tsx +0 -116
- package/packages/solidjs-css/src/pages/index.ts +0 -2
- package/packages/solidjs-css/src/primitives/index.ts +0 -1
- package/packages/solidjs-css/tsconfig.json +0 -20
- package/packages/solidjs-css/tsup.config.bundled_dcjc4sct21j.mjs +0 -18
- package/packages/solidjs-css/tsup.config.ts +0 -14
- package/pnpm-workspace.yaml +0 -2
- package/tsconfig.json +0 -23
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
14
|
+
|
|
15
|
+
// src/index.tsx
|
|
16
|
+
import { I18nProvider as I18nProvider2, createI18n as createI18n2, createTranslations, createLocaleDetect, createI18nAdmin } from "@geenius/i18n-solidjs";
|
|
17
|
+
|
|
18
|
+
// src/components/LocaleSwitcher.tsx
|
|
19
|
+
import { createSignal, Show, For } from "solid-js";
|
|
20
|
+
import { LOCALE_INFO } from "@geenius/i18n-shared";
|
|
21
|
+
var LocaleSwitcher = (props) => {
|
|
22
|
+
const [open, setOpen] = createSignal(false);
|
|
23
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__locale-switcher" }, /* @__PURE__ */ React.createElement(
|
|
24
|
+
"button",
|
|
25
|
+
{
|
|
26
|
+
type: "button",
|
|
27
|
+
class: "i18n__locale-switcher-trigger",
|
|
28
|
+
onClick: () => setOpen((o) => !o)
|
|
29
|
+
},
|
|
30
|
+
/* @__PURE__ */ React.createElement("span", { class: "i18n__locale-switcher-flag" }, LOCALE_INFO[props.current]?.flag),
|
|
31
|
+
/* @__PURE__ */ React.createElement("span", { class: "i18n__locale-switcher-label" }, LOCALE_INFO[props.current]?.nativeName),
|
|
32
|
+
/* @__PURE__ */ React.createElement("span", { class: "i18n__locale-switcher-arrow" }, "\u25BE")
|
|
33
|
+
), /* @__PURE__ */ React.createElement(Show, { when: open() }, /* @__PURE__ */ React.createElement("div", { class: "i18n__locale-switcher-dropdown" }, /* @__PURE__ */ React.createElement(For, { each: props.locales }, (locale) => {
|
|
34
|
+
const info = LOCALE_INFO[locale];
|
|
35
|
+
return /* @__PURE__ */ React.createElement(
|
|
36
|
+
"button",
|
|
37
|
+
{
|
|
38
|
+
type: "button",
|
|
39
|
+
class: `i18n__locale-switcher-option${locale === props.current ? " i18n__locale-switcher-option--active" : ""}`,
|
|
40
|
+
onClick: () => {
|
|
41
|
+
props.onChange(locale);
|
|
42
|
+
setOpen(false);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
/* @__PURE__ */ React.createElement("span", { class: "i18n__locale-switcher-option-flag" }, info?.flag),
|
|
46
|
+
/* @__PURE__ */ React.createElement("span", { class: "i18n__locale-switcher-option-name" }, info?.nativeName),
|
|
47
|
+
/* @__PURE__ */ React.createElement(Show, { when: info?.direction === "rtl" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__locale-switcher-option-rtl" }, "RTL"))
|
|
48
|
+
);
|
|
49
|
+
}))));
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// src/components/RTLWrapper.tsx
|
|
53
|
+
import { LOCALE_INFO as LOCALE_INFO2 } from "@geenius/i18n-shared";
|
|
54
|
+
var RTLWrapper = (props) => {
|
|
55
|
+
const dir = () => props.locale ? LOCALE_INFO2[props.locale]?.direction ?? "ltr" : "ltr";
|
|
56
|
+
return /* @__PURE__ */ React.createElement(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
class: `i18n__rtl-wrapper i18n__rtl-wrapper--${dir()}`,
|
|
60
|
+
dir: dir()
|
|
61
|
+
},
|
|
62
|
+
props.children
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// src/components/LocaleStatsCard.tsx
|
|
67
|
+
import { Show as Show2 } from "solid-js";
|
|
68
|
+
import { LOCALE_INFO as LOCALE_INFO3 } from "@geenius/i18n-shared";
|
|
69
|
+
var LocaleStatsCard = (props) => {
|
|
70
|
+
const info = () => LOCALE_INFO3[props.stat.locale];
|
|
71
|
+
const barModifier = () => props.stat.coverage >= 90 ? "i18n__stats-card-bar-fill--complete" : props.stat.coverage >= 70 ? "i18n__stats-card-bar-fill--partial" : "i18n__stats-card-bar-fill--low";
|
|
72
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__stats-card" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__stats-card-header" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__stats-card-flag" }, info()?.flag), /* @__PURE__ */ React.createElement("span", { class: "i18n__stats-card-locale" }, info()?.nativeName)), /* @__PURE__ */ React.createElement("div", { class: "i18n__stats-card-coverage" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__stats-card-keys" }, props.stat.totalKeys, " keys"), /* @__PURE__ */ React.createElement("span", { class: "i18n__stats-card-percent" }, props.stat.coverage, "%")), /* @__PURE__ */ React.createElement("div", { class: "i18n__stats-card-bar" }, /* @__PURE__ */ React.createElement(
|
|
73
|
+
"div",
|
|
74
|
+
{
|
|
75
|
+
class: `i18n__stats-card-bar-fill ${barModifier()}`,
|
|
76
|
+
style: { width: `${props.stat.coverage}%` }
|
|
77
|
+
}
|
|
78
|
+
)), /* @__PURE__ */ React.createElement("div", { class: "i18n__stats-card-counts" }, /* @__PURE__ */ React.createElement(Show2, { when: props.stat.missingKeys > 0 }, /* @__PURE__ */ React.createElement("span", { class: "i18n__stats-card-missing" }, props.stat.missingKeys, " missing")), /* @__PURE__ */ React.createElement(Show2, { when: props.stat.missingKeys === 0 }, /* @__PURE__ */ React.createElement("span", { class: "i18n__stats-card-complete" }, "Complete"))));
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// src/components/MissingKeyAlert.tsx
|
|
82
|
+
import { Show as Show3 } from "solid-js";
|
|
83
|
+
import { LOCALE_INFO as LOCALE_INFO4 } from "@geenius/i18n-shared";
|
|
84
|
+
var MissingKeyAlert = (props) => {
|
|
85
|
+
return /* @__PURE__ */ React.createElement(Show3, { when: props.count > 0 }, /* @__PURE__ */ React.createElement("div", { class: "i18n__missing-alert" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__missing-alert-icon" }, "\u26A0\uFE0F"), /* @__PURE__ */ React.createElement("span", { class: "i18n__missing-alert-text" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__missing-alert-count" }, props.count), " ", "missing key", props.count > 1 ? "s" : "", " for", " ", /* @__PURE__ */ React.createElement("strong", null, LOCALE_INFO4[props.locale]?.name))));
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/components/TranslationKeyRow.tsx
|
|
89
|
+
import { Show as Show4 } from "solid-js";
|
|
90
|
+
var TranslationKeyRow = (props) => {
|
|
91
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__key-row" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__key-row-key" }, props.translationKey), /* @__PURE__ */ React.createElement("div", { class: "i18n__key-row-value" }, props.value), /* @__PURE__ */ React.createElement("div", { class: "i18n__key-row-locale" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__key-row-locale-badge" }, props.locale.toUpperCase()), /* @__PURE__ */ React.createElement(Show4, { when: props.namespace }, /* @__PURE__ */ React.createElement("span", { class: "i18n__key-row-namespace" }, props.namespace))), /* @__PURE__ */ React.createElement("div", { class: "i18n__key-row-actions" }, /* @__PURE__ */ React.createElement(Show4, { when: props.onEdit }, /* @__PURE__ */ React.createElement(
|
|
92
|
+
"button",
|
|
93
|
+
{
|
|
94
|
+
type: "button",
|
|
95
|
+
class: "i18n__key-row-btn i18n__key-row-btn--edit",
|
|
96
|
+
onClick: () => props.onEdit?.(props.translationKey, props.value)
|
|
97
|
+
},
|
|
98
|
+
"Edit"
|
|
99
|
+
)), /* @__PURE__ */ React.createElement(Show4, { when: props.onDelete }, /* @__PURE__ */ React.createElement(
|
|
100
|
+
"button",
|
|
101
|
+
{
|
|
102
|
+
type: "button",
|
|
103
|
+
class: "i18n__key-row-btn i18n__key-row-btn--delete",
|
|
104
|
+
onClick: () => props.onDelete?.(props.translationKey)
|
|
105
|
+
},
|
|
106
|
+
"Delete"
|
|
107
|
+
))));
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// src/components/LocaleCard.tsx
|
|
111
|
+
import { Show as Show5 } from "solid-js";
|
|
112
|
+
import { LOCALE_INFO as LOCALE_INFO5 } from "@geenius/i18n-shared";
|
|
113
|
+
var LocaleCard = (props) => {
|
|
114
|
+
const info = () => LOCALE_INFO5[props.locale];
|
|
115
|
+
const barModifier = () => props.coverage >= 90 ? "i18n__locale-card-bar-fill--complete" : props.coverage >= 70 ? "i18n__locale-card-bar-fill--partial" : "i18n__locale-card-bar-fill--low";
|
|
116
|
+
return /* @__PURE__ */ React.createElement(
|
|
117
|
+
"button",
|
|
118
|
+
{
|
|
119
|
+
type: "button",
|
|
120
|
+
class: `i18n__locale-card${props.isSelected ? " i18n__locale-card--selected" : ""}`,
|
|
121
|
+
onClick: () => props.onSelect(props.locale)
|
|
122
|
+
},
|
|
123
|
+
/* @__PURE__ */ React.createElement("div", { class: "i18n__locale-card-header" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__locale-card-flag" }, info()?.flag), /* @__PURE__ */ React.createElement("div", { class: "i18n__locale-card-info" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__locale-card-name" }, info()?.nativeName), /* @__PURE__ */ React.createElement("span", { class: "i18n__locale-card-code" }, info()?.name, " \u2014 ", props.locale.toUpperCase())), /* @__PURE__ */ React.createElement(Show5, { when: info()?.direction === "rtl" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__locale-card-rtl" }, "RTL"))),
|
|
124
|
+
/* @__PURE__ */ React.createElement("div", { class: "i18n__locale-card-bar" }, /* @__PURE__ */ React.createElement(
|
|
125
|
+
"div",
|
|
126
|
+
{
|
|
127
|
+
class: `i18n__locale-card-bar-fill ${barModifier()}`,
|
|
128
|
+
style: { width: `${props.coverage}%` }
|
|
129
|
+
}
|
|
130
|
+
)),
|
|
131
|
+
/* @__PURE__ */ React.createElement("span", { class: "i18n__locale-card-coverage" }, props.coverage, "%")
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// src/pages/I18nAdminPage.tsx
|
|
136
|
+
import { createSignal as createSignal2, createMemo, Show as Show6, For as For2 } from "solid-js";
|
|
137
|
+
import { LOCALE_INFO as LOCALE_INFO6, ALL_LOCALES } from "@geenius/i18n-shared";
|
|
138
|
+
var I18nAdminPage = (props) => {
|
|
139
|
+
const locales = () => props.supportedLocales ?? ALL_LOCALES;
|
|
140
|
+
const [selectedLocale, setSelectedLocale] = createSignal2(locales()[0] ?? "en");
|
|
141
|
+
const [search, setSearch] = createSignal2("");
|
|
142
|
+
const allStats = () => props.stats ?? [];
|
|
143
|
+
const allTranslations = () => props.translations ?? {};
|
|
144
|
+
const selectedStat = createMemo(
|
|
145
|
+
() => allStats().find((s) => s.locale === selectedLocale())
|
|
146
|
+
);
|
|
147
|
+
const missingCount = createMemo(() => selectedStat()?.missingKeys ?? 0);
|
|
148
|
+
const translationEntries = createMemo(() => {
|
|
149
|
+
const localeTranslations = allTranslations()[selectedLocale()];
|
|
150
|
+
if (!localeTranslations) return [];
|
|
151
|
+
const entries = Object.entries(localeTranslations);
|
|
152
|
+
const q = search().toLowerCase();
|
|
153
|
+
if (!q) return entries;
|
|
154
|
+
return entries.filter(
|
|
155
|
+
([key, value]) => key.toLowerCase().includes(q) || value.toLowerCase().includes(q)
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
const coverageForLocale = (locale) => {
|
|
159
|
+
const stat = allStats().find((s) => s.locale === locale);
|
|
160
|
+
return stat?.coverage ?? 0;
|
|
161
|
+
};
|
|
162
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__admin-page" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__admin-container" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__page-header" }, /* @__PURE__ */ React.createElement("h1", { class: "i18n__page-title" }, "Translation Admin"), /* @__PURE__ */ React.createElement("p", { class: "i18n__page-subtitle" }, "Manage translations across all supported locales")), /* @__PURE__ */ React.createElement("div", { class: "i18n__admin-body" }, /* @__PURE__ */ React.createElement(Show6, { when: allStats().length > 0 }, /* @__PURE__ */ React.createElement("section", { class: "i18n__admin-section" }, /* @__PURE__ */ React.createElement("h2", { class: "i18n__admin-section-title" }, "Locale Coverage"), /* @__PURE__ */ React.createElement("div", { class: "i18n__stats-grid" }, /* @__PURE__ */ React.createElement(For2, { each: allStats() }, (stat) => /* @__PURE__ */ React.createElement(LocaleStatsCard, { stat }))))), /* @__PURE__ */ React.createElement(MissingKeyAlert, { count: missingCount(), locale: selectedLocale() }), /* @__PURE__ */ React.createElement("section", { class: "i18n__admin-section" }, /* @__PURE__ */ React.createElement("h2", { class: "i18n__admin-section-title" }, "Select Locale"), /* @__PURE__ */ React.createElement("div", { class: "i18n__locale-grid" }, /* @__PURE__ */ React.createElement(For2, { each: locales() }, (locale) => /* @__PURE__ */ React.createElement(
|
|
163
|
+
LocaleCard,
|
|
164
|
+
{
|
|
165
|
+
locale,
|
|
166
|
+
coverage: coverageForLocale(locale),
|
|
167
|
+
isSelected: locale === selectedLocale(),
|
|
168
|
+
onSelect: setSelectedLocale
|
|
169
|
+
}
|
|
170
|
+
)))), /* @__PURE__ */ React.createElement("section", { class: "i18n__admin-section" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__admin-section-header" }, /* @__PURE__ */ React.createElement("h2", { class: "i18n__admin-section-title" }, "Translations \u2014 ", LOCALE_INFO6[selectedLocale()]?.nativeName), /* @__PURE__ */ React.createElement(
|
|
171
|
+
"input",
|
|
172
|
+
{
|
|
173
|
+
type: "text",
|
|
174
|
+
class: "i18n__search-input",
|
|
175
|
+
placeholder: "Search keys or values\u2026",
|
|
176
|
+
value: search(),
|
|
177
|
+
onInput: (e) => setSearch(e.currentTarget.value)
|
|
178
|
+
}
|
|
179
|
+
)), /* @__PURE__ */ React.createElement(
|
|
180
|
+
Show6,
|
|
181
|
+
{
|
|
182
|
+
when: translationEntries().length > 0,
|
|
183
|
+
fallback: /* @__PURE__ */ React.createElement("div", { class: "i18n__empty-state" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__empty-state-icon" }, "\u{1F310}"), /* @__PURE__ */ React.createElement("p", { class: "i18n__empty-state-text" }, "No translations for ", LOCALE_INFO6[selectedLocale()]?.name))
|
|
184
|
+
},
|
|
185
|
+
/* @__PURE__ */ React.createElement("div", { class: "i18n__translation-list" }, /* @__PURE__ */ React.createElement(For2, { each: translationEntries() }, ([key, value]) => /* @__PURE__ */ React.createElement(
|
|
186
|
+
TranslationKeyRow,
|
|
187
|
+
{
|
|
188
|
+
translationKey: key,
|
|
189
|
+
value,
|
|
190
|
+
locale: selectedLocale(),
|
|
191
|
+
onEdit: (k, v) => props.onUpsert?.(selectedLocale(), k, v),
|
|
192
|
+
onDelete: (k) => props.onDelete?.(selectedLocale(), k)
|
|
193
|
+
}
|
|
194
|
+
)))
|
|
195
|
+
)))));
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// src/pages/LocalePreviewPage.tsx
|
|
199
|
+
import { Show as Show7 } from "solid-js";
|
|
200
|
+
import { LOCALE_INFO as LOCALE_INFO7, ALL_LOCALES as ALL_LOCALES2 } from "@geenius/i18n-shared";
|
|
201
|
+
|
|
202
|
+
// src/primitives/index.ts
|
|
203
|
+
var primitives_exports = {};
|
|
204
|
+
__reExport(primitives_exports, i18n_solidjs_star);
|
|
205
|
+
import * as i18n_solidjs_star from "@geenius/i18n-solidjs";
|
|
206
|
+
|
|
207
|
+
// src/pages/LocalePreviewPage.tsx
|
|
208
|
+
function PreviewInfoCard(props) {
|
|
209
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-info-card" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__preview-info-label" }, props.label), /* @__PURE__ */ React.createElement("span", { class: `i18n__preview-info-value${props.highlight ? " i18n__preview-info-value--highlight" : ""}` }, props.value));
|
|
210
|
+
}
|
|
211
|
+
function FormatExample(props) {
|
|
212
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-example" }, /* @__PURE__ */ React.createElement("span", { class: "i18n__preview-label" }, props.label), /* @__PURE__ */ React.createElement("span", { class: "i18n__preview-value" }, props.value));
|
|
213
|
+
}
|
|
214
|
+
function PreviewContent() {
|
|
215
|
+
const { locale, t, direction, isRTL, setLocale, formatDate, formatNumber, formatCurrency } = (0, primitives_exports.createI18n)();
|
|
216
|
+
const info = () => LOCALE_INFO7[locale()];
|
|
217
|
+
return /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-page" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-container" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-header" }, /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-header-text" }, /* @__PURE__ */ React.createElement("h1", { class: "i18n__preview-title" }, "Locale Preview"), /* @__PURE__ */ React.createElement("p", { class: "i18n__preview-subtitle" }, "Live preview of locale formatting and direction")), /* @__PURE__ */ React.createElement(LocaleSwitcher, { locales: ALL_LOCALES2, current: locale(), onChange: setLocale })), /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-info-grid" }, /* @__PURE__ */ React.createElement(PreviewInfoCard, { label: "Locale", value: locale().toUpperCase() }), /* @__PURE__ */ React.createElement(PreviewInfoCard, { label: "Direction", value: direction(), highlight: isRTL() }), /* @__PURE__ */ React.createElement(PreviewInfoCard, { label: "Native Name", value: info()?.nativeName ?? "?" }), /* @__PURE__ */ React.createElement(PreviewInfoCard, { label: "Flag", value: info()?.flag ?? "?" })), /* @__PURE__ */ React.createElement(RTLWrapper, { locale: locale() }, /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-content" }, /* @__PURE__ */ React.createElement("section", { class: "i18n__preview-section" }, /* @__PURE__ */ React.createElement("h3", { class: "i18n__preview-section-title" }, "Formatting Examples"), /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-examples" }, /* @__PURE__ */ React.createElement(FormatExample, { label: "Date", value: formatDate(/* @__PURE__ */ new Date()) }), /* @__PURE__ */ React.createElement(FormatExample, { label: "Date (full)", value: formatDate(/* @__PURE__ */ new Date(), { dateStyle: "full" }) }), /* @__PURE__ */ React.createElement(FormatExample, { label: "Number", value: formatNumber(123456789e-2) }), /* @__PURE__ */ React.createElement(FormatExample, { label: "Currency (USD)", value: formatCurrency(9999.99, "USD") }), /* @__PURE__ */ React.createElement(FormatExample, { label: "Currency (EUR)", value: formatCurrency(4250.5, "EUR") }), /* @__PURE__ */ React.createElement(FormatExample, { label: "Percentage", value: formatNumber(0.85, { style: "percent" }) }))), /* @__PURE__ */ React.createElement(Show7, { when: isRTL() }, /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-rtl-notice" }, "\u26A1 RTL mode active \u2014 text flows right-to-left")), /* @__PURE__ */ React.createElement("section", { class: "i18n__preview-section" }, /* @__PURE__ */ React.createElement("h3", { class: "i18n__preview-section-title" }, "Sample Text"), /* @__PURE__ */ React.createElement("p", { class: "i18n__preview-sample-text" }, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")), /* @__PURE__ */ React.createElement("section", { class: "i18n__preview-section" }, /* @__PURE__ */ React.createElement("h3", { class: "i18n__preview-section-title" }, "Translation Lookup"), /* @__PURE__ */ React.createElement("div", { class: "i18n__preview-examples" }, /* @__PURE__ */ React.createElement(FormatExample, { label: "greeting", value: t("greeting") }), /* @__PURE__ */ React.createElement(FormatExample, { label: "auth.login", value: t("auth.login") }), /* @__PURE__ */ React.createElement(FormatExample, { label: "dashboard.title", value: t("dashboard.title") })))))));
|
|
218
|
+
}
|
|
219
|
+
var LocalePreviewPage = (props) => {
|
|
220
|
+
const fullConfig = {
|
|
221
|
+
defaultLocale: "en",
|
|
222
|
+
supportedLocales: ALL_LOCALES2,
|
|
223
|
+
detectBrowser: true,
|
|
224
|
+
persistLocale: true,
|
|
225
|
+
...props.config
|
|
226
|
+
};
|
|
227
|
+
return /* @__PURE__ */ React.createElement(primitives_exports.I18nProvider, { config: fullConfig, translations: props.translations }, /* @__PURE__ */ React.createElement(PreviewContent, null));
|
|
228
|
+
};
|
|
229
|
+
export {
|
|
230
|
+
I18nAdminPage,
|
|
231
|
+
I18nProvider2 as I18nProvider,
|
|
232
|
+
LocaleCard,
|
|
233
|
+
LocalePreviewPage,
|
|
234
|
+
LocaleStatsCard,
|
|
235
|
+
LocaleSwitcher,
|
|
236
|
+
MissingKeyAlert,
|
|
237
|
+
RTLWrapper,
|
|
238
|
+
TranslationKeyRow,
|
|
239
|
+
createI18n2 as createI18n,
|
|
240
|
+
createI18nAdmin,
|
|
241
|
+
createLocaleDetect,
|
|
242
|
+
createTranslations
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/components/LocaleSwitcher.tsx","../src/components/RTLWrapper.tsx","../src/components/LocaleStatsCard.tsx","../src/components/MissingKeyAlert.tsx","../src/components/TranslationKeyRow.tsx","../src/components/LocaleCard.tsx","../src/pages/I18nAdminPage.tsx","../src/pages/LocalePreviewPage.tsx","../src/primitives/index.ts"],"sourcesContent":["export { I18nProvider, createI18n, createTranslations, createLocaleDetect, createI18nAdmin } from '@geenius/i18n-solidjs'\nexport * from './components'\nexport * from './pages'\n","import { createSignal, Show, For } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { Locale } from '@geenius/i18n-shared'\nimport { LOCALE_INFO } from '@geenius/i18n-shared'\n\ninterface Props {\n locales: Locale[]\n current: Locale\n onChange: (l: Locale) => void\n}\n\nexport const LocaleSwitcher: Component<Props> = (props) => {\n const [open, setOpen] = createSignal(false)\n\n return (\n <div class=\"i18n__locale-switcher\">\n <button\n type=\"button\"\n class=\"i18n__locale-switcher-trigger\"\n onClick={() => setOpen((o) => !o)}\n >\n <span class=\"i18n__locale-switcher-flag\">{LOCALE_INFO[props.current]?.flag}</span>\n <span class=\"i18n__locale-switcher-label\">{LOCALE_INFO[props.current]?.nativeName}</span>\n <span class=\"i18n__locale-switcher-arrow\">▾</span>\n </button>\n\n <Show when={open()}>\n <div class=\"i18n__locale-switcher-dropdown\">\n <For each={props.locales}>\n {(locale) => {\n const info = LOCALE_INFO[locale]\n return (\n <button\n type=\"button\"\n class={`i18n__locale-switcher-option${locale === props.current ? ' i18n__locale-switcher-option--active' : ''}`}\n onClick={() => { props.onChange(locale); setOpen(false) }}\n >\n <span class=\"i18n__locale-switcher-option-flag\">{info?.flag}</span>\n <span class=\"i18n__locale-switcher-option-name\">{info?.nativeName}</span>\n <Show when={info?.direction === 'rtl'}>\n <span class=\"i18n__locale-switcher-option-rtl\">RTL</span>\n </Show>\n </button>\n )\n }}\n </For>\n </div>\n </Show>\n </div>\n )\n}\n","import type { ParentComponent } from 'solid-js'\nimport type { Locale } from '@geenius/i18n-shared'\nimport { LOCALE_INFO } from '@geenius/i18n-shared'\n\nexport const RTLWrapper: ParentComponent<{ locale?: Locale }> = (props) => {\n const dir = () => props.locale ? LOCALE_INFO[props.locale]?.direction ?? 'ltr' : 'ltr'\n\n return (\n <div\n class={`i18n__rtl-wrapper i18n__rtl-wrapper--${dir()}`}\n dir={dir()}\n >\n {props.children}\n </div>\n )\n}\n","import { Show } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { LocaleStat } from '@geenius/i18n-shared'\nimport { LOCALE_INFO } from '@geenius/i18n-shared'\n\ninterface Props {\n stat: LocaleStat\n}\n\nexport const LocaleStatsCard: Component<Props> = (props) => {\n const info = () => LOCALE_INFO[props.stat.locale]\n const barModifier = () =>\n props.stat.coverage >= 90 ? 'i18n__stats-card-bar-fill--complete'\n : props.stat.coverage >= 70 ? 'i18n__stats-card-bar-fill--partial'\n : 'i18n__stats-card-bar-fill--low'\n\n return (\n <div class=\"i18n__stats-card\">\n <div class=\"i18n__stats-card-header\">\n <span class=\"i18n__stats-card-flag\">{info()?.flag}</span>\n <span class=\"i18n__stats-card-locale\">{info()?.nativeName}</span>\n </div>\n <div class=\"i18n__stats-card-coverage\">\n <span class=\"i18n__stats-card-keys\">{props.stat.totalKeys} keys</span>\n <span class=\"i18n__stats-card-percent\">{props.stat.coverage}%</span>\n </div>\n <div class=\"i18n__stats-card-bar\">\n <div\n class={`i18n__stats-card-bar-fill ${barModifier()}`}\n style={{ width: `${props.stat.coverage}%` }}\n />\n </div>\n <div class=\"i18n__stats-card-counts\">\n <Show when={props.stat.missingKeys > 0}>\n <span class=\"i18n__stats-card-missing\">{props.stat.missingKeys} missing</span>\n </Show>\n <Show when={props.stat.missingKeys === 0}>\n <span class=\"i18n__stats-card-complete\">Complete</span>\n </Show>\n </div>\n </div>\n )\n}\n","import { Show } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { Locale } from '@geenius/i18n-shared'\nimport { LOCALE_INFO } from '@geenius/i18n-shared'\n\ninterface Props {\n count: number\n locale: Locale\n}\n\nexport const MissingKeyAlert: Component<Props> = (props) => {\n return (\n <Show when={props.count > 0}>\n <div class=\"i18n__missing-alert\">\n <span class=\"i18n__missing-alert-icon\">⚠️</span>\n <span class=\"i18n__missing-alert-text\">\n <span class=\"i18n__missing-alert-count\">{props.count}</span>\n {' '}missing key{props.count > 1 ? 's' : ''} for{' '}\n <strong>{LOCALE_INFO[props.locale]?.name}</strong>\n </span>\n </div>\n </Show>\n )\n}\n","import { Show } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { Locale } from '@geenius/i18n-shared'\n\ninterface Props {\n translationKey: string\n value: string\n locale: Locale\n namespace?: string\n onEdit?: (key: string, value: string) => void\n onDelete?: (key: string) => void\n}\n\nexport const TranslationKeyRow: Component<Props> = (props) => {\n return (\n <div class=\"i18n__key-row\">\n <div class=\"i18n__key-row-key\">{props.translationKey}</div>\n <div class=\"i18n__key-row-value\">{props.value}</div>\n <div class=\"i18n__key-row-locale\">\n <span class=\"i18n__key-row-locale-badge\">{props.locale.toUpperCase()}</span>\n <Show when={props.namespace}>\n <span class=\"i18n__key-row-namespace\">{props.namespace}</span>\n </Show>\n </div>\n <div class=\"i18n__key-row-actions\">\n <Show when={props.onEdit}>\n <button\n type=\"button\"\n class=\"i18n__key-row-btn i18n__key-row-btn--edit\"\n onClick={() => props.onEdit?.(props.translationKey, props.value)}\n >\n Edit\n </button>\n </Show>\n <Show when={props.onDelete}>\n <button\n type=\"button\"\n class=\"i18n__key-row-btn i18n__key-row-btn--delete\"\n onClick={() => props.onDelete?.(props.translationKey)}\n >\n Delete\n </button>\n </Show>\n </div>\n </div>\n )\n}\n","import { Show } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { Locale } from '@geenius/i18n-shared'\nimport { LOCALE_INFO } from '@geenius/i18n-shared'\n\ninterface Props {\n locale: Locale\n coverage: number\n isSelected: boolean\n onSelect: (l: Locale) => void\n}\n\nexport const LocaleCard: Component<Props> = (props) => {\n const info = () => LOCALE_INFO[props.locale]\n const barModifier = () =>\n props.coverage >= 90 ? 'i18n__locale-card-bar-fill--complete'\n : props.coverage >= 70 ? 'i18n__locale-card-bar-fill--partial'\n : 'i18n__locale-card-bar-fill--low'\n\n return (\n <button\n type=\"button\"\n class={`i18n__locale-card${props.isSelected ? ' i18n__locale-card--selected' : ''}`}\n onClick={() => props.onSelect(props.locale)}\n >\n <div class=\"i18n__locale-card-header\">\n <span class=\"i18n__locale-card-flag\">{info()?.flag}</span>\n <div class=\"i18n__locale-card-info\">\n <span class=\"i18n__locale-card-name\">{info()?.nativeName}</span>\n <span class=\"i18n__locale-card-code\">{info()?.name} — {props.locale.toUpperCase()}</span>\n </div>\n <Show when={info()?.direction === 'rtl'}>\n <span class=\"i18n__locale-card-rtl\">RTL</span>\n </Show>\n </div>\n <div class=\"i18n__locale-card-bar\">\n <div\n class={`i18n__locale-card-bar-fill ${barModifier()}`}\n style={{ width: `${props.coverage}%` }}\n />\n </div>\n <span class=\"i18n__locale-card-coverage\">{props.coverage}%</span>\n </button>\n )\n}\n","import { createSignal, createMemo, Show, For } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { Locale, LocaleStat } from '@geenius/i18n-shared'\nimport { LOCALE_INFO, ALL_LOCALES, flattenDict } from '@geenius/i18n-shared'\nimport type { TranslationDict } from '@geenius/i18n-shared'\nimport { LocaleStatsCard } from '../components/LocaleStatsCard'\nimport { MissingKeyAlert } from '../components/MissingKeyAlert'\nimport { TranslationKeyRow } from '../components/TranslationKeyRow'\nimport { LocaleCard } from '../components/LocaleCard'\n\ninterface Props {\n stats?: LocaleStat[]\n translations?: Record<string, Record<string, string>>\n supportedLocales?: Locale[]\n onUpsert?: (locale: string, key: string, value: string) => void\n onDelete?: (locale: string, key: string) => void\n}\n\nexport const I18nAdminPage: Component<Props> = (props) => {\n const locales = () => props.supportedLocales ?? ALL_LOCALES\n const [selectedLocale, setSelectedLocale] = createSignal<Locale>(locales()[0] ?? 'en')\n const [search, setSearch] = createSignal('')\n\n const allStats = () => props.stats ?? []\n const allTranslations = () => props.translations ?? {}\n\n const selectedStat = createMemo(() =>\n allStats().find((s) => s.locale === selectedLocale())\n )\n\n const missingCount = createMemo(() => selectedStat()?.missingKeys ?? 0)\n\n const translationEntries = createMemo(() => {\n const localeTranslations = allTranslations()[selectedLocale()]\n if (!localeTranslations) return []\n const entries = Object.entries(localeTranslations)\n const q = search().toLowerCase()\n if (!q) return entries\n return entries.filter(\n ([key, value]) => key.toLowerCase().includes(q) || value.toLowerCase().includes(q)\n )\n })\n\n const coverageForLocale = (locale: Locale) => {\n const stat = allStats().find((s) => s.locale === locale)\n return stat?.coverage ?? 0\n }\n\n return (\n <div class=\"i18n__admin-page\">\n <div class=\"i18n__admin-container\">\n {/* Header */}\n <div class=\"i18n__page-header\">\n <h1 class=\"i18n__page-title\">Translation Admin</h1>\n <p class=\"i18n__page-subtitle\">Manage translations across all supported locales</p>\n </div>\n\n <div class=\"i18n__admin-body\">\n {/* Stats section */}\n <Show when={allStats().length > 0}>\n <section class=\"i18n__admin-section\">\n <h2 class=\"i18n__admin-section-title\">Locale Coverage</h2>\n <div class=\"i18n__stats-grid\">\n <For each={allStats()}>\n {(stat) => <LocaleStatsCard stat={stat} />}\n </For>\n </div>\n </section>\n </Show>\n\n {/* Missing keys alert */}\n <MissingKeyAlert count={missingCount()} locale={selectedLocale()} />\n\n {/* Locale selector */}\n <section class=\"i18n__admin-section\">\n <h2 class=\"i18n__admin-section-title\">Select Locale</h2>\n <div class=\"i18n__locale-grid\">\n <For each={locales()}>\n {(locale) => (\n <LocaleCard\n locale={locale}\n coverage={coverageForLocale(locale)}\n isSelected={locale === selectedLocale()}\n onSelect={setSelectedLocale}\n />\n )}\n </For>\n </div>\n </section>\n\n {/* Search + translation rows */}\n <section class=\"i18n__admin-section\">\n <div class=\"i18n__admin-section-header\">\n <h2 class=\"i18n__admin-section-title\">\n Translations — {LOCALE_INFO[selectedLocale()]?.nativeName}\n </h2>\n <input\n type=\"text\"\n class=\"i18n__search-input\"\n placeholder=\"Search keys or values…\"\n value={search()}\n onInput={(e) => setSearch(e.currentTarget.value)}\n />\n </div>\n\n <Show\n when={translationEntries().length > 0}\n fallback={\n <div class=\"i18n__empty-state\">\n <span class=\"i18n__empty-state-icon\">🌐</span>\n <p class=\"i18n__empty-state-text\">No translations for {LOCALE_INFO[selectedLocale()]?.name}</p>\n </div>\n }\n >\n <div class=\"i18n__translation-list\">\n <For each={translationEntries()}>\n {([key, value]) => (\n <TranslationKeyRow\n translationKey={key}\n value={value}\n locale={selectedLocale()}\n onEdit={(k, v) => props.onUpsert?.(selectedLocale(), k, v)}\n onDelete={(k) => props.onDelete?.(selectedLocale(), k)}\n />\n )}\n </For>\n </div>\n </Show>\n </section>\n </div>\n </div>\n </div>\n )\n}\n","import { Show } from 'solid-js'\nimport type { Component } from 'solid-js'\nimport type { I18nConfig, TranslationDict } from '@geenius/i18n-shared'\nimport { LOCALE_INFO, ALL_LOCALES } from '@geenius/i18n-shared'\nimport { I18nProvider, createI18n } from '../primitives'\nimport { LocaleSwitcher } from '../components/LocaleSwitcher'\nimport { RTLWrapper } from '../components/RTLWrapper'\n\nfunction PreviewInfoCard(props: { label: string; value: string; highlight?: boolean }) {\n return (\n <div class=\"i18n__preview-info-card\">\n <span class=\"i18n__preview-info-label\">{props.label}</span>\n <span class={`i18n__preview-info-value${props.highlight ? ' i18n__preview-info-value--highlight' : ''}`}>\n {props.value}\n </span>\n </div>\n )\n}\n\nfunction FormatExample(props: { label: string; value: string }) {\n return (\n <div class=\"i18n__preview-example\">\n <span class=\"i18n__preview-label\">{props.label}</span>\n <span class=\"i18n__preview-value\">{props.value}</span>\n </div>\n )\n}\n\nfunction PreviewContent() {\n const { locale, t, direction, isRTL, setLocale, formatDate, formatNumber, formatCurrency } = createI18n()\n const info = () => LOCALE_INFO[locale()]\n\n return (\n <div class=\"i18n__preview-page\">\n <div class=\"i18n__preview-container\">\n {/* Header */}\n <div class=\"i18n__preview-header\">\n <div class=\"i18n__preview-header-text\">\n <h1 class=\"i18n__preview-title\">Locale Preview</h1>\n <p class=\"i18n__preview-subtitle\">Live preview of locale formatting and direction</p>\n </div>\n <LocaleSwitcher locales={ALL_LOCALES} current={locale()} onChange={setLocale} />\n </div>\n\n {/* Info cards */}\n <div class=\"i18n__preview-info-grid\">\n <PreviewInfoCard label=\"Locale\" value={locale().toUpperCase()} />\n <PreviewInfoCard label=\"Direction\" value={direction()} highlight={isRTL()} />\n <PreviewInfoCard label=\"Native Name\" value={info()?.nativeName ?? '?'} />\n <PreviewInfoCard label=\"Flag\" value={info()?.flag ?? '?'} />\n </div>\n\n {/* RTL-aware content */}\n <RTLWrapper locale={locale()}>\n <div class=\"i18n__preview-content\">\n {/* Formatting */}\n <section class=\"i18n__preview-section\">\n <h3 class=\"i18n__preview-section-title\">Formatting Examples</h3>\n <div class=\"i18n__preview-examples\">\n <FormatExample label=\"Date\" value={formatDate(new Date())} />\n <FormatExample label=\"Date (full)\" value={formatDate(new Date(), { dateStyle: 'full' })} />\n <FormatExample label=\"Number\" value={formatNumber(1234567.89)} />\n <FormatExample label=\"Currency (USD)\" value={formatCurrency(9999.99, 'USD')} />\n <FormatExample label=\"Currency (EUR)\" value={formatCurrency(4250.50, 'EUR')} />\n <FormatExample label=\"Percentage\" value={formatNumber(0.85, { style: 'percent' })} />\n </div>\n </section>\n\n {/* RTL notice */}\n <Show when={isRTL()}>\n <div class=\"i18n__preview-rtl-notice\">\n ⚡ RTL mode active — text flows right-to-left\n </div>\n </Show>\n\n {/* Sample text */}\n <section class=\"i18n__preview-section\">\n <h3 class=\"i18n__preview-section-title\">Sample Text</h3>\n <p class=\"i18n__preview-sample-text\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor\n incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud\n exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n </p>\n </section>\n\n {/* Translation test */}\n <section class=\"i18n__preview-section\">\n <h3 class=\"i18n__preview-section-title\">Translation Lookup</h3>\n <div class=\"i18n__preview-examples\">\n <FormatExample label=\"greeting\" value={t('greeting')} />\n <FormatExample label=\"auth.login\" value={t('auth.login')} />\n <FormatExample label=\"dashboard.title\" value={t('dashboard.title')} />\n </div>\n </section>\n </div>\n </RTLWrapper>\n </div>\n </div>\n )\n}\n\nexport const LocalePreviewPage: Component<{ config?: Partial<I18nConfig>; translations?: TranslationDict }> = (props) => {\n const fullConfig: I18nConfig = {\n defaultLocale: 'en',\n supportedLocales: ALL_LOCALES,\n detectBrowser: true,\n persistLocale: true,\n ...props.config,\n }\n\n return (\n <I18nProvider config={fullConfig} translations={props.translations}>\n <PreviewContent />\n </I18nProvider>\n )\n}\n","export * from '@geenius/i18n-solidjs'\n"],"mappings":"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","names":["I18nProvider","createI18n","LOCALE_INFO","Show","LOCALE_INFO","Show","LOCALE_INFO","Show","Show","LOCALE_INFO","createSignal","Show","For","LOCALE_INFO","createSignal","Show","For","LOCALE_INFO","Show","LOCALE_INFO","ALL_LOCALES","LOCALE_INFO","ALL_LOCALES","Show"]}
|
package/.changeset/config.json
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
|
|
3
|
-
"changelog": "@changesets/cli/changelog",
|
|
4
|
-
"commit": false,
|
|
5
|
-
"fixed": [],
|
|
6
|
-
"linked": [],
|
|
7
|
-
"access": "public",
|
|
8
|
-
"baseBranch": "main",
|
|
9
|
-
"updateInternalDependencies": "patch",
|
|
10
|
-
"ignore": []
|
|
11
|
-
}
|
package/.github/CODEOWNERS
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
* @mxn2020
|
package/.github/dependabot.yml
DELETED
package/.github/workflows/ci.yml
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
on:
|
|
3
|
-
pull_request:
|
|
4
|
-
branches: [main]
|
|
5
|
-
push:
|
|
6
|
-
branches: [main]
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
check:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
steps:
|
|
12
|
-
- uses: actions/checkout@v4
|
|
13
|
-
- uses: pnpm/action-setup@v4
|
|
14
|
-
with:
|
|
15
|
-
version: 10
|
|
16
|
-
- uses: actions/setup-node@v4
|
|
17
|
-
with:
|
|
18
|
-
node-version-file: '.nvmrc'
|
|
19
|
-
cache: 'pnpm'
|
|
20
|
-
- run: pnpm install --frozen-lockfile
|
|
21
|
-
- run: pnpm build
|
|
22
|
-
- run: pnpm lint
|
|
23
|
-
- run: pnpm test
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
on:
|
|
3
|
-
push:
|
|
4
|
-
branches: [main]
|
|
5
|
-
|
|
6
|
-
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
release:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
steps:
|
|
12
|
-
- uses: actions/checkout@v4
|
|
13
|
-
- uses: pnpm/action-setup@v4
|
|
14
|
-
with:
|
|
15
|
-
version: 10
|
|
16
|
-
- uses: actions/setup-node@v4
|
|
17
|
-
with:
|
|
18
|
-
node-version-file: '.nvmrc'
|
|
19
|
-
cache: 'pnpm'
|
|
20
|
-
registry-url: 'https://registry.npmjs.org'
|
|
21
|
-
- run: pnpm install --frozen-lockfile
|
|
22
|
-
- run: pnpm build
|
|
23
|
-
- uses: changesets/action@v1
|
|
24
|
-
with:
|
|
25
|
-
publish: pnpm changeset publish
|
|
26
|
-
version: pnpm changeset version
|
|
27
|
-
env:
|
|
28
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
29
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/.nvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
22
|
package/.project/ACCOUNT.yaml
DELETED
package/.project/IDEAS.yaml
DELETED
package/.project/PROJECT.yaml
DELETED
package/.project/ROADMAP.yaml
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
version: "0.1"
|
|
2
|
-
milestones:
|
|
3
|
-
- name: "v0.1.0 — Initial Release"
|
|
4
|
-
status: in-progress
|
|
5
|
-
items:
|
|
6
|
-
- "Core shared types and logic"
|
|
7
|
-
- "React hooks and components"
|
|
8
|
-
- "SolidJS primitives"
|
|
9
|
-
- "npm publishing via Changesets"
|
|
10
|
-
- name: "v0.2.0 — Stability"
|
|
11
|
-
status: planned
|
|
12
|
-
items:
|
|
13
|
-
- "Test coverage ≥ 50%"
|
|
14
|
-
- "API documentation"
|
|
15
|
-
- "Convex adapter"
|
package/CODE_OF_CONDUCT.md
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# Contributor Covenant Code of Conduct
|
|
2
|
-
|
|
3
|
-
## Our Pledge
|
|
4
|
-
|
|
5
|
-
We as members, contributors, and leaders pledge to make participation in our
|
|
6
|
-
community a harassment-free experience for everyone, regardless of age, body
|
|
7
|
-
size, disability, ethnicity, gender identity and expression, level of experience,
|
|
8
|
-
education, socio-economic status, nationality, personal appearance, race,
|
|
9
|
-
religion, or sexual identity and orientation.
|
|
10
|
-
|
|
11
|
-
## Enforcement
|
|
12
|
-
|
|
13
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
14
|
-
reported to the project team at conduct@geenius.app.
|
|
15
|
-
|
|
16
|
-
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
|
package/CONTRIBUTING.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Contributing to @geenius-i18n
|
|
2
|
-
|
|
3
|
-
Thank you for your interest in contributing!
|
|
4
|
-
|
|
5
|
-
## Development Setup
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
git clone https://github.com/mxn2020/geenius-i18n.git
|
|
9
|
-
cd geenius-i18n
|
|
10
|
-
pnpm install
|
|
11
|
-
pnpm build
|
|
12
|
-
pnpm test
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Pull Request Process
|
|
16
|
-
|
|
17
|
-
1. Fork the repo and create a feature branch from `main`
|
|
18
|
-
2. Add or update tests as appropriate
|
|
19
|
-
3. Run `pnpm changeset` to describe your changes for the changelog
|
|
20
|
-
4. Open a PR against `main`
|
|
21
|
-
|
|
22
|
-
## Code Style
|
|
23
|
-
|
|
24
|
-
- TypeScript strict mode
|
|
25
|
-
- ESLint + Prettier formatting
|
|
26
|
-
- Conventional commits preferred
|
package/SECURITY.md
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Supported Versions
|
|
4
|
-
|
|
5
|
-
| Version | Supported |
|
|
6
|
-
| ------- | --------- |
|
|
7
|
-
| 0.x.x | ✅ |
|
|
8
|
-
|
|
9
|
-
## Reporting a Vulnerability
|
|
10
|
-
|
|
11
|
-
Please report security vulnerabilities by emailing **security@geenius.app**.
|
|
12
|
-
|
|
13
|
-
Do **not** open a public GitHub issue for security vulnerabilities.
|
|
14
|
-
|
|
15
|
-
We will acknowledge receipt within 48 hours and provide a detailed response within 5 business days.
|
package/SUPPORT.md
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
# Support
|
|
2
|
-
|
|
3
|
-
## Getting Help
|
|
4
|
-
|
|
5
|
-
- 📖 [Documentation](https://docs.geenius.app)
|
|
6
|
-
- 🐛 [Bug Reports](https://github.com/mxn2020/geenius-i18n/issues/new?template=bug_report.md)
|
|
7
|
-
- 💡 [Feature Requests](https://github.com/mxn2020/geenius-i18n/issues/new?template=feature_request.md)
|
|
8
|
-
- 📧 Email: support@geenius.app
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@geenius-i18n/convex",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"private": false,
|
|
5
|
-
"type": "module",
|
|
6
|
-
"description": "Convex backend functions and schema for the Geenius i18n system",
|
|
7
|
-
"author": "Antigravity HQ",
|
|
8
|
-
"license": "MIT",
|
|
9
|
-
"publishConfig": {
|
|
10
|
-
"access": "public"
|
|
11
|
-
},
|
|
12
|
-
"main": "./dist/index.js",
|
|
13
|
-
"module": "./dist/index.js",
|
|
14
|
-
"types": "./dist/index.d.ts",
|
|
15
|
-
"exports": {
|
|
16
|
-
".": {
|
|
17
|
-
"types": "./dist/index.d.ts",
|
|
18
|
-
"import": "./dist/index.js"
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
"files": [
|
|
22
|
-
"dist",
|
|
23
|
-
"src"
|
|
24
|
-
],
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "tsup",
|
|
27
|
-
"clean": "rm -rf dist",
|
|
28
|
-
"type-check": "tsc --noEmit",
|
|
29
|
-
"prepublishOnly": "pnpm clean && pnpm build"
|
|
30
|
-
},
|
|
31
|
-
"peerDependencies": {
|
|
32
|
-
"convex": "^1.34.0"
|
|
33
|
-
},
|
|
34
|
-
"devDependencies": {
|
|
35
|
-
"convex": "^1.34.0",
|
|
36
|
-
"tsup": "^8.5.1",
|
|
37
|
-
"typescript": "~6.0.2"
|
|
38
|
-
},
|
|
39
|
-
"engines": {
|
|
40
|
-
"node": ">=20.0.0"
|
|
41
|
-
}
|
|
42
|
-
}
|