i18n-dashboard 0.1.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/LICENSE +21 -0
- package/README.md +715 -0
- package/app.vue +8 -0
- package/assets/css/main.css +21 -0
- package/assets/locales/en.json +380 -0
- package/bin/cli.mjs +279 -0
- package/components/LinkedKeyPicker.vue +135 -0
- package/components/PathPicker.vue +153 -0
- package/components/PluralEditor.vue +295 -0
- package/components/ScanModal.vue +153 -0
- package/components/TranslationHistoryModal.vue +66 -0
- package/components/TranslationRow.vue +541 -0
- package/components/dashboard/WidgetConfigModal.vue +121 -0
- package/components/dashboard/WidgetGrid.vue +190 -0
- package/components/dashboard/WidgetPicker.vue +75 -0
- package/components/dashboard/widgets/ActivityWidget.vue +109 -0
- package/components/dashboard/widgets/LanguagesCoverageWidget.vue +104 -0
- package/components/dashboard/widgets/ProjectsWidget.vue +77 -0
- package/components/dashboard/widgets/ReviewWidget.vue +150 -0
- package/components/dashboard/widgets/StatWidget.vue +133 -0
- package/composables/useAuth.ts +72 -0
- package/composables/useConfig.ts +14 -0
- package/composables/useDashboard.ts +89 -0
- package/composables/useFormats.ts +100 -0
- package/composables/useKeys.ts +231 -0
- package/composables/useLanguages.ts +221 -0
- package/composables/useProfile.ts +76 -0
- package/composables/useProject.ts +180 -0
- package/composables/useReview.ts +94 -0
- package/composables/useSettings.ts +30 -0
- package/composables/useStats.ts +16 -0
- package/composables/useT.ts +38 -0
- package/composables/useUsers.ts +101 -0
- package/composables/useWidgetData.ts +50 -0
- package/consts/commons.const.ts +6 -0
- package/consts/dashboard.const.ts +94 -0
- package/consts/languages.const.ts +223 -0
- package/enums/commons.enum.ts +7 -0
- package/i18n-dashboard.config.example.js +40 -0
- package/interfaces/commons.interface.ts +23 -0
- package/interfaces/job.interface.ts +10 -0
- package/interfaces/key.interface.ts +39 -0
- package/interfaces/languages.interface.ts +23 -0
- package/interfaces/project.interface.ts +9 -0
- package/interfaces/scan.interface.ts +12 -0
- package/interfaces/settings.interface.ts +4 -0
- package/interfaces/stat.interface.ts +30 -0
- package/interfaces/translation.interface.ts +11 -0
- package/interfaces/user.interface.ts +24 -0
- package/layouts/auth.vue +5 -0
- package/layouts/default.vue +327 -0
- package/middleware/auth.global.ts +26 -0
- package/nuxt.config.ts +66 -0
- package/package.json +89 -0
- package/pages/index.vue +5 -0
- package/pages/login.vue +74 -0
- package/pages/onboarding.vue +563 -0
- package/pages/projects/[id]/formats/datetime.vue +240 -0
- package/pages/projects/[id]/formats/modifiers.vue +194 -0
- package/pages/projects/[id]/formats/number.vue +250 -0
- package/pages/projects/[id]/index.vue +182 -0
- package/pages/projects/[id]/languages.vue +537 -0
- package/pages/projects/[id]/review.vue +109 -0
- package/pages/projects/[id]/settings.vue +515 -0
- package/pages/projects/[id]/translations/[keyId].vue +642 -0
- package/pages/projects/[id]/translations/index.vue +250 -0
- package/pages/projects/[id]/users.vue +276 -0
- package/pages/projects/index.vue +334 -0
- package/pages/users/[id]/profile.vue +421 -0
- package/pages/users/index.vue +345 -0
- package/plugins/loading.client.ts +3 -0
- package/plugins/ui-i18n.ts +6 -0
- package/server/api/auth/login.post.ts +28 -0
- package/server/api/auth/logout.post.ts +7 -0
- package/server/api/auth/me.get.ts +11 -0
- package/server/api/auth/me.put.ts +31 -0
- package/server/api/auth/password.put.ts +27 -0
- package/server/api/auth/status.get.ts +16 -0
- package/server/api/config.get.ts +10 -0
- package/server/api/dashboard/layout.get.ts +18 -0
- package/server/api/dashboard/layout.post.ts +18 -0
- package/server/api/db-config.get.ts +44 -0
- package/server/api/db-config.post.ts +73 -0
- package/server/api/export.get.ts +64 -0
- package/server/api/formats/datetime/[id].delete.ts +8 -0
- package/server/api/formats/datetime/[id].put.ts +15 -0
- package/server/api/formats/datetime.get.ts +11 -0
- package/server/api/formats/datetime.post.ts +16 -0
- package/server/api/formats/modifiers/[id].delete.ts +8 -0
- package/server/api/formats/modifiers/[id].put.ts +10 -0
- package/server/api/formats/modifiers.get.ts +10 -0
- package/server/api/formats/modifiers.post.ts +14 -0
- package/server/api/formats/number/[id].delete.ts +8 -0
- package/server/api/formats/number/[id].put.ts +15 -0
- package/server/api/formats/number.get.ts +11 -0
- package/server/api/formats/number.post.ts +16 -0
- package/server/api/formats/snippet.get.ts +87 -0
- package/server/api/fs/browse.get.ts +50 -0
- package/server/api/history/[translationId].get.ts +13 -0
- package/server/api/keys/[id].delete.ts +14 -0
- package/server/api/keys/[id].get.ts +41 -0
- package/server/api/keys/[id].patch.ts +20 -0
- package/server/api/keys/index.get.ts +98 -0
- package/server/api/keys/index.post.ts +17 -0
- package/server/api/languages/[code].delete.ts +15 -0
- package/server/api/languages/[id].put.ts +24 -0
- package/server/api/languages/index.get.ts +13 -0
- package/server/api/languages/index.post.ts +42 -0
- package/server/api/onboarding.post.ts +56 -0
- package/server/api/profile.get.ts +81 -0
- package/server/api/project-snapshot.get.ts +73 -0
- package/server/api/project-snapshot.post.ts +160 -0
- package/server/api/projects/[id].delete.ts +13 -0
- package/server/api/projects/[id].put.ts +40 -0
- package/server/api/projects/index.get.ts +19 -0
- package/server/api/projects/index.post.ts +34 -0
- package/server/api/scan.post.ts +165 -0
- package/server/api/settings/index.get.ts +9 -0
- package/server/api/settings/index.post.ts +20 -0
- package/server/api/setup.post.ts +39 -0
- package/server/api/stats/global.get.ts +126 -0
- package/server/api/stats.get.ts +70 -0
- package/server/api/sync.post.ts +179 -0
- package/server/api/translate.post.ts +52 -0
- package/server/api/translations/batch-translate.post.ts +121 -0
- package/server/api/translations/bulk-status.post.ts +24 -0
- package/server/api/translations/index.post.ts +62 -0
- package/server/api/translations/job/[id].get.ts +23 -0
- package/server/api/translations/status.post.ts +30 -0
- package/server/api/translations/translate-all.post.ts +18 -0
- package/server/api/ui-locale.get.ts +39 -0
- package/server/api/users/[id]/profile.get.ts +107 -0
- package/server/api/users/[id]/roles.put.ts +67 -0
- package/server/api/users/[id].delete.ts +36 -0
- package/server/api/users/[id].put.ts +43 -0
- package/server/api/users/index.get.ts +49 -0
- package/server/api/users/index.post.ts +89 -0
- package/server/consts/auto-translate.const.ts +2 -0
- package/server/consts/commons.const.ts +10 -0
- package/server/consts/db.const.ts +3 -0
- package/server/consts/scanner.const.ts +4 -0
- package/server/consts/translation-job.const.ts +8 -0
- package/server/db/index.ts +672 -0
- package/server/enums/auth.enum.ts +5 -0
- package/server/enums/translation.enum.ts +6 -0
- package/server/interfaces/profile.interface.ts +48 -0
- package/server/interfaces/project-config.interface.ts +9 -0
- package/server/interfaces/scanner.interface.ts +18 -0
- package/server/interfaces/translation-job.interface.ts +13 -0
- package/server/middleware/auth.ts +32 -0
- package/server/plugins/db.ts +6 -0
- package/server/routes/locale/[lang].get.ts +179 -0
- package/server/types/auth.type.ts +3 -0
- package/server/utils/auth.util.ts +89 -0
- package/server/utils/auto-translate.util.ts +112 -0
- package/server/utils/lang-api.util.ts +24 -0
- package/server/utils/mailer.util.ts +80 -0
- package/server/utils/project-config.util.ts +37 -0
- package/server/utils/scanner.uti.ts +307 -0
- package/server/utils/translation-job.util.ts +142 -0
- package/services/auth.service.ts +31 -0
- package/services/base.service.ts +140 -0
- package/services/job.service.ts +10 -0
- package/services/key.service.ts +26 -0
- package/services/language.service.ts +26 -0
- package/services/profile.service.ts +14 -0
- package/services/project.service.ts +23 -0
- package/services/scan.service.ts +14 -0
- package/services/settings.service.ts +14 -0
- package/services/stats.service.ts +11 -0
- package/services/translation.service.ts +36 -0
- package/services/user.service.ts +28 -0
- package/tsconfig.json +3 -0
- package/types/commons.type.ts +3 -0
- package/types/dashboard.type.ts +26 -0
- package/utils/config.util.ts +60 -0
package/app.vue
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "@nuxt/ui";
|
|
3
|
+
|
|
4
|
+
/* ── Page transitions ─────────────────────────────────────────────────────── */
|
|
5
|
+
.page-enter-active {
|
|
6
|
+
transition: opacity 0.18s ease, transform 0.18s ease;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.page-leave-active {
|
|
10
|
+
transition: opacity 0.12s ease, transform 0.12s ease;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.page-enter-from {
|
|
14
|
+
opacity: 0;
|
|
15
|
+
transform: translateY(8px);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.page-leave-to {
|
|
19
|
+
opacity: 0;
|
|
20
|
+
transform: translateY(-4px);
|
|
21
|
+
}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
{
|
|
2
|
+
"nav.dashboard": "Dashboard",
|
|
3
|
+
"nav.translations": "Translations",
|
|
4
|
+
"nav.unused": "Unused",
|
|
5
|
+
"nav.languages": "Languages",
|
|
6
|
+
"nav.review": "Review",
|
|
7
|
+
"nav.settings": "Settings",
|
|
8
|
+
"nav.users": "Users",
|
|
9
|
+
"nav.projects": "Projects",
|
|
10
|
+
"nav.all_projects": "All projects",
|
|
11
|
+
"nav.administration": "Administration",
|
|
12
|
+
"nav.format_numbers": "Number formats",
|
|
13
|
+
"nav.format_dates": "Date formats",
|
|
14
|
+
"nav.modifiers": "Modifiers",
|
|
15
|
+
"sidebar.project_label": "PROJECT",
|
|
16
|
+
"sidebar.no_project": "No project configured",
|
|
17
|
+
"sidebar.add_project": "Add a project",
|
|
18
|
+
"sidebar.manage_projects": "Manage projects",
|
|
19
|
+
"sidebar.scan": "Scan project",
|
|
20
|
+
"sidebar.sync": "Sync JSON",
|
|
21
|
+
"sidebar.no_project_selected": "Select a project to get started",
|
|
22
|
+
"sidebar.theme": "Theme",
|
|
23
|
+
"sidebar.ui_lang": "UI Language",
|
|
24
|
+
"sidebar.scan_disabled_hint": "Requires a local path to be configured",
|
|
25
|
+
"sidebar.sync_disabled_hint": "Requires a local path or a remote URL",
|
|
26
|
+
"project.none_selected": "No project selected",
|
|
27
|
+
"project.none_selected_hint": "Add your Vue.js project to start managing your translations.",
|
|
28
|
+
"project.add_button": "Add a project",
|
|
29
|
+
"user.super_admin": "Super Admin",
|
|
30
|
+
"user.role_user": "User",
|
|
31
|
+
"user.change_password": "Change password",
|
|
32
|
+
"user.logout": "Log out",
|
|
33
|
+
"user.profile": "My profile",
|
|
34
|
+
"user.change_password_title": "Change password",
|
|
35
|
+
"user.current_password": "Current password",
|
|
36
|
+
"user.new_password": "New password",
|
|
37
|
+
"user.confirm_password": "Confirm",
|
|
38
|
+
"user.password_hint": "Minimum 8 characters",
|
|
39
|
+
"user.save_password": "Save",
|
|
40
|
+
"user.password_changed": "Password changed",
|
|
41
|
+
"user.passwords_mismatch": "Passwords do not match",
|
|
42
|
+
"translations.title": "Translations",
|
|
43
|
+
"translations.keys_count": "keys",
|
|
44
|
+
"translations.langs_count": "languages",
|
|
45
|
+
"translations.search": "Search for a key...",
|
|
46
|
+
"translations.add_key": "New key",
|
|
47
|
+
"translations.translate_all": "Translate all",
|
|
48
|
+
"translations.no_results": "No keys found",
|
|
49
|
+
"translations.no_results_hint": "Try a different search term.",
|
|
50
|
+
"translations.add_description": "Add a description…",
|
|
51
|
+
"translations.click_to_add": "Click to add…",
|
|
52
|
+
"translations.save": "Save",
|
|
53
|
+
"translations.cancel": "Cancel",
|
|
54
|
+
"translations.add_key_title": "New translation key",
|
|
55
|
+
"translations.key_label": "Key",
|
|
56
|
+
"translations.key_hint": "Example: home.title or nav.menu.about",
|
|
57
|
+
"translations.description_label": "Description",
|
|
58
|
+
"translations.description_hint": "Context for translators",
|
|
59
|
+
"translations.create": "Create",
|
|
60
|
+
"translations.delete_key": "Delete key",
|
|
61
|
+
"translations.key_deleted": "Key deleted",
|
|
62
|
+
"translations.history": "History",
|
|
63
|
+
"translations.history_by_lang": "History by language",
|
|
64
|
+
"translations.reference": "reference",
|
|
65
|
+
"translations.references": "references",
|
|
66
|
+
"translations.unused_tooltip": "Key not found in source code",
|
|
67
|
+
"translations.insert_plural_sep": "Insert a plural form separator | (e.g. car | cars)",
|
|
68
|
+
"translations.translate_to": "Translate to",
|
|
69
|
+
"translations.no_source": "No source available",
|
|
70
|
+
"translations.translated": "Translated",
|
|
71
|
+
"translations.translate_error": "Google Translate error",
|
|
72
|
+
"translations.status_missing": "Missing — click to add",
|
|
73
|
+
"translations.status_draft_approver": "Draft — click to mark as reviewed",
|
|
74
|
+
"translations.status_draft_translator": "Draft — click to mark as reviewed",
|
|
75
|
+
"translations.status_reviewed_approver": "Reviewed — click to approve",
|
|
76
|
+
"translations.status_reviewed_translator": "Reviewed (approval reserved for moderators)",
|
|
77
|
+
"translations.status_approved_approver": "Approved — click to revert to draft",
|
|
78
|
+
"translations.status_approved": "Approved",
|
|
79
|
+
"translations.line": "line",
|
|
80
|
+
"translations.delete_key_confirm": "Are you sure you want to delete this key?",
|
|
81
|
+
"translations.delete_key_warning": "This will permanently remove the key and all its translations.",
|
|
82
|
+
"status.all": "All",
|
|
83
|
+
"status.draft": "Draft",
|
|
84
|
+
"status.reviewed": "Reviewed",
|
|
85
|
+
"status.approved": "Approved",
|
|
86
|
+
"status.rejected": "Rejected",
|
|
87
|
+
"status.missing": "Missing",
|
|
88
|
+
"status.unused": "Unused",
|
|
89
|
+
"review.title": "Review queue",
|
|
90
|
+
"review.approve_all": "Approve all",
|
|
91
|
+
"review.empty_title": "No translations pending",
|
|
92
|
+
"review.empty_hint": "All reviewed translations have already been approved.",
|
|
93
|
+
"review.approve": "Approve",
|
|
94
|
+
"review.back_to_draft": "Back to draft",
|
|
95
|
+
"review.approved_toast": "Approved",
|
|
96
|
+
"review.pending_count": "{count} translation pending review",
|
|
97
|
+
"review.pending_count_plural": "{count} translations pending review",
|
|
98
|
+
"review.pending_label": "pending review",
|
|
99
|
+
"review.mark_all_reviewed": "Mark all as reviewed",
|
|
100
|
+
"review.reject": "Reject",
|
|
101
|
+
"review.mark_reviewed": "Mark as reviewed",
|
|
102
|
+
"languages.title": "Languages",
|
|
103
|
+
"languages.subtitle": "Manage project languages",
|
|
104
|
+
"languages.add": "Add a language",
|
|
105
|
+
"languages.none": "No language configured",
|
|
106
|
+
"languages.none_hint": "Add languages to start translating.",
|
|
107
|
+
"languages.default_badge": "Default",
|
|
108
|
+
"settings.title": "Settings",
|
|
109
|
+
"settings.save": "Save",
|
|
110
|
+
"settings.root_path": "Root path",
|
|
111
|
+
"settings.locales_folder": "Locales folder",
|
|
112
|
+
"key.params_label": "Params:",
|
|
113
|
+
"key.escapes_label": "Escapes:",
|
|
114
|
+
"key.modifiers_label": "Modifiers:",
|
|
115
|
+
"key.escape_at": "@ → {'@'} — prevents link interpretation",
|
|
116
|
+
"key.escape_open_brace": "{ → {'{'} — prevents interpolation opening",
|
|
117
|
+
"key.escape_close_brace": "} → {'}'} — prevents interpolation closing",
|
|
118
|
+
"key.escape_dollar": "$ → {'$'} — prevents modifier interpretation",
|
|
119
|
+
"key.escape_pipe": "| → {'|'} — literal pipe (≠ plural separator)",
|
|
120
|
+
"key.escape_backslash_open": "\\{ — backslash escape (v11.3+), alternative to {'{'} ",
|
|
121
|
+
"key.escape_backslash_close": "\\} — backslash escape (v11.3+), alternative to {'}'}",
|
|
122
|
+
"key.escape_backslash_at": "\\@ — backslash escape (v11.3+), alternative to {'@'}",
|
|
123
|
+
"key.escape_backslash": "\\\\ — literal backslash",
|
|
124
|
+
"key.modifier_simple": "@:key — inserts the value as-is",
|
|
125
|
+
"key.modifier_lower": "@.lower:key — converts to lowercase",
|
|
126
|
+
"key.modifier_upper": "@.upper:key — converts to UPPERCASE",
|
|
127
|
+
"key.modifier_capitalize": "@.capitalize:key — capitalizes first letter",
|
|
128
|
+
"key.back_to_simple": "Back to simple text",
|
|
129
|
+
"key.switch_to_plural": "Switch to plural mode",
|
|
130
|
+
"key.forms": "forms",
|
|
131
|
+
"key.plural": "Plural",
|
|
132
|
+
"key.plural_forms": "plural forms",
|
|
133
|
+
"key.link_key_tooltip": "Link a key (@:key) with optional modifier",
|
|
134
|
+
"key.link_key_title": "Link a key",
|
|
135
|
+
"key.link_modifier_label": "Render modifier",
|
|
136
|
+
"key.generated_syntax": "Generated syntax:",
|
|
137
|
+
"key.search_placeholder": "Search for a key...",
|
|
138
|
+
"key.none_found": "No key found",
|
|
139
|
+
"key.key_placeholder": "key",
|
|
140
|
+
"plural.template_title": "Pluralization template",
|
|
141
|
+
"plural.forms": "forms",
|
|
142
|
+
"plural.implicit_params_title": "Implicit parameters:",
|
|
143
|
+
"plural.and": "and",
|
|
144
|
+
"plural.implicit_params_hint": "are automatically available in any pluralized key — you don't need to pass them explicitly.",
|
|
145
|
+
"plural.forms_title": "Forms",
|
|
146
|
+
"plural.remove": "Remove",
|
|
147
|
+
"plural.add_form": "Add a form",
|
|
148
|
+
"plural.empty": "empty",
|
|
149
|
+
"plural.selection_rule": "Selection rule: English rule by default (count=1 → form [1] for 2 forms, count=0 → [0], count=1 → [1], count≥2 → [2] for 3 forms).",
|
|
150
|
+
"plural.raw_value": "Raw value:",
|
|
151
|
+
"plural.tpl_2_standard": "2 forms — standard",
|
|
152
|
+
"plural.tpl_2_langs": "English, German, Dutch…",
|
|
153
|
+
"plural.tpl_3_zero": "3 forms — zero / one / many",
|
|
154
|
+
"plural.tpl_3_langs": "French, Spanish, Italian…",
|
|
155
|
+
"plural.tpl_4_slavic": "4 forms — Slavic languages",
|
|
156
|
+
"plural.tpl_4_langs": "Russian, Polish, Ukrainian…",
|
|
157
|
+
"plural.tpl_custom": "Custom",
|
|
158
|
+
"plural.tpl_custom_hint": "Define your own forms",
|
|
159
|
+
"plural.tpl_custom_preview": "form 1 | form 2 | …",
|
|
160
|
+
"plural.singular": "singular",
|
|
161
|
+
"plural.plural_form": "plural",
|
|
162
|
+
"plural.zero": "zero",
|
|
163
|
+
"plural.few": "few",
|
|
164
|
+
"plural.form": "form",
|
|
165
|
+
"plural.others": "others",
|
|
166
|
+
"formats.preview": "Preview",
|
|
167
|
+
"formats.number_title": "Number formats",
|
|
168
|
+
"formats.datetime_title": "Date & time formats",
|
|
169
|
+
"formats.modifiers_title": "Modifiers",
|
|
170
|
+
"users.title": "Users",
|
|
171
|
+
"users.subtitle": "Manage dashboard access",
|
|
172
|
+
"users.all_title": "All users",
|
|
173
|
+
"users.add": "Add a user",
|
|
174
|
+
"users.none": "No users",
|
|
175
|
+
"users.never_connected": "Never logged in",
|
|
176
|
+
"users.role_translator": "Translator",
|
|
177
|
+
"users.role_moderator": "Moderator",
|
|
178
|
+
"users.role_admin": "Admin",
|
|
179
|
+
"users.inactive": "Inactive",
|
|
180
|
+
"users.no_role": "No role",
|
|
181
|
+
"users.project_members": "Project members",
|
|
182
|
+
"users.none_in_project": "No members in this project",
|
|
183
|
+
"users.add_user_title": "Add a user",
|
|
184
|
+
"users.full_name": "Full name",
|
|
185
|
+
"users.role_label": "Role",
|
|
186
|
+
"users.project_label": "Project",
|
|
187
|
+
"users.temp_password_info": "A temporary password will be generated. Share it with the user so they can log in and change it.",
|
|
188
|
+
"users.temp_password_label": "Temporary password",
|
|
189
|
+
"users.edit_role_title": "Edit role",
|
|
190
|
+
"users.role_in_project": "Role in this project",
|
|
191
|
+
"users.remove_user_title": "Remove user",
|
|
192
|
+
"users.remove_confirm": "Are you sure you want to remove this user from the project?",
|
|
193
|
+
"users.remove_from_project": "Remove from project",
|
|
194
|
+
"users.remove_account_kept": "The account will be kept, only the project access will be removed.",
|
|
195
|
+
"users.remove_btn": "Remove",
|
|
196
|
+
"users.edit_role": "Edit role",
|
|
197
|
+
"users.deactivate": "Deactivate",
|
|
198
|
+
"users.reactivate": "Reactivate",
|
|
199
|
+
"users.remove_from_project_action": "Remove from project",
|
|
200
|
+
"users.global_access": "Global access",
|
|
201
|
+
"users.global_access_label": "Global access",
|
|
202
|
+
"users.project_access_label": "Project access",
|
|
203
|
+
"users.manage_access_title": "Manage access",
|
|
204
|
+
"users.manage_access": "Manage access",
|
|
205
|
+
"users.delete_user_title": "Delete user",
|
|
206
|
+
"users.delete_confirm": "Are you sure you want to delete this user?",
|
|
207
|
+
"users.delete_warning": "This action is irreversible. The account and all associated data will be permanently deleted.",
|
|
208
|
+
"users.global_access_all": "All projects",
|
|
209
|
+
"users.no_access": "No access",
|
|
210
|
+
"projects.subtitle": "Manage your translation projects",
|
|
211
|
+
"projects.add": "Add a project",
|
|
212
|
+
"projects.none": "No project",
|
|
213
|
+
"projects.none_hint": "Start by adding your first translation project.",
|
|
214
|
+
"projects.add_first": "Add my first project",
|
|
215
|
+
"projects.keys_stat": "keys",
|
|
216
|
+
"projects.separator": "separator",
|
|
217
|
+
"projects.scan_requires_local": "Requires a local path",
|
|
218
|
+
"projects.scan_tooltip": "Scan source files to detect translation keys",
|
|
219
|
+
"projects.sync_requires_source": "Requires a local path or remote URL",
|
|
220
|
+
"projects.sync_tooltip": "Import locale JSON files into the database",
|
|
221
|
+
"projects.open": "Open",
|
|
222
|
+
"projects.edit_modal_title": "Edit project",
|
|
223
|
+
"projects.add_modal_title": "Add a project",
|
|
224
|
+
"projects.name_label": "Project name",
|
|
225
|
+
"projects.name_placeholder": "My project",
|
|
226
|
+
"projects.source_title": "Source",
|
|
227
|
+
"projects.local_path_hint": "Absolute path to the project root on your file system",
|
|
228
|
+
"projects.local_path_label": "Local path",
|
|
229
|
+
"projects.remote_url_hint": "URL of the repository or locale files (optional)",
|
|
230
|
+
"projects.remote_url_label": "Remote URL",
|
|
231
|
+
"projects.no_source_warning": "No source configured. Sync and scan will be unavailable.",
|
|
232
|
+
"projects.local_active": "Local path active",
|
|
233
|
+
"projects.remote_active": "Remote URL active",
|
|
234
|
+
"projects.both_active": "Local + Remote active",
|
|
235
|
+
"projects.locales_path_hint": "Relative path from root to locale files folder",
|
|
236
|
+
"projects.locales_path_label": "Locales folder",
|
|
237
|
+
"projects.key_separator_label": "Key separator",
|
|
238
|
+
"projects.color_label": "Color",
|
|
239
|
+
"projects.description_placeholder": "Short description…",
|
|
240
|
+
"projects.locales_path_preview": "Preview:",
|
|
241
|
+
"projects.delete_title": "Delete project",
|
|
242
|
+
"projects.delete_confirm": "Are you sure you want to delete this project?",
|
|
243
|
+
"projects.delete_warning": "All keys, translations and languages will be permanently deleted.",
|
|
244
|
+
"projects.color_blue": "Blue",
|
|
245
|
+
"projects.color_green": "Green",
|
|
246
|
+
"projects.color_orange": "Orange",
|
|
247
|
+
"projects.color_red": "Red",
|
|
248
|
+
"projects.color_purple": "Purple",
|
|
249
|
+
"projects.color_pink": "Pink",
|
|
250
|
+
"projects.color_yellow": "Yellow",
|
|
251
|
+
"projects.color_gray": "Gray",
|
|
252
|
+
"profile.member_since": "Member since",
|
|
253
|
+
"profile.last_login": "Last login",
|
|
254
|
+
"profile.edit_account": "Edit account",
|
|
255
|
+
"profile.projects_roles": "Projects & roles",
|
|
256
|
+
"profile.no_roles": "No role assigned",
|
|
257
|
+
"profile.no_languages": "No languages",
|
|
258
|
+
"profile.no_translations": "No translations yet",
|
|
259
|
+
"profile.not_found": "User not found",
|
|
260
|
+
"profile.back": "Back",
|
|
261
|
+
"profile.edit_modal_title": "Edit account",
|
|
262
|
+
"profile.name_label": "Full name",
|
|
263
|
+
"profile.name_placeholder": "John Doe",
|
|
264
|
+
"profile.total_translations": "Total translations",
|
|
265
|
+
"profile.this_month": "This month",
|
|
266
|
+
"profile.this_week": "This week",
|
|
267
|
+
"profile.general": "General",
|
|
268
|
+
"profile.name_email_required": "Name and email are required",
|
|
269
|
+
"dashboard.title": "Dashboard",
|
|
270
|
+
"dashboard.hello": "Hello",
|
|
271
|
+
"dashboard.total_keys": "total keys",
|
|
272
|
+
"dashboard.unused_keys": "unused keys",
|
|
273
|
+
"dashboard.coverage": "coverage",
|
|
274
|
+
"dashboard.recent_activity": "Recent activity",
|
|
275
|
+
"dashboard.no_activity": "No recent activity",
|
|
276
|
+
"dashboard.add_widget": "Add a widget",
|
|
277
|
+
"dashboard.configure_widget": "Configure widget",
|
|
278
|
+
"dashboard.data_source": "Data source",
|
|
279
|
+
"dashboard.specific_project": "Specific project",
|
|
280
|
+
"dashboard.select_project": "Select a project",
|
|
281
|
+
"dashboard.custom_title": "Custom title",
|
|
282
|
+
"dashboard.default_title": "Default title",
|
|
283
|
+
"dashboard.edit": "Edit",
|
|
284
|
+
"dashboard.done": "Done",
|
|
285
|
+
"dashboard.no_widgets": "No widgets",
|
|
286
|
+
"dashboard.stat_total_keys": "Total keys",
|
|
287
|
+
"dashboard.stat_coverage": "Coverage",
|
|
288
|
+
"dashboard.stat_languages": "Languages",
|
|
289
|
+
"dashboard.stat_unused": "Unused",
|
|
290
|
+
"dashboard.languages_coverage": "Language coverage",
|
|
291
|
+
"dashboard.no_languages": "No language configured",
|
|
292
|
+
"dashboard.missing": "missing",
|
|
293
|
+
"common.cancel": "Cancel",
|
|
294
|
+
"common.save": "Save",
|
|
295
|
+
"common.delete": "Delete",
|
|
296
|
+
"common.add": "Add",
|
|
297
|
+
"common.edit": "Edit",
|
|
298
|
+
"common.error": "Error",
|
|
299
|
+
"common.close": "Close",
|
|
300
|
+
"common.copied": "Copied!",
|
|
301
|
+
"common.create": "Create",
|
|
302
|
+
"common.or": "or",
|
|
303
|
+
"common.irreversible": "This action is irreversible.",
|
|
304
|
+
"common.just_now": "just now",
|
|
305
|
+
"common.ago": "ago",
|
|
306
|
+
"login.title": "Log in",
|
|
307
|
+
"login.email": "Email",
|
|
308
|
+
"login.password": "Password",
|
|
309
|
+
"login.submit": "Sign in",
|
|
310
|
+
"login.error": "Invalid credentials",
|
|
311
|
+
"setup.title": "Initial setup",
|
|
312
|
+
"setup.submit": "Create administrator account",
|
|
313
|
+
"onboarding.title": "Welcome to i18n Dashboard",
|
|
314
|
+
"onboarding.subtitle": "Let's set up your workspace in a few steps",
|
|
315
|
+
"onboarding.step_admin": "Admin account",
|
|
316
|
+
"onboarding.step_languages": "Interface languages",
|
|
317
|
+
"onboarding.step_project": "First project",
|
|
318
|
+
"onboarding.step_done": "Done",
|
|
319
|
+
"onboarding.admin_done": "Administrator account created successfully.",
|
|
320
|
+
"onboarding.languages_title": "Interface languages",
|
|
321
|
+
"onboarding.languages_hint": "Select the languages available for the dashboard interface. Translators will be able to work in their own language.",
|
|
322
|
+
"onboarding.languages_search": "Search for a language...",
|
|
323
|
+
"onboarding.languages_selected": "language(s) selected",
|
|
324
|
+
"onboarding.languages_default": "Default language",
|
|
325
|
+
"onboarding.project_title": "Your first project",
|
|
326
|
+
"onboarding.project_hint": "Configure the Vue.js project you want to manage. You can add more later.",
|
|
327
|
+
"onboarding.project_skip": "Skip this step",
|
|
328
|
+
"onboarding.done_title": "All set!",
|
|
329
|
+
"onboarding.done_hint": "Your dashboard is configured. You can now manage your translations.",
|
|
330
|
+
"onboarding.go_to_dashboard": "Go to dashboard",
|
|
331
|
+
"onboarding.next": "Next",
|
|
332
|
+
"onboarding.previous": "Previous",
|
|
333
|
+
"onboarding.finish": "Finish",
|
|
334
|
+
"onboarding.create_admin_hint": "This account will have full access to the dashboard.",
|
|
335
|
+
"onboarding.super_admin_role": "Super admin",
|
|
336
|
+
"onboarding.create_admin_hint2": "You can create additional users later.",
|
|
337
|
+
"onboarding.langs_will_be_translated": "Selected languages will be available for the dashboard interface.",
|
|
338
|
+
"onboarding.translating_in_progress": "Translation in progress…",
|
|
339
|
+
"onboarding.confirm_password": "Confirm password",
|
|
340
|
+
"onboarding.db_create_file_error": "Could not create database file.",
|
|
341
|
+
"onboarding.all_fields_required": "All fields are required.",
|
|
342
|
+
"onboarding.password_min_length": "Password must be at least 8 characters.",
|
|
343
|
+
"onboarding.passwords_mismatch": "Passwords do not match.",
|
|
344
|
+
"onboarding.admin_creation_error": "Error creating administrator account.",
|
|
345
|
+
"onboarding.project_name_path_required": "Project name and path are required.",
|
|
346
|
+
"onboarding.project_creation_error": "Error creating project.",
|
|
347
|
+
"settings.snapshot_title": "Project snapshot",
|
|
348
|
+
"settings.snapshot_hint": "Export a complete snapshot of this project (config, languages, all translation keys and values) as a single JSON file. Import it on any other instance to restore.",
|
|
349
|
+
"settings.snapshot_export": "Export snapshot",
|
|
350
|
+
"settings.snapshot_export_hint": "Full backup: config + languages + all keys",
|
|
351
|
+
"settings.snapshot_export_btn": "Export",
|
|
352
|
+
"settings.snapshot_import": "Import snapshot",
|
|
353
|
+
"settings.snapshot_import_hint": "Merge or replace the current project with an exported snapshot",
|
|
354
|
+
"settings.snapshot_import_btn": "Import",
|
|
355
|
+
"settings.snapshot_mode_merge": "Merge",
|
|
356
|
+
"settings.snapshot_mode_replace": "Replace",
|
|
357
|
+
"settings.snapshot_replace_warning": "Replace mode: all existing keys and translations will be deleted before import.",
|
|
358
|
+
"settings.snapshot_parse_error": "Invalid JSON file",
|
|
359
|
+
"settings.snapshot_import_success": "Snapshot imported",
|
|
360
|
+
"settings.snapshot_import_error": "Import failed",
|
|
361
|
+
"pathpicker.title": "Select a folder",
|
|
362
|
+
"pathpicker.empty": "No subfolder",
|
|
363
|
+
"pathpicker.select": "Select this folder",
|
|
364
|
+
"scan.modal_title": "Scan project",
|
|
365
|
+
"scan.mode_local": "Local",
|
|
366
|
+
"scan.mode_url": "Via URL",
|
|
367
|
+
"scan.local_hint": "Select the root folder of your Vue.js project. The scanner will detect all $t(), t(), <i18n-t> and v-t usages.",
|
|
368
|
+
"scan.local_path_label": "Project root folder",
|
|
369
|
+
"scan.url_hint": "Enter the base URL of your app. The scanner will fetch each configured locale file (en.json, fr.json…) and import all keys.",
|
|
370
|
+
"scan.url_label": "Base URL",
|
|
371
|
+
"scan.url_hint2": "Example: https://my-app.com",
|
|
372
|
+
"scan.url_no_langs": "No languages configured yet. Add languages first so the scanner knows which locale files to fetch.",
|
|
373
|
+
"scan.results": "Results",
|
|
374
|
+
"scan.keys_found": "keys found",
|
|
375
|
+
"scan.keys_added": "new keys",
|
|
376
|
+
"scan.unused": "unused",
|
|
377
|
+
"scan.files_scanned": "files scanned",
|
|
378
|
+
"scan.errors": "errors",
|
|
379
|
+
"scan.run": "Scan"
|
|
380
|
+
}
|