@unbrained/pm-web 2026.7.17-1 → 2026.7.17
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/app.d.ts +1 -15
- package/dist/app.js +1 -15
- package/dist/app.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/public/index.html +28 -32
- package/public/src/app.js +0 -14
- package/public/src/app.js.map +1 -1
- package/public/src/app.ts +0 -15
- package/public/src/components/modals.js +3 -5
- package/public/src/components/modals.js.map +1 -1
- package/public/src/components/modals.ts +3 -6
- package/public/src/sw.ts +0 -3
- package/public/src/views/auth.js +7 -8
- package/public/src/views/auth.js.map +1 -1
- package/public/src/views/auth.ts +7 -8
- package/public/src/views/settings.js +48 -73
- package/public/src/views/settings.js.map +1 -1
- package/public/src/views/settings.ts +48 -77
- package/public/sw.js +0 -3
- package/public/src/i18n/de.json +0 -117
- package/public/src/i18n/en.json +0 -117
- package/public/src/i18n/es.json +0 -117
- package/public/src/i18n/zh.json +0 -117
- package/public/src/i18n.js +0 -287
- package/public/src/i18n.js.map +0 -1
- package/public/src/i18n.ts +0 -306
|
@@ -6,7 +6,6 @@ import { api } from '../api.js';
|
|
|
6
6
|
import { escHtml } from '../utils.js';
|
|
7
7
|
import { toast } from '../components/toast.js';
|
|
8
8
|
import { confirmDialog } from '../components/modals.js';
|
|
9
|
-
import { t, translateError, localeDate, getLocale, SUPPORTED_LOCALES, type SupportedLocale } from '../i18n.js';
|
|
10
9
|
|
|
11
10
|
function avatarInitial(name: string): string {
|
|
12
11
|
return (name.trim()[0] || '?').toUpperCase();
|
|
@@ -19,45 +18,20 @@ function avatarBg(seed: string): string {
|
|
|
19
18
|
return `hsl(${hue},55%,45%)`;
|
|
20
19
|
}
|
|
21
20
|
|
|
22
|
-
/** Compile-time-complete mapping from supported locale → settings label key. */
|
|
23
|
-
const LOCALE_LABEL_KEYS: Record<SupportedLocale, string> = {
|
|
24
|
-
en: 'settings.languageEn',
|
|
25
|
-
de: 'settings.languageDe',
|
|
26
|
-
es: 'settings.languageEs',
|
|
27
|
-
zh: 'settings.languageZh',
|
|
28
|
-
};
|
|
29
|
-
|
|
30
21
|
export function renderSettingsView(): void {
|
|
31
22
|
const el = document.getElementById('content-settings');
|
|
32
23
|
if (!el) return;
|
|
33
24
|
const u = state.user || ({} as any);
|
|
34
25
|
const createdInfo = u.created_at
|
|
35
|
-
? `<span style="display:block;margin-top:4px;font-size:12px;color:var(--text-muted)"
|
|
26
|
+
? `<span style="display:block;margin-top:4px;font-size:12px;color:var(--text-muted)">Account created ${new Date(u.created_at).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}</span>`
|
|
36
27
|
: '';
|
|
37
|
-
const currentLocale = getLocale();
|
|
38
|
-
const langOptions = SUPPORTED_LOCALES.map((loc) => {
|
|
39
|
-
const label = t(LOCALE_LABEL_KEYS[loc]);
|
|
40
|
-
return `<option value="${loc}"${loc === currentLocale ? ' selected' : ''}>${escHtml(label)}</option>`;
|
|
41
|
-
}).join('');
|
|
42
28
|
el.innerHTML = `
|
|
43
29
|
<div class="page-header">
|
|
44
|
-
<div><div class="page-title"
|
|
30
|
+
<div><div class="page-title">Settings</div><div class="page-subtitle">Manage your profile and account</div></div>
|
|
45
31
|
</div>
|
|
46
32
|
<div style="max-width:560px;display:flex;flex-direction:column;gap:20px">
|
|
47
33
|
<div class="card">
|
|
48
|
-
<div class="card-header"><div class="card-title"
|
|
49
|
-
<div class="card-body">
|
|
50
|
-
<div class="form-group">
|
|
51
|
-
<label class="form-label" for="settings-language">${escHtml(t('settings.language'))}</label>
|
|
52
|
-
<select class="form-input" id="settings-language" onchange="window.__app.changeLanguage(this.value)" aria-label="${escHtml(t('settings.language'))}">
|
|
53
|
-
${langOptions}
|
|
54
|
-
</select>
|
|
55
|
-
<div style="font-size:12px;color:var(--text-muted);margin-top:6px">${escHtml(t('settings.languageHint'))}</div>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
<div class="card">
|
|
60
|
-
<div class="card-header"><div class="card-title">${escHtml(t('settings.profile'))}</div></div>
|
|
34
|
+
<div class="card-header"><div class="card-title">Profile</div></div>
|
|
61
35
|
<div class="card-body">
|
|
62
36
|
<div style="display:flex;align-items:center;gap:16px;margin-bottom:20px">
|
|
63
37
|
<div style="width:64px;height:64px;border-radius:50%;background:${avatarBg(u.email||u.display_name||'?')};display:flex;align-items:center;justify-content:center;font-size:24px;font-weight:700;color:#fff;flex-shrink:0;user-select:none" aria-hidden="true">${escHtml(avatarInitial(u.display_name||u.email||'?'))}</div>
|
|
@@ -67,60 +41,60 @@ export function renderSettingsView(): void {
|
|
|
67
41
|
</div>
|
|
68
42
|
</div>
|
|
69
43
|
<div class="form-group">
|
|
70
|
-
<label class="form-label" for="settings-display-name"
|
|
71
|
-
<input class="form-input" id="settings-display-name" type="text" value="${escHtml(u.display_name||u.email||'')}" placeholder="
|
|
44
|
+
<label class="form-label" for="settings-display-name">Display Name</label>
|
|
45
|
+
<input class="form-input" id="settings-display-name" type="text" value="${escHtml(u.display_name||u.email||'')}" placeholder="Your display name" aria-label="Display name">
|
|
72
46
|
</div>
|
|
73
47
|
<div class="form-group">
|
|
74
|
-
<label class="form-label"
|
|
75
|
-
<input class="form-input" type="text" value="${escHtml(u.email||'')}" disabled style="opacity:0.6;cursor:not-allowed" aria-label="
|
|
48
|
+
<label class="form-label">Email</label>
|
|
49
|
+
<input class="form-input" type="text" value="${escHtml(u.email||'')}" disabled style="opacity:0.6;cursor:not-allowed" aria-label="Email address (read only)">
|
|
76
50
|
${createdInfo}
|
|
77
51
|
</div>
|
|
78
52
|
<div class="form-error" id="settings-profile-error" style="display:none" role="alert"></div>
|
|
79
|
-
<button class="btn btn-primary btn-sm" id="settings-profile-btn" onclick="window.__app.saveProfile()" aria-label="
|
|
53
|
+
<button class="btn btn-primary btn-sm" id="settings-profile-btn" onclick="window.__app.saveProfile()" aria-label="Save profile changes"><span>Save Profile</span></button>
|
|
80
54
|
</div>
|
|
81
55
|
</div>
|
|
82
56
|
<div class="card">
|
|
83
|
-
<div class="card-header"><div class="card-title"
|
|
57
|
+
<div class="card-header"><div class="card-title">Change Password</div></div>
|
|
84
58
|
<div class="card-body">
|
|
85
59
|
<div class="form-group">
|
|
86
|
-
<label class="form-label" for="settings-current-pw"
|
|
87
|
-
<input class="form-input" id="settings-current-pw" type="password" placeholder="
|
|
60
|
+
<label class="form-label" for="settings-current-pw">Current Password</label>
|
|
61
|
+
<input class="form-input" id="settings-current-pw" type="password" placeholder="Current password" autocomplete="current-password" aria-label="Current password">
|
|
88
62
|
</div>
|
|
89
63
|
<div class="form-group">
|
|
90
|
-
<label class="form-label" for="settings-new-pw"
|
|
91
|
-
<input class="form-input" id="settings-new-pw" type="password" placeholder="
|
|
64
|
+
<label class="form-label" for="settings-new-pw">New Password</label>
|
|
65
|
+
<input class="form-input" id="settings-new-pw" type="password" placeholder="New password" autocomplete="new-password" aria-label="New password">
|
|
92
66
|
</div>
|
|
93
67
|
<div class="form-group">
|
|
94
|
-
<label class="form-label" for="settings-confirm-pw"
|
|
95
|
-
<input class="form-input" id="settings-confirm-pw" type="password" placeholder="
|
|
68
|
+
<label class="form-label" for="settings-confirm-pw">Confirm New Password</label>
|
|
69
|
+
<input class="form-input" id="settings-confirm-pw" type="password" placeholder="Confirm new password" autocomplete="new-password" aria-label="Confirm new password">
|
|
96
70
|
</div>
|
|
97
71
|
<div class="form-error" id="settings-pw-error" style="display:none" role="alert"></div>
|
|
98
|
-
<button class="btn btn-primary btn-sm" id="settings-pw-btn" onclick="window.__app.changePassword()" aria-label="
|
|
72
|
+
<button class="btn btn-primary btn-sm" id="settings-pw-btn" onclick="window.__app.changePassword()" aria-label="Change password"><span>Change Password</span></button>
|
|
99
73
|
</div>
|
|
100
74
|
</div>
|
|
101
75
|
<div class="card">
|
|
102
76
|
<div class="card-header">
|
|
103
|
-
<div class="card-title"
|
|
104
|
-
${u.has_github_token ? `<span style="font-size:12px;color:var(--status-closed)"
|
|
77
|
+
<div class="card-title">GitHub Token</div>
|
|
78
|
+
${u.has_github_token ? `<span style="font-size:12px;color:var(--status-closed)">✓ Token configured</span>` : `<span style="font-size:12px;color:var(--text-muted)">No token set</span>`}
|
|
105
79
|
</div>
|
|
106
80
|
<div class="card-body">
|
|
107
81
|
<div style="margin-bottom:12px;padding:10px 12px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius);font-size:12px;color:var(--text-secondary)">
|
|
108
|
-
<strong style="color:var(--text-primary)"
|
|
82
|
+
<strong style="color:var(--text-primary)">How to get a token:</strong>
|
|
109
83
|
<ol style="margin-top:6px;padding-left:18px;line-height:1.8">
|
|
110
|
-
<li
|
|
111
|
-
<li
|
|
112
|
-
<li
|
|
84
|
+
<li>Go to GitHub → Settings → Developer settings → Personal access tokens</li>
|
|
85
|
+
<li>Generate a new token with <code style="font-family:monospace;background:var(--bg-base);padding:0 3px;border-radius:3px">repo</code> scope</li>
|
|
86
|
+
<li>Paste the token below and click Save</li>
|
|
113
87
|
</ol>
|
|
114
88
|
</div>
|
|
115
89
|
<div class="form-group">
|
|
116
|
-
<label class="form-label" for="settings-github-token"
|
|
117
|
-
<input class="form-input" id="settings-github-token" type="password" placeholder="${
|
|
118
|
-
<div style="font-size:11px;color:var(--text-muted);margin-top:4px"
|
|
90
|
+
<label class="form-label" for="settings-github-token">Personal Access Token (PAT)</label>
|
|
91
|
+
<input class="form-input" id="settings-github-token" type="password" placeholder="${u.has_github_token ? 'Leave blank to keep current token' : 'ghp_…'}" autocomplete="off" aria-label="GitHub personal access token">
|
|
92
|
+
<div style="font-size:11px;color:var(--text-muted);margin-top:4px">Used for GitHub integration. Needs <code style="font-family:monospace;background:var(--bg-input);padding:0 3px;border-radius:3px">repo</code> scope.</div>
|
|
119
93
|
</div>
|
|
120
94
|
<div class="form-error" id="settings-github-error" style="display:none" role="alert"></div>
|
|
121
95
|
<div style="display:flex;gap:8px">
|
|
122
|
-
<button class="btn btn-primary btn-sm" id="settings-github-btn" onclick="window.__app.saveGitHubToken()" aria-label="
|
|
123
|
-
${u.has_github_token ? `<button class="btn btn-danger btn-sm" onclick="window.__app.clearGitHubToken()" aria-label="
|
|
96
|
+
<button class="btn btn-primary btn-sm" id="settings-github-btn" onclick="window.__app.saveGitHubToken()" aria-label="Save GitHub token"><span>Save Token</span></button>
|
|
97
|
+
${u.has_github_token ? `<button class="btn btn-danger btn-sm" onclick="window.__app.clearGitHubToken()" aria-label="Clear GitHub token">Clear Token</button>` : ''}
|
|
124
98
|
</div>
|
|
125
99
|
</div>
|
|
126
100
|
</div>
|
|
@@ -131,9 +105,9 @@ export async function saveProfile(): Promise<void> {
|
|
|
131
105
|
const displayName = (document.getElementById('settings-display-name') as HTMLInputElement | null)?.value?.trim() || '';
|
|
132
106
|
const errEl = document.getElementById('settings-profile-error') as HTMLElement | null;
|
|
133
107
|
const btn = document.getElementById('settings-profile-btn') as HTMLButtonElement | null;
|
|
134
|
-
if (!displayName) { if (errEl) { errEl.textContent =
|
|
108
|
+
if (!displayName) { if (errEl) { errEl.textContent = 'Display name cannot be empty'; errEl.style.display = 'block'; } return; }
|
|
135
109
|
if (errEl) errEl.style.display = 'none';
|
|
136
|
-
if (btn) { btn.disabled = true; const sp = btn.querySelector('span'); if (sp) sp.textContent =
|
|
110
|
+
if (btn) { btn.disabled = true; const sp = btn.querySelector('span'); if (sp) sp.textContent = 'Saving…'; }
|
|
137
111
|
try {
|
|
138
112
|
const data = await api('PATCH','/auth/profile',{displayName});
|
|
139
113
|
if ((data as any).user) {
|
|
@@ -147,12 +121,12 @@ export async function saveProfile(): Promise<void> {
|
|
|
147
121
|
if (avatarEl) avatarEl.textContent = initials;
|
|
148
122
|
const nameEl = document.getElementById('user-name-display');
|
|
149
123
|
if (nameEl) nameEl.textContent = u.display_name||u.email;
|
|
150
|
-
toast(
|
|
124
|
+
toast('Profile saved','success');
|
|
151
125
|
renderSettingsView();
|
|
152
126
|
} catch(err: unknown) {
|
|
153
|
-
if (errEl) { errEl.textContent =
|
|
127
|
+
if (errEl) { errEl.textContent = err instanceof Error ? err.message : String(err); errEl.style.display = 'block'; }
|
|
154
128
|
} finally {
|
|
155
|
-
if (btn) { btn.disabled = false; const sp = btn.querySelector('span'); if (sp) sp.textContent =
|
|
129
|
+
if (btn) { btn.disabled = false; const sp = btn.querySelector('span'); if (sp) sp.textContent = 'Save Profile'; }
|
|
156
130
|
}
|
|
157
131
|
}
|
|
158
132
|
|
|
@@ -163,13 +137,13 @@ export async function changePassword(): Promise<void> {
|
|
|
163
137
|
const errEl = document.getElementById('settings-pw-error') as HTMLElement | null;
|
|
164
138
|
const btn = document.getElementById('settings-pw-btn') as HTMLButtonElement | null;
|
|
165
139
|
if (errEl) errEl.style.display = 'none';
|
|
166
|
-
if (!currentPassword || !newPassword || !confirmPassword) { if (errEl) { errEl.textContent =
|
|
167
|
-
if (newPassword !== confirmPassword) { if (errEl) { errEl.textContent =
|
|
168
|
-
if (newPassword.length < 6) { if (errEl) { errEl.textContent =
|
|
169
|
-
if (btn) { btn.disabled = true; const sp = btn.querySelector('span'); if (sp) sp.textContent =
|
|
140
|
+
if (!currentPassword || !newPassword || !confirmPassword) { if (errEl) { errEl.textContent = 'All fields are required'; errEl.style.display = 'block'; } return; }
|
|
141
|
+
if (newPassword !== confirmPassword) { if (errEl) { errEl.textContent = 'New passwords do not match'; errEl.style.display = 'block'; } return; }
|
|
142
|
+
if (newPassword.length < 6) { if (errEl) { errEl.textContent = 'New password must be at least 6 characters'; errEl.style.display = 'block'; } return; }
|
|
143
|
+
if (btn) { btn.disabled = true; const sp = btn.querySelector('span'); if (sp) sp.textContent = 'Changing…'; }
|
|
170
144
|
try {
|
|
171
145
|
await api('POST','/auth/change-password',{currentPassword,newPassword});
|
|
172
|
-
toast(
|
|
146
|
+
toast('Password changed successfully','success');
|
|
173
147
|
const curEl = document.getElementById('settings-current-pw') as HTMLInputElement | null;
|
|
174
148
|
const newEl = document.getElementById('settings-new-pw') as HTMLInputElement | null;
|
|
175
149
|
const confEl = document.getElementById('settings-confirm-pw') as HTMLInputElement | null;
|
|
@@ -177,9 +151,9 @@ export async function changePassword(): Promise<void> {
|
|
|
177
151
|
if (newEl) newEl.value = '';
|
|
178
152
|
if (confEl) confEl.value = '';
|
|
179
153
|
} catch(err: unknown) {
|
|
180
|
-
if (errEl) { errEl.textContent =
|
|
154
|
+
if (errEl) { errEl.textContent = err instanceof Error ? err.message : String(err); errEl.style.display = 'block'; }
|
|
181
155
|
} finally {
|
|
182
|
-
if (btn) { btn.disabled = false; const sp = btn.querySelector('span'); if (sp) sp.textContent =
|
|
156
|
+
if (btn) { btn.disabled = false; const sp = btn.querySelector('span'); if (sp) sp.textContent = 'Change Password'; }
|
|
183
157
|
}
|
|
184
158
|
}
|
|
185
159
|
|
|
@@ -187,33 +161,30 @@ export async function saveGitHubToken(): Promise<void> {
|
|
|
187
161
|
const token = (document.getElementById('settings-github-token') as HTMLInputElement | null)?.value?.trim() || '';
|
|
188
162
|
const errEl = document.getElementById('settings-github-error') as HTMLElement | null;
|
|
189
163
|
const btn = document.getElementById('settings-github-btn') as HTMLButtonElement | null;
|
|
190
|
-
if (!token) { if (errEl) { errEl.textContent =
|
|
164
|
+
if (!token) { if (errEl) { errEl.textContent = 'Please enter a token'; errEl.style.display = 'block'; } return; }
|
|
191
165
|
if (errEl) errEl.style.display = 'none';
|
|
192
|
-
if (btn) { btn.disabled = true; const sp = btn.querySelector('span'); if (sp) sp.textContent =
|
|
166
|
+
if (btn) { btn.disabled = true; const sp = btn.querySelector('span'); if (sp) sp.textContent = 'Saving…'; }
|
|
193
167
|
try {
|
|
194
168
|
const data = await api('PATCH','/auth/github-token',{token});
|
|
195
169
|
state.user!.has_github_token = (data as any).hasToken !== undefined ? (data as any).hasToken : true;
|
|
196
|
-
toast(
|
|
170
|
+
toast('GitHub token saved','success');
|
|
197
171
|
renderSettingsView();
|
|
198
172
|
} catch(err: unknown) {
|
|
199
|
-
if (errEl) { errEl.textContent =
|
|
173
|
+
if (errEl) { errEl.textContent = err instanceof Error ? err.message : String(err); errEl.style.display = 'block'; }
|
|
200
174
|
} finally {
|
|
201
|
-
if (btn) { btn.disabled = false; const sp = btn.querySelector('span'); if (sp) sp.textContent =
|
|
175
|
+
if (btn) { btn.disabled = false; const sp = btn.querySelector('span'); if (sp) sp.textContent = 'Save Token'; }
|
|
202
176
|
}
|
|
203
177
|
}
|
|
204
178
|
|
|
205
179
|
export function clearGitHubToken(): void {
|
|
206
|
-
confirmDialog(
|
|
180
|
+
confirmDialog('Clear GitHub Token?', 'Your GitHub integration will stop working.', async () => {
|
|
207
181
|
try {
|
|
208
182
|
const data = await api('PATCH','/auth/github-token',{token:''});
|
|
209
183
|
state.user!.has_github_token = false;
|
|
210
|
-
toast(
|
|
184
|
+
toast('GitHub token cleared','success');
|
|
211
185
|
renderSettingsView();
|
|
212
186
|
} catch(err: unknown) {
|
|
213
|
-
toast(
|
|
187
|
+
toast(err instanceof Error ? err.message : String(err),'error');
|
|
214
188
|
}
|
|
215
|
-
}
|
|
189
|
+
});
|
|
216
190
|
}
|
|
217
|
-
|
|
218
|
-
// Re-export so type-only re-exports stay usable if extended later.
|
|
219
|
-
export type { SupportedLocale };
|
package/public/sw.js
CHANGED
package/public/src/i18n/de.json
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"auth.brand.tagline": "Git-native Projektverwaltung",
|
|
3
|
-
"auth.feature.tasks": "Aufgaben, Features, Bugs, Epics & mehr verwalten",
|
|
4
|
-
"auth.feature.storage": "Git-native Speicherung in .agents/pm/",
|
|
5
|
-
"auth.feature.history": "Vollständiger Verlauf, Kommentare & Aktivitätsfeeds",
|
|
6
|
-
"auth.feature.team": "Teamfreundliche Projektisolation",
|
|
7
|
-
"auth.title.login": "Willkommen zurück",
|
|
8
|
-
"auth.title.register": "Konto erstellen",
|
|
9
|
-
"auth.sub.login": "Melden Sie sich an Ihrem Konto an, um fortzufahren",
|
|
10
|
-
"auth.sub.register": "Treten Sie pm-web bei und beginnen Sie mit der Projektverwaltung",
|
|
11
|
-
"auth.tab.login": "Anmelden",
|
|
12
|
-
"auth.tab.register": "Registrieren",
|
|
13
|
-
"auth.field.displayName": "Anzeigename",
|
|
14
|
-
"auth.field.email": "E-Mail",
|
|
15
|
-
"auth.field.password": "Passwort",
|
|
16
|
-
"auth.placeholder.name": "Ihr Name",
|
|
17
|
-
"auth.placeholder.email": "you@example.com",
|
|
18
|
-
"auth.placeholder.password": "••••••••",
|
|
19
|
-
"auth.divider": "oder",
|
|
20
|
-
"auth.oidc.default": "Mit OpenID Connect fortfahren",
|
|
21
|
-
"auth.oidc.template": "Mit {label} fortfahren",
|
|
22
|
-
"auth.button.login": "Anmelden",
|
|
23
|
-
"auth.button.register": "Konto erstellen",
|
|
24
|
-
"auth.loading": "Bitte warten…",
|
|
25
|
-
"nav.skipLink": "Zum Hauptinhalt springen",
|
|
26
|
-
"nav.settings": "Einstellungen",
|
|
27
|
-
"nav.signOut": "Abmelden",
|
|
28
|
-
"nav.search": "⌘K Suche",
|
|
29
|
-
"nav.search.title": "Suche öffnen (Strg+K)",
|
|
30
|
-
"nav.selectProject": "— Projekt auswählen —",
|
|
31
|
-
"nav.sse.disconnected": "Echtzeit-Synchronisierung getrennt",
|
|
32
|
-
"nav.sse.connected": "Echtzeit-Synchronisierung verbunden",
|
|
33
|
-
"nav.sse.reconnecting": "Echtzeit-Synchronisierung wird wiederhergestellt…",
|
|
34
|
-
"nav.theme.title": "Design wechseln (dunkel / hell / auto)",
|
|
35
|
-
"banner.offline": "Sie sind offline — Änderungen werden bei erneuter Verbindung synchronisiert",
|
|
36
|
-
"banner.install.text": "Installieren Sie <strong>pm-web</strong> für ein nativeres App-Erlebnis",
|
|
37
|
-
"banner.install.dismiss": "Nicht jetzt",
|
|
38
|
-
"banner.install.button": "Installieren",
|
|
39
|
-
"cookie.banner.title": "Cookie-Einstellungen",
|
|
40
|
-
"cookie.banner.text": "Wir verwenden nur technisch notwendige Speicherung für Anmeldung, Sicherheit und Einstellungen. Keine optionalen Tracking-Cookies.",
|
|
41
|
-
"cookie.banner.privacy": "Datenschutzerklärung",
|
|
42
|
-
"cookie.banner.decline": "Nur notwendige",
|
|
43
|
-
"cookie.banner.accept": "Verstanden",
|
|
44
|
-
"settings.title": "Einstellungen",
|
|
45
|
-
"settings.subtitle": "Verwalten Sie Ihr Profil und Ihr Konto",
|
|
46
|
-
"settings.language": "Sprache",
|
|
47
|
-
"settings.languageEn": "English",
|
|
48
|
-
"settings.languageDe": "Deutsch",
|
|
49
|
-
"settings.languageEs": "Español",
|
|
50
|
-
"settings.languageHint": "Oberflächensprache. Rechtsseiten werden vom Betreiber bereitgestellt und sind möglicherweise nicht übersetzt.",
|
|
51
|
-
"settings.profile": "Profil",
|
|
52
|
-
"settings.displayName": "Anzeigename",
|
|
53
|
-
"settings.displayNamePlaceholder": "Ihr Anzeigename",
|
|
54
|
-
"settings.email": "E-Mail",
|
|
55
|
-
"settings.emailReadonly": "E-Mail-Adresse (schreibgeschützt)",
|
|
56
|
-
"settings.accountCreated": "Konto erstellt am {date}",
|
|
57
|
-
"settings.saveProfile": "Profil speichern",
|
|
58
|
-
"settings.changePassword": "Passwort ändern",
|
|
59
|
-
"settings.currentPassword": "Aktuelles Passwort",
|
|
60
|
-
"settings.newPassword": "Neues Passwort",
|
|
61
|
-
"settings.confirmPassword": "Neues Passwort bestätigen",
|
|
62
|
-
"settings.currentPasswordPlaceholder": "Aktuelles Passwort",
|
|
63
|
-
"settings.newPasswordPlaceholder": "Neues Passwort",
|
|
64
|
-
"settings.confirmPasswordPlaceholder": "Neues Passwort bestätigen",
|
|
65
|
-
"settings.githubToken": "GitHub-Token",
|
|
66
|
-
"settings.tokenConfigured": "✓ Token konfiguriert",
|
|
67
|
-
"settings.tokenNotSet": "Kein Token festgelegt",
|
|
68
|
-
"settings.tokenPlaceholder.keep": "Leer lassen, um das aktuelle Token beizubehalten",
|
|
69
|
-
"settings.tokenPlaceholder.set": "ghp_…",
|
|
70
|
-
"settings.tokenLabel": "Personal Access Token (PAT)",
|
|
71
|
-
"settings.tokenHint": "Wird für die GitHub-Integration verwendet. Erfordert den Scope <code>repo</code>.",
|
|
72
|
-
"settings.saveToken": "Token speichern",
|
|
73
|
-
"settings.clearToken": "Token löschen",
|
|
74
|
-
"settings.howToGet": "So erhalten Sie ein Token:",
|
|
75
|
-
"settings.tokenStep1": "GitHub → Settings → Developer settings → Personal access tokens öffnen",
|
|
76
|
-
"settings.tokenStep2": "Neues Token mit dem Scope <code>repo</code> erstellen",
|
|
77
|
-
"settings.tokenStep3": "Token unten einfügen und auf Speichern klicken",
|
|
78
|
-
"settings.saving": "Wird gespeichert…",
|
|
79
|
-
"settings.changing": "Wird geändert…",
|
|
80
|
-
"settings.displayNameEmpty": "Anzeigename darf nicht leer sein",
|
|
81
|
-
"settings.profileSaved": "Profil gespeichert",
|
|
82
|
-
"settings.allFieldsRequired": "Alle Felder sind erforderlich",
|
|
83
|
-
"settings.passwordsDoNotMatch": "Die neuen Passwörter stimmen nicht überein",
|
|
84
|
-
"settings.passwordTooShort": "Das neue Passwort muss mindestens 6 Zeichen lang sein",
|
|
85
|
-
"settings.passwordChanged": "Passwort erfolgreich geändert",
|
|
86
|
-
"settings.tokenEmpty": "Bitte geben Sie ein Token ein",
|
|
87
|
-
"settings.tokenSaved": "GitHub-Token gespeichert",
|
|
88
|
-
"settings.tokenCleared": "GitHub-Token gelöscht",
|
|
89
|
-
"settings.clearTokenTitle": "GitHub-Token löschen?",
|
|
90
|
-
"settings.clearTokenBody": "Ihre GitHub-Integration wird danach nicht mehr funktionieren.",
|
|
91
|
-
"dialog.cancel": "Abbrechen",
|
|
92
|
-
"dialog.confirm": "Bestätigen",
|
|
93
|
-
"dialog.delete": "Löschen",
|
|
94
|
-
"error.emailPasswordRequired": "E-Mail und Passwort sind erforderlich",
|
|
95
|
-
"error.passwordTooShort": "Das Passwort muss mindestens 8 Zeichen lang sein",
|
|
96
|
-
"error.invalidEmail": "Ungültige E-Mail-Adresse",
|
|
97
|
-
"error.accountExists": "Mit dieser E-Mail-Adresse existiert bereits ein Konto",
|
|
98
|
-
"error.registrationFailed": "Registrierung fehlgeschlagen",
|
|
99
|
-
"error.invalidCredentials": "Ungültige E-Mail-Adresse oder Passwort",
|
|
100
|
-
"error.loginFailed": "Anmeldung fehlgeschlagen",
|
|
101
|
-
"error.userNotFound": "Benutzer nicht gefunden",
|
|
102
|
-
"error.fetchUserFailed": "Benutzer konnten nicht abgerufen werden",
|
|
103
|
-
"error.updateProfileFailed": "Profil konnte nicht aktualisiert werden",
|
|
104
|
-
"error.passwordFieldsRequired": "Aktuelles und neues Passwort sind erforderlich",
|
|
105
|
-
"error.newPasswordTooShort": "Das neue Passwort muss mindestens 8 Zeichen lang sein",
|
|
106
|
-
"error.currentPasswordIncorrect": "Das aktuelle Passwort ist falsch",
|
|
107
|
-
"error.changePasswordFailed": "Passwort konnte nicht geändert werden",
|
|
108
|
-
"error.saveTokenFailed": "GitHub-Token konnte nicht gespeichert werden",
|
|
109
|
-
"error.oidcDisabled": "OpenID-Connect-Anmeldung ist nicht aktiviert.",
|
|
110
|
-
"error.oidcDiscoveryFailed": "OpenID-Connect-Provider-Discovery fehlgeschlagen.",
|
|
111
|
-
"error.oidcProviderError": "Der OpenID-Connect-Provider konnte die Anmeldung nicht abschließen.",
|
|
112
|
-
"error.oidcDenied": "Die OpenID-Connect-Anmeldung wurde abgebrochen oder abgelehnt.",
|
|
113
|
-
"error.oidcMissingIdToken": "Der OIDC-Provider hat kein ID-Token zurückgegeben.",
|
|
114
|
-
"error.oidcLoginFailed": "OpenID-Connect-Anmeldung fehlgeschlagen.",
|
|
115
|
-
"legal.disclaimer": "Übersetzung dient nur der Verständlichkeit; die englische Fassung ist maßgeblich.",
|
|
116
|
-
"settings.languageZh": "中文"
|
|
117
|
-
}
|
package/public/src/i18n/en.json
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"auth.brand.tagline": "Git-native project management",
|
|
3
|
-
"auth.feature.tasks": "Manage tasks, features, bugs, epics & more",
|
|
4
|
-
"auth.feature.storage": "Git-native storage in .agents/pm/",
|
|
5
|
-
"auth.feature.history": "Full history, comments & activity feeds",
|
|
6
|
-
"auth.feature.team": "Team-friendly project isolation",
|
|
7
|
-
"auth.title.login": "Welcome back",
|
|
8
|
-
"auth.title.register": "Create account",
|
|
9
|
-
"auth.sub.login": "Sign in to your account to continue",
|
|
10
|
-
"auth.sub.register": "Join pm-web and start managing projects",
|
|
11
|
-
"auth.tab.login": "Sign In",
|
|
12
|
-
"auth.tab.register": "Register",
|
|
13
|
-
"auth.field.displayName": "Display Name",
|
|
14
|
-
"auth.field.email": "Email",
|
|
15
|
-
"auth.field.password": "Password",
|
|
16
|
-
"auth.placeholder.name": "Your name",
|
|
17
|
-
"auth.placeholder.email": "you@example.com",
|
|
18
|
-
"auth.placeholder.password": "••••••••",
|
|
19
|
-
"auth.divider": "or",
|
|
20
|
-
"auth.oidc.default": "Continue with OpenID Connect",
|
|
21
|
-
"auth.oidc.template": "Continue with {label}",
|
|
22
|
-
"auth.button.login": "Sign In",
|
|
23
|
-
"auth.button.register": "Create Account",
|
|
24
|
-
"auth.loading": "Please wait…",
|
|
25
|
-
"nav.skipLink": "Skip to main content",
|
|
26
|
-
"nav.settings": "Settings",
|
|
27
|
-
"nav.signOut": "Sign out",
|
|
28
|
-
"nav.search": "⌘K Search",
|
|
29
|
-
"nav.search.title": "Open search (Ctrl+K)",
|
|
30
|
-
"nav.selectProject": "— Select project —",
|
|
31
|
-
"nav.sse.disconnected": "Real-time sync disconnected",
|
|
32
|
-
"nav.sse.connected": "Real-time sync connected",
|
|
33
|
-
"nav.sse.reconnecting": "Real-time sync reconnecting…",
|
|
34
|
-
"nav.theme.title": "Toggle theme (dark / light / auto)",
|
|
35
|
-
"banner.offline": "You are offline — changes will sync when reconnected",
|
|
36
|
-
"banner.install.text": "Install <strong>pm-web</strong> for a native app experience",
|
|
37
|
-
"banner.install.dismiss": "Not now",
|
|
38
|
-
"banner.install.button": "Install",
|
|
39
|
-
"cookie.banner.title": "Cookie Settings",
|
|
40
|
-
"cookie.banner.text": "We only use technically necessary storage for sign-in, security, and preferences. No optional tracking cookies.",
|
|
41
|
-
"cookie.banner.privacy": "Privacy Policy",
|
|
42
|
-
"cookie.banner.decline": "Necessary only",
|
|
43
|
-
"cookie.banner.accept": "Got it",
|
|
44
|
-
"settings.title": "Settings",
|
|
45
|
-
"settings.subtitle": "Manage your profile and account",
|
|
46
|
-
"settings.language": "Language",
|
|
47
|
-
"settings.languageEn": "English",
|
|
48
|
-
"settings.languageDe": "Deutsch",
|
|
49
|
-
"settings.languageEs": "Español",
|
|
50
|
-
"settings.languageHint": "Interface language. Legal pages are provided by the operator and may not be translated.",
|
|
51
|
-
"settings.profile": "Profile",
|
|
52
|
-
"settings.displayName": "Display Name",
|
|
53
|
-
"settings.displayNamePlaceholder": "Your display name",
|
|
54
|
-
"settings.email": "Email",
|
|
55
|
-
"settings.emailReadonly": "Email address (read only)",
|
|
56
|
-
"settings.accountCreated": "Account created {date}",
|
|
57
|
-
"settings.saveProfile": "Save Profile",
|
|
58
|
-
"settings.changePassword": "Change Password",
|
|
59
|
-
"settings.currentPassword": "Current Password",
|
|
60
|
-
"settings.newPassword": "New Password",
|
|
61
|
-
"settings.confirmPassword": "Confirm New Password",
|
|
62
|
-
"settings.currentPasswordPlaceholder": "Current password",
|
|
63
|
-
"settings.newPasswordPlaceholder": "New password",
|
|
64
|
-
"settings.confirmPasswordPlaceholder": "Confirm new password",
|
|
65
|
-
"settings.githubToken": "GitHub Token",
|
|
66
|
-
"settings.tokenConfigured": "✓ Token configured",
|
|
67
|
-
"settings.tokenNotSet": "No token set",
|
|
68
|
-
"settings.tokenPlaceholder.keep": "Leave blank to keep current token",
|
|
69
|
-
"settings.tokenPlaceholder.set": "ghp_…",
|
|
70
|
-
"settings.tokenLabel": "Personal Access Token (PAT)",
|
|
71
|
-
"settings.tokenHint": "Used for GitHub integration. Needs <code>repo</code> scope.",
|
|
72
|
-
"settings.saveToken": "Save Token",
|
|
73
|
-
"settings.clearToken": "Clear Token",
|
|
74
|
-
"settings.howToGet": "How to get a token:",
|
|
75
|
-
"settings.tokenStep1": "Go to GitHub → Settings → Developer settings → Personal access tokens",
|
|
76
|
-
"settings.tokenStep2": "Generate a new token with <code>repo</code> scope",
|
|
77
|
-
"settings.tokenStep3": "Paste the token below and click Save",
|
|
78
|
-
"settings.saving": "Saving…",
|
|
79
|
-
"settings.changing": "Changing…",
|
|
80
|
-
"settings.displayNameEmpty": "Display name cannot be empty",
|
|
81
|
-
"settings.profileSaved": "Profile saved",
|
|
82
|
-
"settings.allFieldsRequired": "All fields are required",
|
|
83
|
-
"settings.passwordsDoNotMatch": "New passwords do not match",
|
|
84
|
-
"settings.passwordTooShort": "New password must be at least 6 characters",
|
|
85
|
-
"settings.passwordChanged": "Password changed successfully",
|
|
86
|
-
"settings.tokenEmpty": "Please enter a token",
|
|
87
|
-
"settings.tokenSaved": "GitHub token saved",
|
|
88
|
-
"settings.tokenCleared": "GitHub token cleared",
|
|
89
|
-
"settings.clearTokenTitle": "Clear GitHub Token?",
|
|
90
|
-
"settings.clearTokenBody": "Your GitHub integration will stop working.",
|
|
91
|
-
"dialog.cancel": "Cancel",
|
|
92
|
-
"dialog.confirm": "Confirm",
|
|
93
|
-
"dialog.delete": "Delete",
|
|
94
|
-
"error.emailPasswordRequired": "Email and password are required",
|
|
95
|
-
"error.passwordTooShort": "Password must be at least 8 characters",
|
|
96
|
-
"error.invalidEmail": "Invalid email address",
|
|
97
|
-
"error.accountExists": "An account with this email already exists",
|
|
98
|
-
"error.registrationFailed": "Registration failed",
|
|
99
|
-
"error.invalidCredentials": "Invalid email or password",
|
|
100
|
-
"error.loginFailed": "Login failed",
|
|
101
|
-
"error.userNotFound": "User not found",
|
|
102
|
-
"error.fetchUserFailed": "Failed to fetch user",
|
|
103
|
-
"error.updateProfileFailed": "Failed to update profile",
|
|
104
|
-
"error.passwordFieldsRequired": "Current and new passwords are required",
|
|
105
|
-
"error.newPasswordTooShort": "New password must be at least 8 characters",
|
|
106
|
-
"error.currentPasswordIncorrect": "Current password is incorrect",
|
|
107
|
-
"error.changePasswordFailed": "Failed to change password",
|
|
108
|
-
"error.saveTokenFailed": "Failed to save GitHub token",
|
|
109
|
-
"error.oidcDisabled": "OpenID Connect login is not enabled.",
|
|
110
|
-
"error.oidcDiscoveryFailed": "OpenID Connect provider discovery failed.",
|
|
111
|
-
"error.oidcProviderError": "The OpenID Connect provider could not complete login.",
|
|
112
|
-
"error.oidcDenied": "OpenID Connect login was canceled or denied.",
|
|
113
|
-
"error.oidcMissingIdToken": "OIDC provider did not return an ID token.",
|
|
114
|
-
"error.oidcLoginFailed": "OpenID Connect login failed.",
|
|
115
|
-
"legal.disclaimer": "This translation is provided for comprehension only; the English version is authoritative.",
|
|
116
|
-
"settings.languageZh": "中文"
|
|
117
|
-
}
|
package/public/src/i18n/es.json
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"auth.brand.tagline": "Gestión de proyectos nativa de Git",
|
|
3
|
-
"auth.feature.tasks": "Gestione tareas, funciones, errores, epics y más",
|
|
4
|
-
"auth.feature.storage": "Almacenamiento nativo de Git en .agents/pm/",
|
|
5
|
-
"auth.feature.history": "Historial completo, comentarios y feeds de actividad",
|
|
6
|
-
"auth.feature.team": "Aislamiento de proyectos apto para equipos",
|
|
7
|
-
"auth.title.login": "Bienvenido de nuevo",
|
|
8
|
-
"auth.title.register": "Crear cuenta",
|
|
9
|
-
"auth.sub.login": "Inicie sesión en su cuenta para continuar",
|
|
10
|
-
"auth.sub.register": "Únase a pm-web y comience a gestionar proyectos",
|
|
11
|
-
"auth.tab.login": "Iniciar sesión",
|
|
12
|
-
"auth.tab.register": "Registrarse",
|
|
13
|
-
"auth.field.displayName": "Nombre para mostrar",
|
|
14
|
-
"auth.field.email": "Correo electrónico",
|
|
15
|
-
"auth.field.password": "Contraseña",
|
|
16
|
-
"auth.placeholder.name": "Su nombre",
|
|
17
|
-
"auth.placeholder.email": "you@example.com",
|
|
18
|
-
"auth.placeholder.password": "••••••••",
|
|
19
|
-
"auth.divider": "o",
|
|
20
|
-
"auth.oidc.default": "Continuar con OpenID Connect",
|
|
21
|
-
"auth.oidc.template": "Continuar con {label}",
|
|
22
|
-
"auth.button.login": "Iniciar sesión",
|
|
23
|
-
"auth.button.register": "Crear cuenta",
|
|
24
|
-
"auth.loading": "Por favor, espere…",
|
|
25
|
-
"nav.skipLink": "Saltar al contenido principal",
|
|
26
|
-
"nav.settings": "Configuración",
|
|
27
|
-
"nav.signOut": "Cerrar sesión",
|
|
28
|
-
"nav.search": "⌘K Buscar",
|
|
29
|
-
"nav.search.title": "Abrir búsqueda (Ctrl+K)",
|
|
30
|
-
"nav.selectProject": "— Seleccionar proyecto —",
|
|
31
|
-
"nav.sse.disconnected": "Sincronización en tiempo real desconectada",
|
|
32
|
-
"nav.sse.connected": "Sincronización en tiempo real conectada",
|
|
33
|
-
"nav.sse.reconnecting": "Reconectando sincronización en tiempo real…",
|
|
34
|
-
"nav.theme.title": "Cambiar tema (oscuro / claro / auto)",
|
|
35
|
-
"banner.offline": "Está sin conexión — los cambios se sincronizarán al reconectar",
|
|
36
|
-
"banner.install.text": "Instale <strong>pm-web</strong> para una experiencia de aplicación nativa",
|
|
37
|
-
"banner.install.dismiss": "Ahora no",
|
|
38
|
-
"banner.install.button": "Instalar",
|
|
39
|
-
"cookie.banner.title": "Configuración de cookies",
|
|
40
|
-
"cookie.banner.text": "Solo utilizamos almacenamiento técnicamente necesario para el inicio de sesión, la seguridad y las preferencias. Sin cookies opcionales de seguimiento.",
|
|
41
|
-
"cookie.banner.privacy": "Política de privacidad",
|
|
42
|
-
"cookie.banner.decline": "Solo las necesarias",
|
|
43
|
-
"cookie.banner.accept": "Entendido",
|
|
44
|
-
"settings.title": "Configuración",
|
|
45
|
-
"settings.subtitle": "Gestione su perfil y su cuenta",
|
|
46
|
-
"settings.language": "Idioma",
|
|
47
|
-
"settings.languageEn": "English",
|
|
48
|
-
"settings.languageDe": "Deutsch",
|
|
49
|
-
"settings.languageEs": "Español",
|
|
50
|
-
"settings.languageHint": "Idioma de la interfaz. Las páginas legales las proporciona el operador y pueden no estar traducidas.",
|
|
51
|
-
"settings.profile": "Perfil",
|
|
52
|
-
"settings.displayName": "Nombre para mostrar",
|
|
53
|
-
"settings.displayNamePlaceholder": "Su nombre para mostrar",
|
|
54
|
-
"settings.email": "Correo electrónico",
|
|
55
|
-
"settings.emailReadonly": "Correo electrónico (solo lectura)",
|
|
56
|
-
"settings.accountCreated": "Cuenta creada el {date}",
|
|
57
|
-
"settings.saveProfile": "Guardar perfil",
|
|
58
|
-
"settings.changePassword": "Cambiar contraseña",
|
|
59
|
-
"settings.currentPassword": "Contraseña actual",
|
|
60
|
-
"settings.newPassword": "Nueva contraseña",
|
|
61
|
-
"settings.confirmPassword": "Confirmar nueva contraseña",
|
|
62
|
-
"settings.currentPasswordPlaceholder": "Contraseña actual",
|
|
63
|
-
"settings.newPasswordPlaceholder": "Nueva contraseña",
|
|
64
|
-
"settings.confirmPasswordPlaceholder": "Confirmar nueva contraseña",
|
|
65
|
-
"settings.githubToken": "Token de GitHub",
|
|
66
|
-
"settings.tokenConfigured": "✓ Token configurado",
|
|
67
|
-
"settings.tokenNotSet": "Ningún token establecido",
|
|
68
|
-
"settings.tokenPlaceholder.keep": "Déjelo en blanco para mantener el token actual",
|
|
69
|
-
"settings.tokenPlaceholder.set": "ghp_…",
|
|
70
|
-
"settings.tokenLabel": "Personal Access Token (PAT)",
|
|
71
|
-
"settings.tokenHint": "Se usa para la integración con GitHub. Necesita el alcance <code>repo</code>.",
|
|
72
|
-
"settings.saveToken": "Guardar token",
|
|
73
|
-
"settings.clearToken": "Borrar token",
|
|
74
|
-
"settings.howToGet": "Cómo obtener un token:",
|
|
75
|
-
"settings.tokenStep1": "Vaya a GitHub → Settings → Developer settings → Personal access tokens",
|
|
76
|
-
"settings.tokenStep2": "Genere un nuevo token con el alcance <code>repo</code>",
|
|
77
|
-
"settings.tokenStep3": "Pegue el token abajo y haga clic en Guardar",
|
|
78
|
-
"settings.saving": "Guardando…",
|
|
79
|
-
"settings.changing": "Cambiando…",
|
|
80
|
-
"settings.displayNameEmpty": "El nombre para mostrar no puede estar vacío",
|
|
81
|
-
"settings.profileSaved": "Perfil guardado",
|
|
82
|
-
"settings.allFieldsRequired": "Todos los campos son obligatorios",
|
|
83
|
-
"settings.passwordsDoNotMatch": "Las nuevas contraseñas no coinciden",
|
|
84
|
-
"settings.passwordTooShort": "La nueva contraseña debe tener al menos 6 caracteres",
|
|
85
|
-
"settings.passwordChanged": "Contraseña cambiada correctamente",
|
|
86
|
-
"settings.tokenEmpty": "Por favor, introduzca un token",
|
|
87
|
-
"settings.tokenSaved": "Token de GitHub guardado",
|
|
88
|
-
"settings.tokenCleared": "Token de GitHub borrado",
|
|
89
|
-
"settings.clearTokenTitle": "¿Borrar el token de GitHub?",
|
|
90
|
-
"settings.clearTokenBody": "Su integración con GitHub dejará de funcionar.",
|
|
91
|
-
"dialog.cancel": "Cancelar",
|
|
92
|
-
"dialog.confirm": "Confirmar",
|
|
93
|
-
"dialog.delete": "Eliminar",
|
|
94
|
-
"error.emailPasswordRequired": "El correo electrónico y la contraseña son obligatorios",
|
|
95
|
-
"error.passwordTooShort": "La contraseña debe tener al menos 8 caracteres",
|
|
96
|
-
"error.invalidEmail": "Correo electrónico no válido",
|
|
97
|
-
"error.accountExists": "Ya existe una cuenta con este correo electrónico",
|
|
98
|
-
"error.registrationFailed": "Error en el registro",
|
|
99
|
-
"error.invalidCredentials": "Correo electrónico o contraseña no válidos",
|
|
100
|
-
"error.loginFailed": "Error al iniciar sesión",
|
|
101
|
-
"error.userNotFound": "Usuario no encontrado",
|
|
102
|
-
"error.fetchUserFailed": "Error al obtener el usuario",
|
|
103
|
-
"error.updateProfileFailed": "Error al actualizar el perfil",
|
|
104
|
-
"error.passwordFieldsRequired": "La contraseña actual y la nueva son obligatorias",
|
|
105
|
-
"error.newPasswordTooShort": "La nueva contraseña debe tener al menos 8 caracteres",
|
|
106
|
-
"error.currentPasswordIncorrect": "La contraseña actual es incorrecta",
|
|
107
|
-
"error.changePasswordFailed": "Error al cambiar la contraseña",
|
|
108
|
-
"error.saveTokenFailed": "Error al guardar el token de GitHub",
|
|
109
|
-
"error.oidcDisabled": "El inicio de sesión con OpenID Connect no está activado.",
|
|
110
|
-
"error.oidcDiscoveryFailed": "Error en el descubrimiento del proveedor de OpenID Connect.",
|
|
111
|
-
"error.oidcProviderError": "El proveedor de OpenID Connect no pudo completar el inicio de sesión.",
|
|
112
|
-
"error.oidcDenied": "El inicio de sesión con OpenID Connect fue cancelado o denegado.",
|
|
113
|
-
"error.oidcMissingIdToken": "El proveedor OIDC no devolvió un ID token.",
|
|
114
|
-
"error.oidcLoginFailed": "Error en el inicio de sesión con OpenID Connect.",
|
|
115
|
-
"legal.disclaimer": "Esta traducción se proporciona solo para comprensión; la versión en inglés es la autoritativa.",
|
|
116
|
-
"settings.languageZh": "中文"
|
|
117
|
-
}
|