@churchapps/apphelper-login 0.4.26 → 0.4.27

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.
@@ -1,10 +1,11 @@
1
1
  export declare class Locale {
2
2
  private static readonly supportedLanguages;
3
3
  private static readonly extraCodes;
4
- private static readonly fallbacks;
4
+ private static readonly englishFallbacks;
5
5
  static init: (backends: string[]) => Promise<void>;
6
6
  private static deepMerge;
7
7
  private static isObject;
8
+ private static getNestedValue;
8
9
  static t(key: string, options?: Record<string, unknown>): string;
9
10
  static label(key: string): string;
10
11
  static isInitialized(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Locale.d.ts","sourceRoot":"","sources":["../../src/helpers/Locale.ts"],"names":[],"mappings":"AAgBA,qBAAa,MAAM;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAaxC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAG9E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CA0D/B;IAEF,MAAM,CAAC,IAAI,GAAU,UAAU,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAiErD;IAEF,OAAO,CAAC,MAAM,CAAC,SAAS;IAgBxB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAKvB,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAqChE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKjC,MAAM,CAAC,aAAa,IAAI,OAAO;IAK/B,MAAM,CAAC,gBAAgB,IAAI,IAAI;CAG/B"}
1
+ {"version":3,"file":"Locale.d.ts","sourceRoot":"","sources":["../../src/helpers/Locale.ts"],"names":[],"mappings":"AAgBA,qBAAa,MAAM;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAaxC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAG9E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAqEtC;IAEF,MAAM,CAAC,IAAI,GAAU,UAAU,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CA2DrD;IAEF,OAAO,CAAC,MAAM,CAAC,SAAS;IAgBxB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAKvB,OAAO,CAAC,MAAM,CAAC,cAAc;IAO7B,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAyChE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKjC,MAAM,CAAC,aAAa,IAAI,OAAO;IAK/B,MAAM,CAAC,gBAAgB,IAAI,IAAI;CAG/B"}
@@ -19,46 +19,56 @@ export class Locale {
19
19
  static isObject(obj) {
20
20
  return obj !== null && typeof obj === "object" && !Array.isArray(obj);
21
21
  }
22
- // New helper method that uses i18n with fallback
22
+ // Helper method to get value from nested object using dot notation
23
+ static getNestedValue(obj, path) {
24
+ return path.split('.').reduce((current, key) => {
25
+ return current && current[key] !== undefined ? current[key] : undefined;
26
+ }, obj);
27
+ }
28
+ // New helper method that uses i18n with hard-coded English fallback
23
29
  static t(key, options) {
24
30
  try {
25
31
  // Check if i18n is initialized and has the key
26
32
  if (i18n && i18n.isInitialized && i18n.exists(key)) {
27
33
  const translation = i18n.t(key, options);
28
- // If translation is not just the key (which indicates missing translation)
34
+ // If translation is not the same as the key, return it
29
35
  if (translation !== key) {
30
36
  return translation;
31
37
  }
32
38
  }
33
39
  }
34
40
  catch (error) {
35
- console.warn(`Error getting translation for key "${key}":`, error);
41
+ // If i18n fails, fall through to hard-coded fallback
42
+ console.warn(`i18n translation failed for key "${key}":`, error);
36
43
  }
37
- // Fall back to our local fallbacks
38
- const fallback = this.fallbacks[key];
39
- if (fallback) {
40
- // Handle simple string replacement like {} placeholders
41
- if (options && typeof options === 'object') {
42
- let result = fallback;
43
- Object.entries(options).forEach(([placeholder, value]) => {
44
- if (typeof value === 'string' || typeof value === 'number') {
45
- result = result.replace(`{${placeholder}}`, String(value));
46
- result = result.replace('{}', String(value)); // Handle unnamed placeholders
44
+ // Fallback to hard-coded English translations
45
+ const fallbackValue = this.getNestedValue(this.englishFallbacks, key);
46
+ if (fallbackValue !== undefined) {
47
+ // Handle simple string interpolation for options
48
+ if (typeof fallbackValue === 'string' && options) {
49
+ let result = fallbackValue;
50
+ Object.keys(options).forEach(optionKey => {
51
+ const placeholder = `{{${optionKey}}}`;
52
+ if (result.includes(placeholder)) {
53
+ result = result.replace(new RegExp(placeholder, 'g'), String(options[optionKey]));
54
+ }
55
+ // Also handle {} placeholder for backward compatibility
56
+ if (result.includes('{}')) {
57
+ result = result.replace('{}', String(options[optionKey]));
47
58
  }
48
59
  });
49
60
  return result;
50
61
  }
51
- return fallback;
62
+ return String(fallbackValue);
52
63
  }
53
- // Ultimate fallback - return the key itself with a warning
54
- console.warn(`No translation found for key: ${key}`);
64
+ // If no fallback found, return the key itself
55
65
  return key;
56
66
  }
57
67
  // Keep the old method for backward compatibility
58
68
  static label(key) {
59
69
  return this.t(key);
60
70
  }
61
- // Helper method to check if translations are available
71
+ // Helper method to check if i18n is initialized
62
72
  static isInitialized() {
63
73
  return i18n && i18n.isInitialized;
64
74
  }
@@ -83,61 +93,76 @@ Locale.supportedLanguages = [
83
93
  "zh",
84
94
  ];
85
95
  Locale.extraCodes = { no: ["nb", "nn"] };
86
- // English fallbacks for all login-related labels
87
- Locale.fallbacks = {
88
- // Common
89
- "common.pleaseWait": "Please wait...",
90
- "common.search": "Search",
91
- // Login
92
- "login.createAccount": "Create an Account",
93
- "login.email": "Email",
94
- "login.expiredLink": "The current link is expired.",
95
- "login.forgot": "Forgot Password",
96
- "login.goLogin": "Go to Login",
97
- "login.login": "Login",
98
- "login.password": "Password",
99
- "login.register": "Register",
100
- "login.registerThankYou": "Thank you for registering! Please check your email to verify your account.",
101
- "login.requestLink": "Request a new reset link",
102
- "login.reset": "Reset",
103
- "login.resetInstructions": "Enter your email address to request a password reset.",
104
- "login.resetPassword": "Reset Password",
105
- "login.resetSent": "Password reset email sent!",
106
- "login.setPassword": "Set Password",
107
- "login.signIn": "Sign In",
108
- "login.signInTitle": "Please Sign In",
109
- "login.verifyPassword": "Verify Password",
110
- "login.welcomeName": "Welcome back, {}!",
111
- "login.welcomeBack": "Welcome back",
112
- // Login validation
113
- "login.validate.email": "Please enter a valid email address.",
114
- "login.validate.firstName": "Please enter your first name.",
115
- "login.validate.invalid": "Invalid login. Please check your email or password.",
116
- "login.validate.lastName": "Please enter your last name.",
117
- "login.validate.password": "Please enter a password.",
118
- "login.validate.passwordLength": "Password must be at least 8 characters long.",
119
- "login.validate.passwordMatch": "Passwords do not match.",
120
- "login.validate.selectingChurch": "Please select a church.",
121
- // Church selection
122
- "selectChurch.address1": "Address Line 1",
123
- "selectChurch.address2": "Address Line 2",
124
- "selectChurch.another": "Choose another church",
125
- "selectChurch.city": "City",
126
- "selectChurch.confirmRegister": "Are you sure you wish to register a new church?",
127
- "selectChurch.country": "Country",
128
- "selectChurch.name": "Church Name",
129
- "selectChurch.noMatches": "No matches found.",
130
- "selectChurch.register": "Register a New Church",
131
- "selectChurch.selectChurch": "Select a Church",
132
- "selectChurch.state": "State / Province",
133
- "selectChurch.zip": "Zip / Postal Code",
134
- // Church selection validation
135
- "selectChurch.validate.address": "Address cannot be blank.",
136
- "selectChurch.validate.city": "City cannot be blank.",
137
- "selectChurch.validate.country": "Country cannot be blank.",
138
- "selectChurch.validate.name": "Church name cannot be blank.",
139
- "selectChurch.validate.state": "State/Province cannot be blank.",
140
- "selectChurch.validate.zip": "Zip/Postal code cannot be blank."
96
+ // Hard-coded English fallbacks for when locale files are not available
97
+ Locale.englishFallbacks = {
98
+ "common": {
99
+ "pleaseWait": "Please wait...",
100
+ "search": "Search",
101
+ "cancel": "Cancel",
102
+ "save": "Save",
103
+ "delete": "Delete",
104
+ "edit": "Edit",
105
+ "add": "Add",
106
+ "close": "Close",
107
+ "date": "Date",
108
+ "error": "Error",
109
+ "submit": "Submit",
110
+ "update": "Update"
111
+ },
112
+ "login": {
113
+ "createAccount": "Create an Account",
114
+ "email": "Email",
115
+ "expiredLink": "The current link is expired.",
116
+ "forgot": "Forgot Password",
117
+ "goLogin": "Go to Login",
118
+ "login": "Login",
119
+ "password": "Password",
120
+ "register": "Register",
121
+ "registerThankYou": "Thank you for registering! Please check your email to verify your account.",
122
+ "requestLink": "Request a new reset link",
123
+ "reset": "Reset",
124
+ "resetInstructions": "Enter your email address to request a password reset.",
125
+ "resetPassword": "Reset Password",
126
+ "resetSent": "Password reset email sent!",
127
+ "setPassword": "Set Password",
128
+ "signIn": "Sign In",
129
+ "signInTitle": "Please Sign In",
130
+ "verifyPassword": "Verify Password",
131
+ "welcomeName": "Welcome back, <b>{}</b>! Please wait while we load your data.",
132
+ "welcomeBack": "Welcome back",
133
+ "validate": {
134
+ "email": "Please enter a valid email address.",
135
+ "firstName": "Please enter your first name.",
136
+ "invalid": "Invalid login. Please check your email or password.",
137
+ "lastName": "Please enter your last name.",
138
+ "password": "Please enter a password.",
139
+ "passwordLength": "Password must be at least 8 characters long.",
140
+ "passwordMatch": "Passwords do not match.",
141
+ "selectingChurch": "Error in selecting church. Please verify and try again"
142
+ }
143
+ },
144
+ "selectChurch": {
145
+ "address1": "Address Line 1",
146
+ "address2": "Address Line 2",
147
+ "another": "Choose another church",
148
+ "city": "City",
149
+ "confirmRegister": "Are you sure you wish to register a new church?",
150
+ "country": "Country",
151
+ "name": "Church Name",
152
+ "noMatches": "No matches found.",
153
+ "register": "Register a New Church",
154
+ "selectChurch": "Select a Church",
155
+ "state": "State / Province",
156
+ "zip": "Zip / Postal Code",
157
+ "validate": {
158
+ "address": "Address cannot be blank.",
159
+ "city": "City cannot be blank.",
160
+ "country": "Country cannot be blank.",
161
+ "name": "Church name cannot be blank.",
162
+ "state": "State/Province cannot be blank.",
163
+ "zip": "Zip/Postal code cannot be blank."
164
+ }
165
+ }
141
166
  };
142
167
  Locale.init = async (backends) => {
143
168
  const resources = {};
@@ -148,13 +173,9 @@ Locale.init = async (backends) => {
148
173
  const notSupported = _a.supportedLanguages.indexOf(mappedLang) === -1;
149
174
  langs = mappedLang === "en" || notSupported ? ["en"] : ["en", mappedLang];
150
175
  }
151
- // Initialize resources with fallbacks
152
- resources["en"] = { translation: _a.fallbacks };
153
176
  // Load translations for each language
154
177
  for (const lang of langs) {
155
- if (!resources[lang]) {
156
- resources[lang] = { translation: {} };
157
- }
178
+ resources[lang] = { translation: {} };
158
179
  try {
159
180
  for (const backend of backends) {
160
181
  const url = backend.replace("{{lng}}", lang);
@@ -1 +1 @@
1
- {"version":3,"file":"Locale.js","sourceRoot":"","sources":["../../src/helpers/Locale.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Locale.js","sourceRoot":"","sources":["../../src/helpers/Locale.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,57 +1,57 @@
1
- {
2
- "name": "@churchapps/apphelper-login",
3
- "version": "0.4.26",
4
- "description": "Login components for ChurchApps AppHelper",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "scripts": {
9
- "test": "echo \"Error: no test specified\" && exit 1",
10
- "clean": "rimraf dist",
11
- "tsc": "tsc",
12
- "build": "npm-run-all clean tsc"
13
- },
14
- "repository": {
15
- "type": "git",
16
- "url": "git+https://github.com/LiveChurchSolutions/AppHelper.git"
17
- },
18
- "keywords": [
19
- "ChurchApps",
20
- "login",
21
- "authentication"
22
- ],
23
- "author": "ChurchApps.org",
24
- "license": "MIT",
25
- "bugs": {
26
- "url": "https://github.com/LiveChurchSolutions/AppHelper/issues"
27
- },
28
- "homepage": "https://github.com/LiveChurchSolutions/AppHelper#readme",
29
- "peerDependencies": {
30
- "@churchapps/helpers": "^1.0.46",
31
- "@churchapps/apphelper": "^0.4.26",
32
- "react": "^18.0.0 || ^19.0.0",
33
- "react-dom": "^18.0.0 || ^19.0.0",
34
- "react-router-dom": "^7.6.3"
35
- },
36
- "dependencies": {
37
- "@emotion/react": "^11.14.0",
38
- "@emotion/styled": "^11.14.1",
39
- "@mui/material": "^7.2.0",
40
- "axios": "^1.10.0",
41
- "i18next": "^25.3.1",
42
- "jwt-decode": "^4.0.0",
43
- "react-cookie": "^8.0.1",
44
- "react-google-recaptcha": "^3.1.0",
45
- "react-i18next": "^15.6.0",
46
- "react-ga4": "^2.1.0"
47
- },
48
- "devDependencies": {
49
- "@types/node": "^24.0.10",
50
- "@types/react": "^19.1.8",
51
- "@types/react-dom": "^19.1.6",
52
- "@types/react-google-recaptcha": "^2.1.5",
53
- "npm-run-all2": "^8.0.4",
54
- "rimraf": "^6.0.1",
55
- "typescript": "^5.8.3"
56
- }
57
- }
1
+ {
2
+ "name": "@churchapps/apphelper-login",
3
+ "version": "0.4.27",
4
+ "description": "Login components for ChurchApps AppHelper",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "test": "echo \"Error: no test specified\" && exit 1",
10
+ "clean": "rimraf dist",
11
+ "tsc": "tsc",
12
+ "build": "npm-run-all clean tsc"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/LiveChurchSolutions/AppHelper.git"
17
+ },
18
+ "keywords": [
19
+ "ChurchApps",
20
+ "login",
21
+ "authentication"
22
+ ],
23
+ "author": "ChurchApps.org",
24
+ "license": "MIT",
25
+ "bugs": {
26
+ "url": "https://github.com/LiveChurchSolutions/AppHelper/issues"
27
+ },
28
+ "homepage": "https://github.com/LiveChurchSolutions/AppHelper#readme",
29
+ "peerDependencies": {
30
+ "@churchapps/helpers": "^1.0.46",
31
+ "@churchapps/apphelper": "^0.4.27",
32
+ "react": "^18.0.0 || ^19.0.0",
33
+ "react-dom": "^18.0.0 || ^19.0.0",
34
+ "react-router-dom": "^7.6.3"
35
+ },
36
+ "dependencies": {
37
+ "@emotion/react": "^11.14.0",
38
+ "@emotion/styled": "^11.14.1",
39
+ "@mui/material": "^7.2.0",
40
+ "axios": "^1.10.0",
41
+ "i18next": "^25.3.1",
42
+ "jwt-decode": "^4.0.0",
43
+ "react-cookie": "^8.0.1",
44
+ "react-google-recaptcha": "^3.1.0",
45
+ "react-i18next": "^15.6.0",
46
+ "react-ga4": "^2.1.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^24.0.10",
50
+ "@types/react": "^19.1.8",
51
+ "@types/react-dom": "^19.1.6",
52
+ "@types/react-google-recaptcha": "^2.1.5",
53
+ "npm-run-all2": "^8.0.4",
54
+ "rimraf": "^6.0.1",
55
+ "typescript": "^5.8.3"
56
+ }
57
+ }
@@ -31,65 +31,76 @@ export class Locale {
31
31
  ];
32
32
  private static readonly extraCodes: ExtraLanguageCodes = { no: ["nb", "nn"] };
33
33
 
34
- // English fallbacks for all login-related labels
35
- private static readonly fallbacks: Record<string, string> = {
36
- // Common
37
- "common.pleaseWait": "Please wait...",
38
- "common.search": "Search",
39
-
40
- // Login
41
- "login.createAccount": "Create an Account",
42
- "login.email": "Email",
43
- "login.expiredLink": "The current link is expired.",
44
- "login.forgot": "Forgot Password",
45
- "login.goLogin": "Go to Login",
46
- "login.login": "Login",
47
- "login.password": "Password",
48
- "login.register": "Register",
49
- "login.registerThankYou": "Thank you for registering! Please check your email to verify your account.",
50
- "login.requestLink": "Request a new reset link",
51
- "login.reset": "Reset",
52
- "login.resetInstructions": "Enter your email address to request a password reset.",
53
- "login.resetPassword": "Reset Password",
54
- "login.resetSent": "Password reset email sent!",
55
- "login.setPassword": "Set Password",
56
- "login.signIn": "Sign In",
57
- "login.signInTitle": "Please Sign In",
58
- "login.verifyPassword": "Verify Password",
59
- "login.welcomeName": "Welcome back, {}!",
60
- "login.welcomeBack": "Welcome back",
61
-
62
- // Login validation
63
- "login.validate.email": "Please enter a valid email address.",
64
- "login.validate.firstName": "Please enter your first name.",
65
- "login.validate.invalid": "Invalid login. Please check your email or password.",
66
- "login.validate.lastName": "Please enter your last name.",
67
- "login.validate.password": "Please enter a password.",
68
- "login.validate.passwordLength": "Password must be at least 8 characters long.",
69
- "login.validate.passwordMatch": "Passwords do not match.",
70
- "login.validate.selectingChurch": "Please select a church.",
71
-
72
- // Church selection
73
- "selectChurch.address1": "Address Line 1",
74
- "selectChurch.address2": "Address Line 2",
75
- "selectChurch.another": "Choose another church",
76
- "selectChurch.city": "City",
77
- "selectChurch.confirmRegister": "Are you sure you wish to register a new church?",
78
- "selectChurch.country": "Country",
79
- "selectChurch.name": "Church Name",
80
- "selectChurch.noMatches": "No matches found.",
81
- "selectChurch.register": "Register a New Church",
82
- "selectChurch.selectChurch": "Select a Church",
83
- "selectChurch.state": "State / Province",
84
- "selectChurch.zip": "Zip / Postal Code",
85
-
86
- // Church selection validation
87
- "selectChurch.validate.address": "Address cannot be blank.",
88
- "selectChurch.validate.city": "City cannot be blank.",
89
- "selectChurch.validate.country": "Country cannot be blank.",
90
- "selectChurch.validate.name": "Church name cannot be blank.",
91
- "selectChurch.validate.state": "State/Province cannot be blank.",
92
- "selectChurch.validate.zip": "Zip/Postal code cannot be blank."
34
+ // Hard-coded English fallbacks for when locale files are not available
35
+ private static readonly englishFallbacks: Record<string, any> = {
36
+ "common": {
37
+ "pleaseWait": "Please wait...",
38
+ "search": "Search",
39
+ "cancel": "Cancel",
40
+ "save": "Save",
41
+ "delete": "Delete",
42
+ "edit": "Edit",
43
+ "add": "Add",
44
+ "close": "Close",
45
+ "date": "Date",
46
+ "error": "Error",
47
+ "submit": "Submit",
48
+ "update": "Update"
49
+ },
50
+ "login": {
51
+ "createAccount": "Create an Account",
52
+ "email": "Email",
53
+ "expiredLink": "The current link is expired.",
54
+ "forgot": "Forgot Password",
55
+ "goLogin": "Go to Login",
56
+ "login": "Login",
57
+ "password": "Password",
58
+ "register": "Register",
59
+ "registerThankYou": "Thank you for registering! Please check your email to verify your account.",
60
+ "requestLink": "Request a new reset link",
61
+ "reset": "Reset",
62
+ "resetInstructions": "Enter your email address to request a password reset.",
63
+ "resetPassword": "Reset Password",
64
+ "resetSent": "Password reset email sent!",
65
+ "setPassword": "Set Password",
66
+ "signIn": "Sign In",
67
+ "signInTitle": "Please Sign In",
68
+ "verifyPassword": "Verify Password",
69
+ "welcomeName": "Welcome back, <b>{}</b>! Please wait while we load your data.",
70
+ "welcomeBack": "Welcome back",
71
+ "validate": {
72
+ "email": "Please enter a valid email address.",
73
+ "firstName": "Please enter your first name.",
74
+ "invalid": "Invalid login. Please check your email or password.",
75
+ "lastName": "Please enter your last name.",
76
+ "password": "Please enter a password.",
77
+ "passwordLength": "Password must be at least 8 characters long.",
78
+ "passwordMatch": "Passwords do not match.",
79
+ "selectingChurch": "Error in selecting church. Please verify and try again"
80
+ }
81
+ },
82
+ "selectChurch": {
83
+ "address1": "Address Line 1",
84
+ "address2": "Address Line 2",
85
+ "another": "Choose another church",
86
+ "city": "City",
87
+ "confirmRegister": "Are you sure you wish to register a new church?",
88
+ "country": "Country",
89
+ "name": "Church Name",
90
+ "noMatches": "No matches found.",
91
+ "register": "Register a New Church",
92
+ "selectChurch": "Select a Church",
93
+ "state": "State / Province",
94
+ "zip": "Zip / Postal Code",
95
+ "validate": {
96
+ "address": "Address cannot be blank.",
97
+ "city": "City cannot be blank.",
98
+ "country": "Country cannot be blank.",
99
+ "name": "Church name cannot be blank.",
100
+ "state": "State/Province cannot be blank.",
101
+ "zip": "Zip/Postal code cannot be blank."
102
+ }
103
+ }
93
104
  };
94
105
 
95
106
  static init = async (backends: string[]): Promise<void> => {
@@ -106,15 +117,9 @@ export class Locale {
106
117
  langs = mappedLang === "en" || notSupported ? ["en"] : ["en", mappedLang];
107
118
  }
108
119
 
109
- // Initialize resources with fallbacks
110
- resources["en"] = { translation: this.fallbacks };
111
-
112
120
  // Load translations for each language
113
121
  for (const lang of langs) {
114
- if (!resources[lang]) {
115
- resources[lang] = { translation: {} };
116
- }
117
-
122
+ resources[lang] = { translation: {} };
118
123
  try {
119
124
  for (const backend of backends) {
120
125
  const url = backend.replace("{{lng}}", lang);
@@ -179,40 +184,51 @@ export class Locale {
179
184
  return obj !== null && typeof obj === "object" && !Array.isArray(obj);
180
185
  }
181
186
 
182
- // New helper method that uses i18n with fallback
187
+ // Helper method to get value from nested object using dot notation
188
+ private static getNestedValue(obj: Record<string, any>, path: string): any {
189
+ return path.split('.').reduce((current, key) => {
190
+ return current && current[key] !== undefined ? current[key] : undefined;
191
+ }, obj);
192
+ }
193
+
194
+ // New helper method that uses i18n with hard-coded English fallback
183
195
  static t(key: string, options?: Record<string, unknown>): string {
184
196
  try {
185
197
  // Check if i18n is initialized and has the key
186
198
  if (i18n && i18n.isInitialized && i18n.exists(key)) {
187
199
  const translation = i18n.t(key, options);
188
- // If translation is not just the key (which indicates missing translation)
200
+ // If translation is not the same as the key, return it
189
201
  if (translation !== key) {
190
202
  return translation;
191
203
  }
192
204
  }
193
205
  } catch (error) {
194
- console.warn(`Error getting translation for key "${key}":`, error);
206
+ // If i18n fails, fall through to hard-coded fallback
207
+ console.warn(`i18n translation failed for key "${key}":`, error);
195
208
  }
196
209
 
197
- // Fall back to our local fallbacks
198
- const fallback = this.fallbacks[key];
199
- if (fallback) {
200
- // Handle simple string replacement like {} placeholders
201
- if (options && typeof options === 'object') {
202
- let result = fallback;
203
- Object.entries(options).forEach(([placeholder, value]) => {
204
- if (typeof value === 'string' || typeof value === 'number') {
205
- result = result.replace(`{${placeholder}}`, String(value));
206
- result = result.replace('{}', String(value)); // Handle unnamed placeholders
210
+ // Fallback to hard-coded English translations
211
+ const fallbackValue = this.getNestedValue(this.englishFallbacks, key);
212
+ if (fallbackValue !== undefined) {
213
+ // Handle simple string interpolation for options
214
+ if (typeof fallbackValue === 'string' && options) {
215
+ let result = fallbackValue;
216
+ Object.keys(options).forEach(optionKey => {
217
+ const placeholder = `{{${optionKey}}}`;
218
+ if (result.includes(placeholder)) {
219
+ result = result.replace(new RegExp(placeholder, 'g'), String(options[optionKey]));
220
+ }
221
+ // Also handle {} placeholder for backward compatibility
222
+ if (result.includes('{}')) {
223
+ result = result.replace('{}', String(options[optionKey]));
207
224
  }
208
225
  });
209
226
  return result;
210
227
  }
211
- return fallback;
228
+ return String(fallbackValue);
212
229
  }
213
230
 
214
- // Ultimate fallback - return the key itself with a warning
215
- console.warn(`No translation found for key: ${key}`);
231
+ // If no fallback found, return the key itself
216
232
  return key;
217
233
  }
218
234
 
@@ -221,7 +237,7 @@ export class Locale {
221
237
  return this.t(key);
222
238
  }
223
239
 
224
- // Helper method to check if translations are available
240
+ // Helper method to check if i18n is initialized
225
241
  static isInitialized(): boolean {
226
242
  return i18n && i18n.isInitialized;
227
243
  }