@amazon-devices/expo-localization 2.0.1758683737 → 2.0.9000000001
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/CMakeLists.txt +15 -3
- package/README.kepler.md +1 -0
- package/THIRD_PARTY_NOTICES.txt +1 -21
- package/build/ExpoLocalization.kepler.d.ts +4 -4
- package/build/ExpoLocalization.kepler.d.ts.map +1 -1
- package/build/ExpoLocalization.kepler.js +12 -5
- package/build/ExpoLocalization.kepler.js.map +1 -1
- package/kepler/ExpoLocalization.cpp +165 -79
- package/kepler/ExpoLocalization.h +16 -7
- package/kepler/KeplerInit.cpp +5 -8
- package/kepler-compatibility.json +7 -0
- package/package.json +1 -1
- package/react-native.config.js +1 -0
- package/src/ExpoLocalization.kepler.ts +19 -11
- package/plugin/tsconfig.tsbuildinfo +0 -1
package/CMakeLists.txt
CHANGED
|
@@ -15,15 +15,26 @@ set(PACKAGE_NAME "expo-localization")
|
|
|
15
15
|
set(AUTO_LINK_PACKAGE_NAME "${PACKAGE_NAME}-${KEPLER_REACT_NATIVE_MAJOR_VERSION}")
|
|
16
16
|
set(SOURCES_KEPLER kepler/ExpoLocalization.cpp)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
# ICU::uc is an explicit dependency — previously resolved transitively through expo-kepler-utils -> keplerscript-2
|
|
19
|
+
find_package(ICU COMPONENTS i18n uc)
|
|
19
20
|
|
|
20
21
|
add_library(${PACKAGE_NAME} STATIC ${SOURCES_KEPLER})
|
|
21
22
|
|
|
23
|
+
kepler_add_idl_import_library(
|
|
24
|
+
expo_localization_idl_pkg
|
|
25
|
+
PACKAGES
|
|
26
|
+
com.amazon.kepler.env
|
|
27
|
+
com.amazon.kepler.device_config
|
|
28
|
+
com.amazon.kepler.experimental_mr33.messaging
|
|
29
|
+
)
|
|
30
|
+
|
|
22
31
|
target_link_libraries(
|
|
23
32
|
${PACKAGE_NAME}
|
|
24
33
|
PUBLIC
|
|
25
|
-
|
|
34
|
+
turbomoduleAPI::turbomoduleAPI
|
|
26
35
|
ICU::i18n
|
|
36
|
+
ICU::uc
|
|
37
|
+
expo_localization_idl_pkg
|
|
27
38
|
)
|
|
28
39
|
|
|
29
40
|
add_library(${AUTO_LINK_PACKAGE_NAME} SHARED kepler/KeplerInit.cpp)
|
|
@@ -41,8 +52,9 @@ add_executable(${AUTO_LINK_PACKAGE_NAME}_exe kepler/KeplerInit.cpp)
|
|
|
41
52
|
target_link_libraries(${AUTO_LINK_PACKAGE_NAME}_exe
|
|
42
53
|
PRIVATE
|
|
43
54
|
${AUTO_LINK_PACKAGE_NAME}
|
|
44
|
-
|
|
55
|
+
turbomoduleAPI::turbomoduleAPI
|
|
45
56
|
ICU::i18n
|
|
57
|
+
expo_localization_idl_pkg
|
|
46
58
|
)
|
|
47
59
|
|
|
48
60
|
install(TARGETS ${AUTO_LINK_PACKAGE_NAME}
|
package/README.kepler.md
CHANGED
|
@@ -107,3 +107,4 @@ Check out the dedicated documentation page for info about this library, API refe
|
|
|
107
107
|
| Package version | Based on | @amazon-devices/react-native-kepler version |
|
|
108
108
|
| ---------------- | -------- | --------------------------------- |
|
|
109
109
|
| 2.0.x | expo-localization v14.6.0 | 2.0.x |
|
|
110
|
+
| 2.0.x | expo-localization v14.6.0 | 4.0.x+rn0.83.0 |
|
package/THIRD_PARTY_NOTICES.txt
CHANGED
|
@@ -1,24 +1,4 @@
|
|
|
1
1
|
License from package.json:
|
|
2
2
|
==============================
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
|
|
7
|
-
|
|
8
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
-
in the Software without restriction, including without limitation the rights
|
|
11
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
-
furnished to do so, subject to the following conditions:
|
|
14
|
-
|
|
15
|
-
The above copyright notice and this permission notice shall be included in all
|
|
16
|
-
copies or substantial portions of the Software.
|
|
17
|
-
|
|
18
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
-
SOFTWARE.
|
|
4
|
+
MIT
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Subscription } from 'expo-modules-core';
|
|
1
|
+
import type { Subscription } from 'expo-modules-core';
|
|
2
2
|
import { Calendar, Locale } from './Localization.types';
|
|
3
|
-
export declare function addLocaleListener(listener: (
|
|
4
|
-
export declare function addCalendarListener(listener: (
|
|
3
|
+
export declare function addLocaleListener(listener: () => void): Subscription;
|
|
4
|
+
export declare function addCalendarListener(listener: () => void): Subscription;
|
|
5
5
|
export declare function removeSubscription(subscription: Subscription): void;
|
|
6
6
|
declare const module: {
|
|
7
7
|
getLocales: () => Locale[];
|
|
8
8
|
getCalendars: () => Calendar[];
|
|
9
|
-
locale:
|
|
9
|
+
locale: string;
|
|
10
10
|
};
|
|
11
11
|
export default module;
|
|
12
12
|
//# sourceMappingURL=ExpoLocalization.kepler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoLocalization.kepler.d.ts","sourceRoot":"","sources":["../src/ExpoLocalization.kepler.ts"],"names":[],"mappings":"AASA,OAAO,
|
|
1
|
+
{"version":3,"file":"ExpoLocalization.kepler.d.ts","sourceRoot":"","sources":["../src/ExpoLocalization.kepler.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAUxD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,YAAY,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,YAAY,CAStE;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,YAAY,QAE5D;AAED,QAAA,MAAM,MAAM;sBA1BM,MAAM,EAAE;wBACN,QAAQ,EAAE;;CA6B7B,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -6,21 +6,28 @@
|
|
|
6
6
|
* Use is subject to license terms.
|
|
7
7
|
*/
|
|
8
8
|
import { TurboModuleRegistry } from '@amazon-devices/keplerscript-turbomodule-api';
|
|
9
|
+
import { DeviceEventEmitter } from 'react-native';
|
|
9
10
|
const nativeModule = TurboModuleRegistry.getEnforcing('ExpoLocalization');
|
|
10
|
-
const i18nManager = TurboModuleRegistry.getEnforcing('I18nManager');
|
|
11
11
|
export function addLocaleListener(listener) {
|
|
12
|
-
|
|
12
|
+
return DeviceEventEmitter.addListener('onLocaleSettingsChanged', listener);
|
|
13
13
|
}
|
|
14
14
|
export function addCalendarListener(listener) {
|
|
15
|
-
|
|
15
|
+
const localeSubscription = DeviceEventEmitter.addListener('onLocaleSettingsChanged', listener);
|
|
16
|
+
const timezoneSubscription = DeviceEventEmitter.addListener('onCalendarSettingsChanged', listener);
|
|
17
|
+
return {
|
|
18
|
+
remove: () => {
|
|
19
|
+
localeSubscription.remove();
|
|
20
|
+
timezoneSubscription.remove();
|
|
21
|
+
},
|
|
22
|
+
};
|
|
16
23
|
}
|
|
17
24
|
export function removeSubscription(subscription) {
|
|
18
|
-
|
|
25
|
+
subscription.remove();
|
|
19
26
|
}
|
|
20
27
|
const module = {
|
|
21
28
|
getLocales: nativeModule.getLocales,
|
|
22
29
|
getCalendars: nativeModule.getCalendars,
|
|
23
|
-
locale:
|
|
30
|
+
locale: nativeModule.getLocale(),
|
|
24
31
|
};
|
|
25
32
|
export default module;
|
|
26
33
|
//# sourceMappingURL=ExpoLocalization.kepler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoLocalization.kepler.js","sourceRoot":"","sources":["../src/ExpoLocalization.kepler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"ExpoLocalization.kepler.js","sourceRoot":"","sources":["../src/ExpoLocalization.kepler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAqB,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE5F,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAUlD,MAAM,YAAY,GAAG,mBAAmB,CAAC,YAAY,CAAO,kBAAkB,CAAC,CAAC;AAEhF,MAAM,UAAU,iBAAiB,CAAC,QAAoB;IAClD,OAAO,kBAAkB,CAAC,WAAW,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAoB;IACpD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;IAC/F,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,WAAW,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;IACnG,OAAO;QACH,MAAM,EAAE,GAAG,EAAE;YACT,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC5B,oBAAoB,CAAC,MAAM,EAAE,CAAC;QAClC,CAAC;KACY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAA0B;IACzD,YAAY,CAAC,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,MAAM,GAAG;IACX,UAAU,EAAE,YAAY,CAAC,UAAU;IACnC,YAAY,EAAE,YAAY,CAAC,YAAY;IACvC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE;CACnC,CAAC;AAEF,eAAe,MAAM,CAAC","sourcesContent":["/*\n * Copyright (c) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * PROPRIETARY/CONFIDENTIAL\n *\n * Use is subject to license terms.\n */\n\nimport { KeplerTurboModule, TurboModuleRegistry } from '@amazon-devices/keplerscript-turbomodule-api';\nimport type { Subscription } from 'expo-modules-core';\nimport { DeviceEventEmitter } from 'react-native';\n\nimport { Calendar, Locale } from './Localization.types';\n\ninterface Spec extends KeplerTurboModule {\n getLocales(): Locale[];\n getCalendars(): Calendar[];\n getLocale(): string;\n}\n\nconst nativeModule = TurboModuleRegistry.getEnforcing<Spec>('ExpoLocalization');\n\nexport function addLocaleListener(listener: () => void): Subscription {\n return DeviceEventEmitter.addListener('onLocaleSettingsChanged', listener);\n}\n\nexport function addCalendarListener(listener: () => void): Subscription {\n const localeSubscription = DeviceEventEmitter.addListener('onLocaleSettingsChanged', listener);\n const timezoneSubscription = DeviceEventEmitter.addListener('onCalendarSettingsChanged', listener);\n return {\n remove: () => {\n localeSubscription.remove();\n timezoneSubscription.remove();\n },\n } as Subscription;\n}\n\nexport function removeSubscription(subscription: Subscription) {\n subscription.remove();\n}\n\nconst module = {\n getLocales: nativeModule.getLocales,\n getCalendars: nativeModule.getCalendars,\n locale: nativeModule.getLocale(),\n};\n\nexport default module;\n"]}
|
|
@@ -8,8 +8,20 @@
|
|
|
8
8
|
|
|
9
9
|
#include "ExpoLocalization.h"
|
|
10
10
|
|
|
11
|
-
#include <
|
|
12
|
-
#include <
|
|
11
|
+
#include <Kepler/turbomodule/NativeObject.h>
|
|
12
|
+
#include <Kepler/turbomodule/TMLog.h>
|
|
13
|
+
#include <apmf/fn.h>
|
|
14
|
+
#include <apmf/iface/com/amazon/kepler/device_config/DeviceConfigNotFoundError.h>
|
|
15
|
+
#include <apmf/iface/com/amazon/kepler/device_config/DeviceConfigResult.h>
|
|
16
|
+
#include <apmf/iface/com/amazon/kepler/device_config/IDeviceConfig.h>
|
|
17
|
+
#include <apmf/iface/com/amazon/kepler/device_config/IDeviceConfigModule.h>
|
|
18
|
+
#include <apmf/iface/com/amazon/kepler/env/IEnvModule.h>
|
|
19
|
+
#include <apmf/iface/com/amazon/kepler/env/ILocaleConfig.h>
|
|
20
|
+
#include <apmf/iface/com/amazon/kepler/env/IResolvedLocalesListener.h>
|
|
21
|
+
#include <apmf/iface/com/amazon/kepler/experimental_mr33/messaging/IKeplerMessagingModule.h>
|
|
22
|
+
#include <apmf/iface/com/amazon/kepler/experimental_mr33/messaging/IMessageFilterBuilder.h>
|
|
23
|
+
#include <apmf/iface/com/amazon/kepler/experimental_mr33/messaging/IMessageListener.h>
|
|
24
|
+
#include <apmf/apmf_base.h>
|
|
13
25
|
#include <unicode/currunit.h>
|
|
14
26
|
#include <unicode/dcfmtsym.h>
|
|
15
27
|
#include <unicode/dtptngen.h>
|
|
@@ -17,112 +29,186 @@
|
|
|
17
29
|
#include <unicode/ulocdata.h>
|
|
18
30
|
|
|
19
31
|
#include <memory>
|
|
32
|
+
#include <string>
|
|
33
|
+
#include <fmt/core.h>
|
|
20
34
|
|
|
21
|
-
|
|
35
|
+
namespace env = apmf::iface::com::amazon::kepler::env;
|
|
36
|
+
namespace devConf = apmf::iface::com::amazon::kepler::device_config;
|
|
37
|
+
namespace messaging = apmf::iface::com::amazon::kepler::experimental_mr33::messaging;
|
|
38
|
+
|
|
39
|
+
static const std::string g_timeZoneConfig{"com.amazon.devconf/system/configuration/time-zone"};
|
|
40
|
+
|
|
41
|
+
apmf::Ptr<devConf::IDeviceConfig> getDeviceConfig() {
|
|
42
|
+
return apmf::detail::GetProcessObject()
|
|
43
|
+
->getComponent("/com.amazon.kepler.device_config")
|
|
44
|
+
.TryQueryInterface<devConf::IDeviceConfigModule>()
|
|
45
|
+
->getDeviceConfig();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
std::string toUTF8String(const icu::UnicodeString& from) {
|
|
22
49
|
std::string result;
|
|
23
50
|
from.toUTF8String(result);
|
|
24
51
|
return result;
|
|
25
52
|
}
|
|
26
53
|
|
|
27
|
-
|
|
54
|
+
apmf::Ptr<env::IEnvModule> getEnvModule() {
|
|
55
|
+
return apmf::detail::GetProcessObject()
|
|
56
|
+
->getComponent("/com.amazon.kepler.env")
|
|
57
|
+
.TryQueryInterface<env::IEnvModule>();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
ExpoLocalization::ExpoLocalization() : KeplerTurboModule("ExpoLocalization") {
|
|
61
|
+
TMDEBUG(fmt::format("ExpoLocalization constructor {}", name()));
|
|
62
|
+
|
|
63
|
+
getEnvModule()->getLocaleConfig()->addResolvedLocalesListener(nullptr, apmf::Fn1([this](auto locales) {
|
|
64
|
+
this->emit("onLocaleSettingsChanged", nullptr);
|
|
65
|
+
}));
|
|
66
|
+
|
|
67
|
+
// Subscribe to timezone config changes via MR33 messaging
|
|
68
|
+
auto proc = apmf::detail::GetProcessObject();
|
|
69
|
+
auto messagingModule = proc->getComponent("/com.amazon.kepler.experimental_mr33.messaging")
|
|
70
|
+
.TryQueryInterface<messaging::IKeplerMessagingModule>();
|
|
71
|
+
if (messagingModule) {
|
|
72
|
+
struct TZListener : apmf::ApmfBase<TZListener, messaging::IMessageListener> {
|
|
73
|
+
ExpoLocalization* owner;
|
|
74
|
+
explicit TZListener(ExpoLocalization* o) : owner(o) {}
|
|
75
|
+
void onMessage(apmf::View<messaging::IMessage> /*message*/) {
|
|
76
|
+
owner->emit("onCalendarSettingsChanged", nullptr);
|
|
77
|
+
}
|
|
78
|
+
void onError(apmf::View<apmf::IError> /*error*/) {}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
auto channel = messagingModule->makeMessageChannel(
|
|
82
|
+
"ExpoLocalization_TZ",
|
|
83
|
+
apmf::detail::Ptr<TZListener>::Make(this));
|
|
84
|
+
|
|
85
|
+
apmf::detail::Array<apmf::detail::Ptr<messaging::IMessageFilter>> filters;
|
|
86
|
+
filters.push_back(
|
|
87
|
+
messagingModule->makeMessageFilterBuilder()
|
|
88
|
+
->baseUri("broadcast://*/com.amazon.devconf/system/configuration/time-zone")
|
|
89
|
+
->build());
|
|
90
|
+
channel->registerMessageFilter(filters);
|
|
91
|
+
m_timezoneChannel = std::move(channel);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
28
94
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
95
|
+
std::string ExpoLocalization::getLocale() {
|
|
96
|
+
auto locales = getEnvModule()->getLocaleConfig()->getResolvedLocales(nullptr);
|
|
97
|
+
if (locales.empty()) {
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
return locales[0].identifier;
|
|
101
|
+
}
|
|
32
102
|
|
|
33
|
-
|
|
34
|
-
|
|
103
|
+
tbm::NativeJSArray ExpoLocalization::getLocales() {
|
|
104
|
+
auto locales = getEnvModule()->getLocaleConfig()->getResolvedLocales(nullptr);
|
|
105
|
+
tbm::NativeJSArray resultArray(locales.size());
|
|
35
106
|
|
|
36
|
-
|
|
37
|
-
|
|
107
|
+
for (std::size_t i = 0; i < locales.size(); i++) {
|
|
108
|
+
tbm::NativeJSObject result;
|
|
109
|
+
const std::string& identifier = locales[i].identifier;
|
|
38
110
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
result["
|
|
42
|
-
} else {
|
|
43
|
-
result["currencyCode"] = nullptr;
|
|
44
|
-
}
|
|
111
|
+
const icu::Locale loc(identifier.c_str());
|
|
112
|
+
result["languageCode"] = std::string(loc.getLanguage());
|
|
113
|
+
result["languageTag"] = identifier;
|
|
45
114
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
} else {
|
|
54
|
-
result["currencySymbol"] = nullptr;
|
|
55
|
-
result["decimalSeparator"] = nullptr;
|
|
56
|
-
result["digitGroupingSeparator"] = nullptr;
|
|
57
|
-
}
|
|
115
|
+
UErrorCode status = U_ZERO_ERROR;
|
|
116
|
+
std::unique_ptr<icu::NumberFormat> nf(icu::NumberFormat::createInstance(loc, status));
|
|
117
|
+
if (U_SUCCESS(status) != 0) {
|
|
118
|
+
result["currencyCode"] = toUTF8String(nf->getCurrency());
|
|
119
|
+
} else {
|
|
120
|
+
result["currencyCode"] = nullptr;
|
|
121
|
+
}
|
|
58
122
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
123
|
+
status = U_ZERO_ERROR;
|
|
124
|
+
const icu::DecimalFormatSymbols dfs(loc, status);
|
|
125
|
+
if (U_SUCCESS(status) != 0) {
|
|
126
|
+
result["currencySymbol"] = toUTF8String(dfs.getSymbol(icu::DecimalFormatSymbols::kCurrencySymbol));
|
|
127
|
+
result["decimalSeparator"] =
|
|
128
|
+
toUTF8String(dfs.getSymbol(icu::DecimalFormatSymbols::kDecimalSeparatorSymbol));
|
|
129
|
+
result["digitGroupingSeparator"] =
|
|
130
|
+
toUTF8String(dfs.getSymbol(icu::DecimalFormatSymbols::kGroupingSeparatorSymbol));
|
|
131
|
+
} else {
|
|
132
|
+
result["currencySymbol"] = nullptr;
|
|
133
|
+
result["decimalSeparator"] = nullptr;
|
|
134
|
+
result["digitGroupingSeparator"] = nullptr;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
status = U_ZERO_ERROR;
|
|
138
|
+
auto measurementSystem = ulocdata_getMeasurementSystem(loc.getLanguage(), &status);
|
|
139
|
+
if (measurementSystem == UMS_SI) {
|
|
140
|
+
result["measurementSystem"] = "metric";
|
|
141
|
+
} else if (measurementSystem == UMS_US) {
|
|
142
|
+
result["measurementSystem"] = "imperial";
|
|
143
|
+
} else if (measurementSystem == UMS_UK) {
|
|
144
|
+
result["measurementSystem"] = "uk";
|
|
145
|
+
} else {
|
|
146
|
+
result["measurementSystem"] = nullptr;
|
|
147
|
+
}
|
|
70
148
|
|
|
71
|
-
|
|
149
|
+
result["textDirection"] = (loc.isRightToLeft() != 0) ? "rtl" : "ltr";
|
|
72
150
|
|
|
73
|
-
|
|
151
|
+
result["regionCode"] = nullptr;
|
|
74
152
|
|
|
75
|
-
|
|
153
|
+
resultArray[i] = result;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return resultArray;
|
|
76
157
|
}
|
|
77
158
|
|
|
78
|
-
|
|
79
|
-
|
|
159
|
+
tbm::NativeJSArray ExpoLocalization::getCalendars() {
|
|
160
|
+
const auto& locales = getEnvModule()->getLocaleConfig()->getResolvedLocales(nullptr);
|
|
161
|
+
tbm::NativeJSArray calendarArray(locales.size());
|
|
80
162
|
|
|
81
|
-
|
|
82
|
-
|
|
163
|
+
for (std::size_t i = 0; i < locales.size(); i++) {
|
|
164
|
+
tbm::NativeJSObject calendar;
|
|
165
|
+
const std::string& identifier = locales[i].identifier;
|
|
83
166
|
|
|
84
|
-
|
|
85
|
-
icu::UnicodeString timezoneUc(timezone.c_str());
|
|
86
|
-
std::unique_ptr<icu::TimeZone> tz(icu::TimeZone::createTimeZone(timezoneUc));
|
|
167
|
+
const icu::Locale loc(identifier.c_str());
|
|
87
168
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
169
|
+
UErrorCode status = U_ZERO_ERROR;
|
|
170
|
+
std::unique_ptr<icu::Calendar> c(icu::Calendar::createInstance(loc, status));
|
|
171
|
+
if (U_SUCCESS(status) != 0) {
|
|
172
|
+
calendar["calendar"] = std::string(c->getType());
|
|
173
|
+
} else {
|
|
174
|
+
calendar["calendar"] = nullptr;
|
|
175
|
+
}
|
|
95
176
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
177
|
+
status = U_ZERO_ERROR;
|
|
178
|
+
const int firstWeekday = static_cast<int>(c->getFirstDayOfWeek(status));
|
|
179
|
+
if (U_SUCCESS(status) != 0) {
|
|
180
|
+
calendar["firstWeekday"] = firstWeekday;
|
|
181
|
+
} else {
|
|
182
|
+
calendar["firstWeekday"] = nullptr;
|
|
183
|
+
}
|
|
103
184
|
|
|
104
|
-
|
|
105
|
-
status = U_ZERO_ERROR;
|
|
106
|
-
std::unique_ptr<icu::DateTimePatternGenerator> dtp(icu::DateTimePatternGenerator::createInstance(loc, status));
|
|
107
|
-
if (U_SUCCESS(status)) {
|
|
185
|
+
calendar["uses24hourClock"] = nullptr;
|
|
108
186
|
status = U_ZERO_ERROR;
|
|
109
|
-
|
|
110
|
-
if (U_SUCCESS(status)) {
|
|
111
|
-
|
|
187
|
+
std::unique_ptr<icu::DateTimePatternGenerator> dtp(icu::DateTimePatternGenerator::createInstance(loc, status));
|
|
188
|
+
if (U_SUCCESS(status) != 0) {
|
|
189
|
+
status = U_ZERO_ERROR;
|
|
190
|
+
auto cycle = dtp->getDefaultHourCycle(status);
|
|
191
|
+
if (U_SUCCESS(status) != 0) {
|
|
192
|
+
calendar["uses24hourClock"] = (cycle == UDAT_HOUR_CYCLE_23 || cycle == UDAT_HOUR_CYCLE_24);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
apmf::Ptr<devConf::IDeviceConfig> component = getDeviceConfig();
|
|
197
|
+
try {
|
|
198
|
+
calendar["timezone"] = component->get(g_timeZoneConfig);
|
|
199
|
+
} catch (const apmf::BaseError& e) {
|
|
200
|
+
TMERROR(fmt::format("Error while processing time zone data: {}", e.what()));
|
|
201
|
+
calendar["timezone"] = nullptr;
|
|
112
202
|
}
|
|
113
|
-
}
|
|
114
203
|
|
|
115
|
-
|
|
116
|
-
calendar["timezone"] = nullptr;
|
|
117
|
-
} else {
|
|
118
|
-
calendar["timezone"] = timezone;
|
|
204
|
+
calendarArray[i] = calendar;
|
|
119
205
|
}
|
|
120
206
|
|
|
121
|
-
return
|
|
207
|
+
return calendarArray;
|
|
122
208
|
}
|
|
123
209
|
|
|
124
|
-
void ExpoLocalization::aggregateMethods(
|
|
125
|
-
|
|
210
|
+
void ExpoLocalization::aggregateMethods(tbm::MethodAggregator<KeplerTurboModule>& methodAggregator) const noexcept {
|
|
211
|
+
methodAggregator.addMethod("getLocale", 0, &ExpoLocalization::getLocale);
|
|
126
212
|
methodAggregator.addMethod("getLocales", 0, &ExpoLocalization::getLocales);
|
|
127
213
|
methodAggregator.addMethod("getCalendars", 0, &ExpoLocalization::getCalendars);
|
|
128
214
|
}
|
|
@@ -8,15 +8,24 @@
|
|
|
8
8
|
|
|
9
9
|
#pragma once
|
|
10
10
|
|
|
11
|
-
#include <
|
|
11
|
+
#include <Kepler/turbomodule/KeplerTurboModule.h>
|
|
12
|
+
#include <apmf/iface/com/amazon/kepler/experimental_mr33/messaging/IMessageChannel.h>
|
|
13
|
+
#include <apmf/ptr.h>
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
#include "expo-export.h"
|
|
16
|
+
|
|
17
|
+
namespace tbm = com::amazon::kepler::turbomodule;
|
|
18
|
+
|
|
19
|
+
class EXPO_EXPORT ExpoLocalization : public tbm::KeplerTurboModule {
|
|
14
20
|
public:
|
|
15
21
|
ExpoLocalization();
|
|
16
|
-
|
|
17
|
-
|
|
22
|
+
std::string getLocale();
|
|
23
|
+
tbm::JSArray getLocales();
|
|
24
|
+
tbm::JSArray getCalendars();
|
|
25
|
+
|
|
26
|
+
void aggregateMethods(tbm::MethodAggregator<tbm::KeplerTurboModule>& methodAggregator) const noexcept override;
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
private:
|
|
29
|
+
apmf::detail::Ptr<apmf::iface::com::amazon::kepler::experimental_mr33::messaging::IMessageChannel>
|
|
30
|
+
m_timezoneChannel;
|
|
22
31
|
};
|
package/kepler/KeplerInit.cpp
CHANGED
|
@@ -6,18 +6,15 @@
|
|
|
6
6
|
* Use is subject to license terms.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
#include <
|
|
10
|
-
#include <
|
|
11
|
-
#include <keplerui-072/keplerscript-export.h>
|
|
9
|
+
#include <Kepler/turbomodule/KeplerTurboModuleRegistration.h>
|
|
10
|
+
#include <Kepler/turbomodule/TMLog.h>
|
|
12
11
|
|
|
13
12
|
#include "ExpoLocalization.h"
|
|
14
|
-
#include "RegisterModule.h"
|
|
15
13
|
|
|
16
14
|
extern "C" {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
REGISTER_MODULE(autoLinkInfo, ExpoLocalization, "ExpoLocalization");
|
|
15
|
+
__attribute__((visibility("default"))) void autoLinkKeplerTurboModulesV1() noexcept {
|
|
16
|
+
TMDEBUG("autoLinkKeplerTurboModulesV1 for expo-localization");
|
|
17
|
+
KEPLER_REGISTER_TURBO_MODULE_WITH_NAME("ExpoLocalization", ExpoLocalization);
|
|
21
18
|
}
|
|
22
19
|
}
|
|
23
20
|
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@amazon-devices/expo-localization", "version": "2.0.
|
|
1
|
+
{"name": "@amazon-devices/expo-localization", "version": "2.0.9000000001+14.6.0", "description": "Provides an interface for native user localization information.", "main": "build/Localization.js", "types": "build/Localization.d.ts", "sideEffects": false, "scripts": {"build": "expo-module build", "clean": "expo-module clean", "lint": "expo-module lint", "test": "expo-module test", "prepublishOnly": "expo-module prepublishOnly", "expo-module": "expo-module"}, "kepler": {"temporary-alias-for-package": {"name": "expo-localization", "version": "14.6.0"}}, "keywords": ["react-native", "expo", "localization", "locales", "l10n"], "repository": {"type": "git", "url": "https://github.com/expo/expo.git", "directory": "packages/expo-localization"}, "bugs": {"url": "https://github.com/expo/expo/issues"}, "contributors": ["Evan Bacon <bacon@expo.io> (https://github.com/evanbacon)"], "author": "650 Industries, Inc.", "license": "See license in LICENSE", "homepage": "https://docs.expo.dev/versions/latest/sdk/localization/", "jest": {"preset": "expo-module-scripts"}, "dependencies": {"rtl-detect": "^1.0.2"}, "devDependencies": {"expo-module-scripts": "^3.0.0", "i18n-js": "^3.1.0", "@types/minimatch": "^3.0.5"}, "peerDependencies": {"expo": "^50.0.0-alpha.1"}}
|
package/react-native.config.js
CHANGED
|
@@ -6,35 +6,43 @@
|
|
|
6
6
|
* Use is subject to license terms.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import {KeplerTurboModule, TurboModuleRegistry} from '@amazon-devices/keplerscript-turbomodule-api';
|
|
10
|
-
import {Subscription} from 'expo-modules-core';
|
|
9
|
+
import { KeplerTurboModule, TurboModuleRegistry } from '@amazon-devices/keplerscript-turbomodule-api';
|
|
10
|
+
import type { Subscription } from 'expo-modules-core';
|
|
11
|
+
import { DeviceEventEmitter } from 'react-native';
|
|
11
12
|
|
|
12
|
-
import {Calendar, Locale} from './Localization.types';
|
|
13
|
+
import { Calendar, Locale } from './Localization.types';
|
|
13
14
|
|
|
14
15
|
interface Spec extends KeplerTurboModule {
|
|
15
16
|
getLocales(): Locale[];
|
|
16
17
|
getCalendars(): Calendar[];
|
|
18
|
+
getLocale(): string;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
const nativeModule = TurboModuleRegistry.getEnforcing<Spec>('ExpoLocalization')
|
|
20
|
-
const i18nManager = TurboModuleRegistry.getEnforcing('I18nManager') as any;
|
|
21
|
+
const nativeModule = TurboModuleRegistry.getEnforcing<Spec>('ExpoLocalization');
|
|
21
22
|
|
|
22
|
-
export function addLocaleListener(listener: (
|
|
23
|
-
|
|
23
|
+
export function addLocaleListener(listener: () => void): Subscription {
|
|
24
|
+
return DeviceEventEmitter.addListener('onLocaleSettingsChanged', listener);
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
export function addCalendarListener(listener: (
|
|
27
|
-
|
|
27
|
+
export function addCalendarListener(listener: () => void): Subscription {
|
|
28
|
+
const localeSubscription = DeviceEventEmitter.addListener('onLocaleSettingsChanged', listener);
|
|
29
|
+
const timezoneSubscription = DeviceEventEmitter.addListener('onCalendarSettingsChanged', listener);
|
|
30
|
+
return {
|
|
31
|
+
remove: () => {
|
|
32
|
+
localeSubscription.remove();
|
|
33
|
+
timezoneSubscription.remove();
|
|
34
|
+
},
|
|
35
|
+
} as Subscription;
|
|
28
36
|
}
|
|
29
37
|
|
|
30
38
|
export function removeSubscription(subscription: Subscription) {
|
|
31
|
-
|
|
39
|
+
subscription.remove();
|
|
32
40
|
}
|
|
33
41
|
|
|
34
42
|
const module = {
|
|
35
43
|
getLocales: nativeModule.getLocales,
|
|
36
44
|
getCalendars: nativeModule.getCalendars,
|
|
37
|
-
locale:
|
|
45
|
+
locale: nativeModule.getLocale(),
|
|
38
46
|
};
|
|
39
47
|
|
|
40
48
|
export default module;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"root":["./src/withExpoLocalization.ts"],"version":"5.7.2"}
|