@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.
- package/CapawesomeCapacitorLocalization.podspec +17 -0
- package/LICENSE +21 -0
- package/Package.swift +28 -0
- package/README.md +193 -0
- package/android/build.gradle +58 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/Localization.java +108 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/LocalizationPlugin.java +85 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/classes/results/GetLocalesResult.java +29 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/classes/results/GetSettingsResult.java +31 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/classes/results/LocaleResult.java +75 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/interfaces/Callback.java +5 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/interfaces/NonEmptyResultCallback.java +7 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/localization/interfaces/Result.java +7 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/dist/docs.json +333 -0
- package/dist/esm/definitions.d.ts +157 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +12 -0
- package/dist/esm/web.js +75 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +89 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +92 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Plugin/Classes/Results/GetLocalesResult.swift +17 -0
- package/ios/Plugin/Classes/Results/GetSettingsResult.swift +22 -0
- package/ios/Plugin/Classes/Results/LocaleResult.swift +50 -0
- package/ios/Plugin/Info.plist +24 -0
- package/ios/Plugin/Localization.swift +92 -0
- package/ios/Plugin/LocalizationPlugin.swift +53 -0
- package/ios/Plugin/Protocols/Result.swift +5 -0
- 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":"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"}
|
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
|
+
}
|
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
|
+
}
|