@xivdyetools/core 1.3.7

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 (103) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +400 -0
  3. package/dist/constants/index.d.ts +56 -0
  4. package/dist/constants/index.d.ts.map +1 -0
  5. package/dist/constants/index.js +103 -0
  6. package/dist/constants/index.js.map +1 -0
  7. package/dist/data/colors_xiv.json +3130 -0
  8. package/dist/data/locales/de.json +231 -0
  9. package/dist/data/locales/en.json +231 -0
  10. package/dist/data/locales/fr.json +231 -0
  11. package/dist/data/locales/ja.json +231 -0
  12. package/dist/data/locales/ko.json +233 -0
  13. package/dist/data/locales/zh.json +233 -0
  14. package/dist/data/presets.json +390 -0
  15. package/dist/index.d.ts +16 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +18 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/services/APIService.d.ts +246 -0
  20. package/dist/services/APIService.d.ts.map +1 -0
  21. package/dist/services/APIService.js +499 -0
  22. package/dist/services/APIService.js.map +1 -0
  23. package/dist/services/ColorService.d.ts +146 -0
  24. package/dist/services/ColorService.d.ts.map +1 -0
  25. package/dist/services/ColorService.js +209 -0
  26. package/dist/services/ColorService.js.map +1 -0
  27. package/dist/services/DyeService.d.ts +230 -0
  28. package/dist/services/DyeService.d.ts.map +1 -0
  29. package/dist/services/DyeService.js +326 -0
  30. package/dist/services/DyeService.js.map +1 -0
  31. package/dist/services/LocalizationService.d.ts +338 -0
  32. package/dist/services/LocalizationService.d.ts.map +1 -0
  33. package/dist/services/LocalizationService.js +449 -0
  34. package/dist/services/LocalizationService.js.map +1 -0
  35. package/dist/services/PaletteService.d.ts +137 -0
  36. package/dist/services/PaletteService.d.ts.map +1 -0
  37. package/dist/services/PaletteService.js +349 -0
  38. package/dist/services/PaletteService.js.map +1 -0
  39. package/dist/services/PresetService.d.ts +196 -0
  40. package/dist/services/PresetService.d.ts.map +1 -0
  41. package/dist/services/PresetService.js +261 -0
  42. package/dist/services/PresetService.js.map +1 -0
  43. package/dist/services/color/ColorAccessibility.d.ts +39 -0
  44. package/dist/services/color/ColorAccessibility.d.ts.map +1 -0
  45. package/dist/services/color/ColorAccessibility.js +71 -0
  46. package/dist/services/color/ColorAccessibility.js.map +1 -0
  47. package/dist/services/color/ColorConverter.d.ts +146 -0
  48. package/dist/services/color/ColorConverter.d.ts.map +1 -0
  49. package/dist/services/color/ColorConverter.js +393 -0
  50. package/dist/services/color/ColorConverter.js.map +1 -0
  51. package/dist/services/color/ColorManipulator.d.ts +36 -0
  52. package/dist/services/color/ColorManipulator.d.ts.map +1 -0
  53. package/dist/services/color/ColorManipulator.js +56 -0
  54. package/dist/services/color/ColorManipulator.js.map +1 -0
  55. package/dist/services/color/ColorblindnessSimulator.d.ts +35 -0
  56. package/dist/services/color/ColorblindnessSimulator.d.ts.map +1 -0
  57. package/dist/services/color/ColorblindnessSimulator.js +110 -0
  58. package/dist/services/color/ColorblindnessSimulator.js.map +1 -0
  59. package/dist/services/dye/DyeDatabase.d.ts +131 -0
  60. package/dist/services/dye/DyeDatabase.d.ts.map +1 -0
  61. package/dist/services/dye/DyeDatabase.js +367 -0
  62. package/dist/services/dye/DyeDatabase.js.map +1 -0
  63. package/dist/services/dye/DyeSearch.d.ts +55 -0
  64. package/dist/services/dye/DyeSearch.d.ts.map +1 -0
  65. package/dist/services/dye/DyeSearch.js +196 -0
  66. package/dist/services/dye/DyeSearch.js.map +1 -0
  67. package/dist/services/dye/HarmonyGenerator.d.ts +110 -0
  68. package/dist/services/dye/HarmonyGenerator.d.ts.map +1 -0
  69. package/dist/services/dye/HarmonyGenerator.js +221 -0
  70. package/dist/services/dye/HarmonyGenerator.js.map +1 -0
  71. package/dist/services/localization/LocaleLoader.d.ts +38 -0
  72. package/dist/services/localization/LocaleLoader.d.ts.map +1 -0
  73. package/dist/services/localization/LocaleLoader.js +83 -0
  74. package/dist/services/localization/LocaleLoader.js.map +1 -0
  75. package/dist/services/localization/LocaleRegistry.d.ts +73 -0
  76. package/dist/services/localization/LocaleRegistry.d.ts.map +1 -0
  77. package/dist/services/localization/LocaleRegistry.js +84 -0
  78. package/dist/services/localization/LocaleRegistry.js.map +1 -0
  79. package/dist/services/localization/TranslationProvider.d.ts +157 -0
  80. package/dist/services/localization/TranslationProvider.d.ts.map +1 -0
  81. package/dist/services/localization/TranslationProvider.js +289 -0
  82. package/dist/services/localization/TranslationProvider.js.map +1 -0
  83. package/dist/types/index.d.ts +409 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +87 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/types/logger.d.ts +84 -0
  88. package/dist/types/logger.d.ts.map +1 -0
  89. package/dist/types/logger.js +54 -0
  90. package/dist/types/logger.js.map +1 -0
  91. package/dist/utils/index.d.ts +441 -0
  92. package/dist/utils/index.d.ts.map +1 -0
  93. package/dist/utils/index.js +577 -0
  94. package/dist/utils/index.js.map +1 -0
  95. package/dist/utils/kd-tree.d.ts +76 -0
  96. package/dist/utils/kd-tree.d.ts.map +1 -0
  97. package/dist/utils/kd-tree.js +195 -0
  98. package/dist/utils/kd-tree.js.map +1 -0
  99. package/dist/version.d.ts +11 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +11 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocaleLoader.js","sourceRoot":"","sources":["../../../src/services/localization/LocaleLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE3D,2DAA2D;AAC3D,OAAO,QAAQ,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxE,OAAO,QAAQ,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxE,OAAO,QAAQ,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxE,OAAO,QAAQ,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxE,OAAO,QAAQ,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxE,OAAO,QAAQ,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExE,yCAAyC;AACzC,MAAM,SAAS,GAAgC;IAC7C,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,MAAkB;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAE/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,gCAAgC,CAAC,CAAC;YACrE,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,IAAkB,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,MAAM,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAChG,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CAAC,IAAa;QACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAA+B,CAAC;QAEnD,OAAO,CACL,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ;YACrC,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ;YACnC,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ;YACrC,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ;YACvC,OAAO,UAAU,CAAC,UAAU,KAAK,QAAQ;YACzC,OAAO,UAAU,CAAC,YAAY,KAAK,QAAQ;YAC3C,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;YACxC,OAAO,UAAU,CAAC,YAAY,KAAK,QAAQ;YAC3C,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ,CAC3C,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * LocaleRegistry - Manages loaded locale data cache
3
+ *
4
+ * Per R-4: Single Responsibility - caching loaded locales only
5
+ * Per R-5: Uses Map for O(1) lookup performance
6
+ *
7
+ * @module services/localization
8
+ */
9
+ import type { LocaleCode, LocaleData } from '../../types/index.js';
10
+ /**
11
+ * Registry for loaded locale data with caching
12
+ */
13
+ export declare class LocaleRegistry {
14
+ private locales;
15
+ /**
16
+ * Register a loaded locale in the cache
17
+ *
18
+ * @param data - Locale data to register
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const registry = new LocaleRegistry();
23
+ * registry.registerLocale(jaData);
24
+ * ```
25
+ */
26
+ registerLocale(data: LocaleData): void;
27
+ /**
28
+ * Check if locale is already loaded
29
+ *
30
+ * @param locale - Locale code to check
31
+ * @returns true if locale is cached
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * if (!registry.hasLocale('ja')) {
36
+ * await loadJapanese();
37
+ * }
38
+ * ```
39
+ */
40
+ hasLocale(locale: LocaleCode): boolean;
41
+ /**
42
+ * Get loaded locale data
43
+ *
44
+ * @param locale - Locale code to retrieve
45
+ * @returns Locale data if cached, null otherwise
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const jaData = registry.getLocale('ja');
50
+ * if (jaData) {
51
+ * console.log(jaData.labels.dye);
52
+ * }
53
+ * ```
54
+ */
55
+ getLocale(locale: LocaleCode): LocaleData | null;
56
+ /**
57
+ * Clear all loaded locales from cache
58
+ * Useful for memory management or testing
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * registry.clear(); // Free memory
63
+ * ```
64
+ */
65
+ clear(): void;
66
+ /**
67
+ * Get number of loaded locales
68
+ *
69
+ * @returns Count of cached locales
70
+ */
71
+ get size(): number;
72
+ }
73
+ //# sourceMappingURL=LocaleRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocaleRegistry.d.ts","sourceRoot":"","sources":["../../../src/services/localization/LocaleRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEnE;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA0C;IAEzD;;;;;;;;;;OAUG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAItC;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAItC;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAIhD;;;;;;;;OAQG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * LocaleRegistry - Manages loaded locale data cache
3
+ *
4
+ * Per R-4: Single Responsibility - caching loaded locales only
5
+ * Per R-5: Uses Map for O(1) lookup performance
6
+ *
7
+ * @module services/localization
8
+ */
9
+ /**
10
+ * Registry for loaded locale data with caching
11
+ */
12
+ export class LocaleRegistry {
13
+ constructor() {
14
+ this.locales = new Map();
15
+ }
16
+ /**
17
+ * Register a loaded locale in the cache
18
+ *
19
+ * @param data - Locale data to register
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const registry = new LocaleRegistry();
24
+ * registry.registerLocale(jaData);
25
+ * ```
26
+ */
27
+ registerLocale(data) {
28
+ this.locales.set(data.locale, data);
29
+ }
30
+ /**
31
+ * Check if locale is already loaded
32
+ *
33
+ * @param locale - Locale code to check
34
+ * @returns true if locale is cached
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * if (!registry.hasLocale('ja')) {
39
+ * await loadJapanese();
40
+ * }
41
+ * ```
42
+ */
43
+ hasLocale(locale) {
44
+ return this.locales.has(locale);
45
+ }
46
+ /**
47
+ * Get loaded locale data
48
+ *
49
+ * @param locale - Locale code to retrieve
50
+ * @returns Locale data if cached, null otherwise
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const jaData = registry.getLocale('ja');
55
+ * if (jaData) {
56
+ * console.log(jaData.labels.dye);
57
+ * }
58
+ * ```
59
+ */
60
+ getLocale(locale) {
61
+ return this.locales.get(locale) || null;
62
+ }
63
+ /**
64
+ * Clear all loaded locales from cache
65
+ * Useful for memory management or testing
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * registry.clear(); // Free memory
70
+ * ```
71
+ */
72
+ clear() {
73
+ this.locales.clear();
74
+ }
75
+ /**
76
+ * Get number of loaded locales
77
+ *
78
+ * @returns Count of cached locales
79
+ */
80
+ get size() {
81
+ return this.locales.size;
82
+ }
83
+ }
84
+ //# sourceMappingURL=LocaleRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocaleRegistry.js","sourceRoot":"","sources":["../../../src/services/localization/LocaleRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,OAAO,cAAc;IAA3B;QACU,YAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IAyE3D,CAAC;IAvEC;;;;;;;;;;OAUG;IACH,cAAc,CAAC,IAAgB;QAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,MAAkB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,MAAkB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * TranslationProvider - Provides translations with fallback logic
3
+ *
4
+ * Per R-4: Single Responsibility - translation retrieval only
5
+ * Fallback chain: requested locale → English → formatted key
6
+ *
7
+ * @module services/localization
8
+ */
9
+ import type { LocaleCode, TranslationKey, HarmonyTypeKey, VisionType, JobKey, GrandCompanyKey } from '../../types/index.js';
10
+ import type { LocaleRegistry } from './LocaleRegistry.js';
11
+ /**
12
+ * Provides translations with automatic fallback to English
13
+ */
14
+ export declare class TranslationProvider {
15
+ private registry;
16
+ constructor(registry: LocaleRegistry);
17
+ /**
18
+ * Get UI label with fallback chain
19
+ *
20
+ * @param key - Translation key
21
+ * @param locale - Requested locale
22
+ * @returns Translated label or formatted key
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const label = provider.getLabel('dye', 'ja');
27
+ * // Returns "カララント:" (ja) or "Dye" (en fallback)
28
+ * ```
29
+ */
30
+ getLabel(key: TranslationKey, locale: LocaleCode): string;
31
+ /**
32
+ * Get dye name with fallback
33
+ *
34
+ * @param itemID - Dye item ID
35
+ * @param locale - Requested locale
36
+ * @returns Localized dye name or null if not found
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const name = provider.getDyeName(5729, 'ja');
41
+ * // Returns "スノウホワイト" (ja) or "Snow White" (en fallback)
42
+ * ```
43
+ */
44
+ getDyeName(itemID: number, locale: LocaleCode): string | null;
45
+ /**
46
+ * Get category name with fallback
47
+ *
48
+ * @param category - Category key (e.g., "Reds", "Blues")
49
+ * @param locale - Requested locale
50
+ * @returns Localized category name
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const category = provider.getCategory('Reds', 'ja');
55
+ * // Returns "赤系" (ja) or "Reds" (en fallback)
56
+ * ```
57
+ */
58
+ getCategory(category: string, locale: LocaleCode): string;
59
+ /**
60
+ * Get acquisition method with fallback
61
+ *
62
+ * @param acquisition - Acquisition key (e.g., "Dye Vendor", "Crafting")
63
+ * @param locale - Requested locale
64
+ * @returns Localized acquisition method
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const acq = provider.getAcquisition('Dye Vendor', 'ja');
69
+ * // Returns "染料販売業者" (ja) or "Dye Vendor" (en fallback)
70
+ * ```
71
+ */
72
+ getAcquisition(acquisition: string, locale: LocaleCode): string;
73
+ /**
74
+ * Get metallic dye IDs (locale-independent)
75
+ *
76
+ * @param locale - Current locale (for consistency)
77
+ * @returns Array of metallic dye item IDs
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const metallicIds = provider.getMetallicDyeIds('fr');
82
+ * // Returns [13116, 13117, ...] for any locale
83
+ * ```
84
+ */
85
+ getMetallicDyeIds(locale: LocaleCode): number[];
86
+ /**
87
+ * Get harmony type with fallback
88
+ *
89
+ * @param key - Harmony type key
90
+ * @param locale - Requested locale
91
+ * @returns Localized harmony type name
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * const harmony = provider.getHarmonyType('triadic', 'ja');
96
+ * // Returns "三色配色" (ja) or "Triadic" (en fallback)
97
+ * ```
98
+ */
99
+ getHarmonyType(key: HarmonyTypeKey, locale: LocaleCode): string;
100
+ /**
101
+ * Get vision type with fallback
102
+ *
103
+ * @param key - Vision type key
104
+ * @param locale - Requested locale
105
+ * @returns Localized vision type name
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const vision = provider.getVisionType('deuteranopia', 'ja');
110
+ * // Returns "2型色覚(赤緑色盲)" (ja) or English fallback
111
+ * ```
112
+ */
113
+ getVisionType(key: VisionType, locale: LocaleCode): string;
114
+ /**
115
+ * Get job name with fallback
116
+ *
117
+ * @param key - Job key
118
+ * @param locale - Requested locale
119
+ * @returns Localized job name
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const job = provider.getJobName('darkKnight', 'ja');
124
+ * // Returns "暗黒騎士" (ja) or "Dark Knight" (en fallback)
125
+ * ```
126
+ */
127
+ getJobName(key: JobKey, locale: LocaleCode): string;
128
+ /**
129
+ * Get Grand Company name with fallback
130
+ *
131
+ * @param key - Grand Company key
132
+ * @param locale - Requested locale
133
+ * @returns Localized Grand Company name
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * const gc = provider.getGrandCompanyName('maelstrom', 'ja');
138
+ * // Returns "黒渦団" (ja) or "The Maelstrom" (en fallback)
139
+ * ```
140
+ */
141
+ getGrandCompanyName(key: GrandCompanyKey, locale: LocaleCode): string;
142
+ /**
143
+ * Format camelCase/PascalCase key to Title Case
144
+ *
145
+ * @param key - Key to format
146
+ * @returns Formatted string
147
+ * @private
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * formatKey('splitComplementary') // "Split Complementary"
152
+ * formatKey('cosmicExploration') // "Cosmic Exploration"
153
+ * ```
154
+ */
155
+ private formatKey;
156
+ }
157
+ //# sourceMappingURL=TranslationProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranslationProvider.d.ts","sourceRoot":"","sources":["../../../src/services/localization/TranslationProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,MAAM,EACN,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,cAAc;IAE5C;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoBzD;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAoB7D;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoBzD;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoB/D;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE;IAY/C;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoB/D;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoB1D;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoBnD;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM;IAoBrE;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,SAAS;CAMlB"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * TranslationProvider - Provides translations with fallback logic
3
+ *
4
+ * Per R-4: Single Responsibility - translation retrieval only
5
+ * Fallback chain: requested locale → English → formatted key
6
+ *
7
+ * @module services/localization
8
+ */
9
+ /**
10
+ * Provides translations with automatic fallback to English
11
+ */
12
+ export class TranslationProvider {
13
+ constructor(registry) {
14
+ this.registry = registry;
15
+ }
16
+ /**
17
+ * Get UI label with fallback chain
18
+ *
19
+ * @param key - Translation key
20
+ * @param locale - Requested locale
21
+ * @returns Translated label or formatted key
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const label = provider.getLabel('dye', 'ja');
26
+ * // Returns "カララント:" (ja) or "Dye" (en fallback)
27
+ * ```
28
+ */
29
+ getLabel(key, locale) {
30
+ const localeData = this.registry.getLocale(locale);
31
+ // Try requested locale
32
+ if (localeData?.labels[key]) {
33
+ return localeData.labels[key];
34
+ }
35
+ // Fallback to English
36
+ if (locale !== 'en') {
37
+ const englishData = this.registry.getLocale('en');
38
+ if (englishData?.labels[key]) {
39
+ return englishData.labels[key];
40
+ }
41
+ }
42
+ // Final fallback: format key (camelCase → Title Case)
43
+ return this.formatKey(key);
44
+ }
45
+ /**
46
+ * Get dye name with fallback
47
+ *
48
+ * @param itemID - Dye item ID
49
+ * @param locale - Requested locale
50
+ * @returns Localized dye name or null if not found
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const name = provider.getDyeName(5729, 'ja');
55
+ * // Returns "スノウホワイト" (ja) or "Snow White" (en fallback)
56
+ * ```
57
+ */
58
+ getDyeName(itemID, locale) {
59
+ const localeData = this.registry.getLocale(locale);
60
+ const idStr = String(itemID);
61
+ // Try requested locale
62
+ if (localeData?.dyeNames[idStr]) {
63
+ return localeData.dyeNames[idStr];
64
+ }
65
+ // Fallback to English
66
+ if (locale !== 'en') {
67
+ const englishData = this.registry.getLocale('en');
68
+ if (englishData?.dyeNames[idStr]) {
69
+ return englishData.dyeNames[idStr];
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ /**
75
+ * Get category name with fallback
76
+ *
77
+ * @param category - Category key (e.g., "Reds", "Blues")
78
+ * @param locale - Requested locale
79
+ * @returns Localized category name
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const category = provider.getCategory('Reds', 'ja');
84
+ * // Returns "赤系" (ja) or "Reds" (en fallback)
85
+ * ```
86
+ */
87
+ getCategory(category, locale) {
88
+ const localeData = this.registry.getLocale(locale);
89
+ // Try requested locale
90
+ if (localeData?.categories[category]) {
91
+ return localeData.categories[category];
92
+ }
93
+ // Fallback to English
94
+ if (locale !== 'en') {
95
+ const englishData = this.registry.getLocale('en');
96
+ if (englishData?.categories[category]) {
97
+ return englishData.categories[category];
98
+ }
99
+ }
100
+ // Final fallback: return original category
101
+ return category;
102
+ }
103
+ /**
104
+ * Get acquisition method with fallback
105
+ *
106
+ * @param acquisition - Acquisition key (e.g., "Dye Vendor", "Crafting")
107
+ * @param locale - Requested locale
108
+ * @returns Localized acquisition method
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const acq = provider.getAcquisition('Dye Vendor', 'ja');
113
+ * // Returns "染料販売業者" (ja) or "Dye Vendor" (en fallback)
114
+ * ```
115
+ */
116
+ getAcquisition(acquisition, locale) {
117
+ const localeData = this.registry.getLocale(locale);
118
+ // Try requested locale
119
+ if (localeData?.acquisitions[acquisition]) {
120
+ return localeData.acquisitions[acquisition];
121
+ }
122
+ // Fallback to English
123
+ if (locale !== 'en') {
124
+ const englishData = this.registry.getLocale('en');
125
+ if (englishData?.acquisitions[acquisition]) {
126
+ return englishData.acquisitions[acquisition];
127
+ }
128
+ }
129
+ // Final fallback: return original acquisition
130
+ return acquisition;
131
+ }
132
+ /**
133
+ * Get metallic dye IDs (locale-independent)
134
+ *
135
+ * @param locale - Current locale (for consistency)
136
+ * @returns Array of metallic dye item IDs
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const metallicIds = provider.getMetallicDyeIds('fr');
141
+ * // Returns [13116, 13117, ...] for any locale
142
+ * ```
143
+ */
144
+ getMetallicDyeIds(locale) {
145
+ const localeData = this.registry.getLocale(locale);
146
+ if (localeData?.metallicDyeIds) {
147
+ return localeData.metallicDyeIds;
148
+ }
149
+ // Fallback to English
150
+ const englishData = this.registry.getLocale('en');
151
+ return englishData?.metallicDyeIds || [];
152
+ }
153
+ /**
154
+ * Get harmony type with fallback
155
+ *
156
+ * @param key - Harmony type key
157
+ * @param locale - Requested locale
158
+ * @returns Localized harmony type name
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * const harmony = provider.getHarmonyType('triadic', 'ja');
163
+ * // Returns "三色配色" (ja) or "Triadic" (en fallback)
164
+ * ```
165
+ */
166
+ getHarmonyType(key, locale) {
167
+ const localeData = this.registry.getLocale(locale);
168
+ // Try requested locale
169
+ if (localeData?.harmonyTypes[key]) {
170
+ return localeData.harmonyTypes[key];
171
+ }
172
+ // Fallback to English
173
+ if (locale !== 'en') {
174
+ const englishData = this.registry.getLocale('en');
175
+ if (englishData?.harmonyTypes[key]) {
176
+ return englishData.harmonyTypes[key];
177
+ }
178
+ }
179
+ // Final fallback: format key
180
+ return this.formatKey(key);
181
+ }
182
+ /**
183
+ * Get vision type with fallback
184
+ *
185
+ * @param key - Vision type key
186
+ * @param locale - Requested locale
187
+ * @returns Localized vision type name
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * const vision = provider.getVisionType('deuteranopia', 'ja');
192
+ * // Returns "2型色覚(赤緑色盲)" (ja) or English fallback
193
+ * ```
194
+ */
195
+ getVisionType(key, locale) {
196
+ const localeData = this.registry.getLocale(locale);
197
+ // Try requested locale
198
+ if (localeData?.visionTypes[key]) {
199
+ return localeData.visionTypes[key];
200
+ }
201
+ // Fallback to English
202
+ if (locale !== 'en') {
203
+ const englishData = this.registry.getLocale('en');
204
+ if (englishData?.visionTypes[key]) {
205
+ return englishData.visionTypes[key];
206
+ }
207
+ }
208
+ // Final fallback: format key
209
+ return this.formatKey(key);
210
+ }
211
+ /**
212
+ * Get job name with fallback
213
+ *
214
+ * @param key - Job key
215
+ * @param locale - Requested locale
216
+ * @returns Localized job name
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * const job = provider.getJobName('darkKnight', 'ja');
221
+ * // Returns "暗黒騎士" (ja) or "Dark Knight" (en fallback)
222
+ * ```
223
+ */
224
+ getJobName(key, locale) {
225
+ const localeData = this.registry.getLocale(locale);
226
+ // Try requested locale
227
+ if (localeData?.jobNames[key]) {
228
+ return localeData.jobNames[key];
229
+ }
230
+ // Fallback to English
231
+ if (locale !== 'en') {
232
+ const englishData = this.registry.getLocale('en');
233
+ if (englishData?.jobNames[key]) {
234
+ return englishData.jobNames[key];
235
+ }
236
+ }
237
+ // Final fallback: format key
238
+ return this.formatKey(key);
239
+ }
240
+ /**
241
+ * Get Grand Company name with fallback
242
+ *
243
+ * @param key - Grand Company key
244
+ * @param locale - Requested locale
245
+ * @returns Localized Grand Company name
246
+ *
247
+ * @example
248
+ * ```typescript
249
+ * const gc = provider.getGrandCompanyName('maelstrom', 'ja');
250
+ * // Returns "黒渦団" (ja) or "The Maelstrom" (en fallback)
251
+ * ```
252
+ */
253
+ getGrandCompanyName(key, locale) {
254
+ const localeData = this.registry.getLocale(locale);
255
+ // Try requested locale
256
+ if (localeData?.grandCompanyNames[key]) {
257
+ return localeData.grandCompanyNames[key];
258
+ }
259
+ // Fallback to English
260
+ if (locale !== 'en') {
261
+ const englishData = this.registry.getLocale('en');
262
+ if (englishData?.grandCompanyNames[key]) {
263
+ return englishData.grandCompanyNames[key];
264
+ }
265
+ }
266
+ // Final fallback: format key
267
+ return this.formatKey(key);
268
+ }
269
+ /**
270
+ * Format camelCase/PascalCase key to Title Case
271
+ *
272
+ * @param key - Key to format
273
+ * @returns Formatted string
274
+ * @private
275
+ *
276
+ * @example
277
+ * ```typescript
278
+ * formatKey('splitComplementary') // "Split Complementary"
279
+ * formatKey('cosmicExploration') // "Cosmic Exploration"
280
+ * ```
281
+ */
282
+ formatKey(key) {
283
+ return key
284
+ .replace(/([A-Z])/g, ' $1')
285
+ .replace(/^./, (str) => str.toUpperCase())
286
+ .trim();
287
+ }
288
+ }
289
+ //# sourceMappingURL=TranslationProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranslationProvider.js","sourceRoot":"","sources":["../../../src/services/localization/TranslationProvider.ts"],"names":[],"mappings":"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"}