@umituz/react-native-localization 1.0.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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +292 -0
  3. package/lib/domain/repositories/ILocalizationRepository.d.ts +17 -0
  4. package/lib/domain/repositories/ILocalizationRepository.d.ts.map +1 -0
  5. package/lib/domain/repositories/ILocalizationRepository.js +6 -0
  6. package/lib/domain/repositories/ILocalizationRepository.js.map +1 -0
  7. package/lib/index.d.ts +10 -0
  8. package/lib/index.d.ts.map +1 -0
  9. package/lib/index.js +12 -0
  10. package/lib/index.js.map +1 -0
  11. package/lib/infrastructure/components/LocalizationProvider.d.ts +11 -0
  12. package/lib/infrastructure/components/LocalizationProvider.d.ts.map +1 -0
  13. package/lib/infrastructure/components/LocalizationProvider.js +14 -0
  14. package/lib/infrastructure/components/LocalizationProvider.js.map +1 -0
  15. package/lib/infrastructure/config/i18n.d.ts +7 -0
  16. package/lib/infrastructure/config/i18n.d.ts.map +1 -0
  17. package/lib/infrastructure/config/i18n.js +49 -0
  18. package/lib/infrastructure/config/i18n.js.map +1 -0
  19. package/lib/infrastructure/config/languages.d.ts +34 -0
  20. package/lib/infrastructure/config/languages.d.ts.map +1 -0
  21. package/lib/infrastructure/config/languages.js +200 -0
  22. package/lib/infrastructure/config/languages.js.map +1 -0
  23. package/lib/infrastructure/config/languagesData.d.ts +7 -0
  24. package/lib/infrastructure/config/languagesData.d.ts.map +1 -0
  25. package/lib/infrastructure/config/languagesData.js +36 -0
  26. package/lib/infrastructure/config/languagesData.js.map +1 -0
  27. package/lib/infrastructure/locales/en-US/animation.json +30 -0
  28. package/lib/infrastructure/locales/en-US/audio.json +56 -0
  29. package/lib/infrastructure/locales/en-US/datetime.json +140 -0
  30. package/lib/infrastructure/locales/en-US/emoji.json +29 -0
  31. package/lib/infrastructure/locales/en-US/errors.json +43 -0
  32. package/lib/infrastructure/locales/en-US/forms.json +38 -0
  33. package/lib/infrastructure/locales/en-US/general.json +56 -0
  34. package/lib/infrastructure/locales/en-US/icons.json +34 -0
  35. package/lib/infrastructure/locales/en-US/index.d.ts +757 -0
  36. package/lib/infrastructure/locales/en-US/index.d.ts.map +1 -0
  37. package/lib/infrastructure/locales/en-US/index.js +35 -0
  38. package/lib/infrastructure/locales/en-US/index.js.map +1 -0
  39. package/lib/infrastructure/locales/en-US/location.json +49 -0
  40. package/lib/infrastructure/locales/en-US/media.json +49 -0
  41. package/lib/infrastructure/locales/en-US/navigation.json +52 -0
  42. package/lib/infrastructure/locales/en-US/onboarding.json +76 -0
  43. package/lib/infrastructure/locales/en-US/settings.json +65 -0
  44. package/lib/infrastructure/locales/en-US/toast.json +38 -0
  45. package/lib/infrastructure/storage/AsyncStorageWrapper.d.ts +12 -0
  46. package/lib/infrastructure/storage/AsyncStorageWrapper.d.ts.map +1 -0
  47. package/lib/infrastructure/storage/AsyncStorageWrapper.js +29 -0
  48. package/lib/infrastructure/storage/AsyncStorageWrapper.js.map +1 -0
  49. package/lib/infrastructure/storage/LocalizationStore.d.ts +30 -0
  50. package/lib/infrastructure/storage/LocalizationStore.d.ts.map +1 -0
  51. package/lib/infrastructure/storage/LocalizationStore.js +90 -0
  52. package/lib/infrastructure/storage/LocalizationStore.js.map +1 -0
  53. package/package.json +64 -0
  54. package/src/domain/repositories/ILocalizationRepository.ts +18 -0
  55. package/src/index.ts +24 -0
  56. package/src/infrastructure/components/LocalizationProvider.tsx +21 -0
  57. package/src/infrastructure/config/i18n.ts +57 -0
  58. package/src/infrastructure/config/languages.ts +245 -0
  59. package/src/infrastructure/config/languagesData.ts +38 -0
  60. package/src/infrastructure/locales/en-US/animation.json +30 -0
  61. package/src/infrastructure/locales/en-US/audio.json +56 -0
  62. package/src/infrastructure/locales/en-US/datetime.json +140 -0
  63. package/src/infrastructure/locales/en-US/emoji.json +29 -0
  64. package/src/infrastructure/locales/en-US/errors.json +43 -0
  65. package/src/infrastructure/locales/en-US/forms.json +38 -0
  66. package/src/infrastructure/locales/en-US/general.json +56 -0
  67. package/src/infrastructure/locales/en-US/icons.json +34 -0
  68. package/src/infrastructure/locales/en-US/index.ts +36 -0
  69. package/src/infrastructure/locales/en-US/location.json +49 -0
  70. package/src/infrastructure/locales/en-US/media.json +49 -0
  71. package/src/infrastructure/locales/en-US/navigation.json +52 -0
  72. package/src/infrastructure/locales/en-US/onboarding.json +76 -0
  73. package/src/infrastructure/locales/en-US/settings.json +65 -0
  74. package/src/infrastructure/locales/en-US/toast.json +38 -0
  75. package/src/infrastructure/storage/AsyncStorageWrapper.ts +30 -0
  76. package/src/infrastructure/storage/LocalizationStore.ts +118 -0
package/src/index.ts ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * React Native Localization
3
+ * Universal localization system with i18n support for React Native apps
4
+ */
5
+
6
+ // Hooks
7
+ export { useLocalization, useLocalizationStore } from './infrastructure/storage/LocalizationStore';
8
+
9
+ // Components
10
+ export { LocalizationProvider } from './infrastructure/components/LocalizationProvider';
11
+
12
+ // Configuration
13
+ export { default as i18n } from './infrastructure/config/i18n';
14
+ export {
15
+ SUPPORTED_LANGUAGES,
16
+ DEFAULT_LANGUAGE,
17
+ getLanguageByCode,
18
+ isLanguageSupported,
19
+ getDefaultLanguage,
20
+ getDeviceLocale,
21
+ } from './infrastructure/config/languages';
22
+
23
+ // Types
24
+ export type { Language, ILocalizationRepository } from './domain/repositories/ILocalizationRepository';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * LocalizationProvider Component
3
+ * Initializes localization system on mount
4
+ */
5
+
6
+ import React, { useEffect, ReactNode } from 'react';
7
+ import { useLocalizationStore } from '../storage/LocalizationStore';
8
+
9
+ interface LocalizationProviderProps {
10
+ children: ReactNode;
11
+ }
12
+
13
+ export const LocalizationProvider: React.FC<LocalizationProviderProps> = ({ children }) => {
14
+ const initialize = useLocalizationStore((state) => state.initialize);
15
+
16
+ useEffect(() => {
17
+ initialize();
18
+ }, [initialize]);
19
+
20
+ return <>{children}</>;
21
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * i18next Configuration
3
+ * Nested translation structure - common translations spread, domain translations nested
4
+ */
5
+
6
+ import i18n from 'i18next';
7
+ import { initReactI18next } from 'react-i18next';
8
+ import { SUPPORTED_LANGUAGES, DEFAULT_LANGUAGE } from './languages';
9
+
10
+ /**
11
+ * Import all translations from modular folder structure
12
+ * Each locale has an index.ts that merges all JSON files
13
+ *
14
+ * Structure (OFFLINE-ONLY):
15
+ * locales/
16
+ * en-US/ (universal translations in localization domain)
17
+ * index.ts (merges common.json, navigation.json, settings.json, onboarding.json, errors.json)
18
+ *
19
+ * All translations are offline-compatible and work without backend.
20
+ */
21
+
22
+ // Import universal translations from localization domain
23
+ import localizationEnUS from '../locales/en-US';
24
+
25
+ /**
26
+ * Translation Resources
27
+ * Nested structure - domain-based organization with direct key access
28
+ * Example: settings.theme.title, onboarding.welcome.title
29
+ */
30
+ const resources = {
31
+ 'en-US': {
32
+ translation: {
33
+ ...localizationEnUS,
34
+ },
35
+ },
36
+ };
37
+
38
+ /**
39
+ * Initialize i18next
40
+ */
41
+ i18n.use(initReactI18next).init({
42
+ resources,
43
+ lng: DEFAULT_LANGUAGE,
44
+ fallbackLng: DEFAULT_LANGUAGE,
45
+
46
+ interpolation: {
47
+ escapeValue: false, // React already escapes values
48
+ },
49
+
50
+ react: {
51
+ useSuspense: false, // Disable suspense for React Native
52
+ },
53
+
54
+ compatibilityJSON: 'v4', // Use i18next v4 JSON format
55
+ });
56
+
57
+ export default i18n;
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Supported Languages Configuration
3
+ * Complete list of 29 languages supported by the app
4
+ *
5
+ * SINGLE SOURCE OF TRUTH: Imports from constants/languages.ts
6
+ * - All language definitions come from one central location
7
+ * - Ensures consistency across app.json, i18n config, and UI
8
+ * - Automatic synchronization between all language configurations
9
+ *
10
+ * DEVICE LOCALE DETECTION:
11
+ * - First launch: Automatically detects device locale
12
+ * - Fallback: English (en-US) if device locale not supported
13
+ * - User choice: Persists after manual language selection
14
+ */
15
+
16
+ import * as Localization from 'expo-localization';
17
+ import { LANGUAGES } from './languagesData';
18
+ import { Language } from '../../domain/repositories/ILocalizationRepository';
19
+
20
+ // Single source of truth for supported languages
21
+ export const SUPPORTED_LANGUAGES: Language[] = LANGUAGES;
22
+
23
+ export const DEFAULT_LANGUAGE = 'en-US';
24
+
25
+ /**
26
+ * Locale mapping for device locales to supported app locales
27
+ * Maps short codes (e.g., "en") and iOS variants (e.g., "en-GB", "zh-Hans") to our supported locales
28
+ *
29
+ * COMPREHENSIVE MAPPING:
30
+ * - Short codes (ar, bg, cs, da, de, etc.) → Full locale codes (ar-SA, bg-BG, etc.)
31
+ * - iOS regional variants → Our standard locales
32
+ * - All 29 supported languages included
33
+ */
34
+ const LOCALE_MAPPING: Record<string, string> = {
35
+ // Arabic
36
+ 'ar': 'ar-SA',
37
+ 'ar-SA': 'ar-SA',
38
+ 'ar-AE': 'ar-SA',
39
+ 'ar-EG': 'ar-SA',
40
+
41
+ // Bulgarian
42
+ 'bg': 'bg-BG',
43
+ 'bg-BG': 'bg-BG',
44
+
45
+ // Czech
46
+ 'cs': 'cs-CZ',
47
+ 'cs-CZ': 'cs-CZ',
48
+
49
+ // Danish
50
+ 'da': 'da-DK',
51
+ 'da-DK': 'da-DK',
52
+
53
+ // German
54
+ 'de': 'de-DE',
55
+ 'de-DE': 'de-DE',
56
+ 'de-AT': 'de-DE',
57
+ 'de-CH': 'de-DE',
58
+
59
+ // Greek (iOS has el, we map to en-US fallback since we don't support Greek)
60
+ 'el': 'en-US',
61
+
62
+ // English variants
63
+ 'en': 'en-US',
64
+ 'en-US': 'en-US',
65
+ 'en-GB': 'en-US',
66
+ 'en-AU': 'en-US',
67
+ 'en-CA': 'en-US',
68
+ 'en-NZ': 'en-US',
69
+ 'en-IE': 'en-US',
70
+ 'en-ZA': 'en-US',
71
+
72
+ // Spanish
73
+ 'es': 'es-ES',
74
+ 'es-ES': 'es-ES',
75
+ 'es-MX': 'es-ES',
76
+ 'es-AR': 'es-ES',
77
+
78
+ // Finnish
79
+ 'fi': 'fi-FI',
80
+ 'fi-FI': 'fi-FI',
81
+
82
+ // French
83
+ 'fr': 'fr-FR',
84
+ 'fr-FR': 'fr-FR',
85
+ 'fr-CA': 'fr-FR',
86
+ 'fr-BE': 'fr-FR',
87
+ 'fr-CH': 'fr-FR',
88
+
89
+ // Hindi
90
+ 'hi': 'hi-IN',
91
+ 'hi-IN': 'hi-IN',
92
+
93
+ // Croatian (iOS has hr, we map to en-US fallback since we don't support Croatian)
94
+ 'hr': 'en-US',
95
+
96
+ // Hungarian
97
+ 'hu': 'hu-HU',
98
+ 'hu-HU': 'hu-HU',
99
+
100
+ // Indonesian
101
+ 'id': 'id-ID',
102
+ 'id-ID': 'id-ID',
103
+
104
+ // Italian
105
+ 'it': 'it-IT',
106
+ 'it-IT': 'it-IT',
107
+
108
+ // Japanese
109
+ 'ja': 'ja-JP',
110
+ 'ja-JP': 'ja-JP',
111
+
112
+ // Korean
113
+ 'ko': 'ko-KR',
114
+ 'ko-KR': 'ko-KR',
115
+
116
+ // Malay
117
+ 'ms': 'ms-MY',
118
+ 'ms-MY': 'ms-MY',
119
+
120
+ // Norwegian (iOS uses nb for Norwegian Bokmål)
121
+ 'nb': 'no-NO',
122
+ 'no': 'no-NO',
123
+ 'no-NO': 'no-NO',
124
+
125
+ // Dutch
126
+ 'nl': 'nl-NL',
127
+ 'nl-NL': 'nl-NL',
128
+ 'nl-BE': 'nl-NL',
129
+
130
+ // Polish
131
+ 'pl': 'pl-PL',
132
+ 'pl-PL': 'pl-PL',
133
+
134
+ // Portuguese
135
+ 'pt': 'pt-PT',
136
+ 'pt-PT': 'pt-PT',
137
+ 'pt-BR': 'pt-PT',
138
+
139
+ // Romanian
140
+ 'ro': 'ro-RO',
141
+ 'ro-RO': 'ro-RO',
142
+
143
+ // Russian
144
+ 'ru': 'ru-RU',
145
+ 'ru-RU': 'ru-RU',
146
+
147
+ // Slovak (iOS has sk, we map to en-US fallback since we don't support Slovak)
148
+ 'sk': 'en-US',
149
+
150
+ // Swedish
151
+ 'sv': 'sv-SE',
152
+ 'sv-SE': 'sv-SE',
153
+
154
+ // Thai
155
+ 'th': 'th-TH',
156
+ 'th-TH': 'th-TH',
157
+
158
+ // Filipino/Tagalog
159
+ 'tl': 'tl-PH',
160
+ 'tl-PH': 'tl-PH',
161
+ 'fil': 'tl-PH',
162
+
163
+ // Turkish
164
+ 'tr': 'tr-TR',
165
+ 'tr-TR': 'tr-TR',
166
+
167
+ // Ukrainian
168
+ 'uk': 'uk-UA',
169
+ 'uk-UA': 'uk-UA',
170
+
171
+ // Vietnamese
172
+ 'vi': 'vi-VN',
173
+ 'vi-VN': 'vi-VN',
174
+
175
+ // Chinese Simplified (iOS uses zh-Hans)
176
+ 'zh': 'zh-CN',
177
+ 'zh-CN': 'zh-CN',
178
+ 'zh-Hans': 'zh-CN',
179
+ 'zh-Hans-CN': 'zh-CN',
180
+
181
+ // Chinese Traditional (iOS uses zh-Hant, we map to zh-CN since we only support Simplified)
182
+ 'zh-Hant': 'zh-CN',
183
+ 'zh-TW': 'zh-CN',
184
+ 'zh-HK': 'zh-CN',
185
+ };
186
+
187
+ export const getLanguageByCode = (code: string): Language | undefined => {
188
+ return SUPPORTED_LANGUAGES.find((lang) => lang.code === code);
189
+ };
190
+
191
+ export const isLanguageSupported = (code: string): boolean => {
192
+ return SUPPORTED_LANGUAGES.some((lang) => lang.code === code);
193
+ };
194
+
195
+ export const getDefaultLanguage = (): Language => {
196
+ return SUPPORTED_LANGUAGES[0]; // en-US
197
+ };
198
+
199
+ /**
200
+ * Get device locale and map it to supported language
201
+ * Called ONLY on first launch (when no saved language preference exists)
202
+ *
203
+ * @returns Supported language code or DEFAULT_LANGUAGE
204
+ *
205
+ * Examples:
206
+ * - Device: "en" → Returns: "en-US"
207
+ * - Device: "en-GB" → Returns: "en-US"
208
+ * - Device: "tr" → Returns: "tr-TR" (if supported)
209
+ * - Device: "de" → Returns: "en-US" (not supported, fallback)
210
+ */
211
+ export const getDeviceLocale = (): string => {
212
+ try {
213
+ // Get device locale (e.g., "en-US", "tr-TR", or just "en")
214
+ const deviceLocale = Localization.locale;
215
+
216
+ if (!deviceLocale) {
217
+ return DEFAULT_LANGUAGE;
218
+ }
219
+
220
+ // Check if exact match exists in LOCALE_MAPPING
221
+ if (LOCALE_MAPPING[deviceLocale]) {
222
+ return LOCALE_MAPPING[deviceLocale];
223
+ }
224
+
225
+ // Extract language code (e.g., "en" from "en-US")
226
+ const languageCode = deviceLocale.split('-')[0];
227
+
228
+ // Check if language code exists in LOCALE_MAPPING
229
+ if (LOCALE_MAPPING[languageCode]) {
230
+ return LOCALE_MAPPING[languageCode];
231
+ }
232
+
233
+ // Check if device locale is directly supported
234
+ if (isLanguageSupported(deviceLocale)) {
235
+ return deviceLocale;
236
+ }
237
+
238
+ // Fallback to default language
239
+ return DEFAULT_LANGUAGE;
240
+ } catch (error) {
241
+ // If any error occurs, fallback to default
242
+ console.warn('[Localization] Failed to detect device locale:', error);
243
+ return DEFAULT_LANGUAGE;
244
+ }
245
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Languages Data
3
+ * Complete list of supported languages with metadata
4
+ */
5
+
6
+ import type { Language } from '../../domain/repositories/ILocalizationRepository';
7
+
8
+ export const LANGUAGES: Language[] = [
9
+ { code: 'en-US', name: 'English', nativeName: 'English', flag: '🇺🇸', rtl: false },
10
+ { code: 'ar-SA', name: 'Arabic', nativeName: 'العربية', flag: '🇸🇦', rtl: true },
11
+ { code: 'bg-BG', name: 'Bulgarian', nativeName: 'Български', flag: '🇧🇬', rtl: false },
12
+ { code: 'cs-CZ', name: 'Czech', nativeName: 'Čeština', flag: '🇨🇿', rtl: false },
13
+ { code: 'da-DK', name: 'Danish', nativeName: 'Dansk', flag: '🇩🇰', rtl: false },
14
+ { code: 'de-DE', name: 'German', nativeName: 'Deutsch', flag: '🇩🇪', rtl: false },
15
+ { code: 'es-ES', name: 'Spanish', nativeName: 'Español', flag: '🇪🇸', rtl: false },
16
+ { code: 'fi-FI', name: 'Finnish', nativeName: 'Suomi', flag: '🇫🇮', rtl: false },
17
+ { code: 'fr-FR', name: 'French', nativeName: 'Français', flag: '🇫🇷', rtl: false },
18
+ { code: 'hi-IN', name: 'Hindi', nativeName: 'हिन्दी', flag: '🇮🇳', rtl: false },
19
+ { code: 'hu-HU', name: 'Hungarian', nativeName: 'Magyar', flag: '🇭🇺', rtl: false },
20
+ { code: 'id-ID', name: 'Indonesian', nativeName: 'Bahasa Indonesia', flag: '🇮🇩', rtl: false },
21
+ { code: 'it-IT', name: 'Italian', nativeName: 'Italiano', flag: '🇮🇹', rtl: false },
22
+ { code: 'ja-JP', name: 'Japanese', nativeName: '日本語', flag: '🇯🇵', rtl: false },
23
+ { code: 'ko-KR', name: 'Korean', nativeName: '한국어', flag: '🇰🇷', rtl: false },
24
+ { code: 'ms-MY', name: 'Malay', nativeName: 'Bahasa Melayu', flag: '🇲🇾', rtl: false },
25
+ { code: 'nl-NL', name: 'Dutch', nativeName: 'Nederlands', flag: '🇳🇱', rtl: false },
26
+ { code: 'no-NO', name: 'Norwegian', nativeName: 'Norsk', flag: '🇳🇴', rtl: false },
27
+ { code: 'pl-PL', name: 'Polish', nativeName: 'Polski', flag: '🇵🇱', rtl: false },
28
+ { code: 'pt-PT', name: 'Portuguese', nativeName: 'Português', flag: '🇵🇹', rtl: false },
29
+ { code: 'ro-RO', name: 'Romanian', nativeName: 'Română', flag: '🇷🇴', rtl: false },
30
+ { code: 'ru-RU', name: 'Russian', nativeName: 'Русский', flag: '🇷🇺', rtl: false },
31
+ { code: 'sv-SE', name: 'Swedish', nativeName: 'Svenska', flag: '🇸🇪', rtl: false },
32
+ { code: 'th-TH', name: 'Thai', nativeName: 'ไทย', flag: '🇹🇭', rtl: false },
33
+ { code: 'tl-PH', name: 'Filipino', nativeName: 'Tagalog', flag: '🇵🇭', rtl: false },
34
+ { code: 'tr-TR', name: 'Turkish', nativeName: 'Türkçe', flag: '🇹🇷', rtl: false },
35
+ { code: 'uk-UA', name: 'Ukrainian', nativeName: 'Українська', flag: '🇺🇦', rtl: false },
36
+ { code: 'vi-VN', name: 'Vietnamese', nativeName: 'Tiếng Việt', flag: '🇻🇳', rtl: false },
37
+ { code: 'zh-CN', name: 'Chinese (Simplified)', nativeName: '简体中文', flag: '🇨🇳', rtl: false },
38
+ ];
@@ -0,0 +1,30 @@
1
+ {
2
+ "presets": {
3
+ "fadeIn": "Fade In",
4
+ "fadeOut": "Fade Out",
5
+ "slideInUp": "Slide In Up",
6
+ "slideInDown": "Slide In Down",
7
+ "slideInLeft": "Slide In Left",
8
+ "slideInRight": "Slide In Right",
9
+ "scaleIn": "Scale In",
10
+ "scaleOut": "Scale Out",
11
+ "bounce": "Bounce",
12
+ "shake": "Shake"
13
+ },
14
+ "gestures": {
15
+ "tap": "Tap",
16
+ "pan": "Pan",
17
+ "pinch": "Pinch",
18
+ "rotation": "Rotation",
19
+ "longPress": "Long Press"
20
+ },
21
+ "actions": {
22
+ "animate": "Animate",
23
+ "reset": "Reset Animation"
24
+ },
25
+ "labels": {
26
+ "duration": "Duration",
27
+ "damping": "Damping",
28
+ "stiffness": "Stiffness"
29
+ }
30
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "recording": {
3
+ "start": "Start Recording",
4
+ "stop": "Stop Recording",
5
+ "pause": "Pause Recording",
6
+ "resume": "Resume Recording",
7
+ "save": "Save Recording",
8
+ "delete": "Delete Recording",
9
+ "recording": "Recording...",
10
+ "paused": "Paused",
11
+ "duration": "Duration"
12
+ },
13
+ "playback": {
14
+ "play": "Play",
15
+ "pause": "Pause",
16
+ "stop": "Stop",
17
+ "replay": "Replay",
18
+ "forward": "Forward",
19
+ "backward": "Backward",
20
+ "speed": "Speed",
21
+ "volume": "Volume",
22
+ "mute": "Mute",
23
+ "unmute": "Unmute",
24
+ "loop": "Loop",
25
+ "playing": "Playing",
26
+ "buffering": "Buffering",
27
+ "finished": "Finished"
28
+ },
29
+ "permissions": {
30
+ "microphoneTitle": "Microphone Permission",
31
+ "microphoneMessage": "This app needs microphone access to record audio",
32
+ "deniedTitle": "Permission Denied",
33
+ "deniedMessage": "Please enable microphone permissions in Settings",
34
+ "openSettings": "Open Settings"
35
+ },
36
+ "quality": {
37
+ "low": "Low Quality",
38
+ "high": "High Quality"
39
+ },
40
+ "errors": {
41
+ "recordFailed": "Failed to start recording",
42
+ "stopFailed": "Failed to stop recording",
43
+ "playFailed": "Failed to play audio",
44
+ "loadFailed": "Failed to load audio",
45
+ "saveFailed": "Failed to save recording",
46
+ "permissionDenied": "Microphone permission denied",
47
+ "noRecording": "No recording available",
48
+ "invalidFile": "Invalid audio file"
49
+ },
50
+ "formats": {
51
+ "aac": "AAC",
52
+ "mp3": "MP3",
53
+ "m4a": "M4A",
54
+ "wav": "WAV"
55
+ }
56
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "days": {
3
+ "full": {
4
+ "monday": "Monday",
5
+ "tuesday": "Tuesday",
6
+ "wednesday": "Wednesday",
7
+ "thursday": "Thursday",
8
+ "friday": "Friday",
9
+ "saturday": "Saturday",
10
+ "sunday": "Sunday"
11
+ },
12
+ "short": {
13
+ "mon": "Mon",
14
+ "tue": "Tue",
15
+ "wed": "Wed",
16
+ "thu": "Thu",
17
+ "fri": "Fri",
18
+ "sat": "Sat",
19
+ "sun": "Sun"
20
+ },
21
+ "abbreviated": {
22
+ "m": "M",
23
+ "t": "T",
24
+ "w": "W",
25
+ "th": "Th",
26
+ "f": "F",
27
+ "sa": "Sa",
28
+ "su": "Su"
29
+ }
30
+ },
31
+ "months": {
32
+ "full": {
33
+ "january": "January",
34
+ "february": "February",
35
+ "march": "March",
36
+ "april": "April",
37
+ "may": "May",
38
+ "june": "June",
39
+ "july": "July",
40
+ "august": "August",
41
+ "september": "September",
42
+ "october": "October",
43
+ "november": "November",
44
+ "december": "December"
45
+ },
46
+ "short": {
47
+ "jan": "Jan",
48
+ "feb": "Feb",
49
+ "mar": "Mar",
50
+ "apr": "Apr",
51
+ "may": "May",
52
+ "jun": "Jun",
53
+ "jul": "Jul",
54
+ "aug": "Aug",
55
+ "sep": "Sep",
56
+ "oct": "Oct",
57
+ "nov": "Nov",
58
+ "dec": "Dec"
59
+ }
60
+ },
61
+ "relative": {
62
+ "now": "Now",
63
+ "justNow": "Just now",
64
+ "today": "Today",
65
+ "yesterday": "Yesterday",
66
+ "tomorrow": "Tomorrow",
67
+ "thisWeek": "This week",
68
+ "lastWeek": "Last week",
69
+ "nextWeek": "Next week",
70
+ "thisMonth": "This month",
71
+ "lastMonth": "Last month",
72
+ "nextMonth": "Next month",
73
+ "thisYear": "This year",
74
+ "lastYear": "Last year",
75
+ "nextYear": "Next year",
76
+ "ago": "ago",
77
+ "fromNow": "from now",
78
+ "in": "in"
79
+ },
80
+ "units": {
81
+ "singular": {
82
+ "second": "second",
83
+ "minute": "minute",
84
+ "hour": "hour",
85
+ "day": "day",
86
+ "week": "week",
87
+ "month": "month",
88
+ "year": "year"
89
+ },
90
+ "plural": {
91
+ "seconds": "seconds",
92
+ "minutes": "minutes",
93
+ "hours": "hours",
94
+ "days": "days",
95
+ "weeks": "weeks",
96
+ "months": "months",
97
+ "years": "years"
98
+ },
99
+ "short": {
100
+ "s": "s",
101
+ "m": "m",
102
+ "h": "h",
103
+ "d": "d",
104
+ "w": "w",
105
+ "mo": "mo",
106
+ "y": "y"
107
+ }
108
+ },
109
+ "periods": {
110
+ "am": "AM",
111
+ "pm": "PM",
112
+ "morning": "Morning",
113
+ "afternoon": "Afternoon",
114
+ "evening": "Evening",
115
+ "night": "Night",
116
+ "midnight": "Midnight",
117
+ "noon": "Noon"
118
+ },
119
+ "formats": {
120
+ "date": "Date",
121
+ "time": "Time",
122
+ "datetime": "Date & Time",
123
+ "duration": "Duration",
124
+ "startDate": "Start Date",
125
+ "endDate": "End Date",
126
+ "startTime": "Start Time",
127
+ "endTime": "End Time",
128
+ "selectDate": "Select Date",
129
+ "selectTime": "Select Time"
130
+ },
131
+ "actions": {
132
+ "setDate": "Set Date",
133
+ "setTime": "Set Time",
134
+ "clearDate": "Clear Date",
135
+ "clearTime": "Clear Time",
136
+ "confirmDate": "Confirm Date",
137
+ "confirmTime": "Confirm Time",
138
+ "cancel": "Cancel"
139
+ }
140
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "picker": {
3
+ "title": "Select Emoji",
4
+ "search": "Search emojis...",
5
+ "searchPlaceholder": "Search",
6
+ "noResults": "No emojis found",
7
+ "recentlyUsed": "Recently Used"
8
+ },
9
+ "categories": {
10
+ "smileys_emotion": "Smileys & Emotion",
11
+ "people_body": "People & Body",
12
+ "animals_nature": "Animals & Nature",
13
+ "food_drink": "Food & Drink",
14
+ "travel_places": "Travel & Places",
15
+ "activities": "Activities",
16
+ "objects": "Objects",
17
+ "symbols": "Symbols",
18
+ "flags": "Flags"
19
+ },
20
+ "actions": {
21
+ "select": "Select",
22
+ "cancel": "Cancel",
23
+ "clear": "Clear Emoji"
24
+ },
25
+ "validation": {
26
+ "required": "Please select an emoji",
27
+ "invalid": "Invalid emoji"
28
+ }
29
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "validation": {
3
+ "required": "This field is required",
4
+ "invalidEmail": "Invalid email format",
5
+ "invalidPhone": "Invalid phone number",
6
+ "invalidUrl": "Invalid URL format",
7
+ "minLength": "Minimum length is {{min}} characters",
8
+ "maxLength": "Maximum length is {{max}} characters",
9
+ "minValue": "Minimum value is {{min}}",
10
+ "maxValue": "Maximum value is {{max}}",
11
+ "mustMatch": "Fields must match",
12
+ "invalidFormat": "Invalid format",
13
+ "invalidDate": "Invalid date",
14
+ "futureDate": "Date must be in the future",
15
+ "pastDate": "Date must be in the past"
16
+ },
17
+ "storage": {
18
+ "saveFailed": "Failed to save data",
19
+ "loadFailed": "Failed to load data",
20
+ "deleteFailed": "Failed to delete data",
21
+ "notFound": "Data not found"
22
+ },
23
+ "permission": {
24
+ "denied": "Permission denied",
25
+ "notGranted": "Permission not granted",
26
+ "cameraNotAvailable": "Camera not available",
27
+ "locationNotAvailable": "Location services not available",
28
+ "microphoneNotAvailable": "Microphone not available",
29
+ "photosNotAvailable": "Photo library not available"
30
+ },
31
+ "common": {
32
+ "somethingWentWrong": "Something went wrong",
33
+ "tryAgainLater": "Please try again later",
34
+ "unexpectedError": "An unexpected error occurred"
35
+ },
36
+ "actions": {
37
+ "dismiss": "Dismiss",
38
+ "retry": "Retry",
39
+ "cancel": "Cancel",
40
+ "goBack": "Go Back",
41
+ "contactSupport": "Contact Support"
42
+ }
43
+ }