@capawesome/capacitor-localization 0.0.1

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 (37) hide show
  1. package/CapawesomeCapacitorLocalization.podspec +17 -0
  2. package/LICENSE +21 -0
  3. package/Package.swift +28 -0
  4. package/README.md +193 -0
  5. package/android/build.gradle +58 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/Localization.java +108 -0
  8. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/LocalizationPlugin.java +85 -0
  9. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/classes/results/GetLocalesResult.java +29 -0
  10. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/classes/results/GetSettingsResult.java +31 -0
  11. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/classes/results/LocaleResult.java +75 -0
  12. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/interfaces/Callback.java +5 -0
  13. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/interfaces/NonEmptyResultCallback.java +7 -0
  14. package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/interfaces/Result.java +7 -0
  15. package/android/src/main/res/.gitkeep +0 -0
  16. package/dist/docs.json +333 -0
  17. package/dist/esm/definitions.d.ts +157 -0
  18. package/dist/esm/definitions.js +2 -0
  19. package/dist/esm/definitions.js.map +1 -0
  20. package/dist/esm/index.d.ts +4 -0
  21. package/dist/esm/index.js +7 -0
  22. package/dist/esm/index.js.map +1 -0
  23. package/dist/esm/web.d.ts +12 -0
  24. package/dist/esm/web.js +75 -0
  25. package/dist/esm/web.js.map +1 -0
  26. package/dist/plugin.cjs.js +89 -0
  27. package/dist/plugin.cjs.js.map +1 -0
  28. package/dist/plugin.js +92 -0
  29. package/dist/plugin.js.map +1 -0
  30. package/ios/Plugin/Classes/Results/GetLocalesResult.swift +17 -0
  31. package/ios/Plugin/Classes/Results/GetSettingsResult.swift +22 -0
  32. package/ios/Plugin/Classes/Results/LocaleResult.swift +50 -0
  33. package/ios/Plugin/Info.plist +24 -0
  34. package/ios/Plugin/Localization.swift +92 -0
  35. package/ios/Plugin/LocalizationPlugin.swift +53 -0
  36. package/ios/Plugin/Protocols/Result.swift +5 -0
  37. package/package.json +91 -0
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ const Localization = core.registerPlugin('Localization', {
6
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.LocalizationWeb()),
7
+ });
8
+
9
+ class LocalizationWeb extends core.WebPlugin {
10
+ async getLocales() {
11
+ const languageTags = navigator.languages && navigator.languages.length > 0
12
+ ? navigator.languages
13
+ : [navigator.language];
14
+ const locales = languageTags.map(languageTag => this.createLocale(languageTag));
15
+ return { locales };
16
+ }
17
+ async getSettings() {
18
+ const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
19
+ const uses24HourClock = this.determineUses24HourClock();
20
+ const firstDayOfWeek = this.determineFirstDayOfWeek(navigator.language);
21
+ return { timeZone, uses24HourClock, firstDayOfWeek };
22
+ }
23
+ createLocale(languageTag) {
24
+ var _a;
25
+ const locale = new Intl.Locale(languageTag);
26
+ const separators = this.determineSeparators(languageTag);
27
+ return {
28
+ languageTag,
29
+ languageCode: locale.language,
30
+ regionCode: (_a = locale.region) !== null && _a !== void 0 ? _a : null,
31
+ currencyCode: null,
32
+ currencySymbol: null,
33
+ decimalSeparator: separators.decimalSeparator,
34
+ groupingSeparator: separators.groupingSeparator,
35
+ textDirection: this.determineTextDirection(locale),
36
+ measurementSystem: null,
37
+ };
38
+ }
39
+ determineFirstDayOfWeek(languageTag) {
40
+ var _a, _b, _c;
41
+ const locale = new Intl.Locale(languageTag);
42
+ const weekInfo = (_b = (_a = locale.getWeekInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.weekInfo;
43
+ return (_c = weekInfo === null || weekInfo === void 0 ? void 0 : weekInfo.firstDay) !== null && _c !== void 0 ? _c : 1;
44
+ }
45
+ determineSeparators(languageTag) {
46
+ var _a, _b, _c, _d;
47
+ const parts = new Intl.NumberFormat(languageTag).formatToParts(1000000.1);
48
+ const decimalSeparator = (_b = (_a = parts.find(part => part.type === 'decimal')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;
49
+ const groupingSeparator = (_d = (_c = parts.find(part => part.type === 'group')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null;
50
+ return { decimalSeparator, groupingSeparator };
51
+ }
52
+ determineTextDirection(locale) {
53
+ var _a, _b;
54
+ const textInfo = (_b = (_a = locale.getTextInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.textInfo;
55
+ if (textInfo) {
56
+ return textInfo.direction;
57
+ }
58
+ return LocalizationWeb.rtlLanguageCodes.includes(locale.language)
59
+ ? 'rtl'
60
+ : 'ltr';
61
+ }
62
+ determineUses24HourClock() {
63
+ const resolvedOptions = Intl.DateTimeFormat(navigator.language, {
64
+ hour: 'numeric',
65
+ }).resolvedOptions();
66
+ const hourCycle = resolvedOptions.hourCycle;
67
+ return hourCycle === 'h23' || hourCycle === 'h24';
68
+ }
69
+ }
70
+ LocalizationWeb.rtlLanguageCodes = [
71
+ 'ar',
72
+ 'ckb',
73
+ 'dv',
74
+ 'fa',
75
+ 'he',
76
+ 'ps',
77
+ 'sd',
78
+ 'ug',
79
+ 'ur',
80
+ 'yi',
81
+ ];
82
+
83
+ var web = /*#__PURE__*/Object.freeze({
84
+ __proto__: null,
85
+ LocalizationWeb: LocalizationWeb
86
+ });
87
+
88
+ exports.Localization = Localization;
89
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Localization = registerPlugin('Localization', {\n web: () => import('./web').then(m => new m.LocalizationWeb()),\n});\nexport * from './definitions';\nexport { Localization };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class LocalizationWeb extends WebPlugin {\n async getLocales() {\n const languageTags = navigator.languages && navigator.languages.length > 0\n ? navigator.languages\n : [navigator.language];\n const locales = languageTags.map(languageTag => this.createLocale(languageTag));\n return { locales };\n }\n async getSettings() {\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const uses24HourClock = this.determineUses24HourClock();\n const firstDayOfWeek = this.determineFirstDayOfWeek(navigator.language);\n return { timeZone, uses24HourClock, firstDayOfWeek };\n }\n createLocale(languageTag) {\n var _a;\n const locale = new Intl.Locale(languageTag);\n const separators = this.determineSeparators(languageTag);\n return {\n languageTag,\n languageCode: locale.language,\n regionCode: (_a = locale.region) !== null && _a !== void 0 ? _a : null,\n currencyCode: null,\n currencySymbol: null,\n decimalSeparator: separators.decimalSeparator,\n groupingSeparator: separators.groupingSeparator,\n textDirection: this.determineTextDirection(locale),\n measurementSystem: null,\n };\n }\n determineFirstDayOfWeek(languageTag) {\n var _a, _b, _c;\n const locale = new Intl.Locale(languageTag);\n const weekInfo = (_b = (_a = locale.getWeekInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.weekInfo;\n return (_c = weekInfo === null || weekInfo === void 0 ? void 0 : weekInfo.firstDay) !== null && _c !== void 0 ? _c : 1;\n }\n determineSeparators(languageTag) {\n var _a, _b, _c, _d;\n const parts = new Intl.NumberFormat(languageTag).formatToParts(1000000.1);\n const decimalSeparator = (_b = (_a = parts.find(part => part.type === 'decimal')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;\n const groupingSeparator = (_d = (_c = parts.find(part => part.type === 'group')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null;\n return { decimalSeparator, groupingSeparator };\n }\n determineTextDirection(locale) {\n var _a, _b;\n const textInfo = (_b = (_a = locale.getTextInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.textInfo;\n if (textInfo) {\n return textInfo.direction;\n }\n return LocalizationWeb.rtlLanguageCodes.includes(locale.language)\n ? 'rtl'\n : 'ltr';\n }\n determineUses24HourClock() {\n const resolvedOptions = Intl.DateTimeFormat(navigator.language, {\n hour: 'numeric',\n }).resolvedOptions();\n const hourCycle = resolvedOptions.hourCycle;\n return hourCycle === 'h23' || hourCycle === 'h24';\n }\n}\nLocalizationWeb.rtlLanguageCodes = [\n 'ar',\n 'ckb',\n 'dv',\n 'fa',\n 'he',\n 'ps',\n 'sd',\n 'ug',\n 'ur',\n 'yi',\n];\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,YAAY,GAAGA,mBAAc,CAAC,cAAc,EAAE;AACpD,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;AACjE,CAAC;;ACFM,MAAM,eAAe,SAASC,cAAS,CAAC;AAC/C,IAAI,MAAM,UAAU,GAAG;AACvB,QAAQ,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG;AACjF,cAAc,SAAS,CAAC;AACxB,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC;AAClC,QAAQ,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;AACvF,QAAQ,OAAO,EAAE,OAAO,EAAE;AAC1B,IAAI;AACJ,IAAI,MAAM,WAAW,GAAG;AACxB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;AACzE,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAC/D,QAAQ,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC/E,QAAQ,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE;AAC5D,IAAI;AACJ,IAAI,YAAY,CAAC,WAAW,EAAE;AAC9B,QAAQ,IAAI,EAAE;AACd,QAAQ,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AACnD,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC;AAChE,QAAQ,OAAO;AACf,YAAY,WAAW;AACvB,YAAY,YAAY,EAAE,MAAM,CAAC,QAAQ;AACzC,YAAY,UAAU,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI;AAClF,YAAY,YAAY,EAAE,IAAI;AAC9B,YAAY,cAAc,EAAE,IAAI;AAChC,YAAY,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;AACzD,YAAY,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;AAC3D,YAAY,aAAa,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;AAC9D,YAAY,iBAAiB,EAAE,IAAI;AACnC,SAAS;AACT,IAAI;AACJ,IAAI,uBAAuB,CAAC,WAAW,EAAE;AACzC,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;AACtB,QAAQ,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AACnD,QAAQ,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ;AAC/J,QAAQ,OAAO,CAAC,EAAE,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,QAAQ,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC;AAC9H,IAAI;AACJ,IAAI,mBAAmB,CAAC,WAAW,EAAE;AACrC,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAC1B,QAAQ,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC;AACjF,QAAQ,MAAM,gBAAgB,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI;AAC9K,QAAQ,MAAM,iBAAiB,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI;AAC7K,QAAQ,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE;AACtD,IAAI;AACJ,IAAI,sBAAsB,CAAC,MAAM,EAAE;AACnC,QAAQ,IAAI,EAAE,EAAE,EAAE;AAClB,QAAQ,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ;AAC/J,QAAQ,IAAI,QAAQ,EAAE;AACtB,YAAY,OAAO,QAAQ,CAAC,SAAS;AACrC,QAAQ;AACR,QAAQ,OAAO,eAAe,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;AACxE,cAAc;AACd,cAAc,KAAK;AACnB,IAAI;AACJ,IAAI,wBAAwB,GAAG;AAC/B,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE;AACxE,YAAY,IAAI,EAAE,SAAS;AAC3B,SAAS,CAAC,CAAC,eAAe,EAAE;AAC5B,QAAQ,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS;AACnD,QAAQ,OAAO,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK;AACzD,IAAI;AACJ;AACA,eAAe,CAAC,gBAAgB,GAAG;AACnC,IAAI,IAAI;AACR,IAAI,KAAK;AACT,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,CAAC;;;;;;;;;"}
package/dist/plugin.js ADDED
@@ -0,0 +1,92 @@
1
+ var capacitorLocalization = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ const Localization = core.registerPlugin('Localization', {
5
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.LocalizationWeb()),
6
+ });
7
+
8
+ class LocalizationWeb extends core.WebPlugin {
9
+ async getLocales() {
10
+ const languageTags = navigator.languages && navigator.languages.length > 0
11
+ ? navigator.languages
12
+ : [navigator.language];
13
+ const locales = languageTags.map(languageTag => this.createLocale(languageTag));
14
+ return { locales };
15
+ }
16
+ async getSettings() {
17
+ const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
18
+ const uses24HourClock = this.determineUses24HourClock();
19
+ const firstDayOfWeek = this.determineFirstDayOfWeek(navigator.language);
20
+ return { timeZone, uses24HourClock, firstDayOfWeek };
21
+ }
22
+ createLocale(languageTag) {
23
+ var _a;
24
+ const locale = new Intl.Locale(languageTag);
25
+ const separators = this.determineSeparators(languageTag);
26
+ return {
27
+ languageTag,
28
+ languageCode: locale.language,
29
+ regionCode: (_a = locale.region) !== null && _a !== void 0 ? _a : null,
30
+ currencyCode: null,
31
+ currencySymbol: null,
32
+ decimalSeparator: separators.decimalSeparator,
33
+ groupingSeparator: separators.groupingSeparator,
34
+ textDirection: this.determineTextDirection(locale),
35
+ measurementSystem: null,
36
+ };
37
+ }
38
+ determineFirstDayOfWeek(languageTag) {
39
+ var _a, _b, _c;
40
+ const locale = new Intl.Locale(languageTag);
41
+ const weekInfo = (_b = (_a = locale.getWeekInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.weekInfo;
42
+ return (_c = weekInfo === null || weekInfo === void 0 ? void 0 : weekInfo.firstDay) !== null && _c !== void 0 ? _c : 1;
43
+ }
44
+ determineSeparators(languageTag) {
45
+ var _a, _b, _c, _d;
46
+ const parts = new Intl.NumberFormat(languageTag).formatToParts(1000000.1);
47
+ const decimalSeparator = (_b = (_a = parts.find(part => part.type === 'decimal')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;
48
+ const groupingSeparator = (_d = (_c = parts.find(part => part.type === 'group')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null;
49
+ return { decimalSeparator, groupingSeparator };
50
+ }
51
+ determineTextDirection(locale) {
52
+ var _a, _b;
53
+ const textInfo = (_b = (_a = locale.getTextInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.textInfo;
54
+ if (textInfo) {
55
+ return textInfo.direction;
56
+ }
57
+ return LocalizationWeb.rtlLanguageCodes.includes(locale.language)
58
+ ? 'rtl'
59
+ : 'ltr';
60
+ }
61
+ determineUses24HourClock() {
62
+ const resolvedOptions = Intl.DateTimeFormat(navigator.language, {
63
+ hour: 'numeric',
64
+ }).resolvedOptions();
65
+ const hourCycle = resolvedOptions.hourCycle;
66
+ return hourCycle === 'h23' || hourCycle === 'h24';
67
+ }
68
+ }
69
+ LocalizationWeb.rtlLanguageCodes = [
70
+ 'ar',
71
+ 'ckb',
72
+ 'dv',
73
+ 'fa',
74
+ 'he',
75
+ 'ps',
76
+ 'sd',
77
+ 'ug',
78
+ 'ur',
79
+ 'yi',
80
+ ];
81
+
82
+ var web = /*#__PURE__*/Object.freeze({
83
+ __proto__: null,
84
+ LocalizationWeb: LocalizationWeb
85
+ });
86
+
87
+ exports.Localization = Localization;
88
+
89
+ return exports;
90
+
91
+ })({}, capacitorExports);
92
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Localization = registerPlugin('Localization', {\n web: () => import('./web').then(m => new m.LocalizationWeb()),\n});\nexport * from './definitions';\nexport { Localization };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class LocalizationWeb extends WebPlugin {\n async getLocales() {\n const languageTags = navigator.languages && navigator.languages.length > 0\n ? navigator.languages\n : [navigator.language];\n const locales = languageTags.map(languageTag => this.createLocale(languageTag));\n return { locales };\n }\n async getSettings() {\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const uses24HourClock = this.determineUses24HourClock();\n const firstDayOfWeek = this.determineFirstDayOfWeek(navigator.language);\n return { timeZone, uses24HourClock, firstDayOfWeek };\n }\n createLocale(languageTag) {\n var _a;\n const locale = new Intl.Locale(languageTag);\n const separators = this.determineSeparators(languageTag);\n return {\n languageTag,\n languageCode: locale.language,\n regionCode: (_a = locale.region) !== null && _a !== void 0 ? _a : null,\n currencyCode: null,\n currencySymbol: null,\n decimalSeparator: separators.decimalSeparator,\n groupingSeparator: separators.groupingSeparator,\n textDirection: this.determineTextDirection(locale),\n measurementSystem: null,\n };\n }\n determineFirstDayOfWeek(languageTag) {\n var _a, _b, _c;\n const locale = new Intl.Locale(languageTag);\n const weekInfo = (_b = (_a = locale.getWeekInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.weekInfo;\n return (_c = weekInfo === null || weekInfo === void 0 ? void 0 : weekInfo.firstDay) !== null && _c !== void 0 ? _c : 1;\n }\n determineSeparators(languageTag) {\n var _a, _b, _c, _d;\n const parts = new Intl.NumberFormat(languageTag).formatToParts(1000000.1);\n const decimalSeparator = (_b = (_a = parts.find(part => part.type === 'decimal')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;\n const groupingSeparator = (_d = (_c = parts.find(part => part.type === 'group')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null;\n return { decimalSeparator, groupingSeparator };\n }\n determineTextDirection(locale) {\n var _a, _b;\n const textInfo = (_b = (_a = locale.getTextInfo) === null || _a === void 0 ? void 0 : _a.call(locale)) !== null && _b !== void 0 ? _b : locale.textInfo;\n if (textInfo) {\n return textInfo.direction;\n }\n return LocalizationWeb.rtlLanguageCodes.includes(locale.language)\n ? 'rtl'\n : 'ltr';\n }\n determineUses24HourClock() {\n const resolvedOptions = Intl.DateTimeFormat(navigator.language, {\n hour: 'numeric',\n }).resolvedOptions();\n const hourCycle = resolvedOptions.hourCycle;\n return hourCycle === 'h23' || hourCycle === 'h24';\n }\n}\nLocalizationWeb.rtlLanguageCodes = [\n 'ar',\n 'ckb',\n 'dv',\n 'fa',\n 'he',\n 'ps',\n 'sd',\n 'ug',\n 'ur',\n 'yi',\n];\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ @objc public class GetLocalesResult: NSObject, Result {
5
+ let locales: [LocaleResult]
6
+
7
+ init(locales: [LocaleResult]) {
8
+ self.locales = locales
9
+ }
10
+
11
+ @objc public func toJSObject() -> AnyObject {
12
+ let localesArray: [JSValue] = locales.compactMap { $0.toJSObject() as? JSObject }
13
+ var result = JSObject()
14
+ result["locales"] = localesArray
15
+ return result as AnyObject
16
+ }
17
+ }
@@ -0,0 +1,22 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ @objc public class GetSettingsResult: NSObject, Result {
5
+ let firstDayOfWeek: Int
6
+ let timeZone: String
7
+ let uses24HourClock: Bool
8
+
9
+ init(timeZone: String, uses24HourClock: Bool, firstDayOfWeek: Int) {
10
+ self.timeZone = timeZone
11
+ self.uses24HourClock = uses24HourClock
12
+ self.firstDayOfWeek = firstDayOfWeek
13
+ }
14
+
15
+ @objc public func toJSObject() -> AnyObject {
16
+ var result = JSObject()
17
+ result["firstDayOfWeek"] = firstDayOfWeek
18
+ result["timeZone"] = timeZone
19
+ result["uses24HourClock"] = uses24HourClock
20
+ return result as AnyObject
21
+ }
22
+ }
@@ -0,0 +1,50 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ @objc public class LocaleResult: NSObject, Result {
5
+ let currencyCode: String?
6
+ let currencySymbol: String?
7
+ let decimalSeparator: String?
8
+ let groupingSeparator: String?
9
+ let languageCode: String
10
+ let languageTag: String
11
+ let measurementSystem: String?
12
+ let regionCode: String?
13
+ let textDirection: String
14
+
15
+ init(
16
+ languageTag: String,
17
+ languageCode: String,
18
+ regionCode: String?,
19
+ currencyCode: String?,
20
+ currencySymbol: String?,
21
+ decimalSeparator: String?,
22
+ groupingSeparator: String?,
23
+ textDirection: String,
24
+ measurementSystem: String?
25
+ ) {
26
+ self.languageTag = languageTag
27
+ self.languageCode = languageCode
28
+ self.regionCode = regionCode
29
+ self.currencyCode = currencyCode
30
+ self.currencySymbol = currencySymbol
31
+ self.decimalSeparator = decimalSeparator
32
+ self.groupingSeparator = groupingSeparator
33
+ self.textDirection = textDirection
34
+ self.measurementSystem = measurementSystem
35
+ }
36
+
37
+ @objc public func toJSObject() -> AnyObject {
38
+ var result = JSObject()
39
+ result["currencyCode"] = currencyCode ?? NSNull()
40
+ result["currencySymbol"] = currencySymbol ?? NSNull()
41
+ result["decimalSeparator"] = decimalSeparator ?? NSNull()
42
+ result["groupingSeparator"] = groupingSeparator ?? NSNull()
43
+ result["languageCode"] = languageCode
44
+ result["languageTag"] = languageTag
45
+ result["measurementSystem"] = measurementSystem ?? NSNull()
46
+ result["regionCode"] = regionCode ?? NSNull()
47
+ result["textDirection"] = textDirection
48
+ return result as AnyObject
49
+ }
50
+ }
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
7
+ <key>CFBundleExecutable</key>
8
+ <string>$(EXECUTABLE_NAME)</string>
9
+ <key>CFBundleIdentifier</key>
10
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+ <key>CFBundleInfoDictionaryVersion</key>
12
+ <string>6.0</string>
13
+ <key>CFBundleName</key>
14
+ <string>$(PRODUCT_NAME)</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>FMWK</string>
17
+ <key>CFBundleShortVersionString</key>
18
+ <string>1.0</string>
19
+ <key>CFBundleVersion</key>
20
+ <string>$(CURRENT_PROJECT_VERSION)</string>
21
+ <key>NSPrincipalClass</key>
22
+ <string></string>
23
+ </dict>
24
+ </plist>
@@ -0,0 +1,92 @@
1
+ import Foundation
2
+
3
+ @objc public class Localization: NSObject {
4
+ let plugin: LocalizationPlugin
5
+
6
+ init(plugin: LocalizationPlugin) {
7
+ self.plugin = plugin
8
+ }
9
+
10
+ @objc public func getLocales(completion: @escaping (GetLocalesResult?, Error?) -> Void) {
11
+ let locales = Locale.preferredLanguages.map { createLocaleResult(identifier: $0) }
12
+ completion(GetLocalesResult(locales: locales), nil)
13
+ }
14
+
15
+ @objc public func getSettings(completion: @escaping (GetSettingsResult?, Error?) -> Void) {
16
+ let timeZone = TimeZone.current.identifier
17
+ let uses24HourClock = determineUses24HourClock()
18
+ let firstDayOfWeek = convertToIsoDayOfWeek(Calendar.current.firstWeekday)
19
+ let result = GetSettingsResult(timeZone: timeZone, uses24HourClock: uses24HourClock, firstDayOfWeek: firstDayOfWeek)
20
+ completion(result, nil)
21
+ }
22
+
23
+ private func convertToIsoDayOfWeek(_ weekday: Int) -> Int {
24
+ return ((weekday + 5) % 7) + 1
25
+ }
26
+
27
+ private func createLocaleResult(identifier: String) -> LocaleResult {
28
+ let locale = Locale(identifier: identifier)
29
+ let languageCode: String?
30
+ let regionCode: String?
31
+ let currencyCode: String?
32
+ if #available(iOS 16, *) {
33
+ languageCode = locale.language.languageCode?.identifier
34
+ regionCode = locale.region?.identifier
35
+ currencyCode = locale.currency?.identifier
36
+ } else {
37
+ languageCode = locale.languageCode
38
+ regionCode = locale.regionCode
39
+ currencyCode = locale.currencyCode
40
+ }
41
+ let currencySymbol = locale.currencySymbol.flatMap { $0.isEmpty ? nil : $0 }
42
+ let resolvedLanguageCode = languageCode ?? identifier
43
+ return LocaleResult(
44
+ languageTag: identifier,
45
+ languageCode: resolvedLanguageCode,
46
+ regionCode: regionCode,
47
+ currencyCode: currencyCode,
48
+ currencySymbol: currencySymbol,
49
+ decimalSeparator: locale.decimalSeparator,
50
+ groupingSeparator: locale.groupingSeparator,
51
+ textDirection: resolveTextDirection(languageCode: resolvedLanguageCode),
52
+ measurementSystem: resolveMeasurementSystem(locale: locale, regionCode: regionCode)
53
+ )
54
+ }
55
+
56
+ private func determineUses24HourClock() -> Bool {
57
+ guard let format = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current) else {
58
+ return false
59
+ }
60
+ return !format.contains("a")
61
+ }
62
+
63
+ private func resolveMeasurementSystem(locale: Locale, regionCode: String?) -> String? {
64
+ if #available(iOS 16, *) {
65
+ switch locale.measurementSystem {
66
+ case .metric:
67
+ return "metric"
68
+ case .us:
69
+ return "us"
70
+ case .uk:
71
+ return "uk"
72
+ default:
73
+ return nil
74
+ }
75
+ }
76
+ guard let regionCode = regionCode else {
77
+ return nil
78
+ }
79
+ switch regionCode.uppercased() {
80
+ case "US", "LR", "MM":
81
+ return "us"
82
+ case "GB":
83
+ return "uk"
84
+ default:
85
+ return "metric"
86
+ }
87
+ }
88
+
89
+ private func resolveTextDirection(languageCode: String) -> String {
90
+ return Locale.characterDirection(forLanguage: languageCode) == .rightToLeft ? "rtl" : "ltr"
91
+ }
92
+ }
@@ -0,0 +1,53 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ @objc(LocalizationPlugin)
5
+ public class LocalizationPlugin: CAPPlugin, CAPBridgedPlugin {
6
+ public let identifier = "LocalizationPlugin"
7
+ public let jsName = "Localization"
8
+ public let pluginMethods: [CAPPluginMethod] = [
9
+ CAPPluginMethod(name: "getLocales", returnType: CAPPluginReturnPromise),
10
+ CAPPluginMethod(name: "getSettings", returnType: CAPPluginReturnPromise)
11
+ ]
12
+
13
+ public static let tag = "LocalizationPlugin"
14
+
15
+ private var implementation: Localization?
16
+
17
+ override public func load() {
18
+ self.implementation = Localization(plugin: self)
19
+ }
20
+
21
+ @objc func getLocales(_ call: CAPPluginCall) {
22
+ implementation?.getLocales { result, error in
23
+ if let error = error {
24
+ self.rejectCall(call, error)
25
+ return
26
+ }
27
+ self.resolveCall(call, result)
28
+ }
29
+ }
30
+
31
+ @objc func getSettings(_ call: CAPPluginCall) {
32
+ implementation?.getSettings { result, error in
33
+ if let error = error {
34
+ self.rejectCall(call, error)
35
+ return
36
+ }
37
+ self.resolveCall(call, result)
38
+ }
39
+ }
40
+
41
+ private func rejectCall(_ call: CAPPluginCall, _ error: Error) {
42
+ CAPLog.print("[", LocalizationPlugin.tag, "] ", error)
43
+ call.reject(error.localizedDescription)
44
+ }
45
+
46
+ private func resolveCall(_ call: CAPPluginCall, _ result: Result?) {
47
+ if let result = result?.toJSObject() as? JSObject {
48
+ call.resolve(result)
49
+ } else {
50
+ call.resolve()
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,5 @@
1
+ import Capacitor
2
+
3
+ @objc public protocol Result {
4
+ @objc func toJSObject() -> AnyObject
5
+ }
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@capawesome/capacitor-localization",
3
+ "version": "0.0.1",
4
+ "description": "Capacitor plugin to read the user's localization preferences.",
5
+ "main": "dist/plugin.cjs.js",
6
+ "module": "dist/esm/index.js",
7
+ "types": "dist/esm/index.d.ts",
8
+ "unpkg": "dist/plugin.js",
9
+ "files": [
10
+ "android/src/main/",
11
+ "android/build.gradle",
12
+ "dist/",
13
+ "ios/Plugin/",
14
+ "CapawesomeCapacitorLocalization.podspec",
15
+ "Package.swift"
16
+ ],
17
+ "author": "Robin Genz <mail@robingenz.dev>",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/capawesome-team/capacitor-plugins.git"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/capawesome-team/capacitor-plugins/issues"
25
+ },
26
+ "funding": [
27
+ {
28
+ "type": "github",
29
+ "url": "https://github.com/sponsors/capawesome-team/"
30
+ },
31
+ {
32
+ "type": "opencollective",
33
+ "url": "https://opencollective.com/capawesome"
34
+ }
35
+ ],
36
+ "homepage": "https://capawesome.io/docs/plugins/localization/",
37
+ "keywords": [
38
+ "capacitor",
39
+ "plugin",
40
+ "native"
41
+ ],
42
+ "scripts": {
43
+ "verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
44
+ "verify:ios": "cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin -destination generic/platform=iOS && cd ..",
45
+ "verify:android": "cd android && ./gradlew clean build test && cd ..",
46
+ "verify:web": "npm run build",
47
+ "lint": "npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint",
48
+ "fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format",
49
+ "eslint": "eslint . --ext ts",
50
+ "prettier": "prettier \"**/*.{css,html,ts,js,java}\"",
51
+ "swiftlint": "node-swiftlint",
52
+ "docgen": "docgen --api LocalizationPlugin --output-readme README.md --output-json dist/docs.json",
53
+ "build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
54
+ "clean": "rimraf ./dist",
55
+ "watch": "tsc --watch",
56
+ "ios:pod:install": "cd ios && pod install --repo-update && cd ..",
57
+ "ios:spm:install": "cd ios && swift package resolve && cd ..",
58
+ "prepublishOnly": "npm run build"
59
+ },
60
+ "devDependencies": {
61
+ "@capacitor/android": "8.0.0",
62
+ "@capacitor/cli": "8.0.0",
63
+ "@capacitor/core": "8.0.0",
64
+ "@capacitor/docgen": "0.3.1",
65
+ "@capacitor/ios": "8.0.0",
66
+ "@ionic/eslint-config": "0.4.0",
67
+ "eslint": "8.57.0",
68
+ "prettier-plugin-java": "2.6.7",
69
+ "rimraf": "6.1.2",
70
+ "rollup": "4.53.3",
71
+ "swiftlint": "2.0.0",
72
+ "typescript": "5.9.3"
73
+ },
74
+ "peerDependencies": {
75
+ "@capacitor/core": ">=8.0.0"
76
+ },
77
+ "eslintConfig": {
78
+ "extends": "@ionic/eslint-config/recommended"
79
+ },
80
+ "capacitor": {
81
+ "ios": {
82
+ "src": "ios"
83
+ },
84
+ "android": {
85
+ "src": "android"
86
+ }
87
+ },
88
+ "publishConfig": {
89
+ "access": "public"
90
+ }
91
+ }