diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f83413f7..01d706a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,15 @@ variables: - if: $CI_COMMIT_BRANCH == "canary_release" - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z]+\.[0-9]+)?$/ +.notify_rule: + tags: + - macos + - flutter + rules: + - if: $CI_COMMIT_BRANCH == "develop" + - if: $CI_COMMIT_BRANCH == "release" + - if: $CI_COMMIT_BRANCH =~ /feat_[a-zA-Z]+/ + .generate_tag_rule: tags: - macos @@ -175,3 +184,23 @@ create-release: - name: 'sky ipa binary package' url: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/StarLock/${CI_COMMIT_TAG}/starlock-sky-release-${CI_COMMIT_TAG}.ipa' link_type: 'package' + +notify_success: + stage: notification + extends: .notify_rule + before_script: + - printenv | while IFS='=' read -r key value; do echo "$key=$value"; done + script: + - bash notify.sh success + allow_failure: true + when: on_success + +notify_failure: + stage: notification + extends: .notify_rule + before_script: + - printenv | while IFS='=' read -r key value; do echo "$key=$value"; done + script: + - bash notify.sh failure + allow_failure: true + when: on_failure \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index e8f0a10f..21be3ed4 100755 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -85,28 +85,28 @@ android { dimension "flavor-type" applicationId "com.starlock.lock.local" signingConfig signingConfigs.debug - resValue "string", "app_name", "星锁-local" + resValue "string", "app_name", "Star Lock" manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.local" } dev { dimension "flavor-type" applicationId "com.starlock.lock.dev" signingConfig signingConfigs.debug - resValue "string", "app_name", "星锁-dev" + resValue "string", "app_name", "Star Lock" manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.dev" } pre { dimension "flavor-type" applicationId "com.starlock.lock.pre" signingConfig signingConfigs.debug - resValue "string", "app_name", "星锁" + resValue "string", "app_name", "Star Lock-P" manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.pre" } sky { dimension "flavor-type" applicationId "com.skychip.lock" signingConfig signingConfigs.sky - resValue "string", "app_name", "锁通通" + resValue "string", "app_name", "TTLock Pro" manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock" proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-sky.pro' } @@ -114,19 +114,21 @@ android { dimension "flavor-type" applicationId "com.skychip.lock.pre" signingConfig signingConfigs.sky - resValue "string", "app_name", "锁通通-P" + resValue "string", "app_name", "TTLock Pro-P" + manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.pre" } sky_dev { dimension "flavor-type" applicationId "com.skychip.lock.dev" signingConfig signingConfigs.sky - resValue "string", "app_name", "锁通通-D" + resValue "string", "app_name", "TTLock Pro" + manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.dev" } xhj { dimension "flavor-type" applicationId "com.xhjcn.lock" signingConfig signingConfigs.xhj - resValue "string", "app_name", "星星锁" + resValue "string", "app_name", "Star Lock" manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock" proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-xhj.pro' } @@ -134,13 +136,15 @@ android { dimension "flavor-type" applicationId "com.xhjcn.lock.pre" signingConfig signingConfigs.xhj - resValue "string", "app_name", "星星锁-P" + resValue "string", "app_name", "Star Lock-P" + manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.pre" } xhj_dev { dimension "flavor-type" applicationId "com.xhjcn.lock.dev" signingConfig signingConfigs.xhj - resValue "string", "app_name", "星星锁-D" + resValue "string", "app_name", "Star Lock" + manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.dev" } } @@ -290,4 +294,8 @@ dependencies { // implementation(name: 'HiPushSDK-7.0.61.303', ext: 'aar') //接入 VIVO 厂商 implementation 'cn.jiguang.sdk.plugin:vivo:5.2.3' + + // Umeng统计 + implementation 'com.umeng.umsdk:common:9.3.7' + implementation 'com.umeng.umsdk:asms:1.4.1' } diff --git a/android/app/proguard-rules-sky.pro b/android/app/proguard-rules-sky.pro index e6743aff..92eda14c 100644 --- a/android/app/proguard-rules-sky.pro +++ b/android/app/proguard-rules-sky.pro @@ -128,4 +128,12 @@ } -keep class com.tencent.mm.sdk.** { *; } --keep class com.tencent.mm.opensdk.** { *; } \ No newline at end of file +-keep class com.tencent.mm.opensdk.** { *; } + +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +-keep class com.umeng.** { *; } +-keep class com.umeng.**$* { *; } +-keep class com.umeng.message.** { *; } +-keep class com.umeng.message.**$* { *; } \ No newline at end of file diff --git a/android/app/proguard-rules-xhj.pro b/android/app/proguard-rules-xhj.pro index c18c6b01..b48710ff 100644 --- a/android/app/proguard-rules-xhj.pro +++ b/android/app/proguard-rules-xhj.pro @@ -128,4 +128,12 @@ } -keep class com.tencent.mm.sdk.** { *; } --keep class com.tencent.mm.opensdk.** { *; } \ No newline at end of file +-keep class com.tencent.mm.opensdk.** { *; } + +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +-keep class com.umeng.** { *; } +-keep class com.umeng.**$* { *; } +-keep class com.umeng.message.** { *; } +-keep class com.umeng.message.**$* { *; } \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index de19f619..3934e6aa 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -128,4 +128,9 @@ } -keep class com.tencent.mm.sdk.** { *; } --keep class com.tencent.mm.opensdk.** { *; } \ No newline at end of file +-keep class com.tencent.mm.opensdk.** { *; } + +-keep class com.umeng.** { *; } +-keep class com.umeng.**$* { *; } +-keep class com.umeng.message.** { *; } +-keep class com.umeng.message.**$* { *; } \ No newline at end of file diff --git a/android/app/src/dev/res/values-en-rUS/string.xml b/android/app/src/dev/res/values-en-rUS/string.xml new file mode 100644 index 00000000..7c497348 --- /dev/null +++ b/android/app/src/dev/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + Star Lock + \ No newline at end of file diff --git a/android/app/src/dev/res/values-zh-rCN/string.xml b/android/app/src/dev/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..d42c50e6 --- /dev/null +++ b/android/app/src/dev/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 星锁-dev + \ No newline at end of file diff --git a/android/app/src/local/res/values-en-rUS/string.xml b/android/app/src/local/res/values-en-rUS/string.xml new file mode 100644 index 00000000..7c497348 --- /dev/null +++ b/android/app/src/local/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + Star Lock + \ No newline at end of file diff --git a/android/app/src/local/res/values-zh-rCN/string.xml b/android/app/src/local/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..e55b995c --- /dev/null +++ b/android/app/src/local/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 星锁 + \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7cea66a7..9e6d6868 100755 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -58,6 +58,12 @@ + + + + + + - - - - - - - - - - + android:name="com.huawei.hms.push.HmsMessageService" + android:exported="true"> @@ -129,8 +115,8 @@ + android:name="com.huawei.hms.support.api.push.PushReceiver" + android:exported="true"> @@ -193,6 +179,18 @@ + + + + + + + + + + diff --git a/android/app/src/main/assets/umeng_config.xml b/android/app/src/main/assets/umeng_config.xml new file mode 100644 index 00000000..1ba6cc4c --- /dev/null +++ b/android/app/src/main/assets/umeng_config.xml @@ -0,0 +1,5 @@ + + + 671244cf80464b33f6df9648 + Product + \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/skychip/lock/MainActivity.kt b/android/app/src/main/kotlin/com/skychip/lock/MainActivity.kt index dcd984c1..741b150f 100755 --- a/android/app/src/main/kotlin/com/skychip/lock/MainActivity.kt +++ b/android/app/src/main/kotlin/com/skychip/lock/MainActivity.kt @@ -12,10 +12,16 @@ import android.bluetooth.BluetoothAdapter; import androidx.core.content.FileProvider import java.io.File +import com.umeng.commonsdk.UMConfigure + class MainActivity : FlutterActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) GeneratedPluginRegistrant.registerWith(flutterEngine!!) + + // 初始化 Umeng SDK + UMConfigure.init(this, "671244cf80464b33f6df9648", "Product", UMConfigure.DEVICE_TYPE_PHONE, null) + MethodChannel(flutterEngine?.dartExecutor!!.binaryMessenger, "starLockFlutterSend").setMethodCallHandler { call, result -> if (call.method == "loadNativeShare") { val map = call.arguments as Map diff --git a/android/app/src/main/res/values/values-en-rUS/string.xml b/android/app/src/main/res/values/values-en-rUS/string.xml new file mode 100644 index 00000000..7c497348 --- /dev/null +++ b/android/app/src/main/res/values/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + Star Lock + \ No newline at end of file diff --git a/android/app/src/main/res/values/values-zh-rCN/string.xml b/android/app/src/main/res/values/values-zh-rCN/string.xml new file mode 100644 index 00000000..e55b995c --- /dev/null +++ b/android/app/src/main/res/values/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 星锁 + \ No newline at end of file diff --git a/android/app/src/pre/res/values-en-rUS/string.xml b/android/app/src/pre/res/values-en-rUS/string.xml new file mode 100644 index 00000000..7c497348 --- /dev/null +++ b/android/app/src/pre/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + Star Lock + \ No newline at end of file diff --git a/android/app/src/pre/res/values-zh-rCN/string.xml b/android/app/src/pre/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..e55b995c --- /dev/null +++ b/android/app/src/pre/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 星锁 + \ No newline at end of file diff --git a/android/app/src/sky/res/mipmap-hdpi/ic_launcher.png b/android/app/src/sky/res/mipmap-hdpi/ic_launcher.png old mode 100644 new mode 100755 index ff87e975..4587c19d Binary files a/android/app/src/sky/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/sky/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/sky/res/mipmap-mdpi/ic_launcher.png b/android/app/src/sky/res/mipmap-mdpi/ic_launcher.png old mode 100644 new mode 100755 index 39700e6b..32e709f3 Binary files a/android/app/src/sky/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/sky/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/sky/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/sky/res/mipmap-xhdpi/ic_launcher.png old mode 100644 new mode 100755 index 7c5e4f93..bdd7f056 Binary files a/android/app/src/sky/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/sky/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/sky/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/sky/res/mipmap-xxhdpi/ic_launcher.png old mode 100644 new mode 100755 index 5bd49494..1598749d Binary files a/android/app/src/sky/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/sky/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/sky/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/sky/res/mipmap-xxxhdpi/ic_launcher.png old mode 100644 new mode 100755 index d4853f4f..644b4d33 Binary files a/android/app/src/sky/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/sky/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/sky/res/values-en-rUS/string.xml b/android/app/src/sky/res/values-en-rUS/string.xml new file mode 100644 index 00000000..a99e9958 --- /dev/null +++ b/android/app/src/sky/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + TTLock Pro + \ No newline at end of file diff --git a/android/app/src/sky/res/values-zh-rCN/string.xml b/android/app/src/sky/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..f366b5fc --- /dev/null +++ b/android/app/src/sky/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 锁通通 + \ No newline at end of file diff --git a/android/app/src/sky_pre/res/values-en-rUS/string.xml b/android/app/src/sky_pre/res/values-en-rUS/string.xml new file mode 100644 index 00000000..e5736ebd --- /dev/null +++ b/android/app/src/sky_pre/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + TTLock Pro-P + \ No newline at end of file diff --git a/android/app/src/sky_pre/res/values-zh-rCN/string.xml b/android/app/src/sky_pre/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..04482066 --- /dev/null +++ b/android/app/src/sky_pre/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 锁通通-P + \ No newline at end of file diff --git a/android/app/src/xhj/res/values-en-rUS/string.xml b/android/app/src/xhj/res/values-en-rUS/string.xml new file mode 100644 index 00000000..7c497348 --- /dev/null +++ b/android/app/src/xhj/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + Star Lock + \ No newline at end of file diff --git a/android/app/src/xhj/res/values-zh-rCN/string.xml b/android/app/src/xhj/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..384ea2dd --- /dev/null +++ b/android/app/src/xhj/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 星星锁 + \ No newline at end of file diff --git a/android/app/src/xhj_pre/res/values-en-rUS/string.xml b/android/app/src/xhj_pre/res/values-en-rUS/string.xml new file mode 100644 index 00000000..1f8a4906 --- /dev/null +++ b/android/app/src/xhj_pre/res/values-en-rUS/string.xml @@ -0,0 +1,4 @@ + + + Star Lock-P + \ No newline at end of file diff --git a/android/app/src/xhj_pre/res/values-zh-rCN/string.xml b/android/app/src/xhj_pre/res/values-zh-rCN/string.xml new file mode 100644 index 00000000..9129d25b --- /dev/null +++ b/android/app/src/xhj_pre/res/values-zh-rCN/string.xml @@ -0,0 +1,4 @@ + + + 星星锁-P + \ No newline at end of file diff --git a/assets/.DS_Store b/assets/.DS_Store deleted file mode 100755 index dc1423eb..00000000 Binary files a/assets/.DS_Store and /dev/null differ diff --git a/images/.DS_Store b/images/.DS_Store deleted file mode 100755 index 038522c8..00000000 Binary files a/images/.DS_Store and /dev/null differ diff --git a/images/icon_left_grey.png b/images/icon_left_grey.png new file mode 100644 index 00000000..26593087 Binary files /dev/null and b/images/icon_left_grey.png differ diff --git a/images/main/icon_lockDetail_openLock_succeed.png b/images/main/icon_lockDetail_openLock_succeed.png new file mode 100644 index 00000000..5581f7c8 Binary files /dev/null and b/images/main/icon_lockDetail_openLock_succeed.png differ diff --git a/images/main/icon_main_remoteUnlocking_xhj.png b/images/main/icon_main_remoteUnlocking_xhj.png new file mode 100644 index 00000000..3c5dc707 Binary files /dev/null and b/images/main/icon_main_remoteUnlocking_xhj.png differ diff --git a/images/mine/icon_mine_wan_miniprogram.png b/images/mine/icon_mine_wan_miniprogram.png new file mode 100644 index 00000000..55a3a0ca Binary files /dev/null and b/images/mine/icon_mine_wan_miniprogram.png differ diff --git a/images/mine/icon_mine_wan_wanshifu.png b/images/mine/icon_mine_wan_wanshifu.png new file mode 100644 index 00000000..160b2709 Binary files /dev/null and b/images/mine/icon_mine_wan_wanshifu.png differ diff --git a/ios/Podfile b/ios/Podfile index f60e3f48..76407fa5 100755 --- a/ios/Podfile +++ b/ios/Podfile @@ -30,6 +30,9 @@ flutter_ios_podfile_setup target 'Runner' do flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + pod 'UMCommon' + pod 'UMDevice' end # Plugin Pods diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 022a6c01..9dca6bdf 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -10,12 +10,12 @@ PODS: - EMASRest - AlicloudUT (5.2.0.16): - AlicloudUTDID - - AlicloudUTDID (1.5.0.94) - - AlicloudUtils (1.4.1): + - AlicloudUTDID (1.6.0) + - AlicloudUtils (2.0.0): - AlicloudUTDID - aliyun_face_plugin (0.0.1): - Flutter - - AMap3DMap (10.0.600): + - AMap3DMap (10.0.700): - AMapFoundation (>= 1.8.0) - amap_flutter_location (0.0.1): - AMapLocation @@ -39,38 +39,38 @@ PODS: - Flutter - connectivity_plus (0.0.1): - Flutter - - ReachabilitySwift + - FlutterMacOS - device_info_plus (0.0.1): - Flutter - - DKImagePickerController/Core (4.3.7): + - DKImagePickerController/Core (4.3.9): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.7) - - DKImagePickerController/PhotoGallery (4.3.7): + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): - DKImagePickerController/Core - DKPhotoGallery - - DKImagePickerController/Resource (4.3.7) - - DKPhotoGallery (0.0.17): - - DKPhotoGallery/Core (= 0.0.17) - - DKPhotoGallery/Model (= 0.0.17) - - DKPhotoGallery/Preview (= 0.0.17) - - DKPhotoGallery/Resource (= 0.0.17) + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) - SDWebImage - SwiftyGif - - DKPhotoGallery/Core (0.0.17): + - DKPhotoGallery/Core (0.0.19): - DKPhotoGallery/Model - DKPhotoGallery/Preview - SDWebImage - SwiftyGif - - DKPhotoGallery/Model (0.0.17): + - DKPhotoGallery/Model (0.0.19): - SDWebImage - SwiftyGif - - DKPhotoGallery/Preview (0.0.17): + - DKPhotoGallery/Preview (0.0.19): - DKPhotoGallery/Model - DKPhotoGallery/Resource - SDWebImage - SwiftyGif - - DKPhotoGallery/Resource (0.0.17): + - DKPhotoGallery/Resource (0.0.19): - SDWebImage - SwiftyGif - EMASRest (11.1.1.2) @@ -80,8 +80,8 @@ PODS: - Flutter (1.0.0) - flutter_blue_plus (0.0.1): - Flutter - - flutter_bugly_plugin (0.0.1): - - Bugly + - flutter_bugly (0.0.1): + - Bugly (= 2.6.1) - Flutter - flutter_local_notifications (0.0.1): - Flutter @@ -134,10 +134,9 @@ PODS: - FlutterMacOS - permission_handler_apple (9.3.0): - Flutter - - ReachabilitySwift (5.2.2) - - SDWebImage (5.19.1): - - SDWebImage/Core (= 5.19.1) - - SDWebImage/Core (5.19.1) + - SDWebImage (5.19.2): + - SDWebImage/Core (= 5.19.2) + - SDWebImage/Core (5.19.2) - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS @@ -148,6 +147,13 @@ PODS: - system_settings (0.0.1): - Flutter - Toast (4.1.1) + - UMCommon (7.4.7): + - UMDevice + - UMDevice (3.4.0) + - umeng_common_sdk (0.0.1): + - Flutter + - UMCommon + - UMDevice - url_launcher_ios (0.0.1): - Flutter - video_player_avfoundation (0.0.1): @@ -168,12 +174,12 @@ DEPENDENCIES: - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) - auto_orientation (from `.symlinks/plugins/auto_orientation/ios`) - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) - flutter_blue_plus (from `.symlinks/plugins/flutter_blue_plus/ios`) - - flutter_bugly_plugin (from `.symlinks/plugins/flutter_bugly_plugin/ios`) + - flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_native_contact_picker (from `.symlinks/plugins/flutter_native_contact_picker/ios`) - flutter_pcm_sound (from `.symlinks/plugins/flutter_pcm_sound/ios`) @@ -194,6 +200,9 @@ DEPENDENCIES: - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `.symlinks/plugins/sqflite/darwin`) - system_settings (from `.symlinks/plugins/system_settings/ios`) + - UMCommon + - UMDevice + - umeng_common_sdk (from `.symlinks/plugins/umeng_common_sdk/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) @@ -217,10 +226,11 @@ SPEC REPOS: - ios-voice-processor - JCore - JPush - - ReachabilitySwift - SDWebImage - SwiftyGif - Toast + - UMCommon + - UMDevice - WechatOpenSDK-XCFramework EXTERNAL SOURCES: @@ -243,7 +253,7 @@ EXTERNAL SOURCES: camera_avfoundation: :path: ".symlinks/plugins/camera_avfoundation/ios" connectivity_plus: - :path: ".symlinks/plugins/connectivity_plus/ios" + :path: ".symlinks/plugins/connectivity_plus/darwin" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" file_picker: @@ -252,8 +262,8 @@ EXTERNAL SOURCES: :path: Flutter flutter_blue_plus: :path: ".symlinks/plugins/flutter_blue_plus/ios" - flutter_bugly_plugin: - :path: ".symlinks/plugins/flutter_bugly_plugin/ios" + flutter_bugly: + :path: ".symlinks/plugins/flutter_bugly/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" flutter_native_contact_picker: @@ -292,6 +302,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/sqflite/darwin" system_settings: :path: ".symlinks/plugins/system_settings/ios" + umeng_common_sdk: + :path: ".symlinks/plugins/umeng_common_sdk/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" video_player_avfoundation: @@ -304,10 +316,10 @@ SPEC CHECKSUMS: AlicloudPush: 88529c9b796e4ece0601de0867b30359f55b61f7 AlicloudSender: 1f468b6bd962a099ffc19d45e3608b0fe98f259d AlicloudUT: 6d1cf30d57d096b7e9bb4b069dd0ba6ad59a3338 - AlicloudUTDID: 7323c443dcdf9a73e2224dc6ce51703671d7a765 - AlicloudUtils: 873a76615bebcee8b1996f20820d366e433c3eab + AlicloudUTDID: 4e9d44c2fd704b3508069c38eaec9d6a759e702c + AlicloudUtils: 2a78de434a8b2dc99e408c4d6220e654076d9ef0 aliyun_face_plugin: 7a90b6526c5acea616062e809699294c782c3eb8 - AMap3DMap: d104a679c2bad573c908e0ddadf26bc399678b24 + AMap3DMap: 6ee456d7ba946ebbad580a343b74ffa8e9936175 amap_flutter_location: 44ff5beb64f42e0bf5feb402fe299dac0013af6f amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a AMapFoundation: 9885c48fc3a78fdfb84a0299a2293e56ea3c9fec @@ -318,15 +330,15 @@ SPEC CHECKSUMS: auto_orientation: 102ed811a5938d52c86520ddd7ecd3a126b5d39d Bugly: 217ac2ce5f0f2626d43dbaa4f70764c953a26a31 camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4 - connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d + connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed - DKImagePickerController: 0a24ebfe7b48beeb74c27531540aaa2cc1dac6cf - DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475 file_picker: ce3938a0df3cc1ef404671531facef740d03f920 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_blue_plus: 4837da7d00cf5d441fdd6635b3a57f936778ea96 - flutter_bugly_plugin: d2db6d6641938269fa538575126e8ff530ee02c7 + flutter_bugly: bf35df32a9c5d50b8aacdd35bd8ddc5b55150dae flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e @@ -347,18 +359,20 @@ SPEC CHECKSUMS: package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 - ReachabilitySwift: 2128f3a8c9107e1ad33574c6e58e8285d460b149 - SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb + SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 system_settings: 8f5cdbfa72c677fc8d665b863bcc20d393d87e9d Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e + UMCommon: 8b4cd0423297c39bca6eea1ec896558b40e5bcf7 + UMDevice: dcdf7ec167387837559d149fbc7d793d984faf82 + umeng_common_sdk: a8abd7f86dfd013dbbeeae587ee143760c6582f2 url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1 WechatOpenSDK-XCFramework: 36fb2bea0754266c17184adf4963d7e6ff98b69f -PODFILE CHECKSUM: 317f9473a5705c6fe4d79d95e81676f248048fdc +PODFILE CHECKSUM: a4d4747e9f246a7c5b9d643d5efa33799112963a COCOAPODS: 1.14.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index ec320eaa..e988c153 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 04C1FC572D13F1A2000C959E /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 04C1FC562D13F1A2000C959E /* InfoPlist.xcstrings */; }; + 04D0CC262D06CE570042EF10 /* launchImage_xhj.png in Resources */ = {isa = PBXBuildFile; fileRef = 82B657662C919BDF0079121C /* launchImage_xhj.png */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */; }; 370C09E26790814FD1F6465F /* xhjLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6A6F5C86239927252C06A16A /* xhjLaunchScreen.storyboard */; }; @@ -16,8 +18,6 @@ 805C745A7C79091E65665B96 /* devDebug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */; }; 8297E4102AE75AC500E886FA /* XSFlutterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E40E2AE75AC500E886FA /* XSFlutterManager.m */; }; 8297E49B2AE7974700E886FA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E49A2AE7974700E886FA /* AppDelegate.m */; }; - 82B657622C91665F0079121C /* Info_sky.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82B657602C91665E0079121C /* Info_sky.plist */; }; - 82B657652C917F950079121C /* Info_pre.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82B657642C917F950079121C /* Info_pre.plist */; }; 82B657692C919DA70079121C /* launchImage_sky.png in Resources */ = {isa = PBXBuildFile; fileRef = 82B657682C919DA60079121C /* launchImage_sky.png */; }; 82C026542AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */; }; 82F1ECDB2BE8B7B500265D59 /* DTFIdentityManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1ECD12BE8B7B400265D59 /* DTFIdentityManager.framework */; }; @@ -73,6 +73,10 @@ E0A496CB2CA30C7400E376BB /* xhjPreviewRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */; }; E0A496CD2CA30CA900E376BB /* skyDevRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */; }; E0A496CF2CA30CEF00E376BB /* skyPreviewRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */; }; + E0B3E9ED2D04B36C00907A95 /* info_xhj.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9E92D04B36C00907A95 /* info_xhj.plist */; }; + E0B3E9EE2D04B36C00907A95 /* info_sky.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9EA2D04B36C00907A95 /* info_sky.plist */; }; + E0B3E9EF2D04B36D00907A95 /* info_pre.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9EB2D04B36C00907A95 /* info_pre.plist */; }; + E0B3E9F02D04B36D00907A95 /* info_dev.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9EC2D04B36C00907A95 /* info_dev.plist */; }; E2FF5D00DFF6E2BF9DA36649 /* devLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D627D69970E6DA2D33F770E3 /* devLaunchScreen.storyboard */; }; EE0A7A61CF36BC83ACA6EE3E /* xhjProfile.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = DC2FBF181C8D9880E24845E6 /* xhjProfile.xcconfig */; }; F0A7A6EF7D83CA92324D9C20 /* preDebug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 383F65C3166F78B1A1470A4E /* preDebug.xcconfig */; }; @@ -95,6 +99,7 @@ /* Begin PBXFileReference section */ 0420903B2C0EEAA50073E654 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; }; 04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = ""; }; + 04C1FC562D13F1A2000C959E /* InfoPlist.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; 0BEB3ADCCEC961E2916B9004 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devDebug.xcconfig; path = Flutter/devDebug.xcconfig; sourceTree = ""; }; 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-sky.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-sky.xcconfig"; sourceTree = ""; }; @@ -106,6 +111,7 @@ 22D858E988707FF26E068457 /* Pods-Runner.debug-xhj.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-xhj.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-xhj.xcconfig"; sourceTree = ""; }; 265F8968B3CDB02494B21491 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 295A8AFEEC4806105FAA13B5 /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; + 2DE29642D6CB826BF1547F1F /* Pods-Runner.debug-pre-sky.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-pre-sky.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-pre-sky.xcconfig"; sourceTree = ""; }; 33BF41252A96174D009D92E2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = skyRelease.xcconfig; path = Flutter/skyRelease.xcconfig; sourceTree = ""; }; 383F65C3166F78B1A1470A4E /* preDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = preDebug.xcconfig; path = Flutter/preDebug.xcconfig; sourceTree = ""; }; @@ -125,9 +131,6 @@ 8297E40F2AE75AC500E886FA /* XSFlutterManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XSFlutterManager.h; sourceTree = ""; }; 8297E4992AE7974700E886FA /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 8297E49A2AE7974700E886FA /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 82B657602C91665E0079121C /* Info_sky.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_sky.plist; sourceTree = ""; }; - 82B657612C91665E0079121C /* Info_xhj.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_xhj.plist; sourceTree = ""; }; - 82B657642C917F950079121C /* Info_pre.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_pre.plist; sourceTree = ""; }; 82B657662C919BDF0079121C /* launchImage_xhj.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launchImage_xhj.png; sourceTree = ""; }; 82B657682C919DA60079121C /* launchImage_sky.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launchImage_sky.png; sourceTree = ""; }; 82BD91212ADA72360018E523 /* CommonDefine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommonDefine.h; sourceTree = ""; }; @@ -179,9 +182,9 @@ 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info_dev.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info_dev.plist; sourceTree = ""; }; 9A03C622761920C324D80733 /* skyLaunchScreen.storyboard */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.storyboard; name = skyLaunchScreen.storyboard; path = Runner/skyLaunchScreen.storyboard; sourceTree = ""; }; 9AA145F8B894E5E4F14249DB /* devProfile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devProfile.xcconfig; path = Flutter/devProfile.xcconfig; sourceTree = ""; }; + A728CF82D2CACE8B399AACAB /* Pods-Runner.debug-pre-xhj.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-pre-xhj.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-pre-xhj.xcconfig"; sourceTree = ""; }; B7AA7A6DD927B38E32E2C889 /* preProfile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = preProfile.xcconfig; path = Flutter/preProfile.xcconfig; sourceTree = ""; }; CA9024705F732C9C000EA53E /* xhjRelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = xhjRelease.xcconfig; path = Flutter/xhjRelease.xcconfig; sourceTree = ""; }; CDC2B8ED804B514A774F187D /* Pods-Runner.release-xhj.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-xhj.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-xhj.xcconfig"; sourceTree = ""; }; @@ -199,6 +202,11 @@ E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = xhjPreviewRelease.xcconfig; path = Flutter/xhjPreviewRelease.xcconfig; sourceTree = ""; }; E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = skyDevRelease.xcconfig; path = Flutter/skyDevRelease.xcconfig; sourceTree = ""; }; E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = skyPreviewRelease.xcconfig; path = Flutter/skyPreviewRelease.xcconfig; sourceTree = ""; }; + E0B3E9D62D041C2D00907A95 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E0B3E9E92D04B36C00907A95 /* info_xhj.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_xhj.plist; sourceTree = ""; }; + E0B3E9EA2D04B36C00907A95 /* info_sky.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_sky.plist; sourceTree = ""; }; + E0B3E9EB2D04B36C00907A95 /* info_pre.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_pre.plist; sourceTree = ""; }; + E0B3E9EC2D04B36C00907A95 /* info_dev.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_dev.plist; sourceTree = ""; }; ED1F1A04428235FB1B6FD471 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-xhj.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-xhj.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -270,6 +278,8 @@ 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */, 789004F1B475B44713E199BC /* Pods-Runner.pre-release-xhj.xcconfig */, ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */, + 2DE29642D6CB826BF1547F1F /* Pods-Runner.debug-pre-sky.xcconfig */, + A728CF82D2CACE8B399AACAB /* Pods-Runner.debug-pre-xhj.xcconfig */, ); path = Pods; sourceTree = ""; @@ -286,9 +296,9 @@ 2248834AC2C89C79BC3744F6 /* devRelease.xcconfig */, 383F65C3166F78B1A1470A4E /* preDebug.xcconfig */, B7AA7A6DD927B38E32E2C889 /* preProfile.xcconfig */, - D501929EA2295683612A3AD8 /* preRelease.xcconfig */, 7579B06AEF5FEA95042D8474 /* skyDebug.xcconfig */, DC36296928F573892A6C154E /* skyProfile.xcconfig */, + D501929EA2295683612A3AD8 /* preRelease.xcconfig */, 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */, 853610C00A55CC450C2FF839 /* xhjDebug.xcconfig */, DC2FBF181C8D9880E24845E6 /* xhjProfile.xcconfig */, @@ -333,11 +343,14 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 04C1FC562D13F1A2000C959E /* InfoPlist.xcstrings */, + E0B3E9EC2D04B36C00907A95 /* info_dev.plist */, + E0B3E9EB2D04B36C00907A95 /* info_pre.plist */, + E0B3E9EA2D04B36C00907A95 /* info_sky.plist */, + E0B3E9E92D04B36C00907A95 /* info_xhj.plist */, 82B657682C919DA60079121C /* launchImage_sky.png */, 82B657662C919BDF0079121C /* launchImage_xhj.png */, - 82B657642C917F950079121C /* Info_pre.plist */, - 82B657602C91665E0079121C /* Info_sky.plist */, - 82B657612C91665E0079121C /* Info_xhj.plist */, + E0B3E9D62D041C2D00907A95 /* Info.plist */, 04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */, 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */, 8297E4992AE7974700E886FA /* AppDelegate.h */, @@ -347,7 +360,6 @@ 33BF41252A96174D009D92E2 /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C147021CF9000F007C117D /* Info_dev.plist */, 97C146F11CF9000F007C117D /* Supporting Files */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, @@ -472,12 +484,13 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 04D0CC262D06CE570042EF10 /* launchImage_xhj.png in Resources */, 82F1ED1C2BE8BA8F00265D59 /* BioAuthEngine.bundle in Resources */, 82B657692C919DA70079121C /* launchImage_sky.png in Resources */, 82F1ED1A2BE8BA7D00265D59 /* OCRXMedia.bundle in Resources */, 82F1ED182BE8BA6900265D59 /* APBToygerFacadeSuitable.bundle in Resources */, 82F1ED162BE8BA2000265D59 /* APBToygerFacade.bundle in Resources */, - 82B657622C91665F0079121C /* Info_sky.plist in Resources */, + E0B3E9ED2D04B36C00907A95 /* info_xhj.plist in Resources */, 82F1ED142BE8B9F400265D59 /* ToygerService.bundle in Resources */, 82C026542AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist in Resources */, E0A496C92CA30C2C00E376BB /* xhjDevRelease.xcconfig in Resources */, @@ -486,8 +499,10 @@ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, E0A496CB2CA30C7400E376BB /* xhjPreviewRelease.xcconfig in Resources */, + E0B3E9EF2D04B36D00907A95 /* info_pre.plist in Resources */, E0A496C52CA3092500E376BB /* localDebug.xcconfig in Resources */, 805C745A7C79091E65665B96 /* devDebug.xcconfig in Resources */, + E0B3E9EE2D04B36C00907A95 /* info_sky.plist in Resources */, D415555B0C61C5422202D037 /* devProfile.xcconfig in Resources */, 8A77CDE0EDBCACCE22C29A9E /* devRelease.xcconfig in Resources */, F0A7A6EF7D83CA92324D9C20 /* preDebug.xcconfig in Resources */, @@ -495,11 +510,12 @@ 9C453CBFAB0703DFA762337C /* preProfile.xcconfig in Resources */, 44827AC367F1EAB110A97660 /* preRelease.xcconfig in Resources */, D7EF77645AB1C3CEEA536468 /* skyDebug.xcconfig in Resources */, + 04C1FC572D13F1A2000C959E /* InfoPlist.xcstrings in Resources */, 7B54002BF45E5D8B295B6447 /* skyProfile.xcconfig in Resources */, 25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */, ADF948FD9EE8BD1AE71F0984 /* xhjDebug.xcconfig in Resources */, + E0B3E9F02D04B36D00907A95 /* info_dev.plist in Resources */, EE0A7A61CF36BC83ACA6EE3E /* xhjProfile.xcconfig in Resources */, - 82B657652C917F950079121C /* Info_pre.plist in Resources */, 8B1BD17852B1F49E18DB1D6F /* xhjRelease.xcconfig in Resources */, E2FF5D00DFF6E2BF9DA36649 /* devLaunchScreen.storyboard in Resources */, 99FEBCD8A8244C3EE22C5A18 /* preLaunchScreen.storyboard in Resources */, @@ -610,18 +626,212 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 04139B652D068B83005296D1 /* Debug-sky */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7579B06AEF5FEA95042D8474 /* skyDebug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = "$(ASSET_PREFIX)AppIcon"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Runner/info_sky.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = "Debug-sky"; + }; + 04139B662D068B83005296D1 /* Debug-sky */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A63B2C308CB401731950EC8 /* Pods-Runner.debug-sky.xcconfig */; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = SF86QP26TZ; + INFOPLIST_FILE = Runner/info_sky.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; + PRODUCT_NAME = Runner; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = 1; + }; + name = "Debug-sky"; + }; + 04139B672D068BA8005296D1 /* Debug-xhj */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 853610C00A55CC450C2FF839 /* xhjDebug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = "$(ASSET_PREFIX)AppIcon"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Runner/info_xhj.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = "Debug-xhj"; + }; + 04139B682D068BA8005296D1 /* Debug-xhj */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 22D858E988707FF26E068457 /* Pods-Runner.debug-xhj.xcconfig */; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = SF86QP26TZ; + INFOPLIST_FILE = Runner/info_xhj.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; + PRODUCT_NAME = Runner; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = 1; + }; + name = "Debug-xhj"; + }; 04ED96322B688AB00046472A /* Release-sky */ = { isa = XCBuildConfiguration; baseConfigurationReference = 16A83D21DFB231D8453DC681 /* Pods-Runner.release-sky.xcconfig */; buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = NAQ5PL2DYC; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC; - INFOPLIST_FILE = Runner/Info_sky.plist; + INFOPLIST_FILE = Runner/info_sky.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_NAME = Runner; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.skychip.lock.mobileprovision; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -634,14 +844,18 @@ baseConfigurationReference = CDC2B8ED804B514A774F187D /* Pods-Runner.release-xhj.xcconfig */; buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = P8997RW3V8; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8; - INFOPLIST_FILE = Runner/Info_xhj.plist; + INFOPLIST_FILE = Runner/info_xhj.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock; PRODUCT_NAME = Runner; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.xhjcn.lock.mobileprovision; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -683,6 +897,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXCLUDED_ARCHS = ""; @@ -698,7 +913,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_FILE = Runner/info_sky.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -711,7 +926,7 @@ MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -753,6 +968,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXCLUDED_ARCHS = ""; @@ -768,7 +984,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_FILE = Runner/info_xhj.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -781,7 +997,7 @@ MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -823,6 +1039,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; EXCLUDED_ARCHS = ""; @@ -856,8 +1073,9 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.dev; + PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -870,16 +1088,17 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-dev.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC; - INFOPLIST_FILE = Runner/Info_dev.plist; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = SF86QP26TZ; + INFOPLIST_FILE = Runner/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; PRODUCT_NAME = Runner; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -887,7 +1106,7 @@ }; name = "Debug-local"; }; - E0A496D02CA30D2800E376BB /* pre-release-sky */ = { + E0A496D02CA30D2800E376BB /* Pre-release-sky */ = { isa = XCBuildConfiguration; baseConfigurationReference = E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */; buildSettings = { @@ -921,6 +1140,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXCLUDED_ARCHS = ""; @@ -936,7 +1156,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_FILE = Runner/info_sky.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -947,39 +1167,41 @@ "$(PROJECT_DIR)/Flutter", ); MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock; + PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; - name = "pre-release-sky"; + name = "Pre-release-sky"; }; - E0A496D12CA30D2800E376BB /* pre-release-sky */ = { + E0A496D12CA30D2800E376BB /* Pre-release-sky */ = { isa = XCBuildConfiguration; baseConfigurationReference = D697F91E8405773AB9A5881E /* Pods-Runner.pre-release-sky.xcconfig */; buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC; - INFOPLIST_FILE = Runner/Info_pre.plist; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = NAQ5PL2DYC; + INFOPLIST_FILE = Runner/info_sky.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre; PRODUCT_NAME = Runner; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.pre.mobileprovision; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; TARGETED_DEVICE_FAMILY = 1; }; - name = "pre-release-sky"; + name = "Pre-release-sky"; }; - E0A496D22CA30D5A00E376BB /* dev-release-sky */ = { + E0A496D22CA30D5A00E376BB /* Dev-release-sky */ = { isa = XCBuildConfiguration; baseConfigurationReference = E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */; buildSettings = { @@ -1013,6 +1235,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXCLUDED_ARCHS = ""; @@ -1028,7 +1251,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_FILE = Runner/info_sky.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1039,39 +1262,41 @@ "$(PROJECT_DIR)/Flutter", ); MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock; + PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.dev; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; - name = "dev-release-sky"; + name = "Dev-release-sky"; }; - E0A496D32CA30D5A00E376BB /* dev-release-sky */ = { + E0A496D32CA30D5A00E376BB /* Dev-release-sky */ = { isa = XCBuildConfiguration; baseConfigurationReference = 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */; buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC; - INFOPLIST_FILE = Runner/Info_dev.plist; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = NAQ5PL2DYC; + INFOPLIST_FILE = Runner/info_sky.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.dev; PRODUCT_NAME = Runner; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.dev.mobileprovision; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; TARGETED_DEVICE_FAMILY = 1; }; - name = "dev-release-sky"; + name = "Dev-release-sky"; }; - E0A496D42CA30D7400E376BB /* pre-release-xhj */ = { + E0A496D42CA30D7400E376BB /* Pre-release-xhj */ = { isa = XCBuildConfiguration; baseConfigurationReference = E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */; buildSettings = { @@ -1105,6 +1330,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXCLUDED_ARCHS = ""; @@ -1120,7 +1346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_FILE = Runner/info_xhj.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1131,39 +1357,41 @@ "$(PROJECT_DIR)/Flutter", ); MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock; + PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; - name = "pre-release-xhj"; + name = "Pre-release-xhj"; }; - E0A496D52CA30D7400E376BB /* pre-release-xhj */ = { + E0A496D52CA30D7400E376BB /* Pre-release-xhj */ = { isa = XCBuildConfiguration; baseConfigurationReference = 789004F1B475B44713E199BC /* Pods-Runner.pre-release-xhj.xcconfig */; buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8; - INFOPLIST_FILE = Runner/Info_pre.plist; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = P8997RW3V8; + INFOPLIST_FILE = Runner/info_xhj.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre; PRODUCT_NAME = Runner; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.pre.mobileprovision; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; TARGETED_DEVICE_FAMILY = 1; }; - name = "pre-release-xhj"; + name = "Pre-release-xhj"; }; - E0A496D62CA30D8400E376BB /* dev-release-xhj */ = { + E0A496D62CA30D8400E376BB /* Dev-release-xhj */ = { isa = XCBuildConfiguration; baseConfigurationReference = E0A496C82CA30C2C00E376BB /* xhjDevRelease.xcconfig */; buildSettings = { @@ -1197,6 +1425,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; EXCLUDED_ARCHS = ""; @@ -1212,7 +1441,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_FILE = Runner/info_xhj.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1223,37 +1452,39 @@ "$(PROJECT_DIR)/Flutter", ); MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock; + PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.dev; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; - name = "dev-release-xhj"; + name = "Dev-release-xhj"; }; - E0A496D72CA30D8400E376BB /* dev-release-xhj */ = { + E0A496D72CA30D8400E376BB /* Dev-release-xhj */ = { isa = XCBuildConfiguration; baseConfigurationReference = ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */; buildSettings = { CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8; - INFOPLIST_FILE = Runner/Info_dev.plist; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = P8997RW3V8; + INFOPLIST_FILE = Runner/info_xhj.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.dev; PRODUCT_NAME = Runner; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.dev.mobileprovision; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; TARGETED_DEVICE_FAMILY = 1; }; - name = "dev-release-xhj"; + name = "Dev-release-xhj"; }; /* End XCBuildConfiguration section */ @@ -1263,11 +1494,13 @@ buildConfigurations = ( E0A496C62CA309AD00E376BB /* Debug-local */, 5028C464A6FD115380ECE6A0 /* Release-sky */, - E0A496D02CA30D2800E376BB /* pre-release-sky */, - E0A496D22CA30D5A00E376BB /* dev-release-sky */, + E0A496D02CA30D2800E376BB /* Pre-release-sky */, + 04139B652D068B83005296D1 /* Debug-sky */, + E0A496D22CA30D5A00E376BB /* Dev-release-sky */, 9073AF548DAA546CE84A8D2F /* Release-xhj */, - E0A496D42CA30D7400E376BB /* pre-release-xhj */, - E0A496D62CA30D8400E376BB /* dev-release-xhj */, + E0A496D42CA30D7400E376BB /* Pre-release-xhj */, + 04139B672D068BA8005296D1 /* Debug-xhj */, + E0A496D62CA30D8400E376BB /* Dev-release-xhj */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Debug-local"; @@ -1277,11 +1510,13 @@ buildConfigurations = ( E0A496C72CA309AD00E376BB /* Debug-local */, 04ED96322B688AB00046472A /* Release-sky */, - E0A496D12CA30D2800E376BB /* pre-release-sky */, - E0A496D32CA30D5A00E376BB /* dev-release-sky */, + E0A496D12CA30D2800E376BB /* Pre-release-sky */, + 04139B662D068B83005296D1 /* Debug-sky */, + E0A496D32CA30D5A00E376BB /* Dev-release-sky */, 04ED96352B688AB00046472A /* Release-xhj */, - E0A496D52CA30D7400E376BB /* pre-release-xhj */, - E0A496D72CA30D8400E376BB /* dev-release-xhj */, + E0A496D52CA30D7400E376BB /* Pre-release-xhj */, + 04139B682D068BA8005296D1 /* Debug-xhj */, + E0A496D72CA30D8400E376BB /* Dev-release-xhj */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Debug-local"; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme deleted file mode 100755 index 9b1185a7..00000000 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/sky.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/sky.xcscheme index bf70b16a..36a76d0e 100755 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/sky.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/sky.xcscheme @@ -24,7 +24,7 @@ + + + + diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m index 086a7d55..4b399780 100755 --- a/ios/Runner/AppDelegate.m +++ b/ios/Runner/AppDelegate.m @@ -5,7 +5,7 @@ #import "XSFlutterManager.h" #import - +#import @interface AppDelegate() @@ -19,6 +19,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [UMConfigure initWithAppkey:@"671244ae80464b33f6df9646" channel:@"Product"]; + XSFlutterManager *VC = [[XSFlutterManager alloc] init]; self.window.rootViewController = VC; [self.window makeKeyAndVisible]; diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Contents.json index 88147747..d36b1fab 100755 --- a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Contents.json @@ -1,117 +1,122 @@ { "images" : [ { - "filename" : "icon-20@2x.png", + "size" : "20x20", "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" }, { - "filename" : "icon-20@3x.png", + "size" : "20x20", "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" }, { + "size" : "29x29", "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" }, { - "filename" : "icon-29@2x.png", + "size" : "29x29", "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" }, { - "filename" : "icon-29@3x.png", + "size" : "29x29", "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" }, { - "filename" : "icon-40@2x.png", + "size" : "40x40", "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" }, { - "filename" : "icon-40@3x.png", + "size" : "40x40", "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" }, { - "filename" : "icon-60@2x.png", + "size" : "60x60", "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" }, { - "filename" : "icon-60@3x.png", + "size" : "60x60", "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" }, { + "size" : "20x20", "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" }, { - "filename" : "icon-20@2x 1.png", + "size" : "20x20", "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" }, { + "size" : "29x29", "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" }, { - "filename" : "icon-29@2x 1.png", + "size" : "29x29", "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" }, { + "size" : "40x40", "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" }, { - "filename" : "icon-40@2x 1.png", + "size" : "40x40", "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" }, { + "size" : "76x76", "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" }, { - "filename" : "icon-76@2x.png", + "size" : "76x76", "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" }, { - "filename" : "icon-83.5@2x.png", + "size" : "83.5x83.5", "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" }, { - "filename" : "icon-1024.png", + "size" : "1024x1024", "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" } ], "info" : { - "author" : "xcode", - "version" : 1 + "version" : 1, + "author" : "xcode" } } diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100755 index 00000000..dd761bc4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100755 index 00000000..4e8c801a Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100755 index 00000000..20f2a164 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100755 index 00000000..509306f6 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100755 index 00000000..8d943d4f Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100755 index 00000000..b8e0da8c Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100755 index 00000000..ce5b6941 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100755 index 00000000..20f2a164 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100755 index 00000000..24ad8c57 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100755 index 00000000..e3683ba4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100755 index 00000000..e3683ba4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100755 index 00000000..ae954ac4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100755 index 00000000..1b2aa99e Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100755 index 00000000..5825af16 Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100755 index 00000000..6939522e Binary files /dev/null and b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-1024.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-1024.png deleted file mode 100644 index 1401d392..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-1024.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@2x 1.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@2x 1.png deleted file mode 100644 index 0d4ef0b0..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@2x 1.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@2x.png deleted file mode 100644 index 0d4ef0b0..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@3x.png deleted file mode 100644 index f0f13c16..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-20@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@2x 1.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@2x 1.png deleted file mode 100644 index cb4f2492..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@2x 1.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@2x.png deleted file mode 100644 index cb4f2492..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@3x.png deleted file mode 100644 index a00ca13b..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-29@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@2x 1.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@2x 1.png deleted file mode 100644 index 28ac8631..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@2x 1.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@2x.png deleted file mode 100644 index 28ac8631..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@3x.png deleted file mode 100644 index 3a98d3fc..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-40@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-60@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-60@2x.png deleted file mode 100644 index 3a98d3fc..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-60@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-60@3x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-60@3x.png deleted file mode 100644 index 838f2c38..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-60@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-76@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-76@2x.png deleted file mode 100644 index 57f361aa..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-76@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-83.5@2x.png b/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-83.5@2x.png deleted file mode 100644 index 2baa4fcb..00000000 Binary files a/ios/Runner/Assets.xcassets/skyAppIcon.appiconset/icon-83.5@2x.png and /dev/null differ diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 00000000..d740d5b1 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,131 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + $(BUNDLE_DISPLAY_NAME) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(BUNDLE_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + None + CFBundleURLIconFile + + CFBundleURLName + com.sky.skysmartlock + CFBundleURLSchemes + + skysmartlock + + + + + + CFBundleTypeRole + Editor + CFBundleURLName + weixin + CFBundleURLSchemes + + wxbe340095d2b8fd51 + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSApplicationQueriesSchemes + + weixin + weixinULAPI + weixinURLParamsAPI + + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsArbitraryLoadsInWebContent + + NSExceptionDomains + + jpush.cn + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + + + NSBluetoothAlwaysUsageDescription + The app uses bluetooth to find, connect and transfer data between different devices + NSBluetoothPeripheralUsageDescription + The app uses bluetooth to find, connect and transfer data between different devices + NSCameraUsageDescription + 应用请求相机,以便于拍摄照片,用于头像上传及人脸认证 + NSContactsUsageDescription + Reason we need access to the contact list + NSFileProtectionKey + NSFileProtectionCompleteUntilFirstUserAuthentication + NSLocationAlwaysAndWhenInUseUsageDescription + 应用在前台和后台的时候可以搜到更新的位置信息 + NSLocationAlwaysUsageDescription + 应用在后台的时候可以搜到更新的位置信息 + NSLocationWhenInUseUsageDescription + 应用在前台的时候可以搜到更新的位置信息 + NSMicrophoneUsageDescription + 应用请求麦克风用来通话 + NSPhotoLibraryUsageDescription + 应用请求相册用于头像上传 + UIApplicationSceneManifest + + UISceneConfigurations + + + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + remote-notification + + UIFileSharingEnabled + + UILaunchStoryboardName + skyLaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + + UIViewControllerBasedStatusBarAppearance + + io.flutter.embedded_views_preview + + + diff --git a/ios/Runner/InfoPlist.xcstrings b/ios/Runner/InfoPlist.xcstrings new file mode 100644 index 00000000..449697b7 --- /dev/null +++ b/ios/Runner/InfoPlist.xcstrings @@ -0,0 +1,23 @@ +{ + "sourceLanguage" : "zh-Hans", + "strings" : { + "CFBundleDisplayName" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Star Lock" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "星锁" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/ios/Runner/en.lproj/InfoPlist.strings b/ios/Runner/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..42bf8e95 --- /dev/null +++ b/ios/Runner/en.lproj/InfoPlist.strings @@ -0,0 +1,8 @@ +/* + InfoPlist.strings + Runner + + Created by mac on 2024/11/21. + +*/ +"AppName"="Star Lock"; diff --git a/ios/Runner/Info_dev.plist b/ios/Runner/info_dev.plist similarity index 100% rename from ios/Runner/Info_dev.plist rename to ios/Runner/info_dev.plist diff --git a/ios/Runner/Info_pre.plist b/ios/Runner/info_pre.plist similarity index 100% rename from ios/Runner/Info_pre.plist rename to ios/Runner/info_pre.plist diff --git a/ios/Runner/Info_sky.plist b/ios/Runner/info_sky.plist similarity index 100% rename from ios/Runner/Info_sky.plist rename to ios/Runner/info_sky.plist diff --git a/ios/Runner/Info_xhj.plist b/ios/Runner/info_xhj.plist similarity index 100% rename from ios/Runner/Info_xhj.plist rename to ios/Runner/info_xhj.plist diff --git a/ios/Runner/launchImage_sky.png b/ios/Runner/launchImage_sky.png index 3e0336a8..b323652c 100644 Binary files a/ios/Runner/launchImage_sky.png and b/ios/Runner/launchImage_sky.png differ diff --git a/ios/Runner/zh-Hans.lproj/InfoPlist.strings b/ios/Runner/zh-Hans.lproj/InfoPlist.strings new file mode 100644 index 00000000..5b0ee9b4 --- /dev/null +++ b/ios/Runner/zh-Hans.lproj/InfoPlist.strings @@ -0,0 +1,8 @@ +/* + InfoPlist.strings + Runner + + Created by mac on 2024/11/21. + +*/ +"AppName"="星锁"; diff --git a/ios/build.sh b/ios/build.sh index d2a127a0..2900f4d8 100755 --- a/ios/build.sh +++ b/ios/build.sh @@ -21,11 +21,11 @@ elif [[ $ENV_BUILD_TAG =~ $regex ]]; then bundle exec fastlane release flavor:sky --verbose elif [[ "${ENV_BUILD_BRANCH}" == "develop" ]]; then echo "===build dev===${NEXT_VERSION}" - bundle exec fastlane beta flavor:xhj env:dev --verbose - bundle exec fastlane beta flavor:sky env:dev --verbose + bundle exec fastlane beta flavor:xhj env:Dev --verbose + bundle exec fastlane beta flavor:sky env:Dev --verbose elif [[ "${ENV_BUILD_BRANCH}" == "release" ]] || [[ "${ENV_BUILD_BRANCH}" == "feat_devops" ]] ; then echo "===build pre===${NEXT_VERSION}" - bundle exec fastlane beta flavor:xhj env:pre --verbose - bundle exec fastlane beta flavor:sky env:pre --verbose + bundle exec fastlane beta flavor:xhj env:Pre --verbose + bundle exec fastlane beta flavor:sky env:Pre --verbose fi exit 0 \ No newline at end of file diff --git a/lan/lan_ar.json b/lan/lan_ar.json new file mode 100644 index 00000000..de21a723 --- /dev/null +++ b/lan/lan_ar.json @@ -0,0 +1,1122 @@ +{ + "星锁": "قفل نجمة", + "锁通通": "قفل من خلال", + "点击开锁,长按闭锁": "المس للفتح ، مع الاستمرار للقفل", + "考勤": "الحضور", + "考勤设置": "إعدادات الحضور", + "电子钥匙": "مفاتيح", + "添加卡": "إضافة بطاقة", + "卡号": "رقم البطاقة", + "添加指纹": "إضافة بصمة الإصبع", + "指纹号": "رقم بصمة الإصبع", + "遥控": "بعيد", + "添加人脸": "إضافة وجه", + "门锁日志": "سجل قفل الباب", + "密码号": "رقم كلمة المرور", + "添加者": "مشغل", + "添加时间": "الوقت", + "重置": "إعادة الضبط", + "请输入手机号或者邮箱": "رقم الهاتف أو البريد الإلكتروني", + "工作时间": "وقت العمل", + "工作日设置": "إعداد يوم العمل", + "星期一": "يوم الاثنين", + "星期二": "ونشيلة", + "星期三": "يوم الأربعاء", + "星期四": "يوم الخميس", + "星期五": "فريداي", + "星期六": "يوم السبت", + "星期日": "يوم الأحد", + "简写周一": "م", + "简写周二": "ر", + "简写周三": "ث", + "简写周四": "ر", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "مون", + "周二": "تو", + "周三": "الأربعاء", + "周四": "ثدي", + "周五": "فري", + "周六": "سات", + "周日": "الشمس", + "群发钥匙": "إرسال مفاتيح كهربائية متعددة", + "锁": "قفل", + "请添加": "المستلم", + "允许远程开锁": "فتح عن بعد", + "请输入验证码": "رمز التحقق", + "获取密码": "توليد رمز مرور", + "请给密码命名": "أدخل اسم رمز المرور هذا", + "密码有限期为6个小时,只能使用一次": "يجب استخدام رمز المرور هذا في غضون 6 ساعات من الوقت الحالي أو سيتم تعليقه لأسباب أمنية. لا يمكن استخدام رمز المرور هذا إلا مرة واحدة.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "أدخل يدويًا 6-9 أرقام ككلمة مرور. يمكن إضافتها عن طريق الهاتف بلوتوث بجوار القفل ، أو إضافتها عن بعد من خلال البوابة", + "获取": "الحصول على", + "添加": "إضافة", + "删除公司": "حذف الشركة", + "密码详情": "معلومات رمز المرور", + "修改密码": "تغيير رمز المرور", + "添加虹膜": "إضافة قزحية", + "添加门磁": "مستشعر الباب", + "添加无线键盘": "لوحة مفاتيح لاسلكية", + "添加手掌": "إضافة النخيل", + "请输入员工账号": "أدخل حساب الموظف", + "批量授权锁": "منح أقفال متعددة", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "سيكون لدى المسؤول المعتمد إذن الأغلبية لتشغيل هذا القفل.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "تتيح لك هذه الميزة فتح القفل الذكي عن بُعد عبر بوابة. لا يمكن تشغيل هذه الميزة أو إيقافها إلا عبر البلوتوث.", + "排列方式": "نوع القائمة", + "早到榜": "قائمة مبكرة", + "迟到榜": "قائمة متأخرة", + "当前模式": "الوضع الحالي", + "勤奋榜": "قائمة العمل الثابت", + "延迟时间": "تأخير الوقت", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "سيتم قفل القفل تلقائيًا بعد الوقت. يرجى إلغاء قفله لمرة واحدة أولاً لجعل الإعداد متاحًا.", + "时间": "الوقت", + "开始时间": "وقت البدء", + "结束时间": "وقت الانتهاء", + "工作时间设置": "إعداد وقت العمل", + "常开模式": "وضع الممر", + "常开时间": "خلال هذه الفترة الزمنية", + "常开日期": "في هذه الأيام", + "添加员工": "إضافة موظفين", + "节假日": "عطلة", + "打卡方式": "الطريقة", + "员工是否有钥匙": "لديه بالفعل ekey", + "上班时间": "وقت البدء", + "下班时间": "وقت الإغلاق", + "本周": "هذا الأسبوع", + "单休": "عطلة نهاية الأسبوع ليوم واحد", + "双休": "عطلة نهاية الأسبوع لمدة يومين", + "单双休": "عطلة نهاية الأسبوع لمدة يومين", + "年": "السنة", + "月": "شهر", + "放假日期": "عطلة", + "补班日期": "أيام عمل", + "添加假日": "إضافة عطلة", + "开始日期": "تاريخ البدء", + "必填": "مطلوب", + "结束日期": "تاريخ الانتهاء", + "日榜": "يومي", + "月榜": "شهريا", + "考勤记录": "السجلات", + "假日信息": "معلومات العطلة", + "基本信息": "الأساسيات", + "无线键盘": "لوحة مفاتيح لاسلكية", + "选择无线键盘": "إضافة لوحة المفاتيح", + "门磁": "مستشعر الباب", + "自动闭锁": "قفل السيارات", + "锁声音": "صوت القفل", + "防撬报警": "تنبيه عبث", + "重置键": "زر إعادة الضبط", + "锁时间": "ساعة بقفل", + "诊断": "تشخيص", + "上传数据": "تحميل البيانات", + "导入其他锁数据": "استيراد frome قفل آخر", + "锁升级": "تحديث البرامج الثابتة", + "标记房态": "حالة الغرفة", + "开锁提醒": "إلغاء قفل الإشعارات", + "微信二维码": "فتح رمز الاستجابة السريعة", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "يمكن للأشخاص الذين لديهم مفاتيح إلكترونية فتح الباب عن طريق مسح رمز الاستجابة السريعة هذا من خلال whechat. رمز الاستجابة السريعة لكل قفل مختلف. يمكنك طباعته ولصقه بجوار القفل المقابل", + "锁编号": "رقم القفل", + "电量": "بطارية", + "锁分组": "مجموعة القفل", + "选择分组": "تحديد المجموعة", + "创建新分组": "إنشاء مجموعة", + "管理员开锁密码": "رمز مرور المسؤول", + "更新": "تحديث", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "سيتم تحديث مستوى البطارية عن طريق البوابة أو الهاتف البلوتوث", + "当屏幕闪烁时,点击下一步": "انقر فوق التالي عندما تومض لوحة المفاتيح", + "输入*529#或按设置键": "أدخل README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # أو اضغط على مفتاح الإعدادات", + "长按重置键2秒": "اضغط مع الاستمرار على زر إعادة الضبط ثانيتين", + "附近的设备": "المعدات القريبة", + "暂无数据": "لا توجد بيانات", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "ستتمكن من الحصول على حالة الباب مع مستشعر باب مع بوابة. يسمح لمستشعر واحد فقط بالارتباط بقفل.", + "开始": "بدء", + "全天": "كل الساعات", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "يمكنك تعيين فترات زمنية متعددة لوضع المرور. خلال الفترات الزمنية المحددة ، سيظل القفل في حالة مفتوحة بعد إلغاء قفله.", + "请选择锁音量": "يرجى تحديد حجم القفل", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "من خلال تشغيل ، سوف تسمع الصوت من القفل", + "低": "منخفض", + "较低": "متوسط منخفض", + "中": "متوسط", + "较高": "متوسط مرتفع", + "高": "مرتفع", + "开启后,锁被撬动时,会发出报警声": "من خلال تشغيل ، يمكنك تمكين تنبيه التلاعب.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "من خلال إيقاف التشغيل ، يتم تعطيل زر إعادة الضبط.", + "校准时间": "وقت ضبط", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "التشخيص هو قراءة معلومات التكوين داخل القفل وتحميلها بحيث يمكن للموظفين تحليل سبب الفشل", + "上传": "تحميل", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "تحميل البيانات من القفل إلى الخادم. قد يستغرق الأمر عدة دقائق", + "请选择要从哪把锁导入": "تحديد قفل للاستيراد منه", + "有新版本": "لديك نسخة جديدة", + "当前版本": "الإصدار الحالي", + "升级": "تحديث", + "空闲": "شاغر", + "已入住": "محتل", + "多语言": "اللغات", + "添加锁": "إضافة قفل", + "锁地址": "عنوان القفل", + "选择锁类型": "حدد نوع القفل", + "NFC无源锁": "NFC قفل سلبي", + "添加设备": "إضافة جهاز", + "网关": "بوابة", + "客服": "خدمة العملاء", + "设置": "الإعدادات", + "更多设置": "المزيد من المجموعة", + "消息推送": "إشعار دفع", + "锁用户管理": "قفل المستخدمين", + "拥有的钥匙": "المفاتيح الإلكترونية المرتبطة بهذا المستخدم", + "批量授权": "إدارة السلطة", + "关联设备": "جهاز مرتبط", + "关联姓名": "اسم مرتبط", + "转移智能锁": "قفل النقل", + "选择锁": "قفل الشاشة", + "接收人信息": "المستلم", + "转移网关": "بوابة النقل", + "锁屏": "قفل الشاشة", + "已关闭": "إيقاف", + "已开启": "في", + "开启": "تشغيل", + "确定要开启重置键?": "الاستمرار في تمكين زر إعادة الضبط ؟", + "确定要关闭重置键?": "الاستمرار في تعطيل زر إعادة الضبط ؟", + "隐藏无效开锁权限": "إخفاء وصول غير صالح", + "APP开锁时需手机连网的锁": "أقفال تتطلب الهاتف على الانترنت", + "增值服务": "الخدمات", + "关于": "حول", + "退出": "لوجوت", + "删除账号": "حذف حساب", + "个人信息": "معلومات الحساب", + "头像": "افاتار", + "昵称": "الاسم المستعار", + "请输入昵称": "الرجاء إدخال اسمك المستعار", + "修改昵称": "إعادة التسمية", + "修改账号": "تعديل الحساب", + "重置密码": "إعادة تعيين كلمة المرور", + "安全问题": "سؤال الأمان", + "为了你的账号安全,修改账号前请先使用验证码验证": "لضمان أمان حسابك ، يرجى استخدام التحقق من كلمة مرور الحساب قبل تعديل الحساب", + "请输入新账号": "يرجى إدخال الحساب الجديد", + "找回密码和登录新设备时,可通过绑定的手机验证": "سيتم استخدام رقم الهاتف الملزم لاستلام رمز التحقق.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "سيتم استخدام البريد الإلكتروني الملزم لتلقي رمز التحقق.", + "原密码": "كلمة المرور الحالية", + "新密码": "كلمة مرور جديدة", + "确认密码": "تأكيد كلمة المرور", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "في حالة فقدان هاتفك ، يمكنك تسجيل الدخول إلى الهاتف الجديد عن طريق الإجابة على أسئلة الأمان.", + "问题一": "السؤال الأول", + "问题二": "السؤال 2", + "问题三": "السؤال الثالث", + "请输入你的答案": "يرجى كتابة إجابتك", + "即将到期": "تنتهي قريبا", + "去授权": "اذهب إلى التفويض", + "修改名称": "تعديل الاسم", + "状态": "الحالة", + "WiFi名称": "اسم واي فاي", + "网络MAC": "ماك الشبكة", + "网关升级": "تحديث البوابة", + "网关连接的锁": "القفل (القفل) المتصل بهذه البوابة", + "信号强": "قوي", + "选择网关类型": "اختيار نوع البوابة", + "添加网关": "إضافة بوابة", + "重新通电": "إعادة توصيل الطاقة", + "指示灯": "مصباح مؤشر", + "选择网关": "اختر بوابة", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G غير مدعوم. يرجى اختيار واي فاي 2.4G.", + "WiFi密码": "واي فاي Passward", + "请输入WiFi密码": "أدخل كلمة مرور واي فاي", + "网关名称": "اسم البوابة", + "请输入网关名称": "أدخل اسم البوابة", + "IP地址": "عنوان IP", + "子网掩码": "قناع الشبكة الفرعية", + "默认网关": "البوابة الافتراضية", + "自动获取DNS服务器地址": "الحصول على عنوان خادم DNS تلقائيًا", + "首选DNS": "DNS المفضل", + "备选DNS": "DNS بديلة", + "不使用静态IP": "لم يتم استخدام IP ثابت", + "使用静态IP": "استخدام IP ثابت", + "请输入IP地址": "أدخل عنوان IP", + "请输入子网掩码": "أدخل قناع الشبكة الفرعية", + "请输入默认网关": "أدخل البوابة الافتراضية", + "所有锁": "جميع الأقفال", + "搜索所有类型的锁": "مسح جميع أنواع الأقفال", + "门锁": "قفل باب", + "挂锁": "قفل", + "保险箱锁": "قفل أمان", + "智能门禁": "التحكم في الوصول الذكي", + "车位锁": "قفل وقوف السيارات", + "摸亮触摸屏": "لمس أي مفتاح لتفعيل لوحة المفاتيح", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "يرجى لمس أي مفتاح لتنشيط القفل ووضعه في وضع الاقتران. اضغط بعد ذلك", + "附近的锁": "الأقفال القريبة", + "如需修改名字请重新命名,点击确定添加锁": "إذا كنت ترغب في تغيير الاسم ، يرجى إعادة التسمية ، انقر فوق موافق لإضافة القفل", + "添加锁时,手机必须在锁旁边": "عند إضافة قفل ، يجب أن يكون الهاتف بجوار القفل", + "登录": "تسجيل الدخول", + "注册": "تسجيل", + "我已阅读并同意": "لقد قرأت ووافقت", + "验证码": "رمز", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "يجب أن تحتوي كلمة المرور الخاصة بك على 8-20 حرفًا ، وأن تتضمن على الأقل نوعين من الأرقام والحروف والرموز", + "手机": "الهاتف", + "邮箱": "البريد الإلكتروني", + "请输入邮箱": "أدخل بريدك الإلكتروني", + "国家/地区": "البلد/المنطقة", + "你所在的国家/地区": "بلدك/منطقتك", + "选择国家/地区": "اختر بلدك أو منطقتك", + "获取验证码": "احصل على الرمز", + "商务合作": "الأعمال", + "电脑网页版": "نظام ويب", + "酒店系统": "نظام الفندق", + "说明书网页版": "دليل المستخدم", + "高级功能": "وظيفة متقدمة", + "记录保存": "الاحتفاظ بالسجلات", + "您可通过短信将密码、电子钥匙信息发给接收人。": "يمكن استخدام الرسائل القصيرة لإرسال رمز المرور ومعلومات المفتاح الإلكتروني إلى المستلم.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "يمكن استخدام البريد الإلكتروني لإرسال رمز المرور ومعلومات المفتاح الإلكتروني إلى المستلم.", + "购买实名认证提示": "بعد تمكين الوظيفة ، تحتاج إلى استخدام بصمة الإصبع أو الوجه أو كلمة مرور الحساب لفتح التطبيق. ليست هناك حاجة للتحقق مرة أخرى لمدة 3 دقائق", + "请选择你希望的实名认证频次": "يرجى تحديد تردد مصادقة الاسم الحقيقي الذي تريده", + "仅首次": "لأول مرة", + "每日一次": "مرة في اليوم", + "每周一次": "مرة في الأسبوع", + "每月一次": "مرة كل شهر", + "当前状态": "الحالة الحالية", + "试用中": "قيد المحاكمة", + "高级功能权益内容": "وظائف متقدمة", + "短信模板": "قالب الرسائل القصيرة", + "邮件模板": "قالب البريد الإلكتروني", + "发卡工具": "جهاز تشفير البطاقات", + "购买高级功能须知": "إشعار", + "购买高级功能提示": "المزيد من الميزات المتقدمة قيد التطوير ، وإذا كنت في حاجة إليها ، فيمكنك فتح الخدمة بناءً على عدد الأقفال. تتوفر الميزات المتقدمة فقط للأقفال الخاصة بك. إذا كنت مسؤولاً معتمدًا ، يرجى الاتصال بالمسؤول الأعلى للقفل لفتح الخدمة", + "免费体验": "تجربة مجانية", + "立即开通": "مفتوح الآن", + "购买短信": "شراء الرسائل القصيرة", + "购买邮件": "شراء البريد الإلكتروني", + "购买实名认证次数": "شراء مرات مصادقة الاسم الحقيقي", + "开通高级功能": "تمكين وظيفة متقدمة", + "选择套餐": "اختيار الحزمة", + "支付方式": "طريقة الدفع", + "支付宝": "أليباي", + "去支付": "الدفع", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "يُسمح لك بتحديد الرسالة بنفسك. يتم استخدامها لإرسال معلومات رمز المرور والمفتاح الإلكتروني للآخرين.", + "高级功能仅能用于你自己的锁": "لا يمكن تطبيق الوظيفة المتقدمة إلا على الأقفال الخاصة بك.", + "新建模板": "قالب كريت", + "类型": "النوع", + "模版内容": "قالب المحتوى", + "预览": "معاينة", + "房间名": "غرفة", + "预计产生短信条数": "شرائح الرسائل المقدرة", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "تتيح لك هذه الميزة إخفاء رموز المرور والمفاتيح الإلكترونية والبطاقات وبصمات الأصابع غير الصالحة لفترة من الوقت.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "مطلوب هاتف المستخدم ليكون على الإنترنت لفتح هذه الأقفال المحددة مع التطبيق.", + "配置WiFi": "تكوين واي فاي", + "请输入WiFi名字": "يرجى إدخال اسم واي فاي", + "WiFi配网": "شبكة توزيع واي فاي", + "胁迫卡": "بطاقة إجهاد", + "员工是否有密码": "لديه رمز مرور بالفعل", + "员工是否有卡": "لديه بطاقة بالفعل", + "员工是否有指纹": "تعيين بالفعل بصمة الإصبع", + "获取钥匙": "الحصول على المفتاح", + "获取卡": "الحصول على بطاقة", + "获取指纹": "الحصول على بصمة الإصبع", + "安全验证": "التحقق من الهوية", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "ستتم إزالة جميع معلومات حسابك من المنصة بشكل دائم ولا يمكن استردادها. هل تريد حذفها ؟", + "监控": "شاشة", + "视频日志": "سجل الفيديو", + "开门器": "فاتح باب", + "面容开锁": "يفتح الوجه", + "开门方向设置": "مجموعة فتح الاتجاه", + "电机功率设置": "إعداد الطاقة النارية", + "开锁时是否需联网": "إذا كان الإنترنت مطلوبًا عند إلغاء القفل", + "选择要加入分组的锁": "حدد الأقفال لإضافتها إلى هذه المجموعة", + "锁数量": "عدد القفل", + "小米IOT平台": "منصة شاومى ايوت", + "面容开锁设置": "مجموعة فتح الوجه", + "感应距离": "مسافة الاستشعار", + "防误开": "منع فتح خاطئ", + "防误开已关闭,关门后仍可使用面容开锁": "تم إغلاق منع سوء الفتح ، بعد إغلاق الباب لا يزال يستخدم فتح الوجه", + "添加和使用面容开锁时": "إضافة الوجه واستخدامه عند إلغاء القفل", + "添加和使用面容开锁时提示": "\n1 ، يرجى محاولة إبقاء شخص واحد أمام عملية الباب ؛\n2 ، يرجى الوقوف أمام قفل الباب حوالي 0.5 ~ 0.8 متر ، تواجه قفل الباب ؛\n3. يرجى الحفاظ على وجهك دون عوائق وكشف ملامح وجهك ؛\n4. عندما يكون التعرف على الوجه غير طبيعي ، يمكنك لمس أي مفتاح على لوحة المفاتيح الرقمية لإعادة تشغيل التعرف على الوجه يدويًا.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "يرجى اختيار قوة المحرك بعناية وفقًا للحالة الفعلية لقفل الباب:", + "小功率:": "ميني وات:", + "耗电少": "استهلاك طاقة أقل", + "大功率": "قوة عالية:", + "大功率提示": "إذا كان اللسان قفل لا يمكن سحبها عادة عند فتح ، أو تحتاج إلى أن تكون مدفوعة", + "开门方向设置提示": "يرجى اختيار اتجاه فتح باب منزلك بعناية (إذا اخترت الاتجاه الخاطئ ، فلن تتمكن من فتح الباب وإغلاقه بشكل صحيح):", + "左开": "يسار مفتوح", + "右开": "حق مفتوح", + "判断方法:": "من من فضلك", + "判断方法内容": "وقف الرجل خارج المنزل ، في مواجهة باب المدخل.", + "录像时段": "فتحة فيديو", + "密码": "رموز المرور", + "卡": "بطاقات", + "指纹": "بصمة الإصبع", + "人脸": "الوجه", + "配件商城": "قفل مركز تجاري", + "公司名称": "اسم الشركة", + "请输入公司名字": "أدخل اسم الشركة", + "提示": "تلميح", + "是否删除?": "هل يمكن الحذف ؟", + "员工信息": "معلومات الموظفين", + "员工": "الموظفون", + "打卡方式无效": "غير متوفر", + "中国": "الصين", + "选择钥匙": "اختيار ekey", + "编辑": "تحرير", + "无": "لا", + "有": "نعم", + "请输入姓名": "يرجى إدخال اسم", + "获取人脸": "الحصول على الوجوه", + "选择密码": "اختيار رمز المرور", + "选择卡": "اختيار بطاقة", + "选择指纹": "اختيار بصمة الإصبع", + "选择人脸": "تحديد الوجه", + "员工是否有人脸": "إذا كان للموظف وجه", + "同时删除员工钥匙": "حذف المفتاح الإلكتروني الخاص به", + "删除": "ديليت", + "确定要删除员工吗?": "حذف هذا الموظف", + "月统计": "إحصائيات شهرية", + "迟到": "متأخر", + "早退": "ترك مبكرا", + "未打卡": "لا سجل", + "钥匙将在": "ستنتهي صلاحية هذا المفتاح الإلكتروني في", + "天后失效": "يوم (أيام)", + "电量更新时间:": "وقت تحديث البطارية:", + "新增配件": "إضافة", + "钥匙不可用": "المفتاح غير متوفر", + "正在开锁中...": "فتح...", + "你的钥匙": "المفتاح الخاص بك", + "常开模式启动!长按闭锁": "بدأ وضع الفتح! الضغط لفترة طويلة لقفل", + "演示模式": "وضع العرض", + "请先同意用户协议及隐私政策": "يرجى الموافقة على اتفاقية المستخدم وسياسة الخصوصية أولاً", + "用户协议": "شروط المستخدم", + "隐私政策": "سياسة الخصوصية", + "注册成功": "نجح التسجيل", + "你所在的": "أنت في", + "手机号": "رقم الهاتف", + "忘记密码": "نسيت كلمة المرور", + "重置成功": "إعادة ضبط النجاح", + "确定要退出吗?": "خروج ؟", + "功能暂未开放": "الوظيفة ليست مفتوحة بعد", + "设置成功": "الإعداد بنجاح", + "删除成功": "حذف بنجاح", + "单次": "لمرة واحدة", + "永久": "دائم", + "限时": "توقيت", + "自定义": "مخصص", + "清空码": "مسح", + "循环": "متكرر", + "工作日": "يوم عمل", + "每日": "يومي", + "周末": "عطلة نهاية الأسبوع", + "确定要删除吗?": "حذف ؟", + "该锁的密码都将被删除": "سيتم حذف جميع رموز المرور الخاصة بهذا القفل", + "已过期": "غير صالح", + "该锁的电子钥匙都将被删除": "سيتم حذف جميع المفاتيح الإلكترونية لهذا القفل", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "حذف جميع المفاتيح الإلكترونية المرتبطة بهذا المفتاح الإلكتروني. لا يمكن التراجع عن هذه الخطوة!", + "删除钥匙会在用户APP连网后生效": "سيتم حذف المفتاح الإلكتروني", + "有效时间": "وقت فعال", + "接收者": "المستلم", + "仅管理自己创建的用户": "إدارة المستخدمين فقط", + "远程开锁": "فتح عن بعد", + "请输入钥匙名称": "يرجى إدخال اسم المفتاح", + "修改成功": "تعديل النجاح", + "冻结": "تجميد", + "解除冻结": "ذوبان الجليد", + "授权": "تخويل", + "取消授权": "إلغاء التفويض", + "同时解冻其发送的钥匙": "إزالة جميع المفاتيح الإلكترونية الصادرة عن هذا المستخدم", + "会在用户APP连网后生效": "سيتم إذابة هذا المفتاح الإلكتروني عندما يتصل تطبيق المستخدم بشبكة", + "同时冻结其发送的钥匙": "تجميد جميع المفاتيح الإلكترونية الصادرة عن هذا المستخدم", + "冻结会在用户APP连网后生效": "سيتم تجميد هذا المفتاح الإلكتروني عندما يتصل تطبيق المستخدم بشبكة", + "取消授权会在用户APP连网后生效": "سيفقد المستخدم أذوناته عندما يتصل تطبيق المستخدم بشبكة", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "يتمتع المستخدم المصرح له بنفس الأذونات تقريبًا مثل مدير القفل (على سبيل المثال ، القدرة على إرسال المفاتيح الإلكترونية ورموز المرور)", + "失效时间需晚于生效时间": "يجب أن يكون وقت انتهاء الصلاحية متأخرًا عن الوقت الفعلي", + "生效时间需晚于当前时间": "يجب أن يكون الوقت الفعلي متأخرًا عن الوقت الحالي", + "失效日期需晚于生效日期": "يجب أن يكون تاريخ انتهاء الصلاحية بعد تاريخ السريان", + "修改有效期": "فترة التغيير", + "生效日期": "تاريخ البدء", + "失效日期": "تاريخ الانتهاء", + "开锁": "فتح", + "开锁成功": "فتح القفل للنجاح", + "请选择锁": "يرجى تحديد الأقفال", + "请选择接收者": "يرجى تحديد المستلم", + "请选择有效期": "يرجى تحديد فترة الصلاحية", + "请选择发送方式": "الرجاء تحديد طريقة الإرسال", + "请选择结束时间": "يرجى تحديد وقت الانتهاء", + "完成": "مكتمل", + "有效日": "دورة على", + "发送成功": "أرسل بنجاح", + "请选择开始时间": "الرجاء تحديد وقت البدء", + "选择用户": "تحديد المستلمين", + "已选中": "محدد", + "确定": "موافق", + "请选择要发送的锁": "يرجى تحديد الأقفال", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "يشير مصادقة الوجه بالاسم الحقيقي إلى حاجة المستخدم للتحقق من وجهه قبل إلغاء قفل تطبيق الهاتف ، ويمكن إلغاء قفل التحقق.", + "分享": "مشاركة", + "请输入接收者账号": "يرجى إدخال حساب المستلم", + "接收者号码未注册,请重新发送": "رقم المستلم غير مسجل ، يُرجى إعادة الإرسال", + "是否发送电子钥匙给未注册账号": "هل تريد إرسال مفتاح إلكتروني إلى حساب جديد", + "取消": "إلغاء", + "标记成功": "علامة النجاح", + "微信好友": "أصدقاء WeChat", + "短信": "الرسائل القصيرة", + "邮件": "البريد الإلكتروني", + "更多": "المزيد", + "您好,您的电子钥匙生成成功": "مرحبًا ، تم إنشاء مفتاحك الإلكتروني بنجاح", + "生效时间不能小于当前时间": "الوقت الفعلي لا يمكن أن يكون أقل من الوقت الحالي", + "结束时间不能小于当前时间": "لا يمكن أن يكون وقت النهاية أقل من الوقت الحالي", + "是否为管理员": "هل هو مسؤول", + "已连接到锁,请将卡靠近门锁的读卡区": "متصل. ضع البطاقة مقابل قارئ البطاقة", + "尝试连接设备...": "تواصل مع القفل. يرجى الانتظار...", + "地理位置": "الموقع الجغرافي", + "检查以确保以下地址是正确的": "تحقق للتأكد من صحة العنوان التالي", + "地图加载中,请稍候。。": "يتم تحميل الخريطة ، يرجى الانتظار...", + "跳过": "تخطي", + "还未获取到位置信息哦,请耐心等待一下!": "لم يتم الحصول على معلومات الموقع بعد ، يرجى الانتظار بصبر!", + "请填写信息": "يرجى ملء المعلومات", + "有效期": "فترة الصلاحية", + "生效时间": "وقت البدء", + "失效时间": "وقت الانتهاء", + "上传成功": "تم التحميل بنجاح", + "未生效": "غير نشط", + "已生效": "فعال", + "指纹详情": "معلومات بصمة الإصبع", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "سيُطلب منك وضع إصبعك على المستشعر عدة مرات. يرجى اتباع المطالبات...", + "开始添加": "بدء", + "请将您的手指按下": "ضع إصبعك على المجس", + "根据提示,抬起手指后再进行下一次指纹采集": "اتبع المطالبات... سيُطلب منك إزالة إصبعك ووضع إصبعك على المستشعر للتسجيل التالي", + "添加成功": "إضافة النجاح", + "更新成功": "نجاح التحديث", + "搜索": "البحث", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف بطاقة القفل ، هل تريد إعادة الضبط ؟", + "已失效": "غير صالح", + "卡详情": "معلومات البطاقة", + "请输入": "الرجاء إدخال هنا", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "من خلال إيقاف القفل ، سيظل القفل مفتوح طوال اليوم حتى يتم قفله يدويًا", + "请输入小于或等于60的数字": "الرجاء إدخال رقم أقل من 60", + "操作成功": "عملية ناجحة", + "管理员密码相同,无需修改": "كلمة مرور المسؤول هي نفسها ولا تحتاج إلى تعديل", + "请输入6-9位数字": "6-9 أرقام في الطول", + "请输入6-9位管理员密码": "يرجى إدخال كلمة مرور المسؤول من 6-9 أرقام", + "请输入新的管理员密码": "يرجى إدخال كلمة مرور المسؤول الجديدة", + "未分组": "غير مجمعة", + "请输入分组名称": "إنشاء مجموعة", + "创建成功": "خلق النجاح", + "设置锁分组成功": "ضبط مجموعة القفل بنجاح", + "电池1电量": "بطارية 1", + "电池2电量": "بطارية 2", + "电量更新时间": "وقت تحديث البطارية", + "锁电量更新成功": "نجح تحديث الطاقة بقفل", + "您的钥匙未生效": "مفتاحك غير فعال", + "您的钥匙已冻结": "تم تجميد مفتاحك", + "您的钥匙已过期": "انتهت صلاحية مفتاحك", + "常开模式开启": "القفل في وضع المرور", + "超级管理员": "المشرف السوبر", + "授权管理员": "معتمد المشرف", + "普通用户": "مستخدم عادي", + "余": "التوازن", + "天": "يوم", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "بعد حذف القفل ، سيتم حذف جميع المعلومات معًا ، هل أنت متأكد من أنك تريد حذف القفل ؟", + "请输入登录密码": "يرجى إدخال كلمة مرور التطبيق", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "فشل في حذف الجهاز ، يرجى التأكد من أن الجهاز قريب من الجهاز ، وأن الجهاز غير متصل ، وأن الجهاز قيد التشغيل", + "用户无权限": "ليس لدى المستخدم إذن", + "创建公司后,考勤功能才能使用": "يرجى إنشاء شركة أولاً", + "是否删除钥匙?": "حذف هذا المفتاح ؟", + "邮箱绑定成功": "نجاح ربط البريد الإلكتروني", + "手机绑定成功": "نجاح ربط الهاتف المحمول", + "网络访问失败,请检查网络是否正常": "فشل الطلب. الشبكة غير متوفرة ، يرجى التحقق وتوصيل جهازك بـ 3G/4G/WIFI", + "清空": "شفاف", + "是否清空?": "واضح ؟", + "消息详情": "معلومات الرسالة", + "创建时间": "وقت الإنشاء", + "管理员详情": "تفاصيل المسؤول", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "إذا أجبرك شخص ما على فتح الباب ، يمكنك استخدام هذه البطاقة. سيتم إرسال رسالة التنبيه إلى المسؤولين. لاستخدام هذه الميزة ، يرجى التأكد من أن قفلك متصل بالإنترنت.", + "请不要将胁迫卡用于日常开锁": "الرجاء عدم استخدام البطاقة الجبرية للاستخدام اليومي.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "إذا أجبرك شخص ما على فتح الباب ، يمكنك استخدام هذه البصمة. سيتم إرسال رسالة التنبيه إلى الجهات القائمة على الإدارة. لاستخدام هذه الميزة ، يرجى التأكد من أن قفلك متصل بالإنترنت.", + "请不要将胁迫指纹用于日常开锁": "يرجى عدم استخدام بصمة الإصبع الإجباري للاستخدام اليومي.", + "创建公司": "إنشاء شركة", + "公司名称不能超过30个字符": "لا يمكن أن يتجاوز اسم الشركة 30 حرفًا", + "公司名称不能小于6个字符": "لا يمكن أن يقل اسم الشركة عن 6 أحرف", + "WIFI列表": "قائمة واي فاي", + "刷新": "تحديث", + "手动配网": "شبكة توزيع يدوية", + "远距离": "لمسافات طويلة", + "中距离": "مسافة متوسطة", + "近距离": "مسافة قصيرة", + "锁时间更新成功": "نجح تحديث وقت القفل", + "锁用户": "قفل المستخدمين", + "请选择常开日期": "يرجى تحديد تاريخ الفتح", + "结束时间不能小于开始时间哦": "لا يمكن أن يكون وقت النهاية أقل من وقت البدء", + "介绍": "قصتنا", + "个人信息收集清单": "قائمة جمع المعلومات الشخصية", + "应用权限说明": "وصف إذن التطبيق", + "第三方信息共享清单": "قائمة مشاركة معلومات الطرف الثالث", + "请选择您的位置": "يرجى تحديد موقعك", + "请先选择位置": "يرجى تحديد الموقع أولاً", + "管理员密码": "رمز مرور المسؤول", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "إذا كنت بحاجة إلى تعديل ، يرجى إدخال كلمة مرور مسؤول جديدة (6 أرقام) ، انقر فوق موافق لتعديلها", + "修改": "تعديل", + "网络摄像头": "الكاميرا", + "重命名": "إعادة التسمية", + "分组下的锁将被移到未分组里": "سيتم نقل الأقفال تحت المجموعة إلى غير مجمعة", + "编辑成功": "نجاح التحرير", + "厂商": "جهة تصنيع", + "型号": "نموذج", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "بعد إنشاء كلمة المرور ، يرجى استخدامها مرة واحدة للتنشيط قبل 239.59 في نفس اليوم ، وإلا ستكون غير صالحة بعد الساعة 0. بعد تنشيط كلمة المرور ، يمكن استخدامها مرات غير محدودة خلال فترة الصلاحية.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "بعد إنشاء كلمة المرور ، يرجى استخدامها قبل 239.59 في نفس اليوم ، وإلا ستكون غير صالحة بعد الساعة 0. يتم استخدام الرمز الواضح لمسح جميع كلمات المرور التي تم إنشاؤها قبل الساعة 0: 00 اليوم.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "بعد إنشاء كلمة المرور ، يرجى استخدامها قبل 239.59 في نفس اليوم ، وإلا ستكون غير صالحة بعد الساعة 0.", + "清空密码底部提示": "كلمة المرور صالحة حتى 23: 59 في يوم التفريغ", + "相机": "الكاميرا", + "相册": "صور", + "读写": "التخزين", + "定位": "الموقع", + "需要访问相机权限才能拍照上传文件例如头像上传": "مطلوب الوصول إلى الكاميرا لالتقاط الصور وتحميل الملفات ، مثل تحميل صورة الملف الشخصي", + "需要访问相机权限才能使用相册图片上传文件上传头像": "مطلوب الوصول إلى الكاميرا لتحميل الملفات والصور الرمزية باستخدام صور الألبوم", + "需要访问读写权限才能使用本地图片上传头像": "الوصول إلى أذونات القراءة والكتابة مطلوب لتحميل الصور الرمزية باستخدام الصور المحلية", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "الوصول إلى معلومات الموقع مطلوب لاستخدام وظيفة مفتاح الإضافة", + "申请": "تكويد", + "权限": "إذن", + "不允许": "غير مسموح", + "允许": "مسموح", + "权限被拒绝": "رفض التصريح", + "请手动在系统设置中开启": "يرجى تمكينه يدويًا في إعدادات النظام", + "权限以继续使用应用": "إذن لمواصلة استخدام التطبيق.", + "去设置": "الذهاب إعداده حتى", + "当前网络": "الشبكة الحالية", + "位置信息": "معلومات الموقع", + "请输入wifi名称": "يرجى إدخال اسم wifi", + "虹膜": "القزحية", + "手掌": "راحة اليد", + "商城": "مول", + "我的": "لي", + "微信公众号推送": "حساب عام Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "لفتح wechat لتلقي رسائل التنبيه ، تحتاج إلى الانتباه إلى قفل Skye الذكي wechat الحساب العام أولاً ، يرجى حفظ رمز الاستجابة السريعة واستخدام wechat لمسح الإعدادات", + "蓝牙": "بلوتوث", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "الوصول إلى أذونات البلوتوث مطلوب لاستخدام معلومات الموقع لوظيفة مفتاح الإضافة", + "请输入Email": "أدخل بريدك الإلكتروني", + "请输入手机号": "أدخل رقم هاتفك", + "家人到家": "وصل أفراد الأسرة إلى المنزل", + "添加家人": "إضافة فرد من العائلة", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "إذا لم يكن القفل متصلاً بالإنترنت ، فلا يمكن إرسال تذكيرات برمز المرور والبطاقة وبصمة الإصبع وطرق فتح الأبواب الأخرى في الوقت المناسب.", + "消息提醒": "تذكير", + "开门通知": "إشعار الافتتاح", + "N天未开门": "ن أيام دون فتح الباب", + "门未关好": "الباب غير مغلق", + "防拆报警": "إنذار عبث", + "低电量提醒": "بطارية منخفضة", + "胁迫开门": "فتح الباب القسري", + "有人按门铃": "شخص ما يرن جرس الباب", + "有人出现在门口": "شخص ما يظهر على الباب", + "提醒方式": "طريقة التذكير", + "开门方式": "طريقة فتح الباب", + "请选择": "يرجى التحديد", + "家人": "عضو العائلة", + "保存": "وفِّر", + "APP推送": "دفع التطبيق", + "管理员": "مشرف", + "未启用": "لم يتم تمكينه", + "已启用": "تمكين", + "省电模式": "وضع توفير الطاقة", + "逗留抓拍模式": "البقاء في وضع الالتقاط", + "实时监控模式": "وضع مراقبة في الوقت الحقيقي", + "自定义模式": "وضع مخصص", + "猫眼设置": "إعداد عين القط", + "猫眼工作模式": "وضع عمل عين القط", + "自动亮屏": "شاشة ساطعة أوتوماتيكية", + "亮屏持续时间": "الشاشة في الوقت المحدد", + "逗留警告": "كن حذرًا", + "异常警告": "تحذير غير طبيعي", + "短信提醒": "الرسائل القصيرة", + "邮件提醒": "البريد الإلكتروني", + "N天未开门提醒": "ن أيام دون فتح الباب", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "إذا كان شخص ما يجبر لك لفتح القفل ، يمكنك استخدام هذه البصمة. سيتم إرسال رسالة التنبيه إلى الإدارة. لاستخدام هذه الميزة ، يرجى التأكد من أن قفلك متصل بالإنترنت.", + "胁迫指纹": "بصمة الإصبع القسري", + "指纹列表": "قائمة بصمات الأصابع", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "بعد الوقت المحدد ، إذا لم يتم فتح القفل ، فسيرسل النظام رسالة تذكير إلى المستلم المعين. تتطلب هذه الوظيفة أن يكون القفل متصلاً بالإنترنت.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "بعد تمكين التذكير ، عندما تكون بطارية القفل أقل من 20 ٪ و 10 ٪ و 5 ٪ ، سيرسل النظام رسالة تذكير إلى المستلم المعين.", + "未开门时间": "أيام دون فتح الباب", + "添加和使用面容开锁时:": "إضافة الوجه واستخدامه عند إلغاء القفل:", + "关锁": "قفل إغلاق", + "功能": "وظيفة", + "配件": "أجزاء", + "云存": "تخزين سحابي", + "本地": "هذه المنطقة", + "3天滚动储存": "التخزين المتداول لمدة 3 أيام", + "去升级": "ترقية الآن", + "下载列表": "قائمة التحميل", + "已下载": "تحميل", + "全部视频": "جميع مقاطع الفيديو", + "已为本设备免费提供3大滚动视频储存服务": "تم توفير ثلاث خدمات تخزين فيديو للتمرير لهذا الجهاز مجانًا", + "视频播放": "تشغيل الفيديو", + "全选": "الكل", + "请选择要删除的视频": "يرجى تحديد الفيديو الذي تريد حذفه", + "请选择要下载的视频": "يرجى تحديد الفيديو الذي تريد تنزيله", + "欢迎使用": "ترحيب للاستخدام", + "用户协议和隐私政策概要": "ملخص اتفاقية المستخدم وسياسة الخصوصية", + "协议概要": "ملخص البروتوكول", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "شكرًا لك على استخدام هذا التطبيق. نحن نعلق أهمية كبيرة على معلوماتك الشخصية وحماية الخصوصية. قبل استخدام هذا المنتج ، يرجى قراءته بعناية", + "《用户协议》": "شروط المستخدم", + "和": "و", + "《隐私政策》": "《 سياسة الخصوصية 《", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "المحتوى بأكمله. بالنقر على \"موافق\" ، فإنك توافق على جميع الشروط وتقبلها. إذا اخترت عدم الموافقة ، فلن تتمكن من استخدام منتجاتنا وخدماتنا وستخرج من التطبيق.", + "不同意": "نختلف", + "同意": "أوافق", + "该功能是高级功能,请开通后再使用": "هذه هي الوظيفة المتقدمة. يرجى تمكينه أولاً.", + "常用程序": "البرامج المشتركة", + "该锁已被重置": "تمت إعادة ضبط القفل", + "需要访问读写权限才能使用手动升级固件": "مطلوب الوصول إلى أذونات القراءة والكتابة لترقية البرامج الثابتة يدويًا", + "错误D固件,请选择正确的文件": "البرامج الثابتة الخاطئة ، يرجى تحديد الملف الصحيح", + "非SYD固件,请选择正确的文件": "البرامج الثابتة غير SYD ، يرجى تحديد الملف الصحيح", + "文件校验失败 0x01": "فشل التحقق من الملف 0x01", + "解析元数据失败,请选择正确的文件": "فشل في تحليل البيانات الوصفية ، يرجى تحديد الملف الصحيح", + "文件校验失败 0x02": "فشل التحقق من الملف 0x02", + "文件校验失败 0x03": "فشل التحقق من الملف 0x03", + "固件升级完成": "اكتمل ترقية البرامج الثابتة", + "记录": "السجلات", + "开通高级功能后才可以对锁进行管理": "يرجى تمكين الوظيفة المتقدمة أولاً لإدارة الأقفال.", + "去开通": "تمكين", + "实名认证": "مصادقة بالاسم الحقيقي", + "当前剩余数量": "المتبقي", + "购买": "شراء", + "实名认证为付费功能,请购买后再使用": "مصادقة الاسم الحقيقي هي وظيفة مدفوعة ، يرجى استخدامها بعد الشراء", + "密码不一致哦": "كلمات المرور غير متسقة", + "退出添加": "إنهاء الإضافة", + "管理员已满": "مشرف كامل", + "用户已满": "المستخدم ممتلئ", + "锁上面添加指纹已满": "إضافة بصمة على القفل ممتلئ", + "指纹已存在": "بصمة الإصبع موجودة بالفعل.", + "锁上面添加人脸已满": "قفل فوق إضافة الوجه ممتلئ", + "人脸已存在": "الوجه موجود بالفعل", + "锁上面添加卡已满": "قفل فوق بطاقة الإضافة ممتلئ", + "卡已存在": "البطاقة موجودة بالفعل", + "锁上面添加密码已满": "القفل أعلاه إضافة كلمة المرور ممتلئة", + "密码已存在": "يوجد رمز مرور مطابق بالفعل. يرجى اختيار رمز آخر", + "请输入密码": "الرجاء إدخال كلمة المرور", + "暂无密码,无需重置": "لا كلمة مرور ، لا حاجة لإعادة تعيين", + "真实姓名": "الاسم الحقيقي", + "身份证号": "رقم معرف", + "请输入真实姓名": "يرجى إدخال اسمك الحقيقي", + "请输入身份证号": "الرجاء إدخال رقم الهوية الخاص بك", + "请输入身份证号和真实姓名": "يرجى إدخال رقم الهوية والاسم الحقيقي", + "点击返回设备配对": "اضغط على العودة إلى اقتران الجهاز", + "无法连接?尝试升级": "لا يمكن الاتصال ؟ حاولت ترقية", + "固件升级提示": "ترقية البرامج الثابتة موجه", + "请先获取固件文件到手机本地,再选择升级": "يرجى الحصول على ملف البرامج الثابتة إلى الهاتف المحلي أولاً ، ثم تحديد الترقية", + "固件升级中": "يتم ترقية البرامج الثابتة", + "取消升级": "إلغاء الترقية", + "固件传输中": "البرامج الثابتة قيد النقل", + "关闭": "إيقاف تشغيل", + "传输中'": "قيد النقل", + "操作记录": "السجلات", + "修改姓名": "تعديل الاسم", + "传输中": "قيد النقل", + "发送人": "صادرة عن", + "发送时间": "صدر الوقت", + "钥匙详情": "معلومات ekey", + "姓名": "الاسم", + "发送": "إرسال", + "请确认姓名全名和身份证号码是否正确": "يرجى تأكيد صحة الاسم الكامل ورقم الهوية", + "传输期间请勿离开当前页面": "لا تترك الصفحة الحالية أثناء النقل", + "机型": "نماذج", + "硬件版本": "نسخة الأجهزة", + "固件版本": "نسخة البرنامج الثابت", + "手动升级": "ترقية يدوية", + "设备连接中...": "جهاز توصيل...", + "未避免异常情况,请在门打开时升级": "استثناءات لا يمكن تجنبها ، يرجى الترقية عندما يكون الباب مفتوحًا", + "钥匙无效": "المفتاح غير صالح", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "غير قادر على الاتصال بالقفل. يرجى إعادة تشغيل بلوتوث هاتفك والمحاولة مرة أخرى.", + "如果是全自动锁,请使屏幕变亮": "إذا كان القفل أوتوماتيكي بالكامل ، يرجى جعل الشاشة أكثر إشراقًا", + "正在尝试闭锁……": "محاولة القفل. يرجى الانتظار...", + "清空记录": "سجلات واضحة", + "是否要删除操作记录?": "متابعة حذف السجلات ؟", + "被删除的记录不能恢复": "لا يمكن استرداد السجلات بعد الحذف.", + "全部事件": "جميع الأحداث", + "开锁事件": "فتح الحدث", + "异常事件": "حدث غير طبيعي", + "门铃事件": "حدث جرس الباب", + "视频事件": "حدث فيديو", + "请开启蓝牙": "يرجى تشغيل البلوتوث", + "请选择有效日": "يرجى تحديد يوم الفعالية", + "公司名字长度不能小于 6 ": "لا يمكن أن يقل طول اسم الشركة عن 6", + "已是最新版本": "لا توجد تحديثات", + "新建短信模版": "قالب الرسائل القصيرة Creat", + "新建邮件模版": "قالب إبداع للبريد الإلكتروني", + "自定义短信模版": "قالب الرسائل القصيرة", + "自定义邮件模版": "قالب البريد الإلكتروني", + "名称": "الاسم", + "星星锁": "قفل نجمة", + "无考勤记录": "لا سجلات", + "大家干劲十足": "الجميع يأتي في الوقت المحدد", + "工作时长未出炉": "لا توجد ساعات عمل", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "سيؤثر اختيار البلد/المنطقة على أمان البيانات. لقد اخترت حاليًا المملكة العربية المتحدة ، يُرجى التأكيد قبل المتابعة.", + "确认国家或地区": "تأكيد البلد/المنطقة", + "我知道了": "حصلت عليه", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "لتلقي التحديثات المهمة ، يرجى النقر فوق \"فوق\" وتمكين الإشعارات في الإعدادات.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "بعد تشغيل ، يمكنك إعادة التشغيل عن طريق الضغط لفترة طويلة على مفتاح الإعداد على القفل ، وإعادة إضافته مع التطبيق", + "已有": "الحالي", + "新增": "جديد", + "账号格式错误": "تنسيق سيء", + "接收者信息为空": "معلومات المستلم فارغة", + "请输入时间(秒)": "يرجى إدخال الوقت (ثانية)", + "加载数据失败": "فشل في تحميل البيانات", + "重试": "حاول مرة أخرى", + "升级中,是否退出": "أثناء الترقية ، سواء للخروج", + "下一步": "التالي", + "公寓": "شقة", + "个人用户": "شخصي", + "星寓": "شقة نجمة", + "账号": "الحساب", + "请输入手机号或email": "رقم الهاتف أو البريد الإلكتروني", + "请输入星寓管理员的账号": "يرجى إدخال حساب مدير الشقة بالنجمة", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "سيتم نقل جميع بيانات القفل (القفل) المحدد بشكل دائم إلى المستلم.", + "暂不支持跨平台转移,敬请期待": "النقل عبر المنصة غير مدعوم في الوقت الحالي ، يرجى التطلع إليه", + "移除坏锁": "نقل الأقفال المعيبة/التالفة إلى المهملات", + "转移确认": "تأكيد النقل", + "本次共转移": "هذه المرة ما مجموعه", + "把智能锁": "قفل ذكي", + "确认": "موافق", + "移除成功": "إزالة بنجاح", + "转移成功": "نجح النقل", + "该已锁被删除": "تم حذف القفل", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "يمكن للمشرف المعتمد فقط إدارة رموز المرور والمفاتيح الإلكترونية والإلكترونية التي تم إنشاؤها بواسطة نفسه.", + "添加授权管理员": "إنشاء المشرف", + "导出记录": "سجلات التصدير", + "选择时间段": "حدد الفترة الزمنية", + "导出": "التصدير", + "批量导出": "تصدير الدفعة", + "读取记录": "تحديث السجلات", + "设备": "جهاز", + "消息": "الرسائل", + "智能分析": "تحليلات ذكية", + "精准识别设备事件,过滤无效信息": "تحديد أحداث الجهاز بدقة وتصفية المعلومات غير الصالحة", + "系统设置": "إعدادات النظام", + "系统的全局配置在此项内进行设置": "تم تعيين التكوين العالمي للنظام في هذا العنصر", + "导出操作记录": "سجلات التصدير", + "立即查看": "مشاهدة", + "导出成功": "تم التصدير بنجاح", + "发送钥匙": "إرسال ekey", + "进度": "معدل", + "失败": "فشل", + "人脸详情": "تفاصيل الوجه", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "عندما يتم استشعارشخص ما حوالي 1.5 متر أمام الباب ، سيتم تشغيل قفل التعرف على الوجه تلقائيًا.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "عندما يتم لمس شخص ما حوالي 0.8 متر أمام الباب ، سيتم بدء تشغيل قفل التعرف على الوجه تلقائيًا.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "عندما يستشعر شخص ما حوالي 0.5 متر أمام الباب ، سيتم تشغيل قفل التعرف على الوجه تلقائيًا.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "تم إيقاف تشغيل مسافة الاستشعار ، تحتاج إلى لمس أي مفتاح يدويًا على لوحة المفاتيح لإلغاء قفل التعرف على الوجه.", + "防误开已打开,开锁后": "تم تشغيل الفتح المضاد للخطأ ، وبعد إلغاء القفل", + "秒内不可使用面容开锁": "لا يمكن استخدام قفل الوجه في غضون ثوان", + "掌静脉": "الوريد النخيل", + "添加掌静脉": "إضافة الوريد النخيل", + "胁迫掌静脉": "الوريد النخيل القسري", + "请不要将胁迫掌静脉用于日常开锁": "يرجى عدم استخدام عروق كف الإكراه لفتح القفل اليومي", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "متصل بالقفل ، يرجى فتح راحة يدك بشكل طبيعي ، راحة اليد تواجه الكاميرا", + "掌静脉详情": "تفاصيل الوريد النخيل", + "掌静脉号": "رقم الوريد النخيل", + "蓝牙未打开,请到设置里面打开蓝牙": "لم يتم تشغيل البلوتوث ، يرجى تشغيل البلوتوث في الإعدادات", + "删除用户时,会将用户拥有的钥匙一起删除。": "إذا تم حذف المستخدم ، فسيتم أيضًا حذف أي مفاتيح إلكترونية مرتبطة بالمستخدم.", + "配置网络": "تكوين الشبكة", + "你好": "مرحبًا", + "成功": "ناجحة", + "类型选择": "حدد النوع", + "请选择要使用哪种类型": "يرجى تحديد النوع المراد استخدامه", + "系统邮件(推荐)": "البريد الإلكتروني للنظام (مستحسن)", + "系统短信(推荐)": "نظام الرسائل القصيرة (مستحسن)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "سيتم إرسال البريد الإلكتروني من هذا التطبيق. يرجى شراء حزمة البريد الإلكتروني أولاً.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "سيتم إرسال الرسائل القصيرة من هذا التطبيق. يرجى شراء حزمة البريد الإلكتروني أولاً.", + "个人邮件": "البريد الإلكتروني الشخصي", + "个人短信": "الرسائل القصيرة الشخصية", + "邮件将从你的个人邮箱发给用户": "سيتم إرسال البريد الإلكتروني من حساب بريدك الإلكتروني الشخصي.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "سيتم إرسال رسالة SMS من رقم هاتفك الشخصي. تدفع إلى مشغل الاتصالات الخاص بك.", + "为了更好地应用体验,请确定权限": "لتجربة تطبيق أفضل ، يرجى تأكيد الأذونات", + "您第一次拒绝权限,请确定权限": "لقد رفضت الإذن لأول مرة ، يرجى تأكيد الإذن", + "您第二次拒绝权限,请去应用设置开启权限": "لقد رفضت الإذن للمرة الثانية ، يرجى الانتقال إلى إعدادات التطبيق لتمكين الإذن", + "去应用市场": "انتقل إلى متجر التطبيقات", + "温馨提示": "سريع دافئ", + "关闭应用": "إغلاق التطبيق", + "开启微信接收报警消息需要先关注": "لفتح whechat لتلقي رسائل التنبيه ، تحتاج إلى متابعة", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat الحساب العام ، حفظ رمز الاستجابة السريعة واستخدام whechat لمسح الإعدادات", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "مصادقة الاسم الحقيقي هي وظيفة مدفوعة الأجر ، يرجى الاتصال بمسؤول القفل للشراء والاستخدام", + "位置权限": "إذن الموقع", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "يرجى منح التطبيق لاستخدام locatian.It الخاص بك يستخدم لمسح الأقفال والبوابات.", + "相机/相册权限": "إذن الكاميرا/الألبوم", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "يرجى منح التطبيق لقراءة وكتابة الصور وملفات من التخزين.", + "点击选择": "انقر لتحديد", + "微信": "ويشات", + "朋友圈": "لحظات", + "QQ": "QQ", + "QQ空间": "كزوني", + "微博": "ويبو", + "FaceBook": "فيسبوك", + "链接": "رابط", + "今天": "اليوم", + "密码错误": "كلمة مرور غير صالحة", + "网络中断": "انقطاع الشبكة", + "钥匙不存在": "المفتاح غير موجود", + "钥匙过期": "انتهت صلاحية المفتاح", + "钥匙已存在": "المفتاح موجود بالفعل", + "密码失效": "كلمة المرور غير صالحة", + "门锁时间异常": "وقت قفل الباب غير طبيعي", + "APP(手机)未联网": "التطبيق (الهاتف المحمول) غير متصل بالإنترنت", + "数据不存在": "البيانات غير موجودة", + "待接收": "محبوب", + "已冻结": "مجمد", + "已删除": "حذف", + "未知": "المجهول", + "拖动下方滑块完成拼图": "اسحب شريط التمرير إلى بوستيون الصحيح", + "验证成功": "نجاح التحقق", + "验证失败": "فشل التحقق", + "向右拖动滑块填充拼图": "اسحب شريط التمرير إلى اليمين لملء اللغز", + "请先获取到位置信息哦": "يرجى الحصول على معلومات الموقع أولاً", + "请选择国家": "يرجى تحديد بلد", + "获取锁信息": "الحصول على معلومات القفل", + "锁数据异常,请重试": "بيانات القفل غير طبيعية ، يرجى المحاولة مرة أخرى", + "连接设备中...": "جهاز توصيل...", + "把锁": "أقفال", + "条": "شريط", + "封": "ختم", + "次": "مرات", + "支付成功": "نجاح الدفع", + "查看详情": "عرض التفاصيل", + "请输入模板名称": "يرجى إدخال اسم النموذج", + "模版类型": "النوع", + "再返回一次退出": "الخروج مرة أخرى", + "请先添加锁": "الرجاء إضافة القفل أولاً", + "可视对讲": "الاتصال الداخلي المرئي", + "详细日志": "سجل مفصل", + "已复制到剪切板": "منسوخ", + "拍照": "صورة", + "从相册选择": "اختر من الألبوم", + "选择问题": "يرجى تحديد سؤال", + "确认长度不足8位": "تأكيد الطول أقل من 8 أرقام", + "新密码长度不足8位": "طول كلمة المرور الجديدة أقل من 8 أرقام", + "两次密码不一致": "عدم تطابق كلمة المرور. يرجى إعادة المحاولة", + "请点击获取验证码,验证码将发送到": "يرجى الحصول على رمز التحقق. سيتم إرسال الرمز إلى", + "切换": "مفتاح", + "验证": "تحقق", + "验证成功,账号已删除": "نجح التحقق ، تم حذف الحساب", + "该密码不是自定义密码,无法修改": "كلمة المرور هذه ليست كلمة مرور مخصصة ولا يمكن تعديلها", + "请选择设备要关联哪些姓名": "يرجى تحديد الأسماء التي يجب أن يرتبط بها الجهاز", + "请选择姓名要关联哪些设备": "الرجاء تحديد الأجهزة التي يجب ربط الاسم بها", + "确定要移除所选中的坏锁吗?": "إزالة القفل المعطل ؟", + "邮件通知": "إخطار عبر البريد الإلكتروني", + "短信通知": "إخطار عبر الرسائل القصيرة", + "您好,您的授权管理员生成成功": "مرحبًا ، لقد تم إنشاء المسؤول المعتمد لديك بنجاح", + "请输入接收者姓名": "الرجاء إدخال هنا", + "版本更新": "تحديث الإصدار", + "下次再说": "في المرة القادمة", + "配网成功": "نجاح توزيع الشبكة", + "配网失败": "فشل توزيع الشبكة", + "该锁的无线键盘都将被删除": "سيتم حذف جميع لوحات المفاتيح اللاسلكية لهذا القفل", + "实时画面": "صورة في الوقت الحقيقي", + "适合门口较为安全的环境。": "مناسبة لبيئات آمنة نسبيا عند الباب.", + "仅发生特定事件才录像,并可查看实时画面。": "يتم تسجيل أحداث محددة فقط ويمكن عرض الصورة في الوقت الفعلي.", + "一般情况下,满电可使用7-8个月": "في ظل الظروف العادية ، يمكن استخدامه لمدة 7-8 أشهر عند الشحن الكامل", + "有人逗留或发生特定事件才录像,可随时查看": "يتم تسجيل إقامة شخص ما أو أحداث معينة ، ويمكن مشاهدتها في أي وقت", + "实时画面。": "صورة في الوقت الحقيقي.", + "一般情况下,满电可使用5~6个月。": "في ظل الظروف العادية ، يمكن استخدامه لمدة 5 إلى 6 أشهر عند الشحن الكامل.", + "适合门口人员复杂、较不安全的环境。": "مناسبة للبيئات المعقدة وغير الآمنة نسبيا عند الباب.", + "有人出现就录像,可随时查看实时画面。": "سجل عندما يظهر شخص ما ، وعرض الصورة في الوقت الفعلي في أي وقت.", + "一般情况下,满电可使用2~4个月。": "في ظل الظروف العادية ، يمكن استخدامه لمدة 2 ~ 4 أشهر عند الشحن الكامل.", + "根据您家门口实际情况设置录像和实时画面功能。": "قم بتعيين وظائف الفيديو والصورة في الوقت الفعلي وفقًا للوضع الفعلي عند بابك.", + "可使用时长由具体设置决定。": "يتم تحديد مدة الاستخدام من خلال الإعدادات المحددة.", + "查看": "مشاهدة", + "有人按门铃或发生": "شخص ما يرن جرس الباب أو", + "异常事件时": "حدث غير طبيعي", + "不录像": "لا يوجد فيديو", + "有人出现、按门铃": "شخص ما يظهر ، يرن جرس الباب", + "或发生异常事件时": "أو يحدث حدث غير طبيعي", + "逗留达到10秒": "البقاء لمدة 10 ثوان", + "约1.5米": "حوالي 1.5 متر", + "随时": "زمان", + "立即录像": "سجل على الفور", + "录像时机": "توقيت الفيديو", + "有人出现时录像": "سجل عندما يظهر شخص ما", + "人体侦测距离": "المسافة الكشف عن الإنسان", + "查看实时画面": "عرض صورة في الوقت الحقيقي", + "自定义时间": "وقت مخصص", + "当日": "اليوم", + "次日": "اليوم التالي", + "自定义时段": "فترة زمنية مخصصة", + "发生事件时查看": "عرض عندما يحدث حدث", + "实时查看": "عرض في الوقت الحقيقي", + "有人在门口出现10秒后开始录像。": "يظهر شخص ما على الباب لمدة 10 ثوانٍ قبل التسجيل.", + "有人按门铃时立即录像。": "سجل على الفور عندما يرن شخص ما جرس الباب.", + "有人出现在门前1.5米范围时启动录像": "ابدأ التسجيل عندما يظهر شخص ما على بعد 1.5 متر أمام الباب", + "约0.8米": "حوالي 0.8 متر", + "约3.0米": "حوالي 3.0 متر", + "添加指纹失败": "فشلت العملية.", + "项": "الأصناف", + "播放中": "اللعب", + "下载": "تنزيل", + "暂无下载内容": "لا يوجد محتوى تنزيل", + "亮度": "السطوع", + "音量": "الصوت", + "快进至": "سريع إلى الأمام إلى", + "快退至": "الترجيع إلى", + "暂无视频信息": "لا توجد معلومات فيديو", + "加载出错": "خطأ في التحميل", + "请单人正对门锁,距离一个成年人手臂长度": "يرجى الوقوف أمام قفل الباب وحده ، على طول الذراع", + "(约0.6米)。": "(حوالي 0.6 متر).", + "保持脸部无遮挡,露出五官。": "حافظ على وجهك دون عائق وإظهار ملامح وجهك.", + "准备好了,开始添加": "جاهز ، ابدأ الإضافة", + "正在录入中...": "تسجيل...", + "添加人脸失败": "فشل في إضافة الوجه", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف وجوه القفل. هل أنت متأكد أنك تريد إعادة الضبط ؟", + "人脸号": "رقم الوجه", + "虹膜详情": "تفاصيل القزحية", + "虹膜号": "رقم القزحية", + "选择设备类型": "حدد نوع الجهاز", + "照明灯具": "تركيبات الإضاءة", + "电动窗帘": "ستائر كهربائية", + "门窗传感器": "مستشعر باب ونافذة", + "传感器": "مستشعر", + "清除数据成功": "تم مسح البيانات بنجاح", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "القفل غير متصل بالإنترنت ، لذلك لا يمكن تحميل مسجلات رمز المرور والبطاقة وبصمة الإصبع وطرق فتح الأبواب الأخرى في الوقت الفعلي.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "إذا كنت بحاجة إلى الاحتفاظ بالسجلات التاريخية ، فيمكنك تصديرها.", + "看不到操作记录,可能原因有": "لا يمكن رؤية سجلات العملية ، الأسباب المحتملة", + "操作记录详情": "تفاصيل سجل العملية", + "操作时间": "وقت التشغيل", + "此模块功能需要锁联网后设置方可生效": "تحتاج وظيفة الوحدة هذه إلى تعيين بعد توصيل القفل بالإنترنت لتفعيل", + "用户已存在": "المستخدم موجود بالفعل", + "钥匙数量已到上限": "وصل عدد المفاتيح إلى الحد الأعلى", + "附近没有可用网关": "لا توجد بوابة قريبة متاحة", + "正在创建安全连接...": "إنشاء اتصال آمن...", + "监视状态下不能发送录音": "لا يمكن إرسال التسجيلات في وضع المراقبة", + "挂断": "شنق ما يصل", + "监视中暂不能开锁": "فتح القفل غير متوفر أثناء المراقبة", + "长按说话": "اضغط مع الاستمرار في التحدث", + "松开发送": "الإفراج عن إرسال", + "请输入6位数字开锁密码": "يرجى إدخال كلمة مرور إلغاء القفل مكونة من 6 أرقام", + "请输入开锁密码": "الرجاء إدخال كلمة مرور إلغاء القفل", + "接收者在有效期内可以不限次数使用": "يستطيع المستلمون استخدام المفاتيح الإلكترونية لأوقات غير محدودة خلال فترة الصلاحية.", + "接收者可以使用此App开关锁": "المستلم قادر على القفل/الفتح بواسطة هذا التطبيق.", + "单次钥匙有效期为1小时,只能使用一次": "يسري المفتاح الإلكتروني لمرة واحدة لمدة ساعة واحدة ويمكن استخدامه مرة واحدة فقط.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "يستطيع المستلمون استخدام المفاتيح الإلكترونية لأوقات غير محدودة خلال فترة الدورة الثابتة.", + "获取模板失败": "فشل في الحصول على القالب", + "微信通知": "إخطار WeChat", + "系统短信": "نظام الرسائل القصيرة", + "系统邮件": "البريد الإلكتروني للنظام", + "模板": "قالب", + "新建模版": "إنشاء قالب", + "您好,您的密码是": "مرحبًا ، كلمة المرور الخاصة بك هي", + "密码名字": "اسم كلمة المرور", + "请输入6-9位密码": "يرجى إدخال كلمة مرور من 6-9 أرقام", + "设置密码": "تعيين كلمة المرور", + "操作成功,密码为": "نجح. رمز المرور هو", + "类型:自定义-永久": "نوع: مخصص دائم", + "实时播放": "تشغيل في الوقت الحقيقي", + "点击对讲": "انقر على الاتصال الداخلي", + "长按开锁": "الضغط لفترة طويلة لفتح", + "接听失败": "فشل في الإجابة", + "请在锁设置中开启远程开锁": "يرجى تمكين فتح القفل عن بعد في إعدادات القفل", + "接听": "إجابة", + "截图已保存到相册": "تم حفظ لقطة الشاشة في الألبوم", + "添加遥控": "إضافة جهاز التحكم عن بعد", + "已连接到锁,请按遥控": "متصل بقفل ، يرجى الضغط على جهاز التحكم عن بعد", + "遥控号": "رقم جهاز التحكم عن بعد", + "遥控详情": "تفاصيل جهاز التحكم عن بعد", + "照明": "إضاءة", + "退出演示模式": "الخروج وضع العرض", + "提示:当前界面为展示界面,添加设备后才能继续使用": "نصيحة: الواجهة الحالية هي واجهة عرض. بعد إضافة الجهاز ، يمكنك الاستمرار في استخدامه", + "门已上锁": "الباب مغلق", + "您的账号在异地登录,如非本人,请尽快修改密码": "تم استخدام حسابك لتسجيل الدخول من جهاز جديد", + "开门成功": "افتح الباب بنجاح", + "开门失败": "فشل في فتح الباب", + "呼叫提醒": "استدعاء تذكير", + "收到来自": "تم استلامها من", + "锁的呼叫": "اتصال بقفل", + "加载数据中": "تحميل البيانات", + "搜索所有锁类型": "البحث في جميع أنواع القفل", + "锁电量更新时间": "قفل وقت تحديث البطارية", + "1月": "جان", + "2月": "رداء", + "3月": "مار", + "4月": "Apr", + "5月": "مايو", + "6月": "Jun", + "7月": "جول", + "8月": "أوغ", + "9月": "القنب", + "10月": "اوكت", + "11月": "نوف", + "12月": "ديك", + "热门城市": "المدن الساخنة", + "导出锁数据": "بيانات قفل التصدير", + "一键开锁": "فتح بنقرة واحدة", + "已开通": "مفتوح", + "编辑员工": "تحرير الموظفين", + "一": "واحد", + "二": "اثنان", + "三": "ثلاثة", + "四": "أربعة", + "五": "خمسة", + "六": "ستة", + "日": "الشمس", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟", + "在线": "الإنترنت", + "离线": "غير متصل", + "购买记录": "سجل الشراء", + "使用记录": "سجل المستخدم", + "失效时间要大于当前时间": "يجب أن يكون وقت انتهاء الصلاحية أطول من الوقت الحالي", + "修改名字": "تعديل الاسم", + "时": "ساعة", + "分": "دقيقة", + "Amazon Alexa": "أمازون اليكما", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "يمكنك استخدام اليكرا لفتح ، قفل والتحقق من حالة القفل", + "支持的国家": "البلدان المدعومة", + "支持的国家值": "الولايات المتحدة الأمريكية, كندا, المملكة المتحدة, أستراليا, الهند, ألمانيا, فرنسا, إيطاليا, إسبانيا, اليابان", + "操作流程": "عملية التشغيل", + "操作流程值": "1 إضافة قفل وبوابة مع تطبيق القفل الذكي\n\n2 تمكين وظيفة فتح القفل عن بعد للقفل في التطبيق (يتم إيقاف تشغيل هذه الوظيفة افتراضيًا). إذا لم يكن لديك هذا الخيار ، فإن القفل لا يدعم اليكسا\n\n3 أضف مهارات إلى اليكسز وقم بتخويلها باستخدام حساب تطبيق القفل الذكي وكلمة المرور. بعد نجاح التفويض ، يمكنك اكتشاف أجهزة ضمن الحساب\n\n4 حدد موقع القفل في تطبيق اليكسا ، وقم بتشغيل وظيفة إلغاء القفل الصوتي ، وقم بتعيين كلمة مرور اللغة\n\n5 يمكن تشغيل القفل من خلال اليكزا", + "Google Home": "منزل جوجل", + "Action name": "اسم العمل", + "ScienerSmart": "سنيرذكي", + "支持的语言": "اللغات المدعومة", + "英语": "الانجليزية", + "Google Home操作流程的值": "1. استخدم تطبيق القفل الذكي لإضافة أقفال وبوابات\n\n2. تمكين وظيفة فتح القفل عن بعد للقفل في التطبيق (يتم إيقاف تشغيل هذه الوظيفة افتراضيًا). بدون هذا الخيار ، لا يدعم القفل منزل جوجل\n\n3. قم بتثبيت تطبيق Google المنزلي وانقر على زر \"\" في الزاوية العلوية اليسرى\n\n4. في صفحة الإعدادات ، حدد \"العمل مع Google\"\n\n5. البحث عن \"scienerذكي\" واستخدام حساب تطبيق القفل الذكي وكلمة المرور للتفويض", + "密码需至少包含数字/字母/字符中的2种组合": "يجب أن تحتوي كلمة المرور على الأقل على 2 مما يلي: الأرقام والحروف والأحرف الخاصة", + "已开锁": "غير مقفل", + "已闭锁": "مقفل", + "两次密码不一致哦": "كلمات المرور غير متسقة", + "中功率": "قوة متوسطة", + "常规使用": "استخدام منتظم", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "بعد تشغيل البوابة ، اضغط مع الاستمرار على زر إعادة الضبط لمدة 5 ثوانٍ ، وانقر بعد ذلك عندما يومض مصباح المؤشر بالتناوب", + "扫描设备": "جهاز المسح الضوئي", + "删除失败,网关可能已经离线,是否强制删除该数据?": "فشل الحذف. ربما تكون البوابة قد اختفت دون اتصال. هل تريد فرض حذف البيانات ؟", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_bg.json b/lan/lan_bg.json new file mode 100644 index 00000000..e4cbd2e3 --- /dev/null +++ b/lan/lan_bg.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Звездна ключалка", + "锁通通": "Заключване през", + "点击开锁,长按闭锁": "Докосване за отключване, задръжте за заключване", + "考勤": "Посещаемост", + "考勤设置": "Настройки за посещаемост", + "电子钥匙": "Ekeys", + "添加卡": "Добави карта", + "卡号": "Номер на картата", + "添加指纹": "Добави пръстов отпечатък", + "指纹号": "Номер на пръстови отпечатъци", + "遥控": "Дистанционно", + "添加人脸": "Добавяне на лице", + "门锁日志": "Дневник за заключване на врата", + "密码号": "Номер на паролата", + "添加者": "Оператор", + "添加时间": "Време", + "重置": "Нулиране", + "请输入手机号或者邮箱": "Телефонен номер/Email", + "工作时间": "Работно време", + "工作日设置": "Настройка на работния ден", + "星期一": "Понеделник", + "星期二": "Вторник", + "星期三": "Сряда", + "星期四": "Четвъртък", + "星期五": "Петък", + "星期六": "Събота", + "星期日": "Неделя", + "简写周一": "М", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Мон", + "周二": "Т. е.", + "周三": "Ву", + "周四": "Ту", + "周五": "Пт.", + "周六": "Сат", + "周日": "Слънце", + "群发钥匙": "Изпрати множество ekeys", + "锁": "Заключване", + "请添加": "Получател", + "允许远程开锁": "Отключване отдалечено", + "请输入验证码": "Код за проверка", + "获取密码": "Генериране на парола", + "请给密码命名": "Въведете име за този код", + "密码有限期为6个小时,只能使用一次": "Този код трябва да се използва в рамките на 6 часа от текущото време или ще бъде спрян поради съображения за сигурност. този код може да се използва само веднъж.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Ръчно въведете 6-9 цифри като парола. Може да бъде добавен по телефона bluetooth до заключването или дистанционно добавен през шлюза", + "获取": "Get", + "添加": "Добави", + "删除公司": "Изтриване на компанията", + "密码详情": "Информация за подкода", + "修改密码": "Промяна на парола", + "添加虹膜": "Добави ирис", + "添加门磁": "Сензор за врата", + "添加无线键盘": "Безжична клавиатура", + "添加手掌": "Добави длан", + "请输入员工账号": "Въведете сметка на служителя", + "批量授权锁": "Предоставяне на множество брави", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Упълномощеният администратор ще има мажоритарно разрешение да управлява това заключване.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Тази функция ви позволява да отключите интелигентното заключване отдалечено чрез шлюз. тази функция може да бъде включена или изключена само чрез bluetooth.", + "排列方式": "Тип списък", + "早到榜": "Ранен списък", + "迟到榜": "Късен списък", + "当前模式": "Текущ режим", + "勤奋榜": "Работен твърд списък", + "延迟时间": "Време за забавяне", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Ключалката ще се заключи автоматично след времето. моля, отключете го за един път първо, за да направи настройката достъпна.", + "时间": "Време", + "开始时间": "Начално време", + "结束时间": "Краен час", + "工作时间设置": "Настройка на работното време", + "常开模式": "Режим на преминаване", + "常开时间": "В този период от време", + "常开日期": "В тези дни", + "添加员工": "Добавяне на персонал", + "节假日": "Ваканция", + "打卡方式": "Метод", + "员工是否有钥匙": "Вече има екей", + "上班时间": "Начално време", + "下班时间": "Време за затваряне", + "本周": "Тази седмица", + "单休": "Еднодневен уикенд", + "双休": "Двудневен уикенд", + "单双休": "Един-двудневен уикенд", + "年": "Година", + "月": "Месец", + "放假日期": "Ваканция", + "补班日期": "Работни дни", + "添加假日": "Добави празник", + "开始日期": "Начална дата", + "必填": "Задължително", + "结束日期": "Крайна дата", + "日榜": "Дневно", + "月榜": "Месечно", + "考勤记录": "Записи", + "假日信息": "Holiday info", + "基本信息": "Основи", + "无线键盘": "Безжична клавиатура", + "选择无线键盘": "Добавяне на клавиатура", + "门磁": "Сензор за врата", + "自动闭锁": "Автоматично заключване", + "锁声音": "Заключване на звука", + "防撬报警": "Подправяне на предупреждение", + "重置键": "Бутон нулиране", + "锁时间": "Заключващ часовник", + "诊断": "Диагностициране", + "上传数据": "Качване на данни", + "导入其他锁数据": "Внос frome друг заключване", + "锁升级": "Актуализация на фърмуера", + "标记房态": "Състояние на стаята", + "开锁提醒": "Отключване на уведомление", + "微信二维码": "Отключване на qr код", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Хората с електронни ключове могат да отворят вратата, като сканират този qr код чрез wechat. Qr кодът на всяко заключване е различен. Можете да го отпечатате и да го поставите до съответната ключалка", + "锁编号": "Номер на заключване", + "电量": "Батерия", + "锁分组": "Заключителна група", + "选择分组": "Изберете група", + "创建新分组": "Създаване на група", + "管理员开锁密码": "Админгорен код", + "更新": "Актуализация", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Нивото на батерията ще бъде актуализирано от gateway или телефон bluetooth", + "当屏幕闪烁时,点击下一步": "Щракнете върху следващия, когато клавиатурата мига", + "输入*529#或按设置键": "Въведете README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # или натиснете клавиша настройки", + "长按重置键2秒": "Натиснете и задръжте бутона за нулиране 2 секунди", + "附近的设备": "Наблизо оборудване", + "暂无数据": "Няма данни", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Ще можете да получите състояние на вратата със сензор за врата заедно с шлюз. само един сензор е позволено да се свързва със заключване.", + "开始": "Старт", + "全天": "Всички часове", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Можете да зададете няколко времеви периода за режим на преминаване. в рамките на зададените времеви периоди, заключването ще остане в отворено състояние, след като бъде отключено.", + "请选择锁音量": "Моля, изберете обема на заключване", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Като включите, ще чуете звука от ключалката", + "低": "Ниско", + "较低": "Средно ниско", + "中": "Медиум", + "较高": "Средно високо", + "高": "Високо", + "开启后,锁被撬动时,会发出报警声": "Като включите, активирате сигнала за подправяне.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Чрез изключване бутонът reset е деактивиран.", + "校准时间": "Калибриране време", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Диагнозата е да прочетете информацията за конфигурацията вътре в заключването и да я качите, така че персоналът да може да анализира причината за провала", + "上传": "Качване", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Качване на данни от заключване на сървър. може да отнеме няколко минути", + "请选择要从哪把锁导入": "Изберете заключване за импортиране от", + "有新版本": "Имат нова версия", + "当前版本": "Текуща версия", + "升级": "Актуализация", + "空闲": "Вакантно", + "已入住": "Окупиран", + "英文": "Английски", + "多语言": "Езици", + "添加锁": "Добавяне на заключване", + "锁地址": "Адрес за заключване", + "选择锁类型": "Изберете тип заключване", + "NFC无源锁": "Nfc пасивно заключване", + "添加设备": "Добавяне на устройство", + "网关": "Шлюз", + "客服": "Обслужване на клиенти", + "设置": "Настройки", + "更多设置": "Повече комплект", + "消息推送": "Бутане на уведомяване", + "锁用户管理": "Заключване на потребителите", + "拥有的钥匙": "Ekeys, свързани с този потребител", + "批量授权": "Управление на органите", + "关联设备": "Свързано устройство", + "关联姓名": "Асоциирано име", + "转移智能锁": "Прехвърляне на заключване", + "选择锁": "Заключване на екрана", + "接收人信息": "Получател", + "转移网关": "Портал за прехвърляне", + "锁屏": "Заключване на екрана", + "已关闭": "Off", + "已开启": "На", + "开启": "Включване", + "确定要开启重置键?": "Продължете да активирате бутона reset?", + "确定要关闭重置键?": "Продължете да деактивирате бутона reset?", + "隐藏无效开锁权限": "Скриване на невалиден достъп", + "APP开锁时需手机连网的锁": "Брави, изискващи телефон онлайн", + "增值服务": "Услуги", + "关于": "За", + "退出": "Отказ", + "删除账号": "Изтриване на акаунта", + "个人信息": "Информация за акаунта", + "头像": "Аватар", + "昵称": "Прякор", + "请输入昵称": "Моля въведете своя прякор", + "修改昵称": "Преименуване", + "修改账号": "Редактиране на акаунта", + "重置密码": "Нулиране на паролата", + "安全问题": "Въпрос за сигурност", + "为了你的账号安全,修改账号前请先使用验证码验证": "За сигурността на вашия акаунт, моля, използвайте проверката на паролата на акаунта, преди да модифицирате акаунта", + "请输入新账号": "Моля въведете новия акаунт", + "找回密码和登录新设备时,可通过绑定的手机验证": "Свързващият телефонен номер ще бъде използван за получаване на кода за проверка.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Свързващият имейл ще се използва за получаване на кода за проверка.", + "原密码": "Текуща парола", + "新密码": "Нова парола", + "确认密码": "Потвърдете паролата", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "В случай, че телефонът ви е загубил, можете да влезете в нов телефон, като отговаряте на въпросите за сигурността.", + "问题一": "Въпрос 1", + "问题二": "Въпрос 2", + "问题三": "Въпрос 3", + "请输入你的答案": "Моля, въведете вашия отговор", + "即将到期": "Изтича скоро", + "去授权": "Отидете на разрешаване", + "修改名称": "Редактиране на името", + "状态": "Статус", + "WiFi名称": "Име на wifi", + "网络MAC": "Мрежа mac", + "网关升级": "Актуализация на gateway", + "网关连接的锁": "Заключване (и), свързани с този шлюз", + "信号强": "Силни", + "选择网关类型": "Изберете тип шлюз", + "添加网关": "Добавяне на шлюз", + "重新通电": "Повторно свързване на захранването", + "指示灯": "Индикаторна светлина", + "选择网关": "Изберете шлюз", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g не се поддържа,. моля, изберете wifi от 2.4g.", + "WiFi密码": "Wifi passward", + "请输入WiFi密码": "Въведете wifi парола", + "网关名称": "Име на шлюз", + "请输入网关名称": "Въведете името на шлюза", + "IP地址": "Ip адрес", + "子网掩码": "Подмрежова маска", + "默认网关": "Шлюз по подразбиране", + "自动获取DNS服务器地址": "Автоматично получавате адреса на dns сървъра", + "首选DNS": "Предпочитан dns", + "备选DNS": "Алтернативен dns", + "不使用静态IP": "Не се използва статичен ip", + "使用静态IP": "Използване на статичен ip", + "请输入IP地址": "Въведете ip адрес", + "请输入子网掩码": "Въведете маска на подмрежата", + "请输入默认网关": "Въведете шлюз по подразбиране", + "所有锁": "Всички брави", + "搜索所有类型的锁": "Сканиране на всички видове брави", + "门锁": "Заключване на врата", + "挂锁": "Катинар", + "保险箱锁": "Безопасно заключване", + "智能门禁": "Интелигентен контрол на достъпа", + "车位锁": "Заключване за паркиране", + "摸亮触摸屏": "Докоснете всеки ключ, за да активирате клавиатурата", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Моля, докоснете всеки ключ, за да активирате заключването и го поставете в режим на сдвояване.", + "附近的锁": "Близки брави", + "如需修改名字请重新命名,点击确定添加锁": "Ако искате да промените името, моля преименувайте, кликнете ok, за да добавите заключване", + "添加锁时,手机必须在锁旁边": "При добавяне на заключване телефонът трябва да е до ключалката", + "登录": "Вход", + "注册": "Регистър", + "我已阅读并同意": "Прочетох и се съгласих", + "验证码": "Код", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Вашата парола трябва да има 8-20 знака и да включва минимум два вида числа, букви и символи", + "手机": "Телефон", + "邮箱": "Имейл", + "请输入邮箱": "Въведете вашия имейл", + "国家/地区": "Страна/регион", + "你所在的国家/地区": "Вашата страна/регион", + "选择国家/地区": "Изберете вашата страна или регион", + "获取验证码": "Вземи код", + "商务合作": "Бизнес", + "电脑网页版": "Уеб система", + "酒店系统": "Хотелска система", + "说明书网页版": "Ръководство за потребителя", + "高级功能": "Разширена функция", + "记录保存": "Задържане на записи", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Sms може да се използва за изпращане на парола и информация за ekey на получателя.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Имейлът може да се използва за изпращане на парола и информация за ekey на получателя.", + "购买实名认证提示": "След като функцията е активирана, трябва да използвате паролата си за пръстови отпечатъци, лице или акаунт, за да отворите приложението. Няма нужда да се проверява отново за 3 минути", + "请选择你希望的实名认证频次": "Моля, изберете честотата на удостоверяване с реално име, която искате", + "仅首次": "За първи път", + "每日一次": "Веднъж на ден", + "每周一次": "Веднъж седмично", + "每月一次": "Веднъж на месец", + "当前状态": "Текущо състояние", + "试用中": "На изпитание", + "高级功能权益内容": "Разширени функции", + "短信模板": "Sms шаблон", + "邮件模板": "Шаблон за имейл", + "发卡工具": "Кодиращ карта", + "购买高级功能须知": "Известие", + "购买高级功能提示": "По-напреднали функции са в процес на разработка и ако имате нужда от тях, вие сте добре дошли да отворите услугата въз основа на броя на ключалките. Разширените функции са достъпни само за вашите собствени брави. Ако сте упълномощен администратор, моля свържете се с горния администратор на заключването, за да отворите услугата", + "免费体验": "Безплатна пробна версия", + "立即开通": "Отворете сега", + "购买短信": "Купи sms", + "购买邮件": "Купи имейл", + "购买实名认证次数": "Покупка истинско име време за удостоверяване", + "开通高级功能": "Активирайте разширена функция", + "选择套餐": "Изберете пакет", + "支付方式": "Начин на плащане", + "支付宝": "Alipay", + "去支付": "Pay", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Тя се използва за изпращане на информация за парола и екей на другите.", + "高级功能仅能用于你自己的锁": "Разширената функция може да се прилага само собствените си брави.", + "新建模板": "Шаблон за създаване", + "类型": "Тип", + "模版内容": "Съдържание на шаблона", + "预览": "Визуализация", + "房间名": "Стая", + "预计产生短信条数": "Прогнозни сегменти на съобщения", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Тази функция ви позволява да скриете пароли, екей, карти и пръстови отпечатъци, които са невалидни за определен период от време.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Телефонът на потребителя е длъжен да бъде онлайн, за да отключите тези избрани брави с приложение.", + "配置WiFi": "Конфигуриране на wifi", + "请输入WiFi名字": "Моля въведете име wifi", + "WiFi配网": "Wifi разпределителна мрежа", + "胁迫卡": "Стрес карта", + "员工是否有密码": "Вече има парола", + "员工是否有卡": "Вече има карта", + "员工是否有指纹": "Вече задайте отпечатъка на пръста", + "获取钥匙": "Вземи ключ", + "获取卡": "Вземи карта", + "获取指纹": "Получаване на пръстов отпечатък", + "安全验证": "Проверка на самоличността", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Цялата информация за профила ви ще бъде премахната от платформата за постоянно и не може да бъде възстановена. искате ли да изтриете?", + "监控": "Монитор", + "视频日志": "Видео дневник", + "开门器": "Отварачка за врати", + "面容开锁": "Face отключва", + "开门方向设置": "Задаване на посоката на отваряне", + "电机功率设置": "Настройка на мощността на двигателя", + "开锁时是否需联网": "Ако е необходим интернет при отключване", + "选择要加入分组的锁": "Изберете брави, за да добавите към тази група", + "锁数量": "Брой на ключалките", + "小米IOT平台": "Платформа xiaomi iot", + "面容开锁设置": "Face отключва комплект", + "感应距离": "Разстояние за наблюдение", + "防误开": "Предотвратяване на неправилно отваряне", + "防误开已关闭,关门后仍可使用面容开锁": "Предотвратяване на неправилно отваряне е затворена, след затваряне на вратата все още може да използва отключване на лицето", + "添加和使用面容开锁时": "Добавяне и използване на лицето при отключване", + "添加和使用面容开锁时提示": "\n1, моля, опитайте се да поддържате един човек пред операцията на вратата;\n2, моля, застанете пред ключалката на вратата около 0,5 ~ 0,8 метра, обърната към заключването на вратата;\n3. моля, поддържайте лицето си безпрепятствено и излагайте чертите на лицето си;\n4. когато разпознаването на лица е ненормално, можете да докоснете всеки ключ на цифровата клавиатура, за да рестартирате разпознаването на лица ръчно.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Моля, изберете моторната мощност внимателно според действителната ситуация на заключването на вратата:", + "小功率:": "Miniwatt:", + "耗电少": "По-малко консумация на енергия", + "大功率": "Висока мощност:", + "大功率提示": "Ако езикът за заключване не може да бъде прибран нормално при отключване или трябва да бъде задвижван", + "开门方向设置提示": "Моля, внимателно изберете посоката за отваряне на вратата на дома си (ако изберете грешна посока, няма да можете да отворите и затваряте вратата правилно):", + "左开": "Отворете наляво", + "右开": "Отворете вдясно", + "判断方法:": "Превод:", + "判断方法内容": "Мъжът стоеше пред къщата, обърнат към входната врата.", + "录像时段": "Видео слот", + "密码": "Паскоди", + "卡": "Карти", + "指纹": "Пръстов отпечатък", + "人脸": "Лице", + "配件商城": "Lock mall", + "公司名称": "Име на компанията", + "请输入公司名字": "Въведете името на компанията", + "提示": "Подсказване", + "是否删除?": "Дали да изтриете?", + "员工信息": "Информация за персонала", + "员工": "Персонал", + "打卡方式无效": "Недостъпно", + "中国": "Китай", + "选择钥匙": "Изберете екей", + "编辑": "Редактиране", + "无": "Не", + "有": "Да", + "请输入姓名": "Моля въведете име", + "获取人脸": "Получаване на лица", + "选择密码": "Изберете парола", + "选择卡": "Изберете карта", + "选择指纹": "Изберете пръстов отпечатък", + "选择人脸": "Изберете лице", + "员工是否有人脸": "Дали служителят има лице", + "同时删除员工钥匙": "Изтриване на his/her ekey", + "删除": "Делет", + "确定要删除员工吗?": "Изтриване на този служител", + "月统计": "Месечна статистика", + "迟到": "Късно", + "早退": "Напускане рано", + "未打卡": "Няма запис", + "钥匙将在": "Този ekey ще изтече в", + "天后失效": "Ден (и)", + "电量更新时间:": "Време за актуализация на батерията:", + "新增配件": "Добави", + "钥匙不可用": "Ключът не е наличен", + "正在开锁中...": "Отключване...", + "你的钥匙": "Вашият ключ", + "常开模式启动!长按闭锁": "Отворен режим стартира! Дълго натиснете за заключване", + "演示模式": "Демо режим", + "请先同意用户协议及隐私政策": "Моля, съгласни се с потребителското споразумение и политиката за поверителност първо", + "用户协议": "Потребителски условия", + "隐私政策": "Политика за поверителност", + "注册成功": "Регистрацията е успешна", + "你所在的": "Вие сте в", + "手机号": "Телефонен номер", + "忘记密码": "Забравена парола", + "重置成功": "Reset успех", + "确定要退出吗?": "Изход?", + "功能暂未开放": "Функцията все още не е отворена", + "设置成功": "Успешно конфигуриране", + "删除成功": "Изтриване успешно", + "单次": "Еднократен", + "永久": "Постоянен", + "限时": "Времево", + "自定义": "Обичай", + "清空码": "Изтрийте", + "循环": "Повтарящи се", + "工作日": "Работен ден", + "每日": "Дневно", + "周末": "Уикенд", + "确定要删除吗?": "Изтриване?", + "该锁的密码都将被删除": "Всички пароли за това заключване ще бъдат изтрити", + "已过期": "Невалидна", + "该锁的电子钥匙都将被删除": "Всички ekeys за това заключване ще бъдат изтрити", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Изтрийте всички екей, свързани с този екей. тази стъпка не може да бъде отменена!", + "删除钥匙会在用户APP连网后生效": "Екей ще бъде изтрит", + "有效时间": "Ефективно време", + "接收者": "Получател", + "仅管理自己创建的用户": "Управление само на собствените си потребители", + "远程开锁": "Отключване отдалечено", + "请输入钥匙名称": "Моля, въведете името на ключа", + "修改成功": "Промяна на успеха", + "冻结": "Замразяване", + "解除冻结": "Размразяване", + "授权": "Разрешаване", + "取消授权": "Де-разрешаване", + "同时解冻其发送的钥匙": "Размразяване на всички екей, издадени от този потребител", + "会在用户APP连网后生效": "Това ekey ще бъде размразено, когато приложението на потребителя се свърже с мрежа", + "同时冻结其发送的钥匙": "Замразява всички екей, издадени от този потребител", + "冻结会在用户APP连网后生效": "Това ekey ще бъде замразено, когато приложението на потребителя се свърже с мрежа", + "取消授权会在用户APP连网后生效": "Потребителят ще загуби разрешенията си, когато приложението на потребителя се свърже с мрежа", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Упълномощеният потребител има почти същите разрешения като мениджъра на заключване (например. възможност за изпращане на екей и пароли)", + "失效时间需晚于生效时间": "Срокът на изтичане трябва да бъде по-късно от срока на действие", + "生效时间需晚于当前时间": "Ефективното време трябва да е по-късно от текущото време", + "失效日期需晚于生效日期": "Датата на изтичане трябва да бъде по-късно от датата на сила", + "修改有效期": "Период на промяна", + "生效日期": "Начална дата", + "失效日期": "Крайна дата", + "开锁": "Отключване", + "开锁成功": "Отключване на успеха", + "请选择锁": "Моля, изберете брави", + "请选择接收者": "Моля, изберете приемника", + "请选择有效期": "Моля, изберете срока на валидност", + "请选择发送方式": "Моля, изберете метода за изпращане", + "请选择结束时间": "Моля, изберете крайното време", + "完成": "Завършен", + "有效日": "Цикъл", + "发送成功": "Изпрати успех", + "请选择开始时间": "Моля, изберете началния час", + "选择用户": "Изберете получатели", + "已选中": "Избран", + "确定": "Ок", + "请选择要发送的锁": "Моля, изберете брави", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Удостоверяването на реално име на лицето се отнася до необходимостта на потребителя да провери лицето си преди отключване на приложението за телефон и проверката може да бъде отключена.", + "分享": "Сподели", + "请输入接收者账号": "Моля, въведете акаунта на получателя", + "接收者号码未注册,请重新发送": "Номерът на приемника не е регистриран, моля", + "是否发送电子钥匙给未注册账号": "Искате ли да изпратите ekey на нов акаунт", + "取消": "Анулиране", + "标记成功": "Маркирайте успех", + "微信好友": "Wechat приятели", + "短信": "Sms", + "邮件": "Имейл", + "更多": "Още", + "您好,您的电子钥匙生成成功": "Здравейте, вашият електронен ключ се генерира успешно", + "生效时间不能小于当前时间": "Ефективното време не може да бъде по-малко от текущото време", + "结束时间不能小于当前时间": "Крайното време не може да бъде по-малко от текущото време", + "是否为管理员": "Дали е администратор", + "已连接到锁,请将卡靠近门锁的读卡区": "Свързан. поставете картата срещу четеца на карти", + "尝试连接设备...": "Свързване с lock. моля изчакайте...", + "地理位置": "Географско положение", + "检查以确保以下地址是正确的": "Проверете, за да се уверете, че следният адрес е правилен", + "地图加载中,请稍候。。": "Картата се зарежда, моля изчакайте...", + "跳过": "Пропуснете", + "还未获取到位置信息哦,请耐心等待一下!": "Информацията за местоположението все още не е получена, моля изчакайте търпеливо!", + "请填写信息": "Моля, попълнете информацията", + "有效期": "Период на валидност", + "生效时间": "Начално време", + "失效时间": "Краен час", + "上传成功": "Качено успешно", + "未生效": "Неактивен", + "已生效": "Ефективно", + "指纹详情": "Информация за пръстови отпечатъци", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Ще се изисква да поставите пръста си към сензора няколко пъти.", + "开始添加": "Старт", + "请将您的手指按下": "Поставете пръста си върху сензора", + "根据提示,抬起手指后再进行下一次指纹采集": "Следвайте инструкциите... ще трябва да премахнете и поставите пръста си към сензора за следващия запис", + "添加成功": "Добавяне на успех", + "更新成功": "Актуализиране на успеха", + "搜索": "Търсене", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "След като се възстанови, картата на заключването ще бъде изтрита, искате ли да нулирате?", + "已失效": "Невалидна", + "卡详情": "Информация за картата", + "请输入": "Моля въведете тук", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Чрез изключване ключалката ще остане отключена през целия ден, докато не бъде ръчно заключена", + "请输入小于或等于60的数字": "Моля, въведете номер по-малко от 60", + "操作成功": "Операция успешна", + "管理员密码相同,无需修改": "Паролата на администратора е същата и не е необходимо да се променя", + "请输入6-9位数字": "6-9 цифри в дължина", + "请输入6-9位管理员密码": "Моля, въведете 6-9-цифрена парола на администратора", + "请输入新的管理员密码": "Моля, въведете нова парола на администратора", + "未分组": "Негрупиран", + "请输入分组名称": "Създаване на група", + "创建成功": "Създаване на успех", + "设置锁分组成功": "Успешно задайте групата за заключване", + "电池1电量": "Батерия 1", + "电池2电量": "Батерия 2", + "电量更新时间": "Време за актуализация на батерията", + "锁电量更新成功": "Lock power update успех", + "您的钥匙未生效": "Ключът ви не е ефективен", + "您的钥匙已冻结": "Ключът ви е замразен", + "您的钥匙已过期": "Ключът ви е изтекъл", + "常开模式开启": "Заключването е в режим на преминаване", + "超级管理员": "Супер администратор", + "授权管理员": "Оторизиран администратор", + "普通用户": "Обикновен потребител", + "余": "Баланс", + "天": "Ден", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "След изтриване на заключването, цялата информация ще бъде изтрита заедно, сигурни ли сте, че искате да изтриете заключването?", + "请输入登录密码": "Моля, въведете паролата на приложението", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Не успя да изтрие устройството, моля, уверете се, че устройството е близо до устройството, устройството не е свързано и устройството е включено", + "用户无权限": "Потребителят няма разрешение", + "创建公司后,考勤功能才能使用": "Моля, създайте първо компания", + "是否删除钥匙?": "Изтриване на този ekey?", + "邮箱绑定成功": "Успех на свързване с имейл", + "手机绑定成功": "Мобилен телефон обвързване успех", + "网络访问失败,请检查网络是否正常": "Не е налична мрежа, моля, проверете и свържете устройството си към 3g/4g/wifi", + "清空": "Ясни", + "是否清空?": "Ясно?", + "消息详情": "Информация за съобщението", + "创建时间": "Време за създаване", + "管理员详情": "Детайли на администратора", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ако някой ви принуди да отворите вратата, можете да използвате тази карта. аларменото съобщение ще бъде изпратено до администраторите. за да използвате тази функция, моля, уверете се, че ключалката ви е онлайн.", + "请不要将胁迫卡用于日常开锁": "Моля, не използвайте принудителната карта за ежедневна употреба.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ако някой ви принуди да отворите вратата, можете да използвате този пръстов отпечатък. алармата ще бъде изпратена до администраторите. за да използвате тази функция, моля, уверете се, че ключалката ви е онлайн.", + "请不要将胁迫指纹用于日常开锁": "Моля, не използвайте принудителния пръстов отпечатък за ежедневна употреба.", + "创建公司": "Създаване на компания", + "公司名称不能超过30个字符": "Името на компанията не може да надвишава 30 знака", + "公司名称不能小于6个字符": "Името на компанията не може да бъде по-малко от 6 знака", + "WIFI列表": "Wifi списък", + "刷新": "Опресняване", + "手动配网": "Ръчна разпределителна мрежа", + "远距离": "Дълги разстояния", + "中距离": "Средно разстояние", + "近距离": "Къса дистанция", + "锁时间更新成功": "Lock време актуализация успех", + "锁用户": "Заключване на потребителите", + "请选择常开日期": "Моля, изберете дата на отваряне", + "结束时间不能小于开始时间哦": "Времето за край не може да бъде по-малко от времето за старт", + "介绍": "Нашата история", + "个人信息收集清单": "Списък за събиране на лична информация", + "应用权限说明": "Описание на разрешението на приложението", + "第三方信息共享清单": "Списък за споделяне на информация на трети страни", + "请选择您的位置": "Моля, изберете местоположението си", + "请先选择位置": "Моля, изберете първо местоположението", + "管理员密码": "Админгорен код", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Ако трябва да промените, моля въведете нова парола на администратора (6 цифри), кликнете върху ok, за да промените", + "修改": "Модифициране", + "网络摄像头": "Камера", + "重命名": "Преименуване", + "分组下的锁将被移到未分组里": "Бравите под групата ще бъдат преместени в негрупирани", + "编辑成功": "Редактиране на успеха", + "厂商": "Производител", + "型号": "Модел", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "След като паролата е генерирана, моля, използвайте я веднъж за активиране преди 23:59 в същия ден, в противен случай тя ще бъде невалидна след 0 часа. След като паролата е активирана, тя може да се използва неограничено време в рамките на срока на валидност.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "След като паролата е генерирана, моля, използвайте я преди 23:59 часа в същия ден, в противен случай тя ще бъде невалидна след 0 часа. Ясният код се използва за изчистване на всички пароли, генерирани преди 0 часа днес.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "След като паролата е генерирана, моля, използвайте я преди 23:59 часа в същия ден, в противен случай тя ще бъде невалидна след 0 часа.", + "清空密码底部提示": "Паролата е валидна до 23:59 часа в деня на изпразването", + "相机": "Камера", + "相册": "Снимки", + "读写": "Съхранение", + "定位": "Местоположение", + "需要访问相机权限才能拍照上传文件例如头像上传": "Необходим е достъп до камерата, за да се правят снимки и да се качват файлове, като например качване на профилна картина", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Необходим е достъп до камерата за качване на файлове и аватари с помощта на изображения на албуми", + "需要访问读写权限才能使用本地图片上传头像": "Необходим е достъп до разрешения за четене и писане за качване на аватари с помощта на местни изображения", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Необходим е достъп до информация за местоположението, за да използвате функцията за добавяне на ключ", + "申请": "Приложение", + "权限": "Разрешение", + "不允许": "Не е позволено", + "允许": "Разрешено", + "权限被拒绝": "Отказано разрешение", + "请手动在系统设置中开启": "Моля, ръчно го активирайте в системните настройки", + "权限以继续使用应用": "Разрешение за продължаване на използването на приложението.", + "去设置": "Go set it up", + "当前网络": "Текуща мрежа", + "位置信息": "Информация за местоположението", + "请输入wifi名称": "Моля въведете името на wifi", + "虹膜": "Ирис", + "手掌": "Палма", + "商城": "Мол", + "我的": "Мой", + "微信公众号推送": "Публичен акаунт wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "За да отворите wechat, за да получавате алармени съобщения, първо трябва да обърнете внимание на публичната сметка на skye smart lock wechat, моля, запишете qr кода и използвайте wechat, за да сканирате настройките", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "За използване на информацията за местоположението на функцията за добавяне на ключ е необходим достъп до bluetooth разрешения", + "请输入Email": "Въведете вашия имейл", + "请输入手机号": "Въведете телефонния си номер", + "家人到家": "Член на семейството пристигна у дома", + "添加家人": "Добавяне на член на семейството", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Ако заключването не е свързано с интернет, не могат да се изпращат навреме напомняния за парола, карта, пръстови отпечатъци и други методи за отваряне на вратата.", + "消息提醒": "Напомняне", + "开门通知": "Известие за откриване", + "N天未开门": "N дни без отваряне на врати", + "门未关好": "Вратата не е затворена", + "防拆报警": "Подправка аларма", + "低电量提醒": "Ниска батерия", + "胁迫开门": "Принудително отваряне на вратата", + "有人按门铃": "Някой звъни на звънеца", + "有人出现在门口": "Някой се появява на вратата", + "提醒方式": "Метод за напомняне", + "开门方式": "Метод за отваряне на врати", + "请选择": "Моля изберете", + "家人": "Член на семейството", + "保存": "Запазване", + "APP推送": "App push", + "管理员": "Администратор", + "未启用": "Не е активиран", + "已启用": "Активиран", + "省电模式": "Режим на икономия на енергия", + "逗留抓拍模式": "Престой режим на заснемане", + "实时监控模式": "Режим на наблюдение в реално време", + "自定义模式": "Потребителски режим", + "猫眼设置": "Настройка на котешкото око", + "猫眼工作模式": "Cat eye режим на работа", + "自动亮屏": "Автоматичен ярък екран", + "亮屏持续时间": "Екран навреме", + "逗留警告": "Престой предупреждение", + "异常警告": "Ненормално предупреждение", + "短信提醒": "Sms", + "邮件提醒": "Имейл", + "N天未开门提醒": "N дни без отваряне на врати", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Ако някой ви принуди да отворите заключване, можете да използвате този пръстов отпечатък. Алармата ще бъде изпратена на администраторите. за да използвате тази функция, моля, уверете се, че заключването ви е онлайн.", + "胁迫指纹": "Принудителен пръстов отпечатък", + "指纹列表": "Списък с пръстови отпечатъци", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "След зададеното време, ако заключването не бъде отворено, системата ще изпрати напомнящо съобщение до определения получател. Тази функция изисква заключването да бъде свързано с интернет.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "След като активирате напомнянето, когато ключовата батерия е под 20%, 10% и 5%, системата ще изпрати съобщение за напомняне на определения получател.", + "未开门时间": "Дни без отваряне на врати", + "添加和使用面容开锁时:": "Добавяне и използване на лицето при отключване:", + "关锁": "Затворете заключване", + "功能": "Функция", + "配件": "Части", + "云存": "Съхранение в облак", + "本地": "Това населено място", + "3天滚动储存": "3 дни подвижно съхранение", + "去升级": "Ъпгрейд сега", + "下载列表": "Списък за изтегляне", + "已下载": "Изтеглено", + "全部视频": "Всички видеоклипове", + "已为本设备免费提供3大滚动视频储存服务": "За това устройство са предоставени безплатно три услуги за превъртане на видео съхранение", + "视频播放": "Възпроизвеждане на видео", + "全选": "Всички", + "请选择要删除的视频": "Моля, изберете видеото, което искате да изтриете", + "请选择要下载的视频": "Моля, изберете видеото, което искате да изтеглите", + "欢迎使用": "Добре дошли да използвате", + "用户协议和隐私政策概要": "Обобщение на потребителското споразумение и политиката за поверителност", + "协议概要": "Обобщение на протокола", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Благодаря ви, че използвате това приложение. Ние прибавяме голямо значение на вашата лична информация и защита на личните данни. Преди да използвате този продукт, моля, прочетете го внимателно", + "《用户协议》": "Потребителски условия", + "和": "И", + "《隐私政策》": "◆ Политика за поверителност ◆", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Цялото съдържание на. Като кликнете върху \"съгласие\", вие се съгласявате и приемате всички условия. Ако решите да не се съгласите, няма да можете да използвате нашите продукти и услуги и ще прекрати приложението.", + "不同意": "Несъгласие", + "同意": "Съгласен", + "该功能是高级功能,请开通后再使用": "Това е усъвършенстваната функция. Моля, активирайте го първо.", + "常用程序": "Общи програми", + "该锁已被重置": "Ключалката е нулирана", + "需要访问读写权限才能使用手动升级固件": "За ръчно надграждане на фърмуера е необходим достъп до разрешения за четене и писане", + "错误D固件,请选择正确的文件": "Грешен фърмуер, моля изберете правилния файл", + "非SYD固件,请选择正确的文件": "Не syd фърмуер, моля изберете правилния файл", + "文件校验失败 0x01": "Проверка на файла се провали 0x01", + "解析元数据失败,请选择正确的文件": "Не успя да се анализират метаданни, моля изберете правилния файл", + "文件校验失败 0x02": "Проверка на файла се провали 0x02", + "文件校验失败 0x03": "Проверка на файла се провали 0x03", + "固件升级完成": "Ъпгрейд на фърмуера е завършен", + "记录": "Записи", + "开通高级功能后才可以对锁进行管理": "Моля, активирайте разширената функция първо за управление на бравите.", + "去开通": "Активиране", + "实名认证": "Удостоверяване на реално име", + "当前剩余数量": "Останал", + "购买": "Купи", + "实名认证为付费功能,请购买后再使用": "Удостоверяването с реално име е платена функция, моля, използвайте го след покупка", + "密码不一致哦": "Паролите са непоследователни", + "退出添加": "Откажете добавянето", + "管理员已满": "Администратор пълен", + "用户已满": "Потребителят е пълен", + "锁上面添加指纹已满": "Добавяне на пръстов отпечатък на заключване е пълен", + "指纹已存在": "Пръстовият отпечатък вече съществува.", + "锁上面添加人脸已满": "Заключване над добавете лицето е пълен", + "人脸已存在": "Лицето вече съществува", + "锁上面添加卡已满": "Заключване над добавете карта е пълна", + "卡已存在": "Карта вече съществува", + "锁上面添加密码已满": "Заключване над добавете парола е пълна", + "密码已存在": "Идентичен код вече съществува. моля, изберете друг", + "请输入密码": "Моля въведете парола", + "暂无密码,无需重置": "Без парола, няма нужда от нулиране", + "真实姓名": "Истинско име", + "身份证号": "Id номер", + "请输入真实姓名": "Моля въведете истинското си име", + "请输入身份证号": "Моля, въведете идентификационния си номер", + "请输入身份证号和真实姓名": "Моля, въведете вашия идентификационен номер и истинско име", + "点击返回设备配对": "Докоснете обратно към сдвояване на устройството", + "无法连接?尝试升级": "Не може да се свърже? опит за ъпгрейд", + "固件升级提示": "Ред за ъпгрейд на фърмуера", + "请先获取固件文件到手机本地,再选择升级": "Моля, получете файла на фърмуера на местния телефон първо и след това изберете ъпгрейд", + "固件升级中": "Фърмуерът се модернизира", + "取消升级": "Отменете ъпгрейд", + "固件传输中": "Фърмуер в транзит", + "关闭": "Изключете", + "传输中'": "В транзит", + "操作记录": "Записи", + "修改姓名": "Редактиране на името", + "传输中": "В транзит", + "发送人": "Издаден от", + "发送时间": "Издадено време", + "钥匙详情": "Екей инфо", + "姓名": "Име", + "发送": "Изпрати", + "请确认姓名全名和身份证号码是否正确": "Моля, потвърдете, че пълното име и идентификационен номер са правилни", + "传输期间请勿离开当前页面": "Не оставяйте текущата страница по време на трансфера", + "机型": "Модели", + "硬件版本": "Хардуерна версия", + "固件版本": "Версия на фърмуера", + "手动升级": "Ръчно ъпгрейд", + "设备连接中...": "Устройство свързване...", + "未避免异常情况,请在门打开时升级": "Неизбежни изключения, моля ъпгрейд, когато вратата е отворена", + "钥匙无效": "Ключът е невалиден", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Не може да се свърже със заключването. моля, рестартирайте blutooth на телефона си и опитайте отново.", + "如果是全自动锁,请使屏幕变亮": "Ако е напълно автоматично заключване, моля, направете екрана по-светъл", + "正在尝试闭锁……": "Опитайте се да заключите.", + "清空记录": "Изчистване на записи", + "是否要删除操作记录?": "Продължете да изтривате записи?", + "被删除的记录不能恢复": "Записите не могат да бъдат възстановени след изтриване.", + "全部事件": "Всички събития", + "开锁事件": "Отключване събитие", + "异常事件": "Ненормално събитие", + "门铃事件": "Събитие за звънец", + "视频事件": "Видео събитие", + "请开启蓝牙": "Моля, включете bluetooth", + "请选择有效日": "Моля, изберете ефективния ден", + "公司名字长度不能小于 6 ": "Дължината на името на компанията не може да бъде по-малка от 6", + "已是最新版本": "Няма актуализации", + "新建短信模版": "Създаване на sms шаблон", + "新建邮件模版": "Създаване на имейл шаблон", + "自定义短信模版": "Sms шаблон", + "自定义邮件模版": "Шаблон за имейл", + "名称": "Име", + "星星锁": "Звездна ключалка", + "无考勤记录": "Няма записи", + "大家干劲十足": "Всеки идва навреме", + "工作时长未出炉": "Няма работно време", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Изборът на страна/регион ще се отрази на сигурността на данните. в момента сте избрали албания, моля, потвърдете преди да продължите.", + "确认国家或地区": "Потвърдете държава/регион", + "我知道了": "Got it", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "За да получите важни актуализации, моля, кликнете върху 'ok' и активирайте известия в настройките.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "След като включите, можете отново да включите чрез дълго натискане на клавиша за настройка на заключването и да го добавите отново с приложението", + "已有": "Ток", + "新增": "Ново", + "账号格式错误": "Лош формат", + "接收者信息为空": "Информацията на получателя е празна", + "请输入时间(秒)": "Моля въведете времето (сек)", + "加载数据失败": "Неуспешно зареждане на данни", + "重试": "Опитайте отново", + "升级中,是否退出": "По време на надстройката, дали да излезе", + "下一步": "Следващия", + "公寓": "Апартамент", + "个人用户": "Личен", + "星寓": "Стар апартамент", + "账号": "Сметка", + "请输入手机号或email": "Телефонен номер или имейл", + "请输入星寓管理员的账号": "Моля, въведете акаунта на администратора на апартамент star", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Всички данни от избраното заключване (и) ще бъдат постоянно прехвърлени на получателя.", + "暂不支持跨平台转移,敬请期待": "Трансферът на различни платформи не се поддържа за момента, моля, очаквайте с нетърпение", + "移除坏锁": "Преместване на дефектни/повредени брави на боклук", + "转移确认": "Потвърдете прехвърлянето", + "本次共转移": "Този път общо", + "把智能锁": "Smart lock", + "确认": "Ок", + "移除成功": "Успешно премахване", + "转移成功": "Трансфер успех", + "该已锁被删除": "Заключената се изтрива", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Упълномощеният администратор може да управлява само пароли, ekeys и etccreated от самия него.", + "添加授权管理员": "Създаване на администратор", + "导出记录": "Експортиране на записи", + "选择时间段": "Изберете времеви период", + "导出": "Експортиране", + "批量导出": "Партиден износ", + "读取记录": "Опресняване на записи", + "设备": "Устройство", + "消息": "Съобщения", + "智能分析": "Интелигентни анализи", + "精准识别设备事件,过滤无效信息": "Точно идентифицирайте събитията на устройството и филтрирайте невалидна информация", + "系统设置": "Системни настройки", + "系统的全局配置在此项内进行设置": "Глобалната конфигурация на системата е зададена в този елемент", + "导出操作记录": "Експортиране на записи", + "立即查看": "Изглед", + "导出成功": "Експортиран успешно", + "发送钥匙": "Изпрати екей", + "进度": "Рейтинг", + "失败": "Неуспешно", + "人脸详情": "Детайли на лицето", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Когато някой се усети на около 1,5 метра пред вратата, отключването за разпознаване на лицето ще бъде автоматично стартирано.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Когато някой се усети на около 0,8 метра пред вратата, отключването за разпознаване на лицето ще се стартира автоматично.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Когато някой се усети на около 0,5 метра пред вратата, отключването за разпознаване на лицето ще бъде автоматично започнато.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Разстоянието за сензиране е изключено, трябва ръчно да докоснете всеки клавиш на клавиатурата, за да извършите отключване на разпознаване на лица.", + "防误开已打开,开锁后": "Отварянето на анти-грешка е включено и след отключване", + "秒内不可使用面容开锁": "Отключването на лицето не може да се използва в рамките на секунди", + "掌静脉": "Палмова вена", + "添加掌静脉": "Добавете палмова вена", + "胁迫掌静脉": "Принудителна палмова вена", + "请不要将胁迫掌静脉用于日常开锁": "Моля, не използвайте принудителни палмови вени за ежедневно отключване", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Свързан с ключалката, моля, естествено отворете дланта си, дланта е обърната към камерата", + "掌静脉详情": "Детайли на палмовата вена", + "掌静脉号": "Номер на палмовата вена", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth не е включен, моля включете bluetooth в настройките", + "删除用户时,会将用户拥有的钥匙一起删除。": "Ако потребителят бъде изтрит, всички ekeys, свързани с потребителя, също ще бъдат изтрити.", + "配置网络": "Конфигуриране на мрежата", + "你好": "Здравей", + "成功": "Успешен", + "类型选择": "Type select", + "请选择要使用哪种类型": "Моля изберете кой тип да използвате", + "系统邮件(推荐)": "Имейл на системата (препоръчително)", + "系统短信(推荐)": "Sms система (препоръчително)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Имейлът ще бъде изпратен от това приложение. моля, купувайте имейл пакет първо.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Имейл пакет първо.", + "个人邮件": "Личен имейл", + "个人短信": "Личен sms", + "邮件将从你的个人邮箱发给用户": "Имейлът ще бъде изпратен от вашия личен имейл акаунт.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Sms съобщението ще бъде изпратено от вашия личен телефонен номер.", + "为了更好地应用体验,请确定权限": "За по-добър опит в приложението, моля, потвърдете разрешенията", + "您第一次拒绝权限,请确定权限": "Вие отказахте разрешение за първи път, моля, потвърдете разрешение", + "您第二次拒绝权限,请去应用设置开启权限": "Отказахте разрешение за втори път, моля, отидете в настройките на приложението, за да активирате разрешение", + "去应用市场": "Отидете в app store", + "温馨提示": "Топло подсказване", + "关闭应用": "Затворете приложението", + "开启微信接收报警消息需要先关注": "За да отворите wechat, за да получавате алармени съобщения, трябва да следвате", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat публичен акаунт, запишете qr кода и използвайте wechat за сканиране на настройките", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Удостоверяването с реално име е платена функция, моля, свържете се с администратора на заключване, за да закупите и използвате", + "位置权限": "Разрешение за местоположение", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Моля, предоставете приложението, за да използвате вашия locatian. it се използва за сканиране на ble брави и шлюзове.", + "相机/相册权限": "Разрешение за камера/албум", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Моля, предоставете приложението за четене и писане на снимки и файлове от съхранение.", + "点击选择": "Кликнете, за да изберете", + "微信": "Wechat", + "朋友圈": "Моменти", + "QQ": "Qq", + "QQ空间": "Qqzone", + "微博": "Вейбо", + "FaceBook": "Facebook", + "链接": "Линк", + "今天": "Днес", + "密码错误": "Невалидна парола", + "网络中断": "Прекъсване на мрежата", + "钥匙不存在": "Ключ не съществува", + "钥匙过期": "Ключът е изтекъл", + "钥匙已存在": "Ключът вече съществува", + "密码失效": "Невалидна парола", + "门锁时间异常": "Време за заключване на вратата ненормално", + "APP(手机)未联网": "App (мобилен телефон) не е свързан с интернет", + "数据不存在": "Данни не съществуват", + "待接收": "Берецеден", + "已冻结": "Замразени", + "已删除": "Изтрити", + "未知": "Неизвестен", + "拖动下方滑块完成拼图": "Плъзнете плъзгача към правилната позиция", + "验证成功": "Успех на проверката", + "验证失败": "Проверка не успя", + "向右拖动滑块填充拼图": "Плъзнете плъзгача надясно, за да запълните пъзела", + "请先获取到位置信息哦": "Първо, моля, получете информацията за местоположението", + "请选择国家": "Моля, изберете държава", + "获取锁信息": "Получаване на информация за заключване", + "锁数据异常,请重试": "Заключване данни е ненормално, моля опитайте отново", + "连接设备中...": "Свързване на устройство...", + "把锁": "Брави", + "条": "Ивица", + "封": "Тюлен", + "次": "Таймс", + "支付成功": "Pay успех", + "查看详情": "Вижте подробности", + "请输入模板名称": "Моля, въведете името на шаблона", + "模版类型": "Тип", + "再返回一次退出": "Изход отново", + "请先添加锁": "Моля, добавете ключалката първо", + "可视对讲": "Визуален интерком", + "详细日志": "Подробен дневник", + "已复制到剪切板": "Копиран", + "拍照": "Снимка", + "从相册选择": "Изберете от албум", + "选择问题": "Моля, изберете въпрос", + "确认长度不足8位": "Потвърдете дължина по-малка от 8 цифри", + "新密码长度不足8位": "Нова дължина на паролата по-малко от 8 цифри", + "两次密码不一致": "Несъответствие с паролата. моля опитайте отново", + "请点击获取验证码,验证码将发送到": "Моля, получете кода за проверка. кодът ще бъде изпратен до", + "切换": "Превключвател", + "验证": "Проверка", + "验证成功,账号已删除": "Проверка е успешна, акаунт е изтрит", + "该密码不是自定义密码,无法修改": "Тази парола не е персонализирана парола и не може да бъде променена", + "请选择设备要关联哪些姓名": "Моля, изберете кои имена трябва да бъдат свързани с устройството", + "请选择姓名要关联哪些设备": "Моля, изберете кои устройства трябва да бъде свързано с името", + "确定要移除所选中的坏锁吗?": "Премахване на неизправна ключалка?", + "邮件通知": "Уведомяване по имейл", + "短信通知": "Уведоми чрез sms", + "您好,您的授权管理员生成成功": "Здравейте, вашият упълномощен администратор е генериран успешно", + "请输入接收者姓名": "Моля въведете тук", + "版本更新": "Актуализация на версията", + "下次再说": "Следващия път", + "配网成功": "Успех на разпределението на мрежата", + "配网失败": "Разпределението на мрежата се провали", + "该锁的无线键盘都将被删除": "Всички безжични клавиатури за това заключване ще бъдат изтрити", + "实时画面": "Картина в реално време", + "适合门口较为安全的环境。": "Подходящ за сравнително безопасна среда на вратата.", + "仅发生特定事件才录像,并可查看实时画面。": "Записват се само конкретни събития и може да се види картината в реално време.", + "一般情况下,满电可使用7-8个月": "При нормални обстоятелства може да се използва за 7-8 месеца при пълно зареждане", + "有人逗留或发生特定事件才录像,可随时查看": "Някой престои или конкретни събития се записват и могат да бъдат гледани по всяко време", + "实时画面。": "Картина в реално време.", + "一般情况下,满电可使用5~6个月。": "При нормални обстоятелства може да се използва за 5 ~ 6 месеца при пълно зареждане.", + "适合门口人员复杂、较不安全的环境。": "Подходящ за сложни и сравнително опасни среди на вратата.", + "有人出现就录像,可随时查看实时画面。": "Записвайте, когато някой се появи, и вижте снимката в реално време по всяко време.", + "一般情况下,满电可使用2~4个月。": "При нормални обстоятелства може да се използва за 2 ~ 4 месеца при пълно зареждане.", + "根据您家门口实际情况设置录像和实时画面功能。": "Задайте функциите за видео и картина в реално време според действителната ситуация на вратата ви.", + "可使用时长由具体设置决定。": "Продължителността на употреба се определя от конкретните настройки.", + "查看": "Изглед", + "有人按门铃或发生": "Някой звъни на вратата или", + "异常事件时": "Ненормално събитие", + "不录像": "Няма видео", + "有人出现、按门铃": "Някой се появява, звъни звънеца на вратата", + "或发生异常事件时": "Или се случва ненормално събитие", + "逗留达到10秒": "Престой за 10 секунди", + "约1.5米": "Около 1,5 метра", + "随时": "По всяко време", + "立即录像": "Запис веднага", + "录像时机": "Видео синхронизация", + "有人出现时录像": "Запис, когато някой се появи", + "人体侦测距离": "Разстояние за откриване на хора", + "查看实时画面": "Вижте картина в реално време", + "自定义时间": "Персонализирано време", + "当日": "Днес", + "次日": "Следващия ден", + "自定义时段": "Персонализиран период от време", + "发生事件时查看": "Вижте кога се случва събитие", + "实时查看": "Изглед в реално време", + "有人在门口出现10秒后开始录像。": "Някой се появява на вратата за 10 секунди преди запис.", + "有人按门铃时立即录像。": "Запишете веднага, когато някой звъни на вратата.", + "有人出现在门前1.5米范围时启动录像": "Започнете да записвате, когато някой се появи в рамките на 1,5 метра пред вратата", + "约0.8米": "Около 0,8 метра", + "约3.0米": "Около 3,0 метра", + "添加指纹失败": "Операция се провали.", + "项": "Елементи", + "播放中": "Играя", + "下载": "Изтегляне", + "暂无下载内容": "Няма съдържание за изтегляне", + "亮度": "Яркост", + "音量": "Обем", + "快进至": "Бързо напред към", + "快退至": "Върни се към", + "暂无视频信息": "Няма видео информация", + "加载出错": "Грешка при зареждане", + "请单人正对门锁,距离一个成年人手臂长度": "Моля, застанете пред ключалката на вратата сам, по дължина на ръката", + "(约0.6米)。": "(Около 0,6 метра).", + "保持脸部无遮挡,露出五官。": "Дръжте лицето си безпрепятствено и покажете чертите на лицето си.", + "准备好了,开始添加": "Готов, започнете да добавяте", + "正在录入中...": "Запис...", + "添加人脸失败": "Не успя да добавите лице", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "След като се възстанови, лицата на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?", + "人脸号": "Номер на лицето", + "虹膜详情": "Ирис детайли", + "虹膜号": "Номер на ириса", + "选择设备类型": "Изберете тип устройство", + "照明灯具": "Осветителни тела", + "电动窗帘": "Електрически завеси", + "门窗传感器": "Сензор за врати и прозорци", + "传感器": "Сензор", + "清除数据成功": "Успешно изчистени данни", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Заключването не е свързано с интернет, така че рекодовете на подкода, карта, пръстови отпечатъци и други методи за отваряне на вратата не могат да бъдат качени в реално време.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Ако трябва да съхранявате историческите записи, можете да експортирате тях.", + "看不到操作记录,可能原因有": "Не може да видите записите на операцията, възможни причини", + "操作记录详情": "Подробности за записа на операцията", + "操作时间": "Време на работа", + "此模块功能需要锁联网后设置方可生效": "Тази функция на модула трябва да бъде настроена, след като заключването е свързано с интернет, за да влезе в сила", + "用户已存在": "Потребителят вече съществува", + "钥匙数量已到上限": "Броят на ключовете е достигнал горната граница", + "附近没有可用网关": "Няма налични шлюз в близост", + "正在创建安全连接...": "Създаване на сигурна връзка...", + "监视状态下不能发送录音": "Не може да изпрати записи в режим на мониторинг", + "挂断": "Закачай", + "监视中暂不能开锁": "Отключването не е налично по време на мониторинга", + "长按说话": "Натиснете и задръжте, за да говорите", + "松开发送": "Освобождаване за изпращане", + "请输入6位数字开锁密码": "Моля, въведете 6-цифрена парола за отключване", + "请输入开锁密码": "Моля въведете паролата за отключване", + "接收者在有效期内可以不限次数使用": "Получателите могат да използват ekeys за неограничено време в рамките на срока на валидност.", + "接收者可以使用此App开关锁": "Получателят са в състояние да заключи/отключи от това приложение.", + "单次钥匙有效期为1小时,只能使用一次": "Еднократният ekey е валиден за един час и може да се използва само веднъж.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Получателите могат да използват ekeys за неограничено време в рамките на фиксираното време на цикъла.", + "获取模板失败": "Не успя да получите шаблон", + "微信通知": "Уведомление за wechat", + "系统短信": "Система sms", + "系统邮件": "Имейл на системата", + "模板": "Шаблон", + "新建模版": "Създаване на шаблон", + "您好,您的密码是": "Здравейте, паролата ви е", + "密码名字": "Име на парола", + "请输入6-9位密码": "Моля, въведете 6-9 цифрена парола", + "设置密码": "Задаване на парола", + "操作成功,密码为": "Успя. подкодът е", + "类型:自定义-永久": "Тип: обичай-постоянен", + "实时播放": "Възпроизвеждане в реално време", + "点击对讲": "Кликнете към интерком", + "长按开锁": "Дълго натиснете за отключване", + "接听失败": "Не успя да отговори", + "请在锁设置中开启远程开锁": "Моля, активирайте отключване на разстояние в настройките на заключване", + "接听": "Отговор", + "截图已保存到相册": "Скрийншот запазен в албум", + "添加遥控": "Добавяне на дистанционно управление", + "已连接到锁,请按遥控": "Свързан към ключалката, моля натиснете дистанционното управление", + "遥控号": "Номер на дистанционно управление", + "遥控详情": "Дистанционно управление детайли", + "照明": "Осветление", + "退出演示模式": "Изход демо режим", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Съвет: настоящият интерфейс е интерфейс на дисплея. След като добавите устройството, можете да продължите да го използвате", + "门已上锁": "Вратата е заключена", + "您的账号在异地登录,如非本人,请尽快修改密码": "Вашият акаунт е използван за влизане от ново устройство", + "开门成功": "Отвори вратата успешно", + "开门失败": "Не успя да отвори вратата", + "呼叫提醒": "Напомняне за повикване", + "收到来自": "Получено от", + "锁的呼叫": "Заключване", + "加载数据中": "Зареждане на данни", + "搜索所有锁类型": "Търсене на всички типове заключване", + "锁电量更新时间": "Заключване време за актуализация на батерията", + "1月": "Ян", + "2月": "Фев", + "3月": "Мар", + "4月": "Април", + "5月": "Май", + "6月": "Джун", + "7月": "Юл", + "8月": "Авг.", + "9月": "Сеп.", + "10月": "Окт.", + "11月": "Нож", + "12月": "Дек", + "热门城市": "Горещи градове", + "导出锁数据": "Експортиране на данни за заключване", + "一键开锁": "Отключване с едно кликване", + "已开通": "Отворена", + "编辑员工": "Редактиране на персонала", + "一": "Едно", + "二": "Две", + "三": "Три", + "四": "Четири", + "五": "Пет", + "六": "Шеста", + "日": "Слънце", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?", + "在线": "Онлайн", + "离线": "Офлайн", + "购买记录": "Запис за покупка", + "使用记录": "Потребителски запис", + "失效时间要大于当前时间": "Срокът на изтичане трябва да бъде по-дълъг от текущото време", + "修改名字": "Редактиране на името", + "时": "Час", + "分": "Минута", + "Amazon Alexa": "Амазонка алекса", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Можете да използвате alexa за отключване, заключване и проверка на състоянието на заключване", + "支持的国家": "Подкрепени страни", + "支持的国家值": "Сащ, канада, великобритания, австралия, индия, германия, франция, италия, испания, япония", + "操作流程": "Процес на операция", + "操作流程值": "1 добавете заключване и шлюз с приложението smart lock\n\n2 активирайте дистанционното отключване на функцията за заключване в приложението (тази функция е изключена по подразбиране). Ако не разполагате с тази опция, заключването не поддържа alexa\n\n3 добавете умения към alexa и ги разрешавайте с акаунта и паролата на приложението smart lock. След като разрешението е успешно, можете да откриете устройства под акаунта\n\n4 намерете заключването в приложението alexa, включете функцията за отключване на гласа и задайте паролата за езика\n\n5 ключалката може да се управлява чрез alexa", + "Google Home": "Google home", + "Action name": "Име на действие", + "ScienerSmart": "Scienersmart", + "支持的语言": "Поддържани езици", + "英语": "Английски", + "Google Home操作流程的值": "1. използвайте приложението smart lock, за да добавите брави и шлюзове\n\n2. активирайте дистанционното отключване на функцията за заключване в приложението (тази функция е изключена по подразбиране). Без тази опция, заключването не поддържа google home\n\n3. инсталирайте приложението google home и кликнете върху бутона \"\" в горния ляв ъгъл\n\n4. на страницата с настройките изберете \"работа с google\"\n\n5. търсете \"scienersmart\" и използвайте акаунта и паролата на app smart lock, за да разрешите", + "密码需至少包含数字/字母/字符中的2种组合": "Паролата трябва да съдържа поне 2 от следните: числа, букви и специални символи", + "已开锁": "Отключена", + "已闭锁": "Заключен", + "两次密码不一致哦": "Паролите са непоследователни", + "中功率": "Средна мощност", + "常规使用": "Редовна употреба", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "След като шлюзът е включен, натиснете и задръжте бутона reset за 5 секунди и щракнете върху следващия, когато индикаторната светлина мига алтернативно", + "扫描设备": "Сканиране устройство", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Изтриването не успя. Портата може да е отишла офлайн. Искате ли да принудите изтриване на данните?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_bn.json b/lan/lan_bn.json new file mode 100644 index 00000000..94eb47cf --- /dev/null +++ b/lan/lan_bn.json @@ -0,0 +1,1122 @@ +{ + "星锁": "স্টারলক", + "锁通通": "লোকস্টার্ড্রো", + "点击开锁,长按闭锁": "আরেকটিচটো", + "考勤": "টেট", + "考勤设置": "ট্যাট্যান্স ঊর্ধ্বতন", + "电子钥匙": "ইউ", + "添加卡": "অ্যাক-কার্ড", + "卡号": "Cardnumber", + "添加指纹": "প্রতিদ্বন্দ্বী", + "指纹号": "ডিগ্রিমপ্রিপ্ট", + "遥控": "নিউট", + "添加人脸": "এনভাইস", + "门锁日志": "দোর্ডলকগ", + "密码号": "ছোটওয়ার্ড", + "添加者": "অ্যালেটর", + "添加时间": "সময়:", + "重置": "সেট", + "请输入手机号或者邮箱": "ফোনবারেরিল", + "工作时间": "ভাঙ্গা", + "工作日设置": "রুর্ড", + "星期一": "দিন", + "星期二": "ক্যাড", + "星期三": "ওয়েজেনচেডেস", + "星期四": "সাইড্ড", + "星期五": "গ্রেডি", + "星期六": "সাইউটডডে", + "星期日": "সিসুডাড", + "简写周一": "মিম", + "简写周二": "টু", + "简写周三": "নয়", + "简写周四": "টু", + "简写周五": "F", + "简写周六": "সেলস", + "简写周日": "সেলস", + "周一": "মোন", + "周二": "বে", + "周三": "উইড", + "周四": "থু", + "周五": "ফ্রিপ", + "周六": "সাত", + "周日": "সুন", + "群发钥匙": "স্যান্ড", + "锁": "লক", + "请添加": "পরীক্ষা", + "允许远程开锁": "নিউটেনলাক", + "请输入验证码": "শিরোনাম", + "获取密码": "সমুদ্রেট", + "请给密码命名": "ক্যানটেরনামের জন্য উপসর্গিল", + "密码有限期为6个小时,只能使用一次": "সুইংগঠন", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "ওয়াউয়েলি এন্টার্টার 6-9 ডাইডিটসোর্ড। উদাহরণস্বরূপ পর্যন্ত, বা প্রতিদ্বন্দ্বিতা", + "获取": "জেট", + "添加": "অদ্ভুত", + "删除公司": "ডেজেটেক্যাকম্পেনিয়ান", + "密码详情": "পদেজেনফো", + "修改密码": "ডাক", + "添加虹膜": "সমতল", + "添加门磁": "ডোরনেসিসর", + "添加无线键盘": "নীলবিহীন", + "添加手掌": "অদ্ভুত", + "请输入员工账号": "দ্বিতীয় প্রতিনিধি", + "批量授权锁": "গ্রেন্টমডা প্যাটিপ্লোক্স", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "নির্দিষ্ট স্বীকৃতি", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "স্পেস্টারিউরিয়াল্ল", + "排列方式": "লিস্টার্ড", + "早到榜": "লিস্ট", + "迟到榜": "লিস্টি", + "当前模式": "নির্কেত", + "勤奋榜": "ভিকিংহার্ডলিস্ট", + "延迟时间": "ডাইজেড টাইম", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Thelockwilllockautom▁...ক্যাটরটাইম.", + "时间": "সময়:", + "开始时间": "চলমান:", + "结束时间": "এনক্রিপশনসমূহ", + "工作时间设置": "ঊর্ধ্বসমূহ", + "常开模式": "নস্যুদি", + "常开时间": "ইন-সম্পর্কিনtimeperiodpage", + "常开日期": "অন স্পিডিজেড", + "添加员工": "সংগৃহীত", + "节假日": "ওয়াল্ড", + "打卡方式": "হোড", + "员工是否有钥匙": "বিষয়", + "上班时间": "সিস্টেম", + "下班时间": "ক্লাসিং", + "本周": "ইঙ্গোনেক", + "单休": "এক-ডে-ওয়েওয়েন্ডName", + "双休": "টেটো-ডেওওয়েলেন্ডName", + "单双休": "এক-টেটো-ডে-ওওয়েডেন্ড", + "年": "ইয়ার", + "月": "থ", + "放假日期": "ওয়াল্ড", + "补班日期": "ওয়ার্ক", + "添加假日": "অ্যান্ডিড", + "开始日期": "স্টার্টডেট", + "必填": "ক্রম", + "结束日期": "এন্ডড্যাট", + "日榜": "নিয়োগ", + "月榜": "স্বাক্ষর", + "考勤记录": "রূপ", + "假日信息": "হেলিডেড্যান্ফো", + "基本信息": "বাইওসিক্যাস", + "无线键盘": "নীলবিহীন", + "选择无线键盘": "প্রতিদ্বন্দ্বী", + "门磁": "ডোরনেসিসর", + "自动闭锁": "স্বয়ংক্রিয় লক", + "锁声音": "লক", + "防撬报警": "ওয়েটperalertGenericName", + "重置键": "ইউনিটন", + "锁时间": "লকক", + "诊断": "অ্যারিওনস", + "上传数据": "\"লোড-ডাটা\"", + "导入其他锁数据": "ইমপিউন্ট্রোমিটারলক", + "锁升级": "এক্ষ", + "标记房态": "রুমস্টাটাস", + "开锁提醒": "নুলাকস্ট্রো ন্যায়", + "微信二维码": "নবলক", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "PewithelElecticakeysyscanoেপেনডোরবাই কনজানিংয়েংসজিস র রিজেন্ডেড্রুবই Thqr রিজেন্ডেওফ লকনিস। ছোট্ট ছাপ্টাইট ওয়াইট", + "锁编号": "লক", + "电量": "আন্ডার", + "锁分组": "লক", + "选择分组": "নির্বাচক", + "创建新分组": "বিকশিত", + "管理员开锁密码": "অ্যান্ডমিন", + "更新": "আন্ডারেট", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "দিন-পাইলেভেলভব্লুবে ভদ্দোডবিআইভোরফোন", + "当屏幕闪烁时,点击下一步": "বিকশিক", + "输入*529#或按设置键": "Ceventer *529#orpressthedactyleskey", + "长按重置键2秒": "চাপ দাঁড়িয়ে রাখো", + "附近的设备": "উইওমিরবিডিজিমেন্ট", + "暂无数据": "নোডাটা@ item: inlistbox", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "সবচেয়ে গ্রহণযোগ্য ডোয়াটাউটস্ট্যাটসডুয়াডোর চেনাসরভের ডুবে গড়ে তুলবে.", + "开始": "স্টার্ট", + "全天": "অনলাইনসমূহ", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Scancancansetm▁টিপলস্টাইমপ্লেপিউইমের জন্য-স্কেডি.", + "请选择锁音量": "ইংলিউট", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "বাইturningon,?", + "低": "নিম্ন", + "较低": "উম্লু", + "中": "নিম", + "较高": "উমচিং", + "高": "চাই", + "开启后,锁被撬动时,会发出报警声": "বাই, পারস্পরিক।", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "বিনিংঅফ, থেরাসেট গানটেটোনিস অনিচ্ছাদিত।", + "校准时间": "ডাউট্রেট টাইম", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "অ্যারিয়াইসসোতে পড়াশোনা কর্তৃক", + "上传": "Gol-লোড করুন", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Manloaddatafakromlocktoserver.itmaytake boys", + "请选择要从哪把锁导入": "নির্বাচন", + "有新版本": "নিউভরভেন্স", + "当前版本": "অবস্থান", + "升级": "আন্ডারেট", + "空闲": "ছোয়ান্ট", + "已入住": "নিয়ন্ত্র", + "多语言": "Langu▁রেজ", + "添加锁": "লক", + "锁地址": "অ্যান্ডলক", + "选择锁类型": "নির্মাণselectlocktypeype", + "NFC无源锁": "আন্তর্কসিভলক", + "添加设备": "সংগ্ন", + "网关": "সমুদ্রে", + "客服": "ক্রম", + "设置": "কোটিংস", + "更多设置": "মোরসেট", + "消息推送": "সেন্টাটিক", + "锁用户管理": "লকস্টিকার্স", + "拥有的钥匙": "ইয়েসিসোভিটেডড্রিথিং", + "批量授权": "অবা", + "关联设备": "সোসাইভিটেডপলিভাইস", + "关联姓名": "সিস্টেম", + "转移智能锁": "শিফারলক", + "选择锁": "কেনলক", + "接收人信息": "পরীক্ষা", + "转移网关": "সিফারকারওয়ে", + "锁屏": "কেনলক", + "已关闭": "অফ-অফ", + "已开启": "নন", + "开启": "টেকওন", + "确定要开启重置键?": "গানট্টটন?", + "确定要关闭重置键?": "গানট্টটন?", + "隐藏无效开锁权限": "Hide ali▁alidaccessGenericName", + "APP开锁时需手机连网的锁": "ব্লকস্ক্রিয়ামিংফোনলাইন", + "增值服务": "ওয়ার্ডেরিসিস", + "关于": "কুবআউট", + "退出": "ব্লোআউট", + "删除账号": "ডেজেটের কাউন্টাউন্ট", + "个人信息": "কাউন্টিয়নফো", + "头像": "সৌ টাওয়ার", + "昵称": "আনসিসিনাম", + "请输入昵称": "ছোট্টনেম", + "修改昵称": "মেরেম", + "修改账号": "সম্পাদনা", + "重置密码": "ছোটওয়ার্ড", + "安全问题": "সিওরজিটিভিটি estion", + "为了你的账号安全,修改账号前请先使用验证码验证": "ছদ্মবেশীকরণের জন্য সিউর কাউন্টি, ক্যাপিলাইজসহ্যাকাউন্ট ইসওয়ার্ড ফিলিফোরসিফিকেশন mo", + "请输入新账号": "ছোট্ট", + "找回密码和登录新设备时,可通过绑定的手机验证": "ফোনকে বাবারবুইলবিস্টিকেডকে প্রকাশ করে।", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "...ইলব্লিউইলবিউস্টিকেসিফিকেশনেডের পক্ষে।", + "原密码": "নির্যাত্সওয়ার্ড", + "新密码": "নিউpas▁সাইওয়ার্ড", + "确认密码": "ছোটওয়ার্ড", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "ইনক্যাসফিউরফোলোস্ট, রিক্যান্লোগিনট নবফোনবিএনস্কিউরিং স্ক্রোজিটিসিসিসিসিসিএস্যাসিকশনসন।", + "问题一": "সম্পাদনestion1", + "问题二": "কুয়ার 2", + "问题三": "সম্পাদনestion3", + "请输入你的答案": "ছোট্ট", + "即将到期": "পিউন", + "去授权": "অন্তর্নির্মিত", + "修改名称": "নেম", + "状态": "সেটাস", + "WiFi名称": "উইফিনেম", + "网络MAC": "নর্কভার্কম", + "网关升级": "Ggoveway mindedat", + "网关连接的锁": "লক", + "信号强": "রং", + "选择网关类型": "সিওসিকারওয়েটাইপ", + "添加网关": "বিরোধী", + "重新通电": "পরীক্ষা", + "指示灯": "কেয়ানারেটরলাইট", + "选择网关": "সিওসিকারওয়ে", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5 gisnoteigpped,.", + "WiFi密码": "উইফিক", + "请输入WiFi密码": "দ্বিতীয় ওয়ার্ড", + "网关名称": "সমুদ্রনাম", + "请输入网关名称": "দ্বিতীয় সমুদ্রনাম", + "IP地址": "নদ", + "子网掩码": "Edibnetmask", + "默认网关": "গ্রীষ্মাল্ট", + "自动获取DNS服务器地址": "অ্যান্টো-অ্যাকসিক্যালগ্ন", + "首选DNS": "হাস রেড", + "备选DNS": "উদাহরণস্বরূপ", + "不使用静态IP": "নো", + "使用静态IP": "ইউসোর্ট", + "请输入IP地址": "ক্যানটার", + "请输入子网掩码": "ক্রেটারডাবনেট", + "请输入默认网关": "দ্বিতীয় ভিডিওয়ে", + "所有锁": "অললোকস", + "搜索所有类型的锁": "স্যাকানাল্ডসপিসফক্স", + "门锁": "ডোর-লক", + "挂锁": "আনলক", + "保险箱锁": "মাইন্টfelockGenericName", + "智能门禁": "লিজেন্টেসেস কন্ট্রোল", + "车位锁": "কিকিংলক", + "摸亮触摸屏": "টুকরাইকিউট্ট", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "ক্যাপিলাইস ডাউনকিউটিকে তৈরি করুন এবং পুটটিতে পার্টিং", + "附近的锁": "কোমেরিবিলোকস", + "如需修改名字请重新命名,点击确定添加锁": "চিহ্নটিতে প্রতিরোধের নাম, ক্যাপিলাইস ...এম, ডিক্লিক জিনটোকডলক", + "添加锁时,手机必须在锁旁边": "বিদ্রোহী, ফোনস্ট্টস্ব", + "登录": "লোকগিন", + "注册": "গ্রিনিসর", + "我已阅读并同意": "I", + "验证码": "পিপিনড", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "সিউর pas▁সিওয়ার্ডমস্ট ৮-২০ ডিস্টার্স, এবং এক্সলিউইন্ড", + "手机": "ফোন", + "邮箱": "নিইল", + "请输入邮箱": "দ্বিগুণ", + "国家/地区": "অঞ্চল", + "你所在的国家/地区": "অঞ্চল/অঞ্চল", + "选择国家/地区": "ঝোজার", + "获取验证码": "গেটলিকড", + "商务合作": "বিচ", + "电脑网页版": "বুবোবিসিস্টেম", + "酒店系统": "Hotel-সিস্টেম", + "说明书网页版": "ইউজার ওয়াসুয়াল", + "高级功能": "সমতল", + "记录保存": "রূপ", + "您可通过短信将密码、电子钥匙信息发给接收人。": "স্যান্ডসপেন্ডের জন্য নির্ধারিত হয়ে উঠেছে।", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "...আইল্কনির্বাচন করা হয়েছে", + "购买实名认证提示": "অ্যান্ডোটারথেকশনটি এমন, ডাউনড্ড টুইউর-এজেরপ্রিন্ট, ফেসোর ক্যাকাউন্ট-স্কওয়ার্ডটোওপেনপি। স্পোর্টেরিয়ারিসনো মেনেনেসের জন্য চিনিয়ারিকের ফর্ম 3min▁টিউটস", + "请选择你希望的实名认证频次": "রিয়েল-নাম", + "仅首次": "ফোর্টেফাirsttimes", + "每日一次": "অ্যাসডেন", + "每周一次": "কনসিয়াওনিক", + "每月一次": "Enceহেসারিmonth", + "当前状态": "নিরেন্টস্টাটাস", + "试用中": "অনটেরিয়াল", + "高级功能权益内容": "বিদ্রূপ", + "短信模板": "স্যাম্ট", + "邮件模板": "বিল্লাইল", + "发卡工具": "কার্ডভিডার", + "购买高级功能须知": "স্ট্র্যাকস", + "购买高级功能提示": "বিরোধী রাজ্যবিরোধী, এবং অফুর-ম্যানসেম, প্রতিদ্বন্দ্বিতা শুধুমাত্র সাউরিয়াল্যাকস। চিহ্নবিদ্যার", + "免费体验": "মেরসিটারিয়াল", + "立即开通": "নোপেনু", + "购买短信": "জাহানিসাইমস", + "购买邮件": "জাহানিল", + "购买实名认证次数": "পুরস্কারসরূপ", + "开通高级功能": "বৈদ্যুতিন", + "选择套餐": "Choosepflakয়", + "支付方式": "Deofpientiment", + "支付宝": "পেপে", + "去支付": "প্রেত", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "স্বতন্ত্র তৈরি করা হয়েছে... ...একটি স্বতন্ত্র।", + "高级功能仅能用于你自己的锁": "বিরোধী... শুধুমাত্র ইয়েডোরিওক্স।", + "新建模板": "বৈদ্যুতিন", + "类型": "টাইপ", + "模版内容": "পেপল্লেট", + "预览": "ক্যাসভিউ", + "房间名": "রুম", + "预计产生短信条数": "Esti▁matedm▁entraage segment", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "সুইংরেজিস ডাউরিউরিল্লা/y▁/ ডুডিজ, দে, অ্যান্ড ডিগ্রি, এবং রঙিন", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "ইউজারসফোনিস-এসফোনিস-রেডট-টুই-এনটিনেটলিং-টুইল্যাকসপিপ।", + "配置WiFi": "অ্যাকগ্রিং", + "请输入WiFi名字": "ক্যাপিলাইসের ভিডিওনাম", + "WiFi配网": "উইফিল", + "胁迫卡": "বিস্তারকার্ড", + "员工是否有密码": "উত্সাহীন", + "员工是否有卡": "অনননকার্ড", + "员工是否有指纹": "উত্সব", + "获取钥匙": "টেগকি", + "获取卡": "গোটেটকার্ড", + "获取指纹": "গেটগ্রি", + "安全验证": "Identity", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "অ্যালসসআরগানগান্টের মাইউইল্ডবেইভেড-এরফেইট্রোমফর্ম", + "监控": "Monitor", + "视频日志": "নিঃশব্দ", + "开门器": "ডোরওএফ", + "面容开锁": "ফেসসসুনcolocs", + "开门方向设置": "ডিরেক্টরসেট", + "电机功率设置": "অ্যাডার", + "开锁时是否需联网": "Ifinternetisprocadredwhen cumoকল্কিং", + "选择要加入分组的锁": "নির্বাচিত লোককসোদ্ধ", + "锁数量": "লকগান্টি", + "小米IOT平台": "আইওমিমিটোপেগারফর্ম", + "面容开锁设置": "ফেসস cumcolocksete", + "感应距离": "আনসিং", + "防误开": "ক্যাভেন্টভ্রোংসিং", + "防误开已关闭,关门后仍可使用面容开锁": "আইভেন্ট মিসিওসিংহ্যাসেনসিল্ড, পোস্টার্লুসিং ডোরডোরকেনস্টেসফেসসসসম্পলাক", + "添加和使用面容开锁时": "বন্দুদ্র এবংusefacewhencampockg", + "添加和使用面容开锁时提示": "\n1, ডোরমেশনের সামনে ছড়িয়ে পড়েছে;\n2, ডোরবলক আউট 0.5 ~ 0.8met্যারিং, তদুকর্তালক;\n3 .পিলেজপেসেপেস,,\n৪.Whenface টিভিনিজিশনিসবারমাল্ড,?", + "秒": "সেলস", + "请根据门锁实际情况,请谨慎选择电机功率:": "ক্যাপিলাইজ-এর মোটরপোভার অ্যাট্রাইস্টিক্লি কোর্ডিংয়ের দিকে ডোরলকের দিকে:", + "小功率:": "নি:", + "耗电少": "লিসপোভার", + "大功率": "আইচি-পোভার:", + "大功率提示": "ইফথেলক বার্গিউনট", + "开门方向设置提示": "ক্যাপিলাইজেস টিস্ট্রুতের দিকনির্দেশক দিকনির্দেশনার দিকনির্দেশক (অভিন্য... ...স্বীকৃতির দিকনির্দেশনা, ইপিনিউপেনপেন্যান্ড ডোরউর):", + "左开": "নোপেনleftt", + "右开": "ডোপেনরাইট", + "判断方法:": "法:", + "判断方法内容": "ম্যানস্টোডউডোসাইড হাউস, ডিগ্রিমিংয়ের দিকে।", + "录像时段": "নিভি-স্কল্ট", + "密码": "আন্ডাস", + "卡": "বিকশিত", + "指纹": "ডিগ্রিমপ্রিন", + "人脸": "ফেস", + "配件商城": "লককName", + "公司名称": "অ্যাকম্পেনিনাম", + "请输入公司名字": "কনস্টার অ্যাকম্পেনিনাম", + "提示": "চিন্ট", + "是否删除?": "ডুইথের্টোজেটে?", + "员工信息": "টোইফডিয়ানফো", + "员工": "কোটিওফ", + "打卡方式无效": "সান সিনেক্যা", + "中国": "চিনাই", + "选择钥匙": "জোজয়িকি", + "编辑": "সম্পাদনা", + "无": "নো", + "有": "হেস", + "请输入姓名": "ইংলিশ", + "获取人脸": "VARNTting Kanfores", + "选择密码": "নিয়োজ", + "选择卡": "পোনোকার্ড", + "选择指纹": "ঝেজেজেরমিনপ্রিন্ট", + "选择人脸": "ফোকাসselectite", + "员工是否有人脸": "ইমেন্টার্ক", + "同时删除员工钥匙": "ডেজেটেইস/হেরেবিয়", + "删除": "ডেজেট", + "确定要删除员工吗?": "ডেজেটেসইমপেজেরিজ", + "月统计": "Monসর্গার্ডলিস্টচ", + "迟到": "গ্লায়েট", + "早退": "লাইভেল", + "未打卡": "নোরেকর্ড", + "钥匙将在": "স্পেন্ডারিডিস ইবিইলপিল", + "天后失效": "দিন", + "电量更新时间:": "আন্ডারি ওআআরেটটাইম:", + "新增配件": "অদ্ভুত", + "钥匙不可用": "Keyisnot সু সিরিয়ালেবল", + "正在开锁中...": "কনুকলকিং...", + "你的钥匙": "সাউরকি", + "常开模式启动!长按闭锁": "টোপেনডেস্ট্রেড! লম্বাপ্রেসtolock", + "演示模式": "Omo▁ডি", + "请先同意用户协议及隐私政策": "ইউজারডিজেন্ডোপ্রিভেভেই পোলিকিল্সিএফ", + "用户协议": "Usermms", + "隐私政策": "পুরস্কা", + "注册成功": "গ্যারিওরিয়ারিরাজেন্টাফল", + "你所在的": "স্যামারিন", + "手机号": "ফোন", + "忘记密码": "গাট", + "重置成功": "করুসেটল", + "确定要退出吗?": "এটা?", + "功能暂未开放": "ননতাই", + "设置成功": "সেটুপ লাইট", + "删除成功": "ডাইজেটেলাই", + "单次": "একসময়", + "永久": "Man▁man", + "限时": "রান্ড", + "自定义": "দেশ", + "清空码": "কেরালেস", + "循环": "রিং", + "工作日": "ভুকড", + "每日": "নিয়োগ", + "周末": "হেউইভেন্ড", + "确定要删除吗?": "ডেজেটে?", + "该锁的密码都将被删除": "অলস", + "已过期": "পর", + "该锁的电子钥匙都将被删除": "অলুয়ারফোর্সস্ট্রাইস্ট্রাইসlockwillbedeleted", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "ডাইজেনেটল ইউসোসিয়াডেডড্রিমিসস্ট্রিগেরি.", + "删除钥匙会在用户APP连网后生效": "The Pevywillbedeleted", + "有效时间": "পরীক্ষা", + "接收者": "পরীক্ষা", + "仅管理自己创建的用户": "ওয়াজেহিসো", + "远程开锁": "নিউটেনলাক", + "请输入钥匙名称": "পরীক্ষা", + "修改成功": "নিঃশব্দ", + "冻结": "ছবিগ্রিজেস", + "解除冻结": "অবস্থান", + "授权": "নৌকাcolor", + "取消授权": "ডি- Ō", + "同时解冻其发送的钥匙": "স্বয়ংক্রিয়া", + "会在用户APP连网后生效": "স্পেস্টার্ডিস ইবিলিল্ব", + "同时冻结其发送的钥匙": "ছোট্ট", + "冻结会在用户APP连网后生效": "সুইংরেজিস ইউইবিইলবিলিফফজেনউজেনথেউজার ইসপপিএনকর্ক", + "取消授权会在用户APP连网后生效": "Theuserwilllowosehis/তার নিমিসিশনswhenuser'sPartncomectectionstoanetwork", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "নির্দেশাল", + "失效时间需晚于生效时间": "দ্য ক্যাপিরেশনটাইম", + "生效时间需晚于当前时间": "রেক্ক্যাটিভটাইমস্টস্টবিল্টার", + "失效日期需晚于生效日期": "দ্বিতীয় স্বীকৃতি", + "修改有效期": "শ্রমিক", + "生效日期": "স্টার্টডেট", + "失效日期": "এন্ডড্যাট", + "开锁": "আনুকলক", + "开锁成功": "সামলাক", + "请选择锁": "পুরস্কার্ট", + "请选择接收者": "নিয়ন্ত্রণ", + "请选择有效期": "নির্ধারিত", + "请选择发送方式": "নির্বাচন", + "请选择结束时间": "নির্দেশক", + "完成": "অ্যাকসোপাইট", + "有效日": "সিসিকলন", + "发送成功": "স্কেন্ডলার", + "请选择开始时间": "নিয়ন্ত্রক", + "选择用户": "নির্বাচন", + "已选中": "সেস্কেটেড", + "确定": "পেইন", + "请选择要发送的锁": "পুরস্কার্ট", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "ফেসরেল-নেম স্যার্জেশনের জন্য ইউনিট্রিজেন্টার্স... ...তাইমহিসফেসোরেস ফোনপিপ্প, এবং 'সম্প'রকমেরকেশন করা সম্ভব।", + "分享": "নির্যা", + "请输入接收者账号": "ক্যাপিলাইস এন্টার্টার", + "接收者号码未注册,请重新发送": "নির্যাতন", + "是否发送电子钥匙给未注册账号": "দ্বিতীয়তত্ত্বা", + "取消": "কানকনসেল", + "标记成功": "মার্ক", + "微信好友": "ই- ই-", + "短信": "স্যাম্ট", + "邮件": "নিইল", + "更多": "মোর", + "您好,您的电子钥匙生成成功": "আচেলো,...", + "生效时间不能小于当前时间": "রেক্টিভ টাইম কানননটবিলেসৌর", + "结束时间不能小于当前时间": "এন্ডটাইম কানননটবিলেসৌর", + "是否为管理员": "বিদ্রোহminis", + "已连接到锁,请将卡靠近门锁的读卡区": "প্রতিশ্রুতিবদ্ধ.", + "尝试连接设备...": "ক্যানইটিংয়েটুইটলক.", + "地理位置": "Geফোনিক্যাকশনা", + "检查以确保以下地址是正确的": "নির্মিত রূপ", + "地图加载中,请稍候。。": "Themapislocowding, pòmpleasewait...", + "跳过": "গ্রহণ করুন", + "还未获取到位置信息哦,请耐心等待一下!": "থাইলোকেশন formationhasnotenfortহহMiranedwit, PAPLESEWeit", + "请填写信息": "ক্যাপিলেজেজেজেমিলিনথে", + "有效期": "পরীক্ষা", + "生效时间": "চলমান:", + "失效时间": "এনক্রিপশনসমূহ", + "上传成功": "ওয়ালোকেন্ডেল", + "未生效": "আনস্কাটিভ", + "已生效": "পৃথক", + "指纹详情": "ডিগ্রিমিরপ্রিন্টেনফো", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "ছড়িয়ে পড়ে যাওয়ার জন্য তৈরি করা হয়েছে।", + "开始添加": "স্টার্ট", + "请将您的手指按下": "প্লেসফিউরফিংগার", + "根据提示,抬起手指后再进行下一次指纹采集": "এক্সক্ল্লোউট", + "添加成功": "বিদ্রোহ", + "更新成功": "ঝাড্যারেক্", + "搜索": "কর্চ", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "অ্যান্ডোটারআইটিংসটিংসন, লকপলকের কার্ড, ডো ডো ডাইরেট্রেটিসেট?", + "已失效": "পর", + "卡详情": "কার্ড-ডিয়ানফো", + "请输入": "ক্যাপিলাইজ এন্টারোর", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "বাই, লককমিল ইউলিলোক্যাকডো", + "请输入小于或等于60的数字": "ক্যাপিলেস এন্টার্টার", + "操作成功": "ইন্টারএন্টফল", + "管理员密码相同,无需修改": "বিরোধক", + "请输入6-9位数字": "6-9 ডাইটিসনল্যাম্পেনথ", + "请输入6-9位管理员密码": "ক্যাপিলেস এন্টেটার 6-9 ডাইরেটভিটকেটর", + "请输入新的管理员密码": "ক্যাপিলেস এন্টার্টেনওভেটর", + "未分组": "পরীক্ষা", + "请输入分组名称": "বিকশিত", + "创建成功": "বিকশিত", + "设置锁分组成功": "সেটলক", + "电池1电量": "নিখ-চার1", + "电池2电量": "নিখ-পার", + "电量更新时间": "আন্ডার", + "锁电量更新成功": "লককভিউর", + "您的钥匙未生效": "না", + "您的钥匙已冻结": "স্যারকিহ্যাসএম্যান-জেজেন", + "您的钥匙已过期": "স্যারকিহ্যাস", + "常开模式开启": "Thelockisinpassagemod", + "超级管理员": "ভাগ্ন", + "授权管理员": "অবা", + "普通用户": "পরীক্ষা", + "余": "আনাস", + "天": "দিন", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "ব্যান্ডার্টারজেন্টেটলক, সমস্ত নবুইল্ডবেজেটেড ডাইটার, আরেক-সিউরিয়া yভ্যান্টটোজেটেলক?", + "请输入登录密码": "ছোট্ট", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "ডিফাইরেড্টোজেটেইভাইস, পিপিলেসএসমেকসিউরিতে লিভিসিস কোনিয়ারবিভাইস, পিলিভিসিসকে অন্তর্নিহিত নয়, এবং সবকিছুইসিস", + "用户无权限": "Userhasnopermissions", + "创建公司后,考勤功能才能使用": "ছোট্ট", + "是否删除钥匙?": "ডাইজেটেস্ট্রিমিসবি?", + "邮箱绑定成功": "নইল রেডিং", + "手机绑定成功": "Moবিলিফোন ডিভিডিং", + "网络访问失败,请检查网络是否正常": "রিভিতেড", + "清空": "চাল", + "是否清空?": "?", + "消息详情": "''এস' 'এস'", + "创建时间": "টাইম", + "管理员详情": "বিদ্রোহ", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "ক্যানস/////", + "请不要将胁迫卡用于日常开锁": "ক্যাপিলেসডন... ...স্বরূপ কার্ড ফর আইলিউজ।", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "ক্যানসপেনডোর,?", + "请不要将胁迫指纹用于日常开锁": "ক্যাপিলেসডোন টুইজেডো", + "创建公司": "ক্যানস্ট্রোসিয়া অ্যাকম্পাজানিয়ান", + "公司名称不能超过30个字符": "অ্যাকম্পানিনামিকআনট", + "公司名称不能小于6个字符": "অ্যাকম্পানিনামচন্যানোটবিলেসৌর", + "WIFI列表": "উইফিলিস্ট", + "刷新": "আর্কিউ", + "手动配网": "সত্যুয়াল", + "远距离": "লম্বা", + "中距离": "উইউম", + "近距离": "অবস্থান", + "锁时间更新成功": "লকটাইম ফলাদেট্র", + "锁用户": "লকস্টিকার্স", + "请选择常开日期": "ইংলিউজেক্ট", + "结束时间不能小于开始时间哦": "সেন্ড টাইম", + "介绍": "রূপ", + "个人信息收集清单": "সিভিনিয়ান", + "应用权限说明": "নৈতিকতামিন", + "第三方信息共享清单": "সুইজার্ডার্ড", + "请选择您的位置": "ছোট্ট", + "请先选择位置": "ছোট্ট", + "管理员密码": "অ্যান্ডমিন", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Ivdry", + "修改": "Mo", + "网络摄像头": "কেন্দ্রেরা", + "重命名": "মেরেম", + "分组下的锁将被移到未分组里": "লোককস আন্ডার", + "编辑成功": "ডিস্ট্রিক", + "厂商": "সতুজের", + "型号": "ডাল", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "ক্রোটারথেশ সাইওয়ার্ডিস সংকটেড, পিউইজেসইটকর্সেফোর্টিনেশনিমেটোর ...অনটেসিমেডে, রোজার্মাইজিটওয়াইলবিবে alialiali▁প প প প পরাটার 0oclock। অ্যান্ডোটারথেস ইসওয়ার্ডিস activ, এটি পেতে পারেন।", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "ব্যান্ডার্টারথে সাইওয়ার্ডিস সংকটেড, পিউইজেসিটি ক্যানডেইসিস্টিতে সমস্ত সবচেয়ে ছোট্ট-এইচ-এইচ-এইচ-এইচ-এরডে।", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "ব্যান্ডার্টারথে সাইওয়ার্ডিস সংকটেড, পিউইজেসিটি", + "清空密码底部提示": "দিন সাইসওয়ার্ডিসভেদ কস্ট", + "相机": "কেন্দ্রেরা", + "相册": "হেপ্টোস", + "读写": "সেপ্টারেজ", + "定位": "স্থান", + "需要访问相机权限才能拍照上传文件例如头像上传": "অ্যাক্সেসিমেরাইসের দিকে হাতেকস্যান্ড ভার্ডল্ডস, আদ্যাচসাস ভার্ডিংয়ের গ্যাফিলপিজেক্টর", + "需要访问相机权限才能使用相册图片上传文件上传头像": "অ্যাক্সেসটচোরাইস্রাকের রেডট্ডোল্ডআইএস এবং সিউ রাগার্সজিংবাম", + "需要访问读写权限才能使用本地图片上传头像": "অ্যাক্সেসট্রেড্যান্ড্রিট রিমিসিওনিসস রেডট্ ট্রেডোল্ড স্কোলোক্যাল", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "অ্যাক্সেস অ্যাক্সেসিয়ান", + "申请": "অবস্থান", + "权限": "নিমিশন", + "不允许": "নোটল", + "允许": "ইউরোপেড", + "权限被拒绝": "নিমিশনের ied", + "请手动在系统设置中开启": "সিস্টেমে সিস্টেমটিংস", + "权限以继续使用应用": "নিমিশনের জন্য সিউনিস্ট্রিংয়ের দিকে।", + "去设置": "প্রতিযোগিতা", + "当前网络": "আনটেনটিওয়ার্ক", + "位置信息": "স্থান", + "请输入wifi名称": "ক্যাপিলাইজ", + "虹膜": "নিয়", + "手掌": "Pp", + "商城": "XmallName", + "我的": "My", + "微信公众号推送": "ইয়াক", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "টোপেনডেট হোয়াট্ট", + "蓝牙": "নিকট্রিয়াথ", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "ক্ষেত্রে ট্যাক্সট lu▁ইমেরিসিসোসিয়েশনস ...বিরোধী ...বিরোধী", + "请输入Email": "দ্বিগুণ", + "请输入手机号": "ক্যানস্টারফোন", + "家人到家": "তরফলিমমবার্গের চার্ট", + "添加家人": "বিদ্রোহ", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "তবুওলকনিস্টেট interনেট, পরীক্ষার জন্য, কার্ড, রঙেরপ্রিন্ট, এবং রোহরডোরিওসিং met", + "消息提醒": "পরীক্ষা", + "开门通知": "এক্সোভিংগ্রাটিস", + "N天未开门": "আন্ডার", + "门未关好": "থেডোরনিস্টোক্যাড", + "防拆报警": "আর্ট", + "低电量提醒": "নিম্ন", + "胁迫开门": "Forcedডোরোওসিং", + "有人按门铃": "সিওনেটিংস্থে জেনডার্বেল", + "有人出现在门口": "সিওনেপি", + "提醒方式": "পরডার", + "开门方式": "দ্বারেওসিংmetহড", + "请选择": "নেটওয়ার্ক", + "家人": "তবের মনেহর", + "保存": "চ্যান্টভ", + "APP推送": "পিপপেপ", + "管理员": "অদ্ভুত", + "未启用": "নথিপত্র", + "已启用": "দ্বিতীয়া", + "省电模式": "পোওয়ার মাটিভিং", + "逗留抓拍模式": "বিকশিত", + "实时监控模式": "রিয়েল-টাইম", + "自定义模式": "ক্রম", + "猫眼设置": "কেন্দ্রবিন্দু", + "猫眼工作模式": "ক্যাটাইওবোর্কিং", + "自动亮屏": "ডাইটমিউইট", + "亮屏持续时间": "পরীক্ষা", + "逗留警告": "ঝলিং", + "异常警告": "শিরোনাম", + "短信提醒": "স্যাম্ট", + "邮件提醒": "নিইল", + "N天未开门提醒": "আন্ডার", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "ভিফ-ওনকে//////////বিরোধীদের জন্য দৃষ্টিভঙ্গি দিচ্ছিলেন।", + "胁迫指纹": "নির্দোষ", + "指纹列表": "ডিগ্রিমপ্রিন্টলিস্ট", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "অ্যান্ডার্টারসময়, যদি লক্ষ্যপন্থী হত, তবে সিস্টেমইলস্ডেন্টা... ...টুইটেড ডিজিটেডিজেন্টে প্রবেশ করে। স্পেস্টারনিস function qui", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "কেন্দ্রেটার-ভিল্লিংয়ের দিকে, উইথেনটলক", + "未开门时间": "হাউটডোরও", + "添加和使用面容开锁时:": "প্রতিদ্বন্দ্বিতা এবং ইউজেফেহেনসামকলকিং:", + "关锁": "ক্লোসেলক", + "功能": "Function", + "配件": "Par", + "云存": "বিক", + "本地": "শ্রেণীবিদ্যাস", + "3天滚动储存": "3 Days telllingstorge", + "去升级": "আগগ্রেডন", + "下载列表": "জেন রিলোডলিস্ট", + "已下载": "প্যানজিলোকনড", + "全部视频": "অলভিগলিওস", + "已为本设备免费提供3大滚动视频储存服务": "ইজর্ট্রি ট্রোলিংভিচ deostoragezeriেসোর্সিট্যারিসেনভেনভেইন্ডর্ডিসপিনিসপিভিসেফ্রেস্ট্রেড", + "视频播放": "ভাল", + "全选": "সবকিছু", + "请选择要删除的视频": "নির্বাচন", + "请选择要下载的视频": "নির্বাচন", + "欢迎使用": "ভাবে", + "用户协议和隐私政策概要": "...অনুসার্য", + "协议概要": "লিভার", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "স্পেসপোর্ট ওয়াটট্যাচ reatgganceanceancetoour scidiolanformationformationandprivšyprotection। লিফারেস্ট্রিজিং", + "《用户协议》": "Usermms", + "和": "অ্যাড", + "《隐私政策》": "ট্রেভিহাইপোকিলিসি ৩", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "একট্রিক সামঞ্জস্যপূর্ণ। বিশৃঙ্খলা \"জারেট্রি\", 'চিমিরেন্ডস্যাপ্যাপ্টালস'। চিহ্নটিকে নির্বাচিত নয়, পিছনে ব্যবহার করতে পারবেন না।", + "不同意": "অ্যারোনডিজেট্রে", + "同意": "রেট্রে", + "该功能是高级功能,请开通后再使用": "দ্বন্দ্বের বিরুদ্ধে ...বিষয়ক। ক্যাপিলাইজেস-এন্ট-এক্সট।", + "常用程序": "অ্যাকমন্স", + "该锁已被重置": "Thelockhass Pionuaresete", + "需要访问读写权限才能使用手动升级固件": "অ্যাক্সেসস্টোরিট অ্যান্ড্রিট রিমিসিওনিসিস ...উউনিলি ভ্রেড্রেডের", + "错误D固件,请选择正确的文件": "রুংগ্রngenirmware, ক্যাম্পেস নির্বাচন করুন রূপ", + "非SYD固件,请选择正确的文件": "আন্নোন-এফ-এফ-এরওয়ার, ইংলিশ নির্বাচন করুন রূপ", + "文件校验失败 0x01": "ডিফাইলসিফিকেশন ডিভাইস", + "解析元数据失败,请选择正确的文件": "ছোট্ট", + "文件校验失败 0x02": "ডিফাইলসিফিকেশন ডিভাইস", + "文件校验失败 0x03": "ছদ্মবেশী", + "固件升级完成": "এক্ষ", + "记录": "রূপ", + "开通高级功能后才可以对锁进行管理": "ক্যাপিলাইসেব্লিউব্লিউইটেড functionffstt", + "去开通": "ভিউ", + "实名认证": "রিয়েল-নাম", + "当前剩余数量": "পরীক্ষা", + "购买": "জুয়ারি", + "实名认证为付费功能,请购买后再使用": "রিয়েল-নাম", + "密码不一致哦": "Thepasswordsare pencay", + "退出添加": "ক্যাসিট্যান্ডিং", + "管理员已满": "অ্যান্ডমিনfullf", + "用户已满": "Theuserisfull", + "锁上面添加指纹已满": "প্রতিদ্বন্দ্বী", + "指纹已存在": "Thef তমপ্রিন্টারপ্রাচীর।", + "锁上面添加人脸已满": "লকবোভেডফেসসfullk", + "人脸已存在": "ফেসছোল", + "锁上面添加卡已满": "ব্লক", + "卡已存在": "কার্ডলিভিশনা", + "锁上面添加密码已满": "লকবোভ্যান্ডpas▁স্কওয়ার্ডসফুল", + "密码已存在": "এন-ক্যাল", + "请输入密码": "ছোট্ট", + "暂无密码,无需重置": "নোpas▁সাইওয়ার্ড, কোনও উন্মাদ", + "真实姓名": "রিয়েলনাম", + "身份证号": "নির্বার", + "请输入真实姓名": "ছোট্ট", + "请输入身份证号": "ছোট্ট", + "请输入身份证号和真实姓名": "ক্যাপিলাইজ এন্টারিউর", + "点击返回设备配对": "টাপব্যাক", + "无法连接?尝试升级": "Can'tconnect?", + "固件升级提示": "নীল", + "请先获取固件文件到手机本地,再选择升级": "ক্যাপিলাইসেটেন-এফ-এর-এই-এলপোনফোন-এস্ট, এবং নির্বাচন", + "固件升级中": "ThefirmwareisMIMIring golgraphsedd", + "取消升级": "কানসেলথে", + "固件传输中": "এক্ষ", + "关闭": "অফ", + "传输中'": "Intransite", + "操作记录": "রূপ", + "修改姓名": "নেম", + "传输中": "Intransite", + "发送人": "ভাগ্ন", + "发送时间": "সময়-সমূহ", + "钥匙详情": "পাইডিএনফো", + "姓名": "নাম:", + "发送": "স্যান্ড", + "请确认姓名全名和身份证号码是否正确": "ক্যাপিলাইসফিফর্মেস্ট্রাইস্টার্ড", + "传输期间请勿离开当前页面": "নির্দিষ্ট নেতৃত্বাধীন", + "机型": "ডাইলস", + "硬件版本": "ডার্ওয়ারভেন্স", + "固件版本": "FmwareversionName", + "手动升级": "ধুয়াল ফলাগ্রাড", + "设备连接中...": "প্রাচীন...", + "未避免异常情况,请在门打开时升级": "সাউন oidযোগ্য exceptionstionsণনশনস, ক্যাপিলাইস", + "钥匙无效": "Thekeyisinvalialid", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "পর্যন্ত পর্যন্ত।", + "如果是全自动锁,请使屏幕变亮": "ফিইটি", + "正在尝试闭锁……": "টুইংটলক.", + "清空记录": "বিন্যাস", + "是否要删除操作记录?": "ক্যানগুটোডজেটেড?", + "被删除的记录不能恢复": "Thé", + "全部事件": "সমস্ত ev", + "开锁事件": "সানকলক", + "异常事件": "কবলমার", + "门铃事件": "জোনবিবেল", + "视频事件": "নিকট", + "请开启蓝牙": "ক্যাম্প্রেসেসপ", + "请选择有效日": "নিয়ন্ত্রণ", + "公司名字长度不能小于 6 ": "লিক্যান্থ", + "已是最新版本": "নুটার্ড", + "新建短信模版": "স্যাম্ট", + "新建邮件模版": "বৈঠিল", + "自定义短信模版": "স্যাম্ট", + "自定义邮件模版": "বিল্লাইল", + "名称": "নাম:", + "星星锁": "স্টারলক", + "无考勤记录": "নো", + "大家干劲十足": "ইনটাইম", + "工作时长未出炉": "নোwedorkingHourss", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "ইসিউফ/রেজিওয়েলভিল", + "确认国家或地区": "রঙা", + "我知道了": "নির্ধারিত", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "টুকরানিভর", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "ভোরাটারটিং,////", + "已有": "পার্টেন্ট", + "新增": "নিউ", + "账号格式错误": "ব্যাডফর্মা", + "接收者信息为空": "থাপিজেন্ট মাইসইইমপি", + "请输入时间(秒)": "ক্যাপিলাইজেসের টাইম (ওক)", + "加载数据失败": "ভবিষ্যৎ", + "重试": "রেট্রিকোর", + "升级中,是否退出": "স্পষ্টতই", + "下一步": "উত্স", + "公寓": "প্রতিদ্বন্দ্বী", + "个人用户": "সিডিয়েন", + "星寓": "স্টারপ্রিপেমেন্ট", + "账号": "কাউন্টি", + "请输入手机号或email": "ফোনবারেরিল", + "请输入星寓管理员的账号": "স্টারপ্যারিটমেন্টেটর", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "অন্তর্ভুক্ত ডেটাডেটেডলক (গুলি) নীলবি perman▁... ...ভিউলি......", + "暂不支持跨平台转移,敬请期待": "ক্রস-পিউটফর্ম", + "移除坏锁": "Xmovefak a▁/ ডম্যাগেডল্কস্টোজেশ", + "转移确认": "অ্যানিফার", + "本次共转移": "সার্স্টার্ডসটাইটালফ", + "把智能锁": "স্যার্টলক", + "确认": "পেইন", + "移除成功": "Remove lat", + "转移成功": "নির্বাচক", + "该已锁被删除": "থাইল্যাঙ্কেডসডজেড", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "নির্দিষ্ট স্বীকার্ড অভ্যাস শালাই, নিজস্ব আত্মা", + "添加授权管理员": "ক্যানস্ট্রিয়েট এনমিন", + "导出记录": "পোর্ট", + "选择时间段": "পরবর্তী সময়সমূহ", + "导出": "পোর্ট", + "批量导出": "পোর্ট", + "读取记录": "রূপ", + "设备": "ব্লিভাইস", + "消息": "এন্টস", + "智能分析": "Intel▁লিজেন্টা", + "精准识别设备事件,过滤无效信息": "হা", + "系统设置": "সিস্টেমটিংস", + "系统的全局配置在此项内进行设置": "সিস্টেমের সিস্টেমস্যারিজম", + "导出操作记录": "পোর্ট", + "立即查看": "ভিউ", + "导出成功": "Ex▁por▁por▁por", + "发送钥匙": "স্কেন্ডে", + "进度": "রেট", + "失败": "ডিগ্রিড", + "人脸详情": "ফেসপ্লিটাইলস", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "উইভেনসকেওনিসপেড আউট met▁ডুরটির ফ্রেন্ডারে, ফেসভিটিজিওন ам ব্লাকিংয়েলকিলবিইট", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "উইভেনসকেওনিসপেড আউট met▁ডুরটির ফ্রেন্ডারে, ফেসভিটিজিওন ам ব্লাকিংয়েলকিলবিইট", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "উইভেনসকেওনিসপেড আউট met▁ডুরটির ফ্রেন্ডারে, ফেসভিটিজিওন ам ব্লাকিংয়েলকিলবিইট", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "শুধুমাত্র অ্যাকাউন্টেনস্ফোরম্যান্সেনস্ফোরম্যান্সেনস্ফোরম্যান্সেনস্ফোরম্যাশন নমুকলকিংয়ের উপর দিয়েছে।", + "防误开已打开,开锁后": "থিয়েন্টি-মিস্ত্যাকেকটিংহাস এমিনডেন, এবং পেটারসোকলকিং", + "秒内不可使用面容开锁": "ফেসসসুনালকিংকনট্রেডবুয়েডভিথিন-স্ক্রিক", + "掌静脉": "পেভিন", + "添加掌静脉": "অদ্ভুত", + "胁迫掌静脉": "নির্দোষ", + "请不要将胁迫掌静脉用于日常开锁": "ক্যাপিলেসডোনোটউস লিরিজেপ্যাপ্ট", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "লকটিতে, ক্যাম্পেনলিওপেনপেনপিউরপি, প্যাপেনিস্ফুরিং", + "掌静脉详情": "Pp", + "掌静脉号": "Pp", + "蓝牙未打开,请到设置里面打开蓝牙": "নিকটেনস্টথেনিসনটন", + "删除用户时,会将用户拥有的钥匙一起删除。": "ফিফুসারিসএডজেটেডিয়ানি ইয়েডোসোসিয়েড উইথসুরইলসুইল-জেড-এডজেড।", + "配置网络": "রূপ", + "你好": "আন্লো", + "成功": "আদি", + "类型选择": "ট্রেন", + "请选择要使用哪种类型": "নির্দেশক", + "系统邮件(推荐)": "সিস্টেম", + "系统短信(推荐)": "সিস্টেমস (অনুকরা)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "ইলওয়াইলবেসেন্ট-গ্রামিস্ট্রিমিসপপি.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Thesmswillbesentfromisupap.plese Januaryemailpcaskagefirst।", + "个人邮件": "সিওনিয়েল", + "个人短信": "সিডিয়োনাস", + "邮件将从你的个人邮箱发给用户": "ইলওয়াইলবেসেন্ট-ফ্রমুর-সোরিওনিয়েল-এল-এরকাউন্ট।", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Thesmsm▁entradaagewillbesentfromyourper▁sডিনিয়ানফোন numবার.", + "为了更好地应用体验,请确定权限": "ফোরাডাবট্রেটার appliপিজেন্স, ক্যাপিলাইসের নীল", + "您第一次拒绝权限,请确定权限": "....", + "您第二次拒绝权限,请去应用设置开启权限": "ছোট্টসময়ের জন্য মিশনাল", + "去应用市场": "গোট", + "温馨提示": "Mpromহ্", + "关闭应用": "ক্লোসেথে", + "开启微信接收报警消息需要先关注": "টোপেপেনোপাইট", + "微信公众号,请保存二维码并使用微信扫一扫设置": "নীচে পাবলিক কাউন্টি", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "রিয়েল-নাম", + "位置权限": "মিশনা", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "ক্যাম্পেজেসগ্রান্ট্যান্টেপ্প টুইউরক্যান", + "相机/相册权限": "ক্যান্সেরা/অ্যালবাম মিশনে", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "পুইজেসগ্রান্ট্র্যান্টেপ্ট্রেড আর্টুরিট হাকিটুএন্ড-এরফের ডিগ্রোমপিরেজ।", + "点击选择": "ক্লিক্ক", + "微信": "ইওক্লাট", + "朋友圈": "সম্মেন্টস", + "QQ": "ইকা", + "QQ空间": "জোন", + "微博": "ওয়েজিবো", + "FaceBook": "ডিগ্রাডুক", + "链接": "লিংক", + "今天": "অর্লেন্ডে", + "密码错误": "পথ", + "网络中断": "নকওয়ার্কinterruption", + "钥匙不存在": "কিকের অস্তিত্ব নয়", + "钥匙过期": "কিউনিয়ার্ড", + "钥匙已存在": "কেইল্যালিভিশনা", + "密码失效": "পার্সওয়ার্ড", + "门锁时间异常": "দ্বারোলকটাইমComment", + "APP(手机)未联网": "পিপি (moবিলিফোন) ননা", + "数据不存在": "বিদ্যমান নয়", + "待接收": "লিমিনিট", + "已冻结": "এক্লিউজেন", + "已删除": "ডাইজেড", + "未知": "নুকা-এর", + "拖动下方滑块完成拼图": "ড্র্যাগল্ডারকে ট্র্যাক করেডো", + "验证成功": "শ্রমিক", + "验证失败": "শুধু", + "向右拖动滑块填充拼图": "ডানদিকে ডানদিকে", + "请先获取到位置信息哦": "ছোট্ট", + "请选择国家": "ক্যাপিলেসselectacountry", + "获取锁信息": "গেটলক মাই", + "锁数据异常,请重试": "লকডেটাইসবnormal, ক্যাপিলেসেট্রে", + "连接设备中...": "অ্যাকম্পিকোসিটিং......", + "把锁": "লোককস", + "条": "সেট্রিপ", + "封": "কোকাল", + "次": "ন্যাস", + "支付成功": "পায়েলার", + "查看详情": "ভিউ", + "请输入模板名称": "ছোট্ট", + "模版类型": "টাইপ", + "再返回一次退出": "ইটি", + "请先添加锁": "ক্যাপিলাইজোড", + "可视对讲": "কম", + "详细日志": "লিটাইমেডলগ", + "已复制到剪切板": "বিক্যাল", + "拍照": "হুকিউট", + "从相册选择": "হোসেফরোমআলবাম", + "选择问题": "ক্যাপিলেসো", + "确认长度不足8位": "অ্যাল্লানথলেসসৌর্যারিয়ান8", + "新密码长度不足8位": "নিউpas▁স্কওয়ার্ডল্লানথলেসৌরগরিয়ান8d▁بھیটস", + "两次密码不一致": "পার্সওয়ার্ড", + "请点击获取验证码,验证码将发送到": "ক্যাপিলেজেটেসিফিকেশন লিন্ডে", + "切换": "স্কিভিচ", + "验证": "ভিরেসরি", + "验证成功,账号已删除": "শ্রমিক", + "该密码不是自定义密码,无法修改": "স্যুর্গনিসোর্ডিসোটাভিস্টম ছসওয়ার্ডandcannotbe mo", + "请选择设备要关联哪些姓名": "ক্যাপিইজেসলেক্ট", + "请选择姓名要关联哪些设备": "ক্যাপিলেসselectwhichyvicesthenameshouldbe Socialatoirewth", + "确定要移除所选中的坏锁吗?": "Rem▁fun▁funক্যালক?", + "邮件通知": "সিস্ট্র্যাঙ্কিভিভিয়াইল", + "短信通知": "সিস্ট্রো টিফিভিভিয়াস্কমস", + "您好,您的授权管理员生成成功": "আচেলো, রিউর রিভিউড", + "请输入接收者姓名": "ক্যাপিলাইজ এন্টারোর", + "版本更新": "ভারসান", + "下次再说": "কোয়েনটাইম", + "配网成功": "নকর্ক ওয়ার্ক", + "配网失败": "নবক ওয়ার্ক", + "该锁的无线键盘都将被删除": "অলসবিহীন", + "实时画面": "রিয়েল-টাইমপেসিচারName", + "适合门口较为安全的环境。": "ভিডিওটেবল ফরফরাসী ইলেই মাইউইভেনমেন্টের দরজা।", + "仅发生特定事件才录像,并可查看实时画面。": "কেবলমাত্র আলোচনার কোর্সডন্ডথের রিয়েল-টাইমপিসিচার হয়ত।", + "一般情况下,满电可使用7-8个月": "আন্ডারমালবিক", + "有人逗留或发生特定事件才录像,可随时查看": "স্যান্টোনস্টার্ক", + "实时画面。": "রিয়েল-টাইমপিজেচার।", + "一般情况下,满电可使用5~6个月。": "আন্ডারমালবিক ir▁stan", + "适合门口人员复杂、较不安全的环境。": "ভিডিওটেবল ভারসাম্যের জন্য অ্যাকম্পেক্সট্যান্ডসেল-এলি-মিলি-এইচ-এর দরজায়।", + "有人出现就录像,可随时查看实时画面。": "রিয়েল-টাইমপিউরিয়ার্সকে দেখুন, এবং রিয়েল-টাইমপিফিচারে অতিরিক্ত সময় দেখুন।", + "一般情况下,满电可使用2~4个月。": "আন্ডারমালবিক ir▁stan", + "根据您家门口实际情况设置录像和实时画面功能。": "অ্যান্ড রিয়েল-টাইমপিসিচার... ...প্রকৃতপক্ষের দিকে প্রকৃতপক্ষে ...অনুষ্ঠানের জন্য।", + "可使用时长由具体设置决定。": "ইউজিসিস্টারপেলিকের মাধ্যমে স্পেসিফিকের মাধ্যমে।", + "查看": "ভিউ", + "有人按门铃或发生": "সিওনেটিংস্ গোয়েনবিবেলর", + "异常事件时": "কবলমার", + "不录像": "নোভিউ", + "有人出现、按门铃": "সিওনেপি গাড়ি, রিংস্ট", + "或发生异常事件时": "অরনবনার্মার", + "逗留达到10秒": "ঝরফোর 10-স্কইক", + "约1.5米": "আমাউট", + "随时": "আয়নসাইম", + "立即录像": "পরীক্ষা", + "录像时机": "ভাব", + "有人出现时录像": "ছোট্ট", + "人体侦测距离": "আইউম্যানস", + "查看实时画面": "ভিউরিয়েল-টাইমপিজেক্টর", + "自定义时间": "ছোট্ট", + "当日": "অর্লেন্ডে", + "次日": "উত্স", + "自定义时段": "চিহ্ন", + "发生事件时查看": "ভিউচেনানজেন্টারস", + "实时查看": "রিয়েল-টাইমviewview-action", + "有人在门口出现10秒后开始录像。": "স্যাওনেপ গালারস্টডোরফোর 10 શ્ইক", + "有人按门铃时立即录像。": "ক্যানট্রোর্ড", + "有人出现在门前1.5米范围时启动录像": "ডোরফার ফলস্বরূপ", + "约0.8米": "আমাউট", + "约3.0米": "আমাউট", + "添加指纹失败": "এলাইটেফাইরেড।", + "项": "ডিটইটাইউস", + "播放中": "পেপস্ল্যাসিং", + "下载": "জেন রালোড", + "暂无下载内容": "কনপোর্ট", + "亮度": "ব্যবহার", + "音量": "কুয়ানুম", + "快进至": "দ্রুত", + "快退至": "পূর্ববর্ত্ট", + "暂无视频信息": "নোভিininin", + "加载出错": "লোকোডিংয়ের", + "请单人正对门锁,距离一个成年人手臂长度": "পুরোপুরি ফুটবল ডোর লকন, অ্যান্টার্ম স্লাইসেন্টেথ", + "(约0.6米)。": "(আউটআউট", + "保持脸部无遮挡,露出五官。": "কিশোরফেসসসসহুর্কিউরিতের ডাইরেটরস।", + "准备好了,开始添加": "পর, ঝাল", + "正在录入中...": "কোর্ডিং...", + "添加人脸失败": "তদন্তুর ফেস", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "ব্যান্ডোটারট্রাসিটিংসটিংস, ছদ্মবেশীর লকবিল্ডিজেড।?", + "人脸号": "ফেসnumber", + "虹膜详情": "বিনিস করিলস", + "虹膜号": "নিউইস", + "选择设备类型": "নির্ধারিত হবে", + "照明灯具": "লিজেন্টিং-এফরচারস", + "电动窗帘": "টেক্সট্রিক", + "门窗传感器": "দোয়ার্ডআন্ডবডাউজেন্সর", + "传感器": "নেশাসর", + "清除数据成功": "তথ্য বিজ্ঞাপন", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "দ্বিতীয়তত্ত্বাবধায়ক নেট, হেরেটেরিওয়ের দিকে, কার্ড, ডিগ্রিপ্রিন্ট, এবং রোহরডোরিওসিং met▁ho", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "ভিফ y▁ou", + "看不到操作记录,可能原因有": "বিকশিতন", + "操作记录详情": "অ্যাটারওরেকর্ড", + "操作时间": "অন্তর্ভুক্ত সময়:", + "此模块功能需要锁联网后设置方可生效": "স্পোর্টনিজ", + "用户已存在": "ইউজারলিয়ার", + "钥匙数量已到上限": "ইউপার সীমাবদ্ধ করেছে", + "附近没有可用网关": "স্পোর্টেরিসনো সান সিরিয়ালেবল গোয়েরওয়েরবি।", + "正在创建安全连接...": "বিকশিত... ....", + "监视状态下不能发送录音": "অ্যানটোস্ট্রেন্ড কোর্সিংসিন", + "挂断": "হ্যাংআপ", + "监视中暂不能开锁": "কুসালোকিংনিসোট সান সিউনিয়াবল্ডাব্লুরিং", + "长按说话": "চাপুন", + "松开发送": "পরীক্ষা", + "请输入6位数字开锁密码": "ক্যাম্প্রেস এন্টেটার 6-ডাইটস", + "请输入开锁密码": "ছোট্ট", + "接收者在有效期内可以不限次数使用": "ইয়াক-এর জন্য দেওয়ার জন্য ব্যবহারযোগ্য পৃথিবীকরণের জন্য।", + "接收者可以使用此App开关锁": "পরীক্ষা করা যায়/কনলাকবিনিজপিপি।", + "单次钥匙有效期为1小时,只能使用一次": "একক-সময় ইউবিইসভের জন্য একমাত্র শুধুমাত্র শুধুমাত্র নির্দিষ্ট করতে পারে।", + "接收者可以在有效期内的固定时间段里,不限次数使用": "পরীক্ষার জন্য দেওয়ার জন্য দেওয়ার জন্য দেওয়ার পক্ষে।", + "获取模板失败": "গ্রহণ করো", + "微信通知": "নীতম", + "系统短信": "সিস্টেমস", + "系统邮件": "সিস্টেম", + "模板": "ইম্পালাইট", + "新建模版": "বিকশিত", + "您好,您的密码是": "আচেলো, রিউর নেওয়ার্ডিস", + "密码名字": "ছোটওয়ার্ডের নাম", + "请输入6-9位密码": "ক্যাপিলেস এন্টেটার 6-9 ডিরেজিট ছওয়ার্ড", + "设置密码": "সেট", + "操作成功,密码为": "আদি", + "类型:自定义-永久": "টাইপ:", + "实时播放": "রিয়েল-টাইমপিপ্লেব্যাক", + "点击对讲": "ক্লিক্টোকম", + "长按开锁": "লংপ্রেসtocunlockGenericName", + "接听失败": "ডিফাইরেডটুআনসাইওয়ার", + "请在锁设置中开启远程开锁": "ক্যাপিলাইজ এসব... ...সংকলকিং", + "接听": "অ্যানসাওয়ার", + "截图已保存到相册": "এম-এন-এস সাউ-এডো", + "添加遥控": "অ্যান্ডেড", + "已连接到锁,请按遥控": "নিয়ন্ত্রণে, কোম্পানির কন্ট্রোল", + "遥控号": "নিয়ন্ত্রণ", + "遥控详情": "নিয়োটকন্ট্রোল্লিটাইলস", + "照明": "নিয়ন্ত্রক", + "退出演示模式": "নিয়মিট", + "提示:当前界面为展示界面,添加设备后才能继续使用": "টিপ: বিরোধীদের বিরোধী, অ্যাকাঙ্কনসিটি সিউন্টোইট", + "门已上锁": "থেডোরিসল্যাঙ্কেড", + "您的账号在异地登录,如非本人,请尽快修改密码": "ছোট হাসকাউন্টহ্যাসটিমিনস্টিকেডো", + "开门成功": "টোপেনডোরআই লারএন্ট-এর", + "开门失败": "ছোট্টপেনডোর", + "呼叫提醒": "ক্যান্সাল", + "收到来自": "আইভেদ্রোম", + "锁的呼叫": "লোককল", + "加载数据中": "ব্লুডিং-ডাটাName", + "搜索所有锁类型": "কোআরসার্লককপিস", + "锁电量更新时间": "লক", + "1月": "জিনা", + "2月": "পার্ব", + "3月": "মার", + "4月": "ক্যাপার", + "5月": "মায়", + "6月": "জুন", + "7月": "জুলা", + "8月": "তাগাগ", + "9月": "স্যা", + "10月": "Oct", + "11月": "নভ", + "12月": "ব্লিক", + "热门城市": "আই", + "导出锁数据": "পোর্টlockdataName", + "一键开锁": "এক-চ্যাক্লাক", + "已开通": "উত্স", + "编辑员工": "এডিটওফ", + "一": "জিন", + "二": "টেটও", + "三": "স্ট্রাইস্ট্রে", + "四": "টেফার", + "五": "এক্ষেভ", + "六": "শিরোনাম", + "日": "সুন", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?", + "在线": "কনলাইন", + "离线": "দেউন্টলাইনCity in Ontario Canada", + "购买记录": "পুরস্কার্ড", + "使用记录": "ব্যবহারকারীর কর্তৃক", + "失效时间要大于当前时间": "দীর্ঘকালীন", + "修改名字": "নেম", + "时": "Hour", + "分": "নিউট", + "Amazon Alexa": "Ammogonalexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "/অনুপন্থির", + "支持的国家": "আদিবাস্য", + "支持的国家值": "ইউসা, চা, uk, ঊর্ধ্ব, ডাইডিয়া, germany, ডিফায়েন্স, লি, ইম্পোসি, ইজেড", + "操作流程": "ক্যামেশনprocesscess", + "操作流程值": "1 বিরোধীদ্যালক্যান্ডgatkorethrouthhescartchlockParp\n\n2 দশমিক... ...সম্পোকলকিং... লকটিংয়ের (সংখ্যা ইংলিপিস অফবি-রফ-এফল্ট)। ফিফডোনট্যানস্ট্রিওপশন, থেলক ক্যান্টোনট\n\n3 বিদ্রোহী স্কুই ls টু-এক্সাআন্ড ঊর্ধ্বতন পোস্টার্থে\n\n৪লক্যাটথলকের দিন ইক্সাপপ্প, টেসিতে ইসোলাকক fun\n\n5thelockcanbe equavaedunderroughalexaxa", + "Google Home": "শ্রোগল", + "Action name": "কর্মসূচী", + "ScienerSmart": "ইসিসিভার্ট", + "支持的语言": "আদিবাস্য", + "英语": "সেনডেনলিশ", + "Google Home操作流程的值": "1. .এইচস্টার্টলকপ্পটো অ্যাক্টোক্যাকস্যান্ড ডিগ্রি\n\n2. দ্বিধাবিহীন হাউটস্টার্ডিউপিসোভিশন, thelock CantonesnotlendipportoogleAnhome\n\n3 .এনস্টলথে\n\n৪..অনুপিজিংসপেজ, \"কর্মবৃন্দে\" নির্বাচন করুন\"\n\n৫..পেরার্ফোর \"সাইকিয়ারস্কার্টার্ট\" এবং ব্যবহারকারী ছর্টলাকপ্প-এরকন্টন্ড pas-স্কওয়ার্ডটু", + "密码需至少包含数字/字母/字符中的2种组合": "ইসওয়ার্ডমস্টস্টেটলিয়াস্ট 2ofthefক্লোভিং:", + "已开锁": "কনুকলচকেড", + "已闭锁": "লোকচকেড", + "两次密码不一致哦": "Thepasswordsare pencay", + "中功率": "উইউমপোওয়ার", + "常规使用": "গ্যারিউস", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "অ্যারাস্টার্টিউইসপোভেরেডন, প্রেস এবং টিপেস্টেট্রিসেট গানttonfor5sononds, এবং চক্লিক উইভেন্থে-উইন্টার", + "扫描设备": "সিস্কান্লিভাইস", + "删除失败,网关可能已经离线,是否强制删除该数据?": "ডাইজেজেশনিমেরিলেড। টিভওয়েমাইয়ানভিগনোনোআরলাইন। ডো ডাউনডেটা?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_cs.json b/lan/lan_cs.json new file mode 100644 index 00000000..a4f55b06 --- /dev/null +++ b/lan/lan_cs.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Hvězdný zámek", + "锁通通": "Zamknout přes", + "点击开锁,长按闭锁": "Touch to unlock, hold to lock", + "考勤": "Účast", + "考勤设置": "Nastavení účasti", + "电子钥匙": "Ekeys", + "添加卡": "Přidat kartu", + "卡号": "Číslo karty", + "添加指纹": "Přidat otisk prstů", + "指纹号": "Číslo otisků prstů", + "遥控": "Vzdálený", + "添加人脸": "Přidat tvář", + "门锁日志": "Zámek dveří", + "密码号": "Číslo hesla", + "添加者": "Operátor", + "添加时间": "Čas", + "重置": "Resetovat", + "请输入手机号或者邮箱": "Telefonní číslo/e-mail", + "工作时间": "Pracovní čas", + "工作日设置": "Nastavení pracovního dne", + "星期一": "Pondělí", + "星期二": "Úterý", + "星期三": "Středa", + "星期四": "Čtvrtek", + "星期五": "Pátek", + "星期六": "Sobota", + "星期日": "Neděle", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Svá", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Sun", + "群发钥匙": "Odeslat více ekejů", + "锁": "Zámek", + "请添加": "Příjemce", + "允许远程开锁": "Vzdálené odemknutí", + "请输入验证码": "Kód ověřování", + "获取密码": "Generovat přístupový kód", + "请给密码命名": "Zadejte název tohoto kódu", + "密码有限期为6个小时,只能使用一次": "Tento přístupový kód musí být použit do 6 hodin od aktuálního času nebo bude pozastaven z bezpečnostních důvodů. tento přístupový kód lze použít pouze jednou.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Ručně zadejte 6-9 číslic jako heslo. Může být přidán telefonem bluetooth vedle zámku, nebo vzdáleně přidán přes bránu", + "获取": "Get", + "添加": "Přidat", + "删除公司": "Smazat společnost", + "密码详情": "Informace o kódu", + "修改密码": "Změnit heslo", + "添加虹膜": "Přidat iris", + "添加门磁": "Senzor dveří", + "添加无线键盘": "Bezdrátová klávesnice", + "添加手掌": "Přidat dlaň", + "请输入员工账号": "Zadejte účet zaměstnance", + "批量授权锁": "Udělit více zámků", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Oprávněný správce bude mít většinové oprávnění k provozu tohoto zámku.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Tato funkce umožňuje odemknout inteligentní zámek na dálku přes bránu. tato funkce lze zapnout nebo vypnout pouze prostřednictvím bluetooth.", + "排列方式": "Typ seznamu", + "早到榜": "První seznam", + "迟到榜": "Pozdní seznam", + "当前模式": "Aktuální režim", + "勤奋榜": "Pracovní tvrdý seznam", + "延迟时间": "Čas zpoždění", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Zámek se automaticky zamkne po uplynutí doby. prosím, odemkněte ji na jednou poprvé, aby bylo nastavení k dispozici.", + "时间": "Čas", + "开始时间": "Čas zahájení", + "结束时间": "Konec času", + "工作时间设置": "Nastavení pracovní doby", + "常开模式": "Režim průchodu", + "常开时间": "V tomto období", + "常开日期": "V těchto dnech", + "添加员工": "Přidat personál", + "节假日": "Dovolená", + "打卡方式": "Metoda", + "员工是否有钥匙": "Už má ekey", + "上班时间": "Počáteční čas", + "下班时间": "Čas uzavření", + "本周": "Tento týden", + "单休": "Jednodenní víkend", + "双休": "Dvoudenní víkend", + "单双休": "Jednodenní víkend", + "年": "Rok", + "月": "Měsíc", + "放假日期": "Dovolená", + "补班日期": "Pracovní dny", + "添加假日": "Přidat dovolenou", + "开始日期": "Datum zahájení", + "必填": "Požadované", + "结束日期": "Datum ukončení", + "日榜": "Denně", + "月榜": "Měsíční", + "考勤记录": "Záznamy", + "假日信息": "Dovolená info", + "基本信息": "Základy", + "无线键盘": "Bezdrátová klávesnice", + "选择无线键盘": "Přidat klávesnici", + "门磁": "Senzor dveří", + "自动闭锁": "Auto lock", + "锁声音": "Zámek zvuku", + "防撬报警": "Pohotovostní upozornění", + "重置键": "Tlačítko reset", + "锁时间": "Zámkové hodiny", + "诊断": "Diagnostikovat", + "上传数据": "Nahrát data", + "导入其他锁数据": "Import frome další zámek", + "锁升级": "Aktualizace firmwaru", + "标记房态": "Stav pokoje", + "开锁提醒": "Odemknout oznámení", + "微信二维码": "Odemknout qr kód", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Lidé s elektronickými klíči mohou otevřít dveře skenováním tohoto qr kódu prostřednictvím wechatu. Qr kód každého zámku je odlišný. Můžete ho vytisknout a vložit ho vedle odpovídajícího zámku.", + "锁编号": "Číslo zámku", + "电量": "Baterie", + "锁分组": "Skupina zámků", + "选择分组": "Vybrat skupinu", + "创建新分组": "Vytvořit skupinu", + "管理员开锁密码": "Správce hesla", + "更新": "Aktualizace", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Úroveň baterie bude aktualizována pomocí brány nebo telefonu bluetooth", + "当屏幕闪烁时,点击下一步": "Klepněte na tlačítko další, když klávesnice bliká", + "输入*529#或按设置键": "Zadejte README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # nebo stiskněte klávesu nastavení", + "长按重置键2秒": "Stiskněte a podržte tlačítko reset 2 sekundy", + "附近的设备": "Zařízení v blízkosti", + "暂无数据": "Žádné údaje", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Stav dveří se bude schopen získat pomocí senzoru dveří spolu s bránou. pouze jeden senzor je povolen spojovat se zámkem.", + "开始": "Začátek", + "全天": "Všechny hodiny", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Můžete nastavit více časových období pro režim průchodu. během nastavených časových období zůstane zámek po odemčení v otevřeném stavu.", + "请选择锁音量": "Vyberte svazek zámku", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Tím, že zapnete, uslyšíte zvuk ze zámku.", + "低": "Nízká", + "较低": "Středně nízká", + "中": "Střední", + "较高": "Střední vysoká", + "高": "High", + "开启后,锁被撬动时,会发出报警声": "Tím, že zapnete, povolíte poplach.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Vypnutím tlačítka reset je zakázána.", + "校准时间": "Kalibrační čas", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnóza je přečíst informace o konfiguraci uvnitř zámku a nahrát ji tak, aby pracovníci mohli analyzovat příčinu selhání.", + "上传": "Nahrát", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Nahrát data ze zámku na server. to může trvat několik minut", + "请选择要从哪把锁导入": "Vyberte zámek pro import z", + "有新版本": "Mít novou verzi", + "当前版本": "Aktuální verze", + "升级": "Aktualizace", + "空闲": "Prázdné", + "已入住": "Obsazen", + "多语言": "Jazyky", + "添加锁": "Přidat zámek", + "锁地址": "Adresa uzamčení", + "选择锁类型": "Vybrat typ zámku", + "NFC无源锁": "Nfc pasivní zámek", + "添加设备": "Přidat zařízení", + "网关": "Brána", + "客服": "Zákaznický servis", + "设置": "Nastavení", + "更多设置": "Více sady", + "消息推送": "Tlačítko oznámení", + "锁用户管理": "Zamknout uživatele", + "拥有的钥匙": "Ekeys přidružené k tomuto uživateli", + "批量授权": "Správa orgánů", + "关联设备": "Přidružené zařízení", + "关联姓名": "Přidružený název", + "转移智能锁": "Přenos zámku", + "选择锁": "Zámek obrazovky", + "接收人信息": "Příjemce", + "转移网关": "Přenos brány", + "锁屏": "Zámek obrazovky", + "已关闭": "Vypnuto", + "已开启": "Na", + "开启": "Zapnout", + "确定要开启重置键?": "Pokračovat v zapnutí tlačítka reset?", + "确定要关闭重置键?": "Pokračovat v zakázání tlačítka reset?", + "隐藏无效开锁权限": "Skrýt neplatný přístup", + "APP开锁时需手机连网的锁": "Zámky vyžadující telefon online", + "增值服务": "Služby", + "关于": "O", + "退出": "Odhlášení", + "删除账号": "Smazat účet", + "个人信息": "Informace o účtu", + "头像": "Avatar", + "昵称": "Přezdívka", + "请输入昵称": "Zadejte prosím svou přezdívku", + "修改昵称": "Přejmenovat", + "修改账号": "Upravit účet", + "重置密码": "Obnovit heslo", + "安全问题": "Bezpečnostní otázka", + "为了你的账号安全,修改账号前请先使用验证码验证": "Pro bezpečnost vašeho účtu použijte před úpravou účtu ověření hesla účtu", + "请输入新账号": "Zadejte nový účet", + "找回密码和登录新设备时,可通过绑定的手机验证": "K obdržení ověřovacího kódu bude použit závazné telefonní číslo.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Vazba e-mailu bude použita k obdržení ověřovacího kódu.", + "原密码": "Aktuální heslo", + "新密码": "Nové heslo", + "确认密码": "Potvrdit heslo", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "V případě, že váš telefon ztratil, můžete se přihlásit na nový telefon odpovědí na bezpečnostní otázky.", + "问题一": "Otázka 1", + "问题二": "Otázka 2", + "问题三": "Otázka 3", + "请输入你的答案": "Please type your answer", + "即将到期": "Zanedlouho vyprší", + "去授权": "Přejít na autorizaci", + "修改名称": "Upravit název", + "状态": "Stav", + "WiFi名称": "Název wifi", + "网络MAC": "Síťový mac", + "网关升级": "Aktualizace brány", + "网关连接的锁": "Zámek (y) připojený k této bráně", + "信号强": "Silná", + "选择网关类型": "Zvolte typ brány", + "添加网关": "Přidat bránu", + "重新通电": "Znovu připojit napájení", + "指示灯": "Indikační světlo", + "选择网关": "Zvolte bránu", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g není podporována,. vyberte wifi 2.4g.", + "WiFi密码": "Wifi passward", + "请输入WiFi密码": "Zadejte heslo wifi", + "网关名称": "Název brány", + "请输入网关名称": "Zadejte název brány", + "IP地址": "Ip adresa", + "子网掩码": "Maska podsítě", + "默认网关": "Výchozí brána", + "自动获取DNS服务器地址": "Automaticky získat adresu serveru dns", + "首选DNS": "Preferovaný dns", + "备选DNS": "Alternativní dns", + "不使用静态IP": "Nepoužívá se statické ip", + "使用静态IP": "Použít statické ip", + "请输入IP地址": "Zadejte adresu ip", + "请输入子网掩码": "Zadejte masku podsítě", + "请输入默认网关": "Zadat výchozí bránu", + "所有锁": "Všechny zámky", + "搜索所有类型的锁": "Skenovat všechny typy zámků", + "门锁": "Zámek dveří", + "挂锁": "Padlock", + "保险箱锁": "Bezpečný zámek", + "智能门禁": "Inteligentní ovládání přístupu", + "车位锁": "Parkovací zámek", + "摸亮触摸屏": "Stiskněte klávesu a aktivujte klávesnici", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Stiskněte tlačítko pro aktivaci zámku a vložte ji do režimu páření.", + "附近的锁": "Blízké zámky", + "如需修改名字请重新命名,点击确定添加锁": "Chcete-li změnit název, přejmenujte, klepněte na tlačítko ok pro přidání zámku", + "添加锁时,手机必须在锁旁边": "Při přidání zámku musí být telefon vedle zámku.", + "登录": "Přihlášení", + "注册": "Registrovat", + "我已阅读并同意": "Četl jsem a souhlasil", + "验证码": "Kód", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Vaše heslo musí mít 8-20 znaků a musí obsahovat minimálně dva typy čísel, písmen a symbolů.", + "手机": "Telefon", + "邮箱": "Email", + "请输入邮箱": "Zadejte e-mail", + "国家/地区": "Země/region", + "你所在的国家/地区": "Vaše země/region", + "选择国家/地区": "Vyberte si svou zemi nebo region", + "获取验证码": "Získat kód", + "商务合作": "Business", + "电脑网页版": "Webový systém", + "酒店系统": "Hotel system", + "说明书网页版": "Uživatelská příručka", + "高级功能": "Rozšířená funkce", + "记录保存": "Uchovávání záznamů", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Sms lze použít k odeslání přístupových kódů a informací o ekey příjemci.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mailem lze použít pro odeslání přístupových kódů a informací o ekey příjemci.", + "购买实名认证提示": "Poté, co je funkce povolena, musíte použít heslo otisků prstu, obličeje nebo účtu k otevření aplikace. Není nutné znovu ověřit po dobu 3 minut", + "请选择你希望的实名认证频次": "Vyberte požadovanou frekvenci ověření skutečného jména.", + "仅首次": "Poprvé", + "每日一次": "Jednou denně", + "每周一次": "Jednou týdně", + "每月一次": "Jednou za měsíc", + "当前状态": "Aktuální stav", + "试用中": "Při zkoušce", + "高级功能权益内容": "Pokročilé funkce", + "短信模板": "Šablona sms", + "邮件模板": "Šablona e-mailu", + "发卡工具": "Kodér karty", + "购买高级功能须知": "Upozornění", + "购买高级功能提示": "Více pokročilých funkcí jsou ve vývoji, a pokud je potřebujete, jste vítáni na otevření služby na základě počtu zámků. Pokročilé funkce jsou k dispozici pouze pro vaše zámky. Pokud jste autorizovaný správce, obraťte se na horního správce zámku pro otevření služby.", + "免费体验": "Free trial", + "立即开通": "Otevřít nyní", + "购买短信": "Koupit sms", + "购买邮件": "Koupit e-mail", + "购买实名认证次数": "Doba ověření skutečného jména", + "开通高级功能": "Povolit rozšířenou funkci", + "选择套餐": "Zvolte balíček", + "支付方式": "Způsob platby", + "支付宝": "Alipay", + "去支付": "Platit", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "You are allowed to define the message by yourself. it is used to send information of pascode and ekey to others.", + "高级功能仅能用于你自己的锁": "Rozšířená funkce může být použita pouze vlastní zámky.", + "新建模板": "Šablona vytváření", + "类型": "Typ", + "模版内容": "Obsah šablony", + "预览": "Náhled", + "房间名": "Pokoj", + "预计产生短信条数": "Odhadované segmenty zpráv", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Tato funkce vám umožní skrýt hesla, ekey, karty a otisky prstů, které jsou neplatné po určitou dobu.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Uživatelský telefon je povinen být online pro odemčení těchto vybraných zámků pomocí aplikace.", + "配置WiFi": "Konfigurace wifi", + "请输入WiFi名字": "Zadejte název wifi", + "WiFi配网": "Distribuční síť wifi", + "胁迫卡": "Stresová karta", + "员工是否有密码": "Již má heslo", + "员工是否有卡": "Již má kartu", + "员工是否有指纹": "Již nastavit otisk prstů", + "获取钥匙": "Získat klíč", + "获取卡": "Získat kartu", + "获取指纹": "Získat otisk prstů", + "安全验证": "Ověření totožnosti", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Všechny informace o vašem účtu budou z platformy odebrány natrvalo a nemohou být obnoveny.", + "监控": "Monitor", + "视频日志": "Protokol videa", + "开门器": "Otvírač dveří", + "面容开锁": "Tvář odemkne", + "开门方向设置": "Nastavit směr otevření", + "电机功率设置": "Nastavení motorového výkonu", + "开锁时是否需联网": "Je-li při odblokování zapotřebí internet", + "选择要加入分组的锁": "Vyberte zámky pro přidání do této skupiny", + "锁数量": "Počet zámků", + "小米IOT平台": "Platforma xiaomi iot", + "面容开锁设置": "Obličejová odemkne nastavit", + "感应距离": "Senzační vzdálenost", + "防误开": "Zabránit špatnému otevření", + "防误开已关闭,关门后仍可使用面容开锁": "Zabránit chybnému otevření bylo zavřeno, po uzavření dveře může stále používat tvář odemknout", + "添加和使用面容开锁时": "Přidat a použít tvář při odblokování", + "添加和使用面容开锁时提示": "\n1, please try to keep a single person in front of the door operation;\n2, please stand in front of the door lock about 0.5 ~ 0.8 meters, facing the door lock;\n3. please keep your face unobstructed and expose your facial features;\n4. when face recognition is abnormal, you can touch any key on the digital keyboard to restart face recognition manually.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Prosím, vyberte výkon motoru pečlivě podle skutečné situace zámku dveří:", + "小功率:": "Miniwatt:", + "耗电少": "Nižší spotřeba energie", + "大功率": "High-power:", + "大功率提示": "Pokud se uzamkací jazyk nemůže při odblokování odebrat normálně, nebo je třeba řídit", + "开门方向设置提示": "Prosím, opatrně vyberte směr otevřít dveře svého domova (pokud zvolíte špatný směr, nebudete moci správně otevřít a zavřít dveře):", + "左开": "Otevřít vlevo", + "右开": "Otevřít vpravo", + "判断方法:": ":", + "判断方法内容": "Muž stál před domem, obrátil se ke vstupním dveřím.", + "录像时段": "Video slot", + "密码": "Passcodes", + "卡": "Karty", + "指纹": "Otisk prstů", + "人脸": "Tvář", + "配件商城": "Lock mall", + "公司名称": "Název společnosti", + "请输入公司名字": "Zadejte název společnosti", + "提示": "Náznak", + "是否删除?": "Jestli chcete odstranit?", + "员工信息": "Informace o personálu", + "员工": "Zaměstnanci", + "打卡方式无效": "Nedostupné", + "中国": "Čína", + "选择钥匙": "Vyberte si ekey", + "编辑": "Upravit", + "无": "Ne", + "有": "Ano", + "请输入姓名": "Zadejte název", + "获取人脸": "Getting faces", + "选择密码": "Zvolte přístupový kód", + "选择卡": "Zvolte kartu", + "选择指纹": "Zvolte otisk prstů", + "选择人脸": "Vybrat tvář", + "员工是否有人脸": "Zda má zaměstnanec tvář", + "同时删除员工钥匙": "Smazat jeho/její ekey", + "删除": "Delet", + "确定要删除员工吗?": "Smazat tohoto zaměstnance", + "月统计": "Měsíční statistiky", + "迟到": "Pozdní", + "早退": "Odejít brzy", + "未打卡": "Žádný záznam", + "钥匙将在": "Tato ekey skončí v", + "天后失效": "Den (y)", + "电量更新时间:": "Doba aktualizace baterie:", + "新增配件": "Přidat", + "钥匙不可用": "Klíč není k dispozici", + "正在开锁中...": "Odemknutí...", + "你的钥匙": "Váš klíč", + "常开模式启动!长按闭锁": "Otevřený režim byl zahájen! Dlouhý stisk k zamčení", + "演示模式": "Demo režim", + "请先同意用户协议及隐私政策": "Nejprve se dohodněte na uživatelské dohodě a zásadě ochrany osobních údajů", + "用户协议": "Uživatelské podmínky", + "隐私政策": "Zásady ochrany osobních údajů", + "注册成功": "Registrace úspěšná", + "你所在的": "Jsi v tom.", + "手机号": "Telefonní číslo", + "忘记密码": "Zapomněla jsem heslo", + "重置成功": "Resetovat úspěch", + "确定要退出吗?": "Odchod?", + "功能暂未开放": "Funkce ještě není otevřena", + "设置成功": "Úspěšně nastavit", + "删除成功": "Úspěšně odstranit", + "单次": "Jednorázová", + "永久": "Trvalé", + "限时": "Časový", + "自定义": "Vlastní", + "清空码": "Vymazat", + "循环": "Opakující se", + "工作日": "Pracovní den", + "每日": "Denně", + "周末": "Víkend", + "确定要删除吗?": "Smazat?", + "该锁的密码都将被删除": "Všechny heslové kódy pro tento zámek budou odstraněny", + "已过期": "Neplatný", + "该锁的电子钥匙都将被删除": "Všechny ekeys pro tento zámek budou odstraněny", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Smazat všechny ekeys přidružené k této ekey. tento krok nelze vrátit!", + "删除钥匙会在用户APP连网后生效": "Ekey bude odstraněn", + "有效时间": "Efektivní čas", + "接收者": "Příjemce", + "仅管理自己创建的用户": "Spravovat pouze vlastní uživatele", + "远程开锁": "Vzdálené odemknutí", + "请输入钥匙名称": "Zadejte název klíče", + "修改成功": "Změnit úspěch", + "冻结": "Zmrazit", + "解除冻结": "Thaw", + "授权": "Povolit", + "取消授权": "Deautorizovat", + "同时解冻其发送的钥匙": "Thaw all ekeys issued by this user", + "会在用户APP连网后生效": "Tato ekey bude rozmrazena, když se uživatelská aplikace připojí k síti.", + "同时冻结其发送的钥匙": "Zmrazit všechny ekeys vydané tímto uživatelem", + "冻结会在用户APP连网后生效": "This ekey will be frozen when the user's app connects to a network", + "取消授权会在用户APP连网后生效": "Uživatel ztratí oprávnění, když se uživatelská aplikace připojí k síti.", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Oprávněný uživatel má téměř stejná oprávnění jako správce zámků (např. schopnost odeslat ekeys a hesla)", + "失效时间需晚于生效时间": "Doba platnosti musí být pozdější než doba účinnosti", + "生效时间需晚于当前时间": "Účinný čas musí být pozdější než aktuální čas", + "失效日期需晚于生效日期": "Datum platnosti musí být pozdější než datum účinnosti", + "修改有效期": "Změna období", + "生效日期": "Datum zahájení", + "失效日期": "Datum ukončení", + "开锁": "Odemknout", + "开锁成功": "Odemknout úspěch", + "请选择锁": "Vyberte zámky", + "请选择接收者": "Vyberte prosím přijímač", + "请选择有效期": "Vyberte lhůtu platnosti", + "请选择发送方式": "Prosím, vyberte způsob odeslání", + "请选择结束时间": "Prosím, vyberte koncový čas", + "完成": "Kompletní", + "有效日": "Cyklus na", + "发送成功": "Odeslat úspěch", + "请选择开始时间": "Prosím, vyberte počáteční čas", + "选择用户": "Vybrat příjemce", + "已选中": "Vybráno", + "确定": "Ok", + "请选择要发送的锁": "Vyberte zámky", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Ověření reálného jména tváře odkazuje na potřebu uživatele ověřit jeho tvář před odblokováním aplikace telefon a ověření může být odemčeno.", + "分享": "Sdílet", + "请输入接收者账号": "Zadejte prosím účet příjemce", + "接收者号码未注册,请重新发送": "Číslo přijímače není zaregistrováno, prosím zašlete znovu", + "是否发送电子钥匙给未注册账号": "Chcete poslat ekey na nový účet", + "取消": "Storno", + "标记成功": "Označit úspěch", + "微信好友": "Wechat přátelé", + "短信": "Sms", + "邮件": "Email", + "更多": "Více", + "您好,您的电子钥匙生成成功": "Dobrý den, váš elektronický klíč je úspěšně generován", + "生效时间不能小于当前时间": "Efektivní čas nemůže být menší než současný čas", + "结束时间不能小于当前时间": "Konec času nemůže být menší než aktuální čas", + "是否为管理员": "Je to správce", + "已连接到锁,请将卡靠近门锁的读卡区": "Připojeno. umístěte kartu proti čtenáři karet", + "尝试连接设备...": "Spojení se zámkem, prosím počkejte...", + "地理位置": "Zeměpisná poloha", + "检查以确保以下地址是正确的": "Zkontrolujte, zda je následující adresa správná.", + "地图加载中,请稍候。。": "Mapa je načítána, prosím počkejte...", + "跳过": "Přeskočit", + "还未获取到位置信息哦,请耐心等待一下!": "Informace o umístění dosud nebyly získány, prosím počkejte trpělivě!", + "请填写信息": "Prosím, vyplňte informace", + "有效期": "Doba platnosti", + "生效时间": "Čas zahájení", + "失效时间": "Konec času", + "上传成功": "Úspěšně nahrané", + "未生效": "Neaktivní", + "已生效": "Efektivní", + "指纹详情": "Informace o otisku prstů", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Budete muset umístit prst na senzor několikrát. prosím, postupujte podle pokynů...", + "开始添加": "Začátek", + "请将您的手指按下": "Umístěte prst na snímač", + "根据提示,抬起手指后再进行下一次指纹采集": "Postupujte podle pokynů... budete muset odstranit a umístit prst na senzor pro další záznam", + "添加成功": "Přidat úspěch", + "更新成功": "Aktualizovat úspěch", + "搜索": "Hledat", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Po resetování bude karta zámku odstraněna, chcete resetovat?", + "已失效": "Neplatný", + "卡详情": "Informace o kartě", + "请输入": "Zadejte prosím zde", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Vypnutím zámek zůstane odemčen celý den, dokud nebude ručně zamčen.", + "请输入小于或等于60的数字": "Zadejte číslo menší než 60", + "操作成功": "Operace úspěšná", + "管理员密码相同,无需修改": "Heslo správce je stejné a nemusí být změněno.", + "请输入6-9位数字": "Délka 6-9 číslic", + "请输入6-9位管理员密码": "Zadejte prosím heslo správce 6-9 číslic", + "请输入新的管理员密码": "Zadejte nové heslo správce", + "未分组": "Neseskupeno", + "请输入分组名称": "Vytvořit skupinu", + "创建成功": "Vytvořit úspěch", + "设置锁分组成功": "Úspěšně nastavit skupinu zámků", + "电池1电量": "Baterie 1", + "电池2电量": "Baterie 2", + "电量更新时间": "Doba aktualizace baterie", + "锁电量更新成功": "Úspěch aktualizace zámku", + "您的钥匙未生效": "Váš klíč není účinný.", + "您的钥匙已冻结": "Váš klíč byl zmrazený.", + "您的钥匙已过期": "Váš klíč vypršel.", + "常开模式开启": "Zámek je v režimu průjezdu", + "超级管理员": "Super admin", + "授权管理员": "Autorizovaný správce", + "普通用户": "Obyčejný uživatel", + "余": "Bilance", + "天": "Den", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Po odstranění zámku budou všechny informace smazány společně, jste si jistý, že chcete odstranit zámek?", + "请输入登录密码": "Zadejte prosím heslo aplikace", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Nepodařilo se odstranit zařízení, ujistěte se, že zařízení je v blízkosti zařízení, zařízení není připojeno a zařízení je zapnuto.", + "用户无权限": "Uživatel nemá povolení", + "创建公司后,考勤功能才能使用": "Nejprve vytvořte společnost.", + "是否删除钥匙?": "Smazat tohle ekey?", + "邮箱绑定成功": "Úspěch závazku e-mailem", + "手机绑定成功": "Úspěch závazku mobilního telefonu", + "网络访问失败,请检查网络是否正常": "Žádost se nezdařila. síť není k dispozici, zkontrolujte a připojte zařízení k 3g/4g/wifi", + "清空": "Vymazat", + "是否清空?": "Čistý?", + "消息详情": "Informace o zprávě", + "创建时间": "Čas vytvoření", + "管理员详情": "Podrobnosti správce", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Pokud vás někdo nutí otevřít dveře, můžete použít tuto kartu. poplašná zpráva bude odeslána správcům. chcete-li tuto funkci použít, ujistěte se, že je váš zámek online.", + "请不要将胁迫卡用于日常开锁": "Please do not use the forced card for daily use.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Pokud vás někdo nutí otevřít dveře, můžete použít tento otisk prstů. poplašná zpráva bude odeslána správcům. chcete-li tuto funkci použít, ujistěte se, že je váš zámek online.", + "请不要将胁迫指纹用于日常开锁": "Please do not use the forced fingerprint for daily use.", + "创建公司": "Vytvořit společnost", + "公司名称不能超过30个字符": "Název společnosti nemůže překročit 30 znaků", + "公司名称不能小于6个字符": "Název společnosti nemůže být menší než 6 znaků", + "WIFI列表": "Seznam wifi", + "刷新": "Aktualizace", + "手动配网": "Manuální distribuční síť", + "远距离": "Dlouhá vzdálenost", + "中距离": "Střední vzdálenost", + "近距离": "Krátká vzdálenost", + "锁时间更新成功": "Úspěch aktualizace času uzamčení", + "锁用户": "Zamknout uživatele", + "请选择常开日期": "Vyberte datum otevření", + "结束时间不能小于开始时间哦": "Koncový čas nemůže být menší než počáteční čas", + "介绍": "Náš příběh", + "个人信息收集清单": "Seznam shromažďování osobních informací", + "应用权限说明": "Popis oprávnění aplikace", + "第三方信息共享清单": "Seznam sdílení informací třetích stran", + "请选择您的位置": "Vyberte si umístění", + "请先选择位置": "Please select the location first", + "管理员密码": "Správce hesla", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Pokud potřebujete změnit, zadejte nové heslo správce (6 číslic), klepněte na tlačítko ok pro změnu", + "修改": "Upravit", + "网络摄像头": "Kamera", + "重命名": "Přejmenovat", + "分组下的锁将被移到未分组里": "Zámky pod skupinou budou přesunuty do neseskupené", + "编辑成功": "Upravit úspěch", + "厂商": "Výrobce", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Poté, co je heslo vytvořeno, použijte jej jednou pro aktivaci před 23:59 ve stejný den, jinak bude neplatná po 0 hodině. Poté, co je heslo aktivováno, může být použito neomezeně v rámci doby platnosti.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Poté, co je heslo vytvořeno, použijte ji před 23:59 ve stejný den, jinak bude neplatná po 0 hodině. The clear code is used to clear all the password generated before 0 o'clock today.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Poté, co je heslo vytvořeno, použijte ji před 23:59 ve stejný den, jinak bude neplatná po 0 hodině.", + "清空密码底部提示": "Heslo je platné do 23:59 v den vyprázdnění", + "相机": "Kamera", + "相册": "Fotografie", + "读写": "Úložiště", + "定位": "Location", + "需要访问相机权限才能拍照上传文件例如头像上传": "Přístup k fotoaparátu je nutný k tomu, aby bylo možné vyfotit fotografie a nahrát soubory, jako je například nahrávání profilového obrázku.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "K načtení souborů a avatarů pomocí obrázků alba je zapotřebí přístup k fotoaparátu.", + "需要访问读写权限才能使用本地图片上传头像": "Přístup k oprávněním pro čtení a zápis je nezbytný k nahrávání avatarů pomocí místních obrázků", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "K použití funkce přidat klíč je zapotřebí přístup k informacím o umístění", + "申请": "Aplikace", + "权限": "Povolení", + "不允许": "Není povoleno", + "允许": "Povoleno", + "权限被拒绝": "Povolení odepřeno", + "请手动在系统设置中开启": "Please enable it manually in the system settings", + "权限以继续使用应用": "Oprávnění k pokračování v používání aplikace.", + "去设置": "Jdi to nastavit.", + "当前网络": "Aktuální síť", + "位置信息": "Informace o místě", + "请输入wifi名称": "Zadejte název wifi", + "虹膜": "Iris", + "手掌": "Palma", + "商城": "Mall", + "我的": "My", + "微信公众号推送": "Veřejný účet wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Chcete-li otevřít wechat a přijímat poplašné zprávy, musíte nejprve věnovat pozornost veřejnému účtu skye smart lock wechat, uložte qr kód a použijte wechat k skenování nastavení", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Pro použití informací o umístění funkce přidat klíč je zapotřebí přístup k oprávněním bluetooth.", + "请输入Email": "Zadejte e-mail", + "请输入手机号": "Zadejte telefonní číslo", + "家人到家": "Rodinný člen přijel domů", + "添加家人": "Přidat člena rodiny", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Není-li zámek připojený k internetu, nelze včas odeslat připomenutí pro heslo, kartu, otisk prstů a jiné metody otevírání dveří.", + "消息提醒": "Připomínka", + "开门通知": "Oznámení o zahájení", + "N天未开门": "N days without door opening", + "门未关好": "Dveře nejsou zavřené.", + "防拆报警": "Poplach", + "低电量提醒": "Nízká baterie", + "胁迫开门": "Nucené otevření dveří", + "有人按门铃": "Někdo zazvoní na zvonek", + "有人出现在门口": "Někdo se objeví u dveří.", + "提醒方式": "Způsob připomenutí", + "开门方式": "Metoda otevření dveří", + "请选择": "Vyberte prosím", + "家人": "Rodinný člen", + "保存": "Uložit", + "APP推送": "Aplikace push", + "管理员": "Admin", + "未启用": "Není povoleno", + "已启用": "Povoleno", + "省电模式": "Režim úspor energie", + "逗留抓拍模式": "Zůstaňte v režimu zachycování", + "实时监控模式": "Režim monitorování v reálném čase", + "自定义模式": "Vlastní režim", + "猫眼设置": "Nastavení očí kočky", + "猫眼工作模式": "Pracovní režim kočičího oka", + "自动亮屏": "Automatická jasná obrazovka", + "亮屏持续时间": "Obrazovka včas", + "逗留警告": "Vydržet varování", + "异常警告": "Abnormální varování", + "短信提醒": "Sms", + "邮件提醒": "Email", + "N天未开门提醒": "N days without door opening", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Pokud vás někdo nutí otevřít zámek, můžete použít tento otisk prstů. Poplašná zpráva bude odeslána správcům. chcete-li tuto funkci použít, ujistěte se, že je zámek online.", + "胁迫指纹": "Nucený otisk prstů", + "指纹列表": "Seznam otisků prstů", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Po zadaném čase, není-li zámek otevřen, systém zašle připomínací zprávu určenému příjemci. Tato funkce vyžaduje, aby byl zámek připojený k internetu.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Po zapnutí připomínky, pokud je uzamkací baterie nižší než 20%, 10% a 5%, zašle systém určenému příjemci připomenutí.", + "未开门时间": "Dny bez otevření dveří", + "添加和使用面容开锁时:": "Přidat a použít obličej při odblokování:---* README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh", + "关锁": "Zavřít zámek", + "功能": "Funkce", + "配件": "Části", + "云存": "Cloud storage", + "本地": "Tato lokalita", + "3天滚动储存": "3 dny skladování", + "去升级": "Aktualizovat nyní", + "下载列表": "Stáhnout seznam", + "已下载": "Stažené", + "全部视频": "Všechny videa", + "已为本设备免费提供3大滚动视频储存服务": "Pro toto zařízení byly bezplatně poskytovány tři služby scrolling video storage.", + "视频播放": "Přehrávání videa", + "全选": "All", + "请选择要删除的视频": "Vyberte video, které chcete smazat.", + "请选择要下载的视频": "Vyberte video, které chcete stáhnout.", + "欢迎使用": "Welcome to use", + "用户协议和隐私政策概要": "Souhrn uživatelské dohody a zásad ochrany osobních údajů", + "协议概要": "Souhrn protokolu", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Thank you for using this application. Přikládáme velký význam vaší osobní informaci a ochraně soukromí. Před použitím tohoto produktu si ho prosím pozorně přečtěte", + "《用户协议》": "Uživatelské podmínky", + "和": "A", + "《隐私政策》": "◆ Zásady ochrany osobních údajů", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Celý obsah. Kliknutím na \"souhlasím\" souhlasíte a akceptujete všechny podmínky. Pokud se rozhodnete nesouhlasit, nebudete moci používat naše produkty a služby a aplikaci ukončíte.", + "不同意": "Nesouhlasí", + "同意": "Souhlasím.", + "该功能是高级功能,请开通后再使用": "Toto je pokročilá funkce. Prosím, zapněte to nejprve.", + "常用程序": "Společné programy", + "该锁已被重置": "Zámek byl obnoven", + "需要访问读写权限才能使用手动升级固件": "Pro ruční aktualizaci firmwaru je zapotřebí přístup k oprávněním pro čtení a zápis", + "错误D固件,请选择正确的文件": "Chybný firmware, prosím, vyberte správný soubor", + "非SYD固件,请选择正确的文件": "Non syd firmware, please select the correct file", + "文件校验失败 0x01": "Ověření souboru selhalo 0x01", + "解析元数据失败,请选择正确的文件": "Nepodařilo se analyzovat metadata, vyberte prosím správný soubor", + "文件校验失败 0x02": "Ověření souboru selhalo 0x02", + "文件校验失败 0x03": "Ověření souboru selhalo 0x03", + "固件升级完成": "Aktualizace firmwaru byla dokončena", + "记录": "Záznamy", + "开通高级功能后才可以对锁进行管理": "Please enable advanced function first to manage locks.", + "去开通": "Povolit", + "实名认证": "Ověření skutečného jména", + "当前剩余数量": "Zbývající", + "购买": "Koupit", + "实名认证为付费功能,请购买后再使用": "True-name authentication is a paid function, please use it after purchase", + "密码不一致哦": "Hesla jsou nekonzistentní", + "退出添加": "Přestat přidávat", + "管理员已满": "Admin full", + "用户已满": "Uživatel je plný", + "锁上面添加指纹已满": "Přidat otisk prstů na zámku je plný", + "指纹已存在": "Otisk prstů již existuje.", + "锁上面添加人脸已满": "Lock above add face is full", + "人脸已存在": "Obličej už existuje.", + "锁上面添加卡已满": "Zamknout nad přidat kartu je plná", + "卡已存在": "Karta již existuje", + "锁上面添加密码已满": "Zamknout nad přidat heslo je plný", + "密码已存在": "Stejný přístupový kód již existuje.", + "请输入密码": "Zadejte prosím heslo", + "暂无密码,无需重置": "Bez hesla, není třeba resetovat", + "真实姓名": "Pravé jméno", + "身份证号": "Id číslo", + "请输入真实姓名": "Zadejte vaše skutečné jméno", + "请输入身份证号": "Zadejte prosím vaše id číslo", + "请输入身份证号和真实姓名": "Zadejte prosím vaše id číslo a skutečné jméno", + "点击返回设备配对": "Klepněte zpět na páření zařízení", + "无法连接?尝试升级": "Nelze se připojit? pokus o inovaci", + "固件升级提示": "Výzva pro aktualizaci firmwaru", + "请先获取固件文件到手机本地,再选择升级": "Nejprve získejte soubor firmwaru do místního telefonu a poté zvolte upgrade.", + "固件升级中": "Firmware je aktualizován", + "取消升级": "Zrušit upgrade", + "固件传输中": "Firmware in transit", + "关闭": "Vypnout", + "传输中'": "V tranzitu", + "操作记录": "Záznamy", + "修改姓名": "Upravit název", + "传输中": "V tranzitu", + "发送人": "Vydané", + "发送时间": "Vydávaný čas", + "钥匙详情": "Ekey info", + "姓名": "Jméno", + "发送": "Odeslat", + "请确认姓名全名和身份证号码是否正确": "Potvrďte, že úplné jméno a id číslo jsou správné.", + "传输期间请勿离开当前页面": "Během převodu nenechávejte aktuální stránku", + "机型": "Modely", + "硬件版本": "Hardwarová verze", + "固件版本": "Verze firmwaru", + "手动升级": "Ruční aktualizace", + "设备连接中...": "Připojení zařízení...", + "未避免异常情况,请在门打开时升级": "Nevyhnutelné výjimky, prosím aktualizovat, když je dveře otevřené", + "钥匙无效": "Klíč je neplatný", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Nelze se připojit k zámku. restartujte blutooth telefonu a akci opakujte.", + "如果是全自动锁,请使屏幕变亮": "Pokud je to plně automatický zámek, udělejte, prosím, obrazovka jasnější", + "正在尝试闭锁……": "Snažím se zamknout.", + "清空记录": "Vymazat záznamy", + "是否要删除操作记录?": "Pokračovat ve smazání záznamů?", + "被删除的记录不能恢复": "Záznamy nelze po odstranění obnovit.", + "全部事件": "Všechny události", + "开锁事件": "Odemknout událost", + "异常事件": "Abnormální událost", + "门铃事件": "Událost zvonu u dveří", + "视频事件": "Video událost", + "请开启蓝牙": "Zapněte prosím bluetooth", + "请选择有效日": "Please select the effective day", + "公司名字长度不能小于 6 ": "Délka názvu společnosti nesmí být menší než 6", + "已是最新版本": "Žádné aktualizace", + "新建短信模版": "Vytváření šablony sms", + "新建邮件模版": "Vytvoření e-mailové šablony", + "自定义短信模版": "Šablona sms", + "自定义邮件模版": "Šablona e-mailu", + "名称": "Jméno", + "星星锁": "Hvězdný zámek", + "无考勤记录": "Žádné záznamy", + "大家干劲十足": "Všichni přicházejí včas.", + "工作时长未出炉": "Žádná pracovní doba", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Výběr země/regionu bude mít vliv na bezpečnost údajů. v současné době jste vybrali albánie, prosím potvrďte před pokračováním.", + "确认国家或地区": "Potvrdit zemi/region", + "我知道了": "Mám to.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Chcete-li obdržet důležité aktualizace, klepněte na tlačítko ok a povolit oznámení v nastavení.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Po zapnutí můžete znovu zapnout dlouhým stisknutím klávesy nastavení na zámku a znovu jej přidat s aplikací.", + "已有": "Current", + "新增": "Nový", + "账号格式错误": "Špatný formát", + "接收者信息为空": "Informace příjemce jsou prázdné", + "请输入时间(秒)": "Zadejte čas (s)", + "加载数据失败": "Načtení dat se nezdařilo", + "重试": "Zkuste to znovu", + "升级中,是否退出": "Během aktualizace, zda na výstup", + "下一步": "Další", + "公寓": "Byt", + "个人用户": "Osobní", + "星寓": "Star apartment", + "账号": "Účet", + "请输入手机号或email": "Telefonní číslo nebo e-mail", + "请输入星寓管理员的账号": "Prosím, zadejte účet správce hvězdného bytu", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Všechny údaje vybraného zámku budou trvale přeneseny na příjemce.", + "暂不支持跨平台转移,敬请期待": "Cross-platform transfer se zatím nepodporuje, těším se na to, prosím.", + "移除坏锁": "Přesunout chybné/poškozené zámky do odpadků", + "转移确认": "Potvrdit přenos", + "本次共转移": "This time a total of", + "把智能锁": "Chytrý zámek", + "确认": "Ok", + "移除成功": "Úspěšně odstranit", + "转移成功": "Úspěch přenosu", + "该已锁被删除": "Zamčený je odstraněn", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Autorizovaný správce může spravovat pouze hesla, ekeys a etccreated sám.", + "添加授权管理员": "Vytvořit správce", + "导出记录": "Exportovat záznamy", + "选择时间段": "Vybrat časové období", + "导出": "Export", + "批量导出": "Export šarže", + "读取记录": "Refresh records", + "设备": "Zařízení", + "消息": "Zprávy", + "智能分析": "Inteligentní analýza", + "精准识别设备事件,过滤无效信息": "Přesně identifikovat události zařízení a filtrovat neplatné informace", + "系统设置": "Nastavení systému", + "系统的全局配置在此项内进行设置": "Globální konfigurace systému je nastavena v této položce", + "导出操作记录": "Exportovat záznamy", + "立即查看": "Zobrazit", + "导出成功": "Úspěšně exportováno", + "发送钥匙": "Odeslat ekey", + "进度": "Sazba", + "失败": "Selhal", + "人脸详情": "Detaily obličeje", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Když někdo cítí asi 1,5 metrů před dveřmi, rozpoznávání obličeje bude automaticky spuštěno.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Když někdo cítí asi 0,8 metrů před dveřmi, rozpoznávání obličeje bude automaticky spuštěno.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Když někdo cítí asi 0,5 metrů před dveřmi, rozpoznávání obličeje bude automaticky spuštěno.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Vzdálenost snímání byla vypnuta, je třeba ručně dotknout jakoukoli klávesu na klávesnici, aby bylo možné odemknout rozpoznání obličeje.", + "防误开已打开,开锁后": "Otevírání proti chybě bylo zapnuto a po uvolnění", + "秒内不可使用面容开锁": "Odemknutí obličeje nelze použít během několika sekund.", + "掌静脉": "Dlanní žíla", + "添加掌静脉": "Přidat dlaňovou žílu", + "胁迫掌静脉": "Nucená dlaň", + "请不要将胁迫掌静脉用于日常开锁": "Please do not use coercion palm veins for daily unlocking", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Připojeno k zámku, přirozeně otevřete dlani, dlaň je obrácená ke kamerě.", + "掌静脉详情": "Detaily dlaně", + "掌静脉号": "Číslo dlanové žíly", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth není zapnut, prosím zapněte bluetooth v nastavení", + "删除用户时,会将用户拥有的钥匙一起删除。": "Pokud je uživatel odstraněn, budou také odstraněny ekeys přidružené k uživateli.", + "配置网络": "Konfigurovat síť", + "你好": "Haló", + "成功": "Úspěšný", + "类型选择": "Zadejte vybraný typ (+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +", + "请选择要使用哪种类型": "Vyberte typ, který chcete použít", + "系统邮件(推荐)": "E-mailem systému (doporučeno)", + "系统短信(推荐)": "Sms (doporučeno)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "The email will be sent from this app. please buy email package first.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "The sms will be sent from this app. please buy email package first.", + "个人邮件": "Osobní e-mail", + "个人短信": "Osobní sms", + "邮件将从你的个人邮箱发给用户": "E-mail bude odeslán z vašeho osobního e-mailového účtu.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Sms bude odeslána z vašeho osobního telefonního čísla.", + "为了更好地应用体验,请确定权限": "For a better application experience, please confirm the permissions", + "您第一次拒绝权限,请确定权限": "Jste odmítl povolení poprvé, prosím potvrďte svolení", + "您第二次拒绝权限,请去应用设置开启权限": "You refused permission for the second time, please go to the application settings to enable permission", + "去应用市场": "Přejít do app store", + "温馨提示": "Warm prompt", + "关闭应用": "Zavřít aplikaci", + "开启微信接收报警消息需要先关注": "Chcete-li otevřít wechat pro přijímání poplašných zpráv, musíte následovat", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat veřejný účet, uložit qr kód a použít wechat pro skenování nastavení", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "True-name authentication is a paid function, please contact the lock administrator to purchase and use", + "位置权限": "Povolení k umístění", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Please grant the app to use your locatian. it is used to scan ble locks and gateways.", + "相机/相册权限": "Svolení fotoaparátu/alba", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Prosím, udělte aplikaci pro čtení a zápis fotografií a souborů z úložiště.", + "点击选择": "Klikněte pro výběr", + "微信": "Wechat", + "朋友圈": "Moment", + "QQ": "Qq", + "QQ空间": "Qqzone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Link", + "今天": "Dnes", + "密码错误": "Neplatné heslo", + "网络中断": "Přerušení sítě", + "钥匙不存在": "Klíč neexistuje", + "钥匙过期": "Konec platnosti klíče", + "钥匙已存在": "Klíč již existuje", + "密码失效": "Heslo neplatné", + "门锁时间异常": "Čas zámku dveří abnormální", + "APP(手机)未联网": "Aplikace (mobilní telefon) není připojena k internetu", + "数据不存在": "Data neexistují", + "待接收": "Bereceived", + "已冻结": "Zmrazené", + "已删除": "Smazáno", + "未知": "Neznámý", + "拖动下方滑块完成拼图": "Přetáhněte posuvník do správné pozice", + "验证成功": "Úspěch ověřování", + "验证失败": "Ověření selhalo", + "向右拖动滑块填充拼图": "Drag the slider to the right to fill the puzzle", + "请先获取到位置信息哦": "Nejprve získejte informace o umístění", + "请选择国家": "Vyberte zemi", + "获取锁信息": "Získat informace o zámku", + "锁数据异常,请重试": "Data zámku jsou abnormální, zkuste to znovu.", + "连接设备中...": "Připojování zařízení...", + "把锁": "Zámky", + "条": "Pásek", + "封": "Pečeť", + "次": "Times", + "支付成功": "Pay success", + "查看详情": "Zobrazit podrobnosti", + "请输入模板名称": "Zadejte název šablony", + "模版类型": "Typ", + "再返回一次退出": "Exit again", + "请先添加锁": "Prosím, nejprve přidat zámek", + "可视对讲": "Visual intercom", + "详细日志": "Podrobný deník", + "已复制到剪切板": "Zkopírován", + "拍照": "Foto", + "从相册选择": "Vyberte si z alba", + "选择问题": "Prosím, vyberte otázku", + "确认长度不足8位": "Potvrdit délku menší než 8 číslic", + "新密码长度不足8位": "Nová délka hesla je menší než 8 číslic", + "两次密码不一致": "Neshoda hesla. zkuste to znovu", + "请点击获取验证码,验证码将发送到": "Prosím, získejte ověřovací kód. kód bude odeslán", + "切换": "Přepínač", + "验证": "Ověřit", + "验证成功,账号已删除": "Ověření úspěšné, účet odstraněný", + "该密码不是自定义密码,无法修改": "Toto heslo není vlastní heslo a nemůže být změněno.", + "请选择设备要关联哪些姓名": "Vyberte, k jakým názvům by mělo být zařízení přiřazeno.", + "请选择姓名要关联哪些设备": "Vyberte, k jakým zařízením by měl být název přidružen", + "确定要移除所选中的坏锁吗?": "Odstranit nefunkční zámek?", + "邮件通知": "Informovat prostřednictvím e-mailu", + "短信通知": "Oznamovat prostřednictvím sms", + "您好,您的授权管理员生成成功": "Dobrý den, váš autorizovaný správce byl úspěšně generován", + "请输入接收者姓名": "Zadejte prosím zde", + "版本更新": "Aktualizace verze", + "下次再说": "Příště", + "配网成功": "Úspěch distribuce sítě", + "配网失败": "Distribuce sítě selhala", + "该锁的无线键盘都将被删除": "Všechny bezdrátové klávesnice pro tento zámek budou odstraněny", + "实时画面": "Obrázek v reálném čase", + "适合门口较为安全的环境。": "Vhodné pro relativně bezpečné prostředí u dveří.", + "仅发生特定事件才录像,并可查看实时画面。": "Zaznamenávají se pouze konkrétní události a je možné zobrazit obrázek v reálném čase.", + "一般情况下,满电可使用7-8个月": "Za normálních okolností může být používán po dobu 7-8 měsíců při plném nabití", + "有人逗留或发生特定事件才录像,可随时查看": "Někdo pobývá nebo se zaznamenávají konkrétní události a může být kdykoli sledován.", + "实时画面。": "Fotka v reálném čase.", + "一般情况下,满电可使用5~6个月。": "Za normálních okolností, může být použit po dobu 5 ~ 6 měsíců při plném nabití.", + "适合门口人员复杂、较不安全的环境。": "Vhodné pro komplexní a relativně nebezpečné prostředí u dveří.", + "有人出现就录像,可随时查看实时画面。": "Zaznamenejte, když se někdo objeví, a zobrazit obrázek v reálném čase kdykoli.", + "一般情况下,满电可使用2~4个月。": "Za normálních okolností může být používán po dobu 2 ~ 4 měsíců při plném nabití.", + "根据您家门口实际情况设置录像和实时画面功能。": "Nastavte funkce videa a obrazu v reálném čase podle skutečné situace u dveří.", + "可使用时长由具体设置决定。": "Doba trvání použití je určena konkrétními nastaveními.", + "查看": "Zobrazit", + "有人按门铃或发生": "Někdo zvoní zvonek nebo", + "异常事件时": "Abnormální událost", + "不录像": "Žádný video", + "有人出现、按门铃": "Někdo se objeví, zvoní zvonek.", + "或发生异常事件时": "Nebo se objeví abnormální událost", + "逗留达到10秒": "Pobyt po dobu 10 sekund", + "约1.5米": "Asi 1,5 m", + "随时": "Anytime", + "立即录像": "Zaznamenat ihned", + "录像时机": "Načasování videa", + "有人出现时录像": "Zaznamenat, když se někdo objeví", + "人体侦测距离": "Vzdálenost detekce člověka", + "查看实时画面": "Zobrazit obrázek v reálném čase", + "自定义时间": "Vlastní čas", + "当日": "Dnes", + "次日": "Další den", + "自定义时段": "Vlastní časové období", + "发生事件时查看": "Zobrazit, kdy událost nastane", + "实时查看": "Zobrazení v reálném čase", + "有人在门口出现10秒后开始录像。": "Někdo se objeví u dveří 10 sekund před nahráním.", + "有人按门铃时立即录像。": "Okamžitě zaznamenejte, když někdo zazvoní na zvonek.", + "有人出现在门前1.5米范围时启动录像": "Začněte nahrávat, když se někdo objeví do 1,5 metrů před dveřmi.", + "约0.8米": "Asi 0,8 m", + "约3.0米": "Asi 3,0 metrů", + "添加指纹失败": "Operace selhala.", + "项": "Položky", + "播放中": "Hra", + "下载": "Stáhnout", + "暂无下载内容": "Žádný obsah ke stažení", + "亮度": "Jasnost", + "音量": "Svazek", + "快进至": "Rychle dopředu k", + "快退至": "Rewind to", + "暂无视频信息": "Žádné video informace", + "加载出错": "Chyba při načítání", + "请单人正对门锁,距离一个成年人手臂长度": "Prosím, stůjte před zámkem dveří sám, v délce paže", + "(约0.6米)。": "(Asi 0,6 metrů).", + "保持脸部无遮挡,露出五官。": "Udržujte svou tvář bez překážek a zobrazit vaše obličejové rysy.", + "准备好了,开始添加": "Ready, start adding", + "正在录入中...": "Nahrávání...", + "添加人脸失败": "Přidání obličeje se nezdařilo", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Po resetování budou obličeje zámku odstraněny. Jste si jistý, že chcete resetovat?", + "人脸号": "Číslo obličeje", + "虹膜详情": "Detaily iris", + "虹膜号": "Číslo iris", + "选择设备类型": "Vybrat typ zařízení", + "照明灯具": "Osvětlovací zařízení", + "电动窗帘": "Elektrické záclony", + "门窗传感器": "Senzor dveří a oken", + "传感器": "Senzor", + "清除数据成功": "Data úspěšně vymazána", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Zámek není připojený k internetu, takže rekódování hesla, karty, otisků prstů a jiných metod otevírání dveří nelze nahrát v reálném čase.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Pokud potřebujete uchovávat historické záznamy, můžete je exportovat.", + "看不到操作记录,可能原因有": "Nelze vidět záznamy operace, možné důvody", + "操作记录详情": "Podrobnosti záznamu operace", + "操作时间": "Doba operace", + "此模块功能需要锁联网后设置方可生效": "Tato funkce modulu musí být nastavena poté, co je zámek připojen k internetu, aby nabyla účinnosti", + "用户已存在": "Uživatel již existuje", + "钥匙数量已到上限": "Počet klíčů dosáhl horní hranice", + "附近没有可用网关": "There is no available gateway nearby", + "正在创建安全连接...": "Vytvoření zabezpečeného připojení...", + "监视状态下不能发送录音": "Nelze odeslat záznamy v režimu monitorování", + "挂断": "Zavěsit", + "监视中暂不能开锁": "Při monitorování není k dispozici uvolnění", + "长按说话": "Stiskněte a držte se mluvit", + "松开发送": "Uvolnění k odeslání", + "请输入6位数字开锁密码": "Zadejte prosím 6-ciferné odemknout heslo", + "请输入开锁密码": "Zadejte prosím heslo odemknout", + "接收者在有效期内可以不限次数使用": "Příjemci mohou v rámci doby platnosti využít společnost ekeys po dobu neomezenou.", + "接收者可以使用此App开关锁": "Příjemce jsou schopni uzamknout/odemknout pomocí této aplikace.", + "单次钥匙有效期为1小时,只能使用一次": "Jednorázový ekey je platný jednu hodinu a může být použit pouze jednou.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Příjemci jsou schopni použít ekeys po neomezenou dobu v rámci pevného cyklu.", + "获取模板失败": "Selhalo získání šablony", + "微信通知": "Wechat oznámení", + "系统短信": "Systém sms", + "系统邮件": "Systémový e-mail", + "模板": "Šablona", + "新建模版": "Vytvořit šablonu", + "您好,您的密码是": "Dobrý den, vaše heslo je", + "密码名字": "Název hesla", + "请输入6-9位密码": "Zadejte prosím heslo 6-9 číslic", + "设置密码": "Nastavit heslo", + "操作成功,密码为": "Úspěšně. heslo je", + "类型:自定义-永久": "Typ: vlastní-trvalé", + "实时播放": "Přehrávání v reálném čase", + "点击对讲": "Klikněte na intercom", + "长按开锁": "Dlouhý stisk pro odemčení", + "接听失败": "Nezdařila se odpověď", + "请在锁设置中开启远程开锁": "Povolit vzdálené uvolnění v nastavení zámku", + "接听": "Odpověď", + "截图已保存到相册": "Screenshot saved to album", + "添加遥控": "Přidat dálkové ovládání", + "已连接到锁,请按遥控": "Připojeno k zámku, stiskněte, prosím, dálkové ovládání", + "遥控号": "Číslo dálkového ovládání", + "遥控详情": "Detaily dálkového ovládání", + "照明": "Osvětlení", + "退出演示模式": "Exit demo mode", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tip: aktuální rozhraní je zobrazovací rozhraní. Po přidání zařízení můžete pokračovat v jeho používání.", + "门已上锁": "Dveře jsou zamčené.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Váš účet byl použit k přihlášení z nového zařízení", + "开门成功": "Úspěšně otevřít dveře", + "开门失败": "Nepodařilo se otevřít dveře", + "呼叫提醒": "Upomínka volání", + "收到来自": "Received from", + "锁的呼叫": "Volání zámku", + "加载数据中": "Načítání dat", + "搜索所有锁类型": "Hledat všechny typy zámků", + "锁电量更新时间": "Čas aktualizace baterie uzamknout", + "1月": "Jan", + "2月": "Únor", + "3月": "Mar", + "4月": "Duben", + "5月": "Květen", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Říjen", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Hot cities", + "导出锁数据": "Exportovat data zámku", + "一键开锁": "Odemknout jedno kliknutí", + "已开通": "Otevřeno", + "编辑员工": "Upravit personál", + "一": "One", + "二": "Dva", + "三": "Tři", + "四": "Čtyři", + "五": "Pět", + "六": "Šest", + "日": "Sun", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Zápis nákupu", + "使用记录": "Záznam uživatele", + "失效时间要大于当前时间": "Doba platnosti musí být delší než současný čas", + "修改名字": "Upravit název", + "时": "Hodina", + "分": "Minuta", + "Amazon Alexa": "Amazon alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Můžete použít alexa na odemčení, zamčení a kontrolu stavu zámku", + "支持的国家": "Podporované země", + "支持的国家值": "Usa, kanada, velká británie, austrálie, indie, německo, francie, itálie, španělsko, japonsko", + "操作流程": "Proces operace", + "操作流程值": "1 přidat zámek a bránu s aplikací smart lock\n\n2 zapněte funkci vzdáleného odblokování zámku v aplikaci (tato funkce je ve výchozím nastavení vypnuta). Pokud nemáte tuto možnost, zámek nepodporuje alexa.\n\n3 přidat dovednosti k alexa a povolit je pomocí účtu a hesla aplikace smart lock. Poté, co je oprávnění úspěšné, můžete objevit zařízení v rámci účtu\n\n4 vyhledejte zámek v aplikaci alexa, zapněte funkci odemčení hlasu a nastavte heslo jazyka\n\n5 zámek lze ovládat prostřednictvím alexa", + "Google Home": "Google home", + "Action name": "Název akce", + "ScienerSmart": "Scienersmart", + "支持的语言": "Podporované jazyky", + "英语": "English", + "Google Home操作流程的值": "1. použijte aplikaci smart lock pro přidání zámků a brán\n\n2. enable the remote unlocking function of the lock in the app (this function is off by default). Bez této možnosti nepodporuje zámek google home\n\n3. nainstalujte aplikaci google home a klepněte na tlačítko \"\" v levé horní části\n\n4. na stránce nastavení vyberte \"práce s google\"\n\n5. search for \"scienersmart\" and use the smart lock app account and password to authorize", + "密码需至少包含数字/字母/字符中的2种组合": "Heslo musí obsahovat alespoň 2 z těchto údajů: čísla, písmena a zvláštní znaky", + "已开锁": "Odemčeno", + "已闭锁": "Zamčeno", + "两次密码不一致哦": "Hesla jsou nekonzistentní", + "中功率": "Střední síla", + "常规使用": "Pravidelné použití", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Po zapnutí brány stiskněte a podržte tlačítko reset po dobu 5 sekund a klepněte na tlačítko next", + "扫描设备": "Skenovat zařízení", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Odstranění se nezdařilo. Brána možná byla offline. Chcete vynutit smazat data?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_da.json b/lan/lan_da.json new file mode 100644 index 00000000..d5e1d294 --- /dev/null +++ b/lan/lan_da.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Stjernelås", + "锁通通": "Lås igend", + "点击开锁,长按闭锁": "Rør for at låse op, hold til lås", + "考勤": "Deltagere", + "考勤设置": "Optagelsesindstillinger", + "电子钥匙": "E-nøgler", + "添加卡": "Tilføj kort", + "卡号": "Kortnummer", + "添加指纹": "Tilføj fingeraftryk", + "指纹号": "Fingeraftryk nummer", + "遥控": "Fjerne", + "添加人脸": "Tilføj ansigt", + "门锁日志": "Log til dørlås", + "密码号": "Adgangskodenummer", + "添加者": "Luftfartsforetagender", + "添加时间": "Tid", + "重置": "Nulstilse", + "请输入手机号或者邮箱": "Tlf.nr/email", + "工作时间": "Arbejdstid", + "工作日设置": "Arbejdsdagsindstillinger", + "星期一": "Mandag", + "星期二": "Tirsdag", + "星期三": "Onsdag:", + "星期四": "Torsdag", + "星期五": "Fredag", + "星期六": "Lørdag", + "星期日": "Søndag", + "简写周一": "M", + "简写周二": "T.", + "简写周三": "V", + "简写周四": "T.", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Man", + "周二": "Tie", + "周三": "Jøs", + "周四": "To:", + "周五": "Er", + "周六": "Lø", + "周日": "Solen", + "群发钥匙": "Send flere ekeys", + "锁": "Lås", + "请添加": "Modtager", + "允许远程开锁": "Fjernlås op.", + "请输入验证码": "Verifikationskode", + "获取密码": "Generér adgangskode", + "请给密码命名": "Indtast et navn for denne adgangskode", + "密码有限期为6个小时,只能使用一次": "Denne adgangskode SKAL bruges inden for 6 timer fra den aktuelle tid, eller det vil blive SUSPENDED af sikkerhed årsager. Denne adgangskode kan kun bruges en gang.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Indtast 6-9 cifre manuelt som adgangskode. Kan tilføjes via telefon Bluetooth ved siden af låsen, eller tilføjes fjernbetjent gennem gatewayen.", + "获取": "Få", + "添加": "Tilføj til", + "删除公司": "Slet selskab", + "密码详情": "Adgangskodeinfo", + "修改密码": "Ændr adgangskode", + "添加虹膜": "Tilføj iris", + "添加门磁": "Dørensor", + "添加无线键盘": "Trådløs tastatur", + "添加手掌": "Tilføj palme", + "请输入员工账号": "Indtast medarbejderkonto", + "批量授权锁": "Giv flere låse", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Den autoriserede administrator har flertal tilladelse til at betjene denne lås.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Denne funktion giver dig mulighed for at låse Smart Lock fjernbetjening via en Gateway. Denne funktion kan kun slås til eller fra via Bluetooth.", + "排列方式": "Listetype", + "早到榜": "Tidlig listeName", + "迟到榜": "Forsinkede lister", + "当前模式": "Nuværende tilstand", + "勤奋榜": "Arbejdshård liste:", + "延迟时间": "Forsinkelsetid", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Låsen vil låse automatisk efter tiden.Lås den op for en gang først for at gøre indstillingen tilgængelig.", + "时间": "Tid", + "开始时间": "Starttid", + "结束时间": "Sluttid", + "工作时间设置": "Indstilling af arbejdstider", + "常开模式": "Passage MODE", + "常开时间": "I denne tidsperiode", + "常开日期": "På disse dage", + "添加员工": "Tilføj personale", + "节假日": "Ferie", + "打卡方式": "Metode", + "员工是否有钥匙": "Jeg har allerede ekey", + "上班时间": "Starttid", + "下班时间": "Lukketid", + "本周": "Denne uge", + "单休": "Endags Weekend", + "双休": "Todages Weekend", + "单双休": "En to-dages helge", + "年": "År", + "月": "Måned", + "放假日期": "Ferie", + "补班日期": "Arbejdsdage", + "添加假日": "Tilføj ferie", + "开始日期": "Startdato", + "必填": "Krævet", + "结束日期": "Slutdato", + "日榜": "Hver dag", + "月榜": "Månedligt", + "考勤记录": "Registreringer", + "假日信息": "Ferieoplysninger", + "基本信息": "Grundlæggende elementer", + "无线键盘": "Trådløs tastatur", + "选择无线键盘": "Tilføj tastatur", + "门磁": "Dørensor", + "自动闭锁": "Auto låsning", + "锁声音": "Lås lyd", + "防撬报警": "Tamper- alarm", + "重置键": "Nulstil knappen", + "锁时间": "Lås ure", + "诊断": "Diagnostisk", + "上传数据": "Upload data", + "导入其他锁数据": "Importér fra en anden lås", + "锁升级": "Firmware- opdatering", + "标记房态": "Værelsesstatus", + "开锁提醒": "Lås op meddelelser", + "微信二维码": "Lås op QR- kode", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Folk med elektroniske nøgler kan åbne døren ved at scanne denne QR-kode gennem WeChat. QR-koden for hver lås er anderledes. Du kan udskrive det ud og indsætte det ved siden af den tilsvarende lås", + "锁编号": "Låsnummer", + "电量": "BatteriName", + "锁分组": "Lås gruppen", + "选择分组": "Vælg gruppe", + "创建新分组": "Opret en gruppe", + "管理员开锁密码": "Admin- adgangskode", + "更新": "Opdater", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Batteriniveauet vil blive opdateret via gateway eller telefon bluetooth", + "当屏幕闪烁时,点击下一步": "Klik næste når tastaturet blinker", + "输入*529#或按设置键": "Indtast README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# eller tryk på Indstillingstasten", + "长按重置键2秒": "Tryk og hold nulstille knappen 2 sekunder", + "附近的设备": "Udstyr", + "暂无数据": "Ingen data", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Du vil være i stand til at få dørstatus med en dørsensor sammen med en gateway. Kun én sensor må forbinde med en lås.", + "开始": "Start", + "全天": "Alle timer", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Du kan indstille flere tidsperioder for passage tilstand.Inden de fastsatte tidsperioder, vil låsen forblive i en åben tilstand efter at være låst op.", + "请选择锁音量": "Vælg lås lydstyrke", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Ved at tænde på, vil du høre lyden fra låsen", + "低": "Lav", + "较低": "Mellem lav", + "中": "Medier", + "较高": "Middelhøje", + "高": "Højt", + "开启后,锁被撬动时,会发出报警声": "Ved at tænde, aktiverer du TAMPER alarmen.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Ved at slukke, er RESET-knappen deaktiveret.", + "校准时间": "Kalibrering tid", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnose er at læse konfigurationsoplysninger inde i låsen og uploade det, så personalet kan analysere årsagen til fejlen", + "上传": "Uploade", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Upload data fra lås til server.Det kan tage flere minutter", + "请选择要从哪把锁导入": "Vælg en lås at importere fra", + "有新版本": "Har ny version:", + "当前版本": "Nuværende version", + "升级": "Opdater", + "空闲": "Ledige:", + "已入住": "Optaget", + "多语言": "Sprog", + "添加锁": "Tilføj lås", + "锁地址": "Lås adresse", + "选择锁类型": "Vælg låstype", + "NFC无源锁": "NFC Passiv lås", + "添加设备": "Tilføj enhed", + "网关": "GatewayName", + "客服": "Kundeservice:", + "设置": "Indstillinger", + "更多设置": "Mere sæt", + "消息推送": "Bemærkningspruts", + "锁用户管理": "Lås brugere", + "拥有的钥匙": "En", + "批量授权": "Myndighedens forvaltning", + "关联设备": "Tilknyttet enhed", + "关联姓名": "Tilknyttet navn", + "转移智能锁": "Overførselslås", + "选择锁": "Skærmlås", + "接收人信息": "Modtager", + "转移网关": "Overførselsvindue", + "锁屏": "Skærmlås", + "已关闭": "Afskærmning", + "已开启": "Frem", + "开启": "Tænd på", + "确定要开启重置键?": "Fortsæt med at aktivere knappen Nulstil?", + "确定要关闭重置键?": "Fortsæt med at deaktivere Nulstil knappen?", + "隐藏无效开锁权限": "Skjul ugyldig adgang", + "APP开锁时需手机连网的锁": "Låse, der kræver telefon online.", + "增值服务": "Tjenesteydelser", + "关于": "Om:", + "退出": "Log ud", + "删除账号": "Slet konto", + "个人信息": "Kontoinformation", + "头像": "Avatar", + "昵称": "NickNameName", + "请输入昵称": "Indtast venligst dit kaldenavn", + "修改昵称": "Omdøb", + "修改账号": "Redigér konto", + "重置密码": "Nulstil adgangskoden", + "安全问题": "Sikkerhedsspørgsmål", + "为了你的账号安全,修改账号前请先使用验证码验证": "For sikkerheden på din konto, skal du bruge konto-adgangskode verifikation før du ændrer kontoen.", + "请输入新账号": "Indtast den nye konto", + "找回密码和登录新设备时,可通过绑定的手机验证": "Binding Telefonnummeret vil blive brugt til at modtage Verifikationskoden.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Den Binding e-mail vil blive brugt til at modtage verifikationskoden.", + "原密码": "Nuværende adgangskode:", + "新密码": "Ny adgangskode:", + "确认密码": "Bekræft adgangskoden", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Hvis telefonen er tabt, kan du logge ind på ny telefon ved at besvare sikkerhedsspørgsmål.", + "问题一": "Spørgsmål 1", + "问题二": "Spørgsmål nr. 2:", + "问题三": "Spørgsmål 3", + "请输入你的答案": "Skriv venligst dit svar", + "即将到期": "Udløber snart", + "去授权": "Gå til autorisering", + "修改名称": "Redigér navn", + "状态": "Status", + "WiFi名称": "Wifi Navn", + "网络MAC": "Netværk MAC", + "网关升级": "Gateway- opdatering", + "网关连接的锁": "Lås forbundet til denne Gateway", + "信号强": "Stærk", + "选择网关类型": "Vælg gateway- type", + "添加网关": "Tilføj gatewayName", + "重新通电": "Tilslut kraften", + "指示灯": "Indikator Lys", + "选择网关": "Vælg gatewayName", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G understøttes ikke, Vælg et WiFi på 2.4G.", + "WiFi密码": "WiFi- adgangskort", + "请输入WiFi密码": "Indtast WiFi- adgangskode", + "网关名称": "Portnavn", + "请输入网关名称": "Indtast portnavn", + "IP地址": "IP- adresse", + "子网掩码": "Subnetmaske", + "默认网关": "Standardporten", + "自动获取DNS服务器地址": "Hent automatisk DNS-serveren adresse", + "首选DNS": "Foretrukket DNS", + "备选DNS": "Alternativ DNS", + "不使用静态IP": "Ingen statisk IP anvendes", + "使用静态IP": "Brug statisk IP", + "请输入IP地址": "Indtast IP- adresse", + "请输入子网掩码": "Indtast subnetmaske", + "请输入默认网关": "Indtast standardporten", + "所有锁": "Alle låser", + "搜索所有类型的锁": "Scan alle typer låser", + "门锁": "Dørlås", + "挂锁": "Hængelås", + "保险箱锁": "Sikker lås", + "智能门禁": "Intelligent adgangskontrol", + "车位锁": "Parkeringslås", + "摸亮触摸屏": "Rør enhver tast for at aktivere tastaturen", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Rør venligst enhver nøgle til at aktivere låsen og sætte den i PAIRING Tilstand.", + "附近的锁": "Nærlig låse", + "如需修改名字请重新命名,点击确定添加锁": "Hvis du vil ændre navnet, skal du omdøbe, klikke på OK for at tilføje låse", + "添加锁时,手机必须在锁旁边": "Når du tilføjer en lås, skal telefonen være ved siden af låsen", + "登录": "LoginName", + "注册": "Registrer", + "我已阅读并同意": "Jeg har læst og indvilliget", + "验证码": "Kode", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Din adgangskode skal have 8-20 tegn og omfatte mindst to typer tal, bogstaver og symboler", + "手机": "Telefonen", + "邮箱": "E- mail", + "请输入邮箱": "Indtast din e- mail", + "国家/地区": "Land/region", + "你所在的国家/地区": "Dit land/region", + "选择国家/地区": "Vælg dit land eller region.", + "获取验证码": "Hent kode", + "商务合作": "Forretningsområde", + "电脑网页版": "Websystem", + "酒店系统": "Hotel System", + "说明书网页版": "Brugerhåndbogen", + "高级功能": "Avanceret funktion", + "记录保存": "Opbevaring af registre", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS kan bruges til at sende adgangskode og ekey oplysninger til modtager.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mailen kan bruges til at sende adgangskode og ekey oplysninger til modtager.", + "购买实名认证提示": "Når funktionen er aktiveret, skal du bruge dit fingeraftryk, ansigt eller konto adgangskode til at åbne APP. Der er ingen grund til at verificere igen i 3 minutter", + "请选择你希望的实名认证频次": "Vælg venligst den rigtige godkendelsesfrekvens du ønsker", + "仅首次": "For første gang.", + "每日一次": "En gang dagligt", + "每周一次": "En gang om ugen", + "每月一次": "En gang hver måned.", + "当前状态": "Nuværende status", + "试用中": "Ved retssag", + "高级功能权益内容": "Avancerede funktioner", + "短信模板": "SMS- skabelon", + "邮件模板": "E- mail- skabelon", + "发卡工具": "Kortkoder", + "购买高级功能须知": "Meddelelse", + "购买高级功能提示": "Mere avancerede funktioner er under udvikling, og hvis du har brug for dem, er du velkommen til at åbne service baseret på antallet af låse. Avancerede funktioner er kun tilgængelige for dine egne låse. Hvis du er en autoriseret administrator, bedes du kontakte den øverste administrator af låsen for at åbne tjenesten", + "免费体验": "Fri prøve", + "立即开通": "Åbn nu", + "购买短信": "Køb SMS", + "购买邮件": "Køb e- mail", + "购买实名认证次数": "Køb Rigtige navn Godkendelsestide", + "开通高级功能": "Aktivér avanceret funktion", + "选择套餐": "Vælg pakke", + "支付方式": "Betalingsform", + "支付宝": "Alipaya", + "去支付": "Betaling", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Du har tilladelse til at definere meddelelsen selv.Det bruges til at sende oplysninger om adgangskode og ekey til andre.", + "高级功能仅能用于你自己的锁": "Den avancerede funktion kan kun anvendes dine egne låse.", + "新建模板": "Opret skabelon", + "类型": "Type", + "模版内容": "Skabelonindhold", + "预览": "Forhåndsvisning", + "房间名": "Rol", + "预计产生短信条数": "Anslåede meddelelsessegmenter", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Denne funktion giver dig mulighed for at skjule adgangskoder, keys, kort og fingeraftryk, som er ugyldige i en periode.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Brugers telefon er forpligtet til at være online for at låse disse valgte låse med APP.", + "配置WiFi": "Indstil WiFi", + "请输入WiFi名字": "Indtast", + "WiFi配网": "WiFi-distributionsnetværk", + "胁迫卡": "Stresskort", + "员工是否有密码": "Har allerede adgangskode", + "员工是否有卡": "Har allerede kort", + "员工是否有指纹": "Sæt fingeraftrykket alleredeName", + "获取钥匙": "Hent nøgle", + "获取卡": "Hent kort", + "获取指纹": "Hent fingeraftryk", + "安全验证": "Verifikation af identitet", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle dine kontooplysninger vil blive fjernet fra platformen PERMANENTENTIGT og kan ikke gendannes. Ønsker du at slette?", + "监控": "Skærm", + "视频日志": "Videologg", + "开门器": "Døråbnere", + "面容开锁": "Ansigt åbnes", + "开门方向设置": "Åbningsvejssæt", + "电机功率设置": "Indstilling af MotorPowerName", + "开锁时是否需联网": "Hvis Internet er påkrævet ved oplåsning", + "选择要加入分组的锁": "Vælg lockS der skal tilføjes til denne gruppe.", + "锁数量": "Låstællinger", + "小米IOT平台": "Xiaomi IOT-platformName", + "面容开锁设置": "Ansigtet låser op sæt", + "感应距离": "Følelsesafstand", + "防误开": "Forhindre forkert åbning", + "防误开已关闭,关门后仍可使用面容开锁": "Forhindre misåbning er blevet lukket, efter lukning af døren kan stadig bruge ansigt oplåsning.", + "添加和使用面容开锁时": "Tilføj og brug ansigt ved oplåsning", + "添加和使用面容开锁时提示": "\n1, forsøg venligst at holde en enkelt person foran døren operation;\n2, stå venligst foran døren lås om 0,5~0,8 meter, vender døren lås;\n3. Hold dit ansigt uændret og afsløre dine ansigtsfunktioner;\n4. Når ansigtsgenkendelse er unormal, kan du røre enhver nøgle på det digitale tastatur for at genstarte ansigtsgenkendelse manuelt.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Vælg venligst motoreffekten omhyggeligt i forhold til dørlåsens faktiske situation:", + "小功率:": "Miniwatt:", + "耗电少": "Mindre energiforbrug", + "大功率": "Høj effekt:", + "大功率提示": "Hvis låsets tunge ikke kan trækkes normalt ved låsning, eller skal køres", + "开门方向设置提示": "Vælg venligst omhyggeligt retning til at åbne døren til dit hjem (hvis du vælger den forkerte retning, du vil ikke være i stand til at åbne og lukke døren ordentligt):", + "左开": "Åbn venstre", + "右开": "Åbn til højre", + "判断方法:": "à ̧nne:", + "判断方法内容": "Manden stod udenfor huset og vendte indgangsdøren.", + "录像时段": "Videoplads", + "密码": "Adgangskoder", + "卡": "Kort", + "指纹": "Fingeraftryk", + "人脸": "Ansigt", + "配件商城": "Lås Mall", + "公司名称": "Virksomhedens navn", + "请输入公司名字": "Indtast firmanavn", + "提示": "Tips", + "是否删除?": "Om der skal slettes?", + "员工信息": "Personaleinfor", + "员工": "Personale", + "打卡方式无效": "Ikke tilgængelig", + "中国": "Kina", + "选择钥匙": "Vælg ekey", + "编辑": "Redigér", + "无": "Nej", + "有": "JA", + "请输入姓名": "Indtast et navn", + "获取人脸": "Få ansigter", + "选择密码": "Vælg adgangskode", + "选择卡": "Vælg kort", + "选择指纹": "Vælg fingeraftryk", + "选择人脸": "Vælg flade", + "员工是否有人脸": "Om medarbejderen har et ansigt", + "同时删除员工钥匙": "Slet hans/ hendes ekey", + "删除": "Slet", + "确定要删除员工吗?": "Slet denne medarbejderName", + "月统计": "Månedlig statistik", + "迟到": "Forsinker", + "早退": "Forsvind tidligt", + "未打卡": "Ingen optegnelse", + "钥匙将在": "Denne ekey vil udløbe i", + "天后失效": "Dag(er)", + "电量更新时间:": "Batteriopdateringstid:", + "新增配件": "Tilføj til", + "钥匙不可用": "Nøglen er ikke tilgængelig", + "正在开锁中...": "Låser op...", + "你的钥匙": "Din nøgle.", + "常开模式启动!长按闭锁": "Åben tilstand startet! Lang tryk for at låse", + "演示模式": "Demo- tilstand", + "请先同意用户协议及隐私政策": "Vær venlig at acceptere brugeraftalen og fortrolighedspolitik først.", + "用户协议": "Brugerbetingelser", + "隐私政策": "Privatlivspolitik", + "注册成功": "Registreringen lykkes", + "你所在的": "Du er med.", + "手机号": "Telefonnummer", + "忘记密码": "Glemt adgangskode", + "重置成功": "Nulstil succet", + "确定要退出吗?": "Udgang?", + "功能暂未开放": "Funktionen er endnu ikke åben.", + "设置成功": "Indstilling med succet", + "删除成功": "Slet lykkes", + "单次": "Engangs", + "永久": "Permanende", + "限时": "Tid", + "自定义": "Brugerdefineret", + "清空码": "Slett", + "循环": "Gentagere", + "工作日": "Arbejdsdag", + "每日": "Hver dag", + "周末": "Weekend", + "确定要删除吗?": "Slet?", + "该锁的密码都将被删除": "Alle adgangskoder for denne lås vil blive DELETET", + "已过期": "Ugyldig", + "该锁的电子钥匙都将被删除": "Alle eKeys til denne lås vil blive DELETET", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Alle ekeys forbundet med denne ekey.This Trin kan ikke være UNDONE!", + "删除钥匙会在用户APP连网后生效": "Ekey vil blive fjernet", + "有效时间": "Effektiv tid", + "接收者": "Modtager", + "仅管理自己创建的用户": "Administrer kun sine egne brugere", + "远程开锁": "Fjernlås op.", + "请输入钥匙名称": "Indtast tastenavn", + "修改成功": "Ændr succes.", + "冻结": "Frys", + "解除冻结": "Tøs", + "授权": "Godkendt", + "取消授权": "Af- tilladt", + "同时解冻其发送的钥匙": "Tø alle ekeys udstedt af denne bruger", + "会在用户APP连网后生效": "Denne ekey vil blive THAWED, når brugerens APP forbinder til et netværk", + "同时冻结其发送的钥匙": "Frys alle ekeys udstedt af denne bruger", + "冻结会在用户APP连网后生效": "Denne ekey vil være FROZEN, når brugerens APP forbinder til et netværk", + "取消授权会在用户APP连网后生效": "Brugeren vil fjerne sine tilladelser, når brugerens APP forbindes til et netværk", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Den autoriserede bruger har næsten de samme tilladelser som LOCK Manager (f.eks. Mulighed for at sende ekeys og adgangskoder)", + "失效时间需晚于生效时间": "Udløbstiden skal være senere end det effektive tidspunkt.", + "生效时间需晚于当前时间": "Den effektive tid skal være senere end det nuværende tidspunkt.", + "失效日期需晚于生效日期": "Udløbsdatoen skal være senere end ikrafttrædelsesdatoen.", + "修改有效期": "Ændringsperiode", + "生效日期": "Startdato", + "失效日期": "Slutdato", + "开锁": "Lås op.", + "开锁成功": "Lås op lys", + "请选择锁": "Vælg låser", + "请选择接收者": "Vælg venligst modtager", + "请选择有效期": "Vælg venligst gyldighedsperioden", + "请选择发送方式": "Vælg venligst afsendelsesmetoden", + "请选择结束时间": "Vælg sluttidspunktet", + "完成": "Gennemført", + "有效日": "Cyklus på vej", + "发送成功": "Send succes.", + "请选择开始时间": "Vælg starttidspunktet", + "选择用户": "Vælg modtagere", + "已选中": "Valgt", + "确定": "OK", + "请选择要发送的锁": "Vælg låser", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Ansigt rigtige-navn godkendelse henviser til brugerens behov for at verificere sit ansigt før låse telefonen APP, og verifikationen kan låses op.", + "分享": "Delt", + "请输入接收者账号": "Indtast modtagerens konto", + "接收者号码未注册,请重新发送": "Modtagerens nummer er ikke registreret.", + "是否发送电子钥匙给未注册账号": "Vil du sende en ekey til en ny konto", + "取消": "Annuller", + "标记成功": "Markér succes.", + "微信好友": "WeChat- venner", + "短信": "SMS", + "邮件": "E- mail", + "更多": "Mere", + "您好,您的电子钥匙生成成功": "Hej, din elektroniske nøgle er genereret med succet", + "生效时间不能小于当前时间": "Den effektive tid kan ikke være mindre end den nuværende tid", + "结束时间不能小于当前时间": "Sluttidspunktet kan ikke være mindre end det nuværende tidspunkt.", + "是否为管理员": "Er det en administrator", + "已连接到锁,请将卡靠近门锁的读卡区": "Tilsluttet.Sæt kortet mod kortlæseren", + "尝试连接设备...": "Forbindelse med lås.Vent venligst ....", + "地理位置": "Geografisk placering", + "检查以确保以下地址是正确的": "Tjek for at sikre, at følgende adresse er korrekt", + "地图加载中,请稍候。。": "Kortet indlæser, vent venligst...", + "跳过": "Skip", + "还未获取到位置信息哦,请耐心等待一下!": "Oplysningerne om placeringen er ikke indhentet endnu, vent venligst tålmodigt!", + "请填写信息": "Udfyld venligst oplysningerne.", + "有效期": "Gyldighedsperiode", + "生效时间": "Starttid", + "失效时间": "Sluttid", + "上传成功": "Uploadet med succet", + "未生效": "Inaktivt", + "已生效": "Effektiv", + "指纹详情": "Fingeraftryksinfor", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Du vil være forpligtet til at placere din finger til sensoren flere gange.Følg ....", + "开始添加": "Start", + "请将您的手指按下": "Placer din finger på sensoren.", + "根据提示,抬起手指后再进行下一次指纹采集": "Følg prompterne ... Du vil være forpligtet til at fjerne og placere din finger til Sensor til næste optegnelse.", + "添加成功": "Tilføj succes.", + "更新成功": "Opdatér succes.", + "搜索": "Søg i", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Efter nulstilling vil låsens kort blive slettet, vil du nulstille?", + "已失效": "Ugyldig", + "卡详情": "Kortinformation", + "请输入": "Indtast venligst her.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Ved at dreje fra, vil låsen forblive Ulåst hele dagen, indtil den er manuelt låset", + "请输入小于或等于60的数字": "Indtast et tal mindre end 60", + "操作成功": "Operationen lykkes", + "管理员密码相同,无需修改": "Administrator- adgangskoden er den samme og behøver ikke ændres", + "请输入6-9位数字": "6-9 cifre i længde", + "请输入6-9位管理员密码": "Indtast venligst en 6-9 cifre administrator adgangskode til administrator", + "请输入新的管理员密码": "Indtast en ny administrator- adgangskode", + "未分组": "Ikke-grupperet", + "请输入分组名称": "Opret en gruppe", + "创建成功": "Opret succes", + "设置锁分组成功": "Sæt låsgruppen lykkes", + "电池1电量": "Batteri 1", + "电池2电量": "Batteri 2", + "电量更新时间": "Batteriopdateringstid", + "锁电量更新成功": "Lock power opdatering succes", + "您的钥匙未生效": "Din nøgle er ikke effektiv.", + "您的钥匙已冻结": "Din nøgle er blevet frosnet", + "您的钥匙已过期": "Din nøgle er udløbet", + "常开模式开启": "Låsen er i passage-tilstand", + "超级管理员": "Super administration", + "授权管理员": "Godkendt administration", + "普通用户": "Almindelig bruger", + "余": "Salde", + "天": "Dagen", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Efter slettelse af låsen, vil alle oplysninger blive slettet sammen, er du sikker på, at du ønsker at slette låsen?", + "请输入登录密码": "Indtast applikations- adgangskodet", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Mislykkedes at slette enheden, sørg for at enheden er i nærheden af enheden, enheden er ikke tilsluttet, og enheden er tændt", + "用户无权限": "Brugeren har ingen tilladelse.", + "创建公司后,考勤功能才能使用": "Opret et selskab først.", + "是否删除钥匙?": "Slet denne ekey?", + "邮箱绑定成功": "E- mail- bindende succet", + "手机绑定成功": "Mobiltelefon bindende succes.", + "网络访问失败,请检查网络是否正常": "Forespørgsel mislykkedes.Netværk utilgængelig, Kontroller og tilslut din enhed til 3G/4G/WIFI", + "清空": "Ryd", + "是否清空?": "Forstået?", + "消息详情": "Brev- infoName", + "创建时间": "Oprettelsestid", + "管理员详情": "Oplysninger om administrator", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Hvis nogen tvinger dig til at åbne døren, kan du bruge dette kort. Alarmen vil blive sendt til administratorerne. For at bruge denne funktion, skal du sørge for din lås er online.", + "请不要将胁迫卡用于日常开锁": "Brug ikke det påtvungne kort til daglig brug.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Hvis nogen tvinger dig til at åbne døren, kan du bruge dette fingeraftryk. Alarmen vil blive sendt til administratorerne. For at bruge denne funktion, skal du sørge for din lås er online.", + "请不要将胁迫指纹用于日常开锁": "Brug ikke det påtvungne fingeraftryk til daglig brug.", + "创建公司": "Opret en virksomhed", + "公司名称不能超过30个字符": "Firmanavn må ikke overstige 30 tegn", + "公司名称不能小于6个字符": "Firmanavn kan ikke være mindre end 6 tegn", + "WIFI列表": "WIFI- listen", + "刷新": "Genopfrisk", + "手动配网": "Manuelt distributionsnetværk", + "远距离": "Langdistans", + "中距离": "Mellemafstand", + "近距离": "Kort afstand", + "锁时间更新成功": "Succes til opdatering af låsetid", + "锁用户": "Lås brugere", + "请选择常开日期": "Vælg den åbne dato", + "结束时间不能小于开始时间哦": "Sluttidspunktet kan ikke være mindre end starttidspunktet", + "介绍": "Vores historie", + "个人信息收集清单": "Indsamlingsliste for personoplysninger", + "应用权限说明": "Beskrivelse af programtilladelse", + "第三方信息共享清单": "Oplysningsliste over tredjepartsmængder", + "请选择您的位置": "Vælg venligst din placering", + "请先选择位置": "Vælg venligst stedet først.", + "管理员密码": "Admin- kode", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Hvis du har brug for at ændre, skal du indtaste en ny administrator-adgangskode (6 cifre), klik på OK for at ændre.", + "修改": "Ændre", + "网络摄像头": "Kameraer", + "重命名": "Omdøb", + "分组下的锁将被移到未分组里": "Låse under gruppen vil blive flyttet til ungrupperet", + "编辑成功": "Redigér succes.", + "厂商": "Fremstiller", + "型号": "Modell", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Når adgangskoden er genereret, skal du bruge den en gang til aktivering inden 23:59 på samme dag, ellers vil det være ugyldigt efter klokken 0. Når adgangskoden er aktiveret, kan den anvendes ubegrænsede tider inden for gyldighedsperioden.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Når adgangskoden er genereret, skal du bruge den før 23:59 på samme dag, ellers vil den være ugyldig efter klokken 0. Den klare kode bruges til at rydde alle de adgangskoder genereret før klokken 0 i dag.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Når adgangskoden er genereret, skal du bruge den før 23:59 på samme dag, ellers vil den være ugyldig efter klokken 0.", + "清空密码底部提示": "Adgangskoden er gyldig indtil 23:59 på tømningsdagen", + "相机": "Kameraet", + "相册": "Billeder", + "读写": "Opbevaring", + "定位": "Placering", + "需要访问相机权限才能拍照上传文件例如头像上传": "Adgang til kameraet er påkrævet for at tage billeder og uploade filer, såsom at uploade et profilbillede", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Adgang til kamera er påkrævet for at uploade filer og avatarer ved hjælp af albumbilleder", + "需要访问读写权限才能使用本地图片上传头像": "Adgang til læse- og skrivetilladelser kræves for at uploade avatarer ved hjælp af lokale billeder", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Adgang til placeringsinformation kræves for at bruge tilføjelsesnøglefunktionen.", + "申请": "Ansøgning", + "权限": "Tillage", + "不允许": "Ikke tilladt", + "允许": "Tilladt", + "权限被拒绝": "Tilladelse nægtet", + "请手动在系统设置中开启": "Aktivér det manuelt i systemindstillinger", + "权限以继续使用应用": "Tilladelse til at fortsætte med at bruge programmet.", + "去设置": "Gå og slå det op.", + "当前网络": "Nuværende netværk", + "位置信息": "Placeringsoplysninger", + "请输入wifi名称": "Indtast venligst wifi- navnet", + "虹膜": "Iris", + "手掌": "Palme", + "商城": "Indkøbscent", + "我的": "Je", + "微信公众号推送": "Vichat offentlige konto", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "For at åbne Wechat for at modtage alarmbeskeder, skal du være opmærksom på Skye Smart Lock vichat offentlige konto først, gem venligst QR-koden og brug wechat til at scanne indstillinger", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Adgang til Bluetooth-tilladelser er påkrævet for at bruge placeringsinformationen for tilføje nøglefunktionens placering", + "请输入Email": "Indtast din e- mail", + "请输入手机号": "Indtast dit telefonnummer", + "家人到家": "Familiemedlem ankom hjem.", + "添加家人": "Tilføj familiemedlem.", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Hvis låsen ikke er tilsluttet internettet, påmindelser om adgangskode, kort, fingeraftryk, og andre døråbningsmetoder kan ikke sendes rettidigt.", + "消息提醒": "Påmindelse", + "开门通知": "Åbningsmeddelelse", + "N天未开门": "N dage uden døråbning", + "门未关好": "Døren er ikke lukket", + "防拆报警": "Tamper- alarm", + "低电量提醒": "Lavt batteri", + "胁迫开门": "Tvungen døråbning", + "有人按门铃": "Nogen ringer på.", + "有人出现在门口": "Nogen dukker op ved døren.", + "提醒方式": "Påmindelsesmetode", + "开门方式": "Døråbningsmetode", + "请选择": "Vælg", + "家人": "Familiemedlemmer", + "保存": "Gem", + "APP推送": "APP tryk", + "管理员": "Administrering", + "未启用": "Ikke aktiveret", + "已启用": "Aktiveret", + "省电模式": "Energibesparelsestilstand", + "逗留抓拍模式": "Hold optagelsestilstand", + "实时监控模式": "Overvågningstilstand", + "自定义模式": "Brugerdefineret tilstand", + "猫眼设置": "Katteøjeindstillinger", + "猫眼工作模式": "Katteøjets arbejdstilstand", + "自动亮屏": "Automatisk lys skærm", + "亮屏持续时间": "Skærm til tiden", + "逗留警告": "Vær advarende.", + "异常警告": "Unormal advarsel:", + "短信提醒": "SMS", + "邮件提醒": "E- mail", + "N天未开门提醒": "N dage uden døråbning", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Hvis nogen tvinger dig til at åbne låsen, kan du bruge dette fingeraftryk. Alarmmeddelelsen vil blive sendt til administratorer.TO bruge denne funktion,Sørg venligst for din lås er online.", + "胁迫指纹": "Tvunget fingeraftryk", + "指纹列表": "Fingeraftrykslisten", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Efter den indstillede tid, hvis låsen ikke åbnes, vil systemet sende en påmindelse meddelelse til den udpegede modtager. Denne funktion kræver, at låsen er tilsluttet internettet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Efter aktivering af påmindelsen , når låse batteriet er under 20%, 10%, og 5% , systemet sender en påmindelsesmeddelelse til den udpegede modtager.", + "未开门时间": "Dage uden døråbning", + "添加和使用面容开锁时:": "Tilføj og brug Face, når du låser op:", + "关锁": "Tæt lås", + "功能": "Funktion", + "配件": "Dele", + "云存": "Skylagring", + "本地": "Dette område", + "3天滚动储存": "3 dage rullende opbevaring", + "去升级": "Opgrader nu", + "下载列表": "Download listen", + "已下载": "Downloadet", + "全部视频": "Alle videoer", + "已为本设备免费提供3大滚动视频储存服务": "Tre rullende videolagringstjenester er blevet leveret gratis for denne enhed.", + "视频播放": "Videoafspilning", + "全选": "Alle", + "请选择要删除的视频": "Vælg den video du ønsker at sletter", + "请选择要下载的视频": "Vælg den video du vil downloade", + "欢迎使用": "Velkommen til at bruge", + "用户协议和隐私政策概要": "Oversigt over brugeraftalen og fortrolighedspolitikken", + "协议概要": "Protokolresumé", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Tak for at bruge dette program. Vi lægger stor vægt på dine personlige oplysninger og beskyttelse af privatlivets fred. Før du bruger dette produkt, skal du læse det omhyggeligt.", + "《用户协议》": "Brugerbetingelser", + "和": "Og", + "《隐私政策》": "Indsigtspolitik", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Hele indholdet af. Ved at klikke på \"Avtale\", accepterer du og accepterer alle betingelser. Hvis du vælger ikke at acceptere, vil du ikke være i stand til at bruge vores produkter og tjenester og vil forlade programmet.", + "不同意": "Uenig", + "同意": "Accepter", + "该功能是高级功能,请开通后再使用": "Dette er den avancerede funktion. Aktivér den først.", + "常用程序": "Fælles programmer", + "该锁已被重置": "Låsen er blevet nulstillet.", + "需要访问读写权限才能使用手动升级固件": "Adgang til læse- og skrivetilladelser kræves for manuelt at opgradere firmware manuelt", + "错误D固件,请选择正确的文件": "Forkert firmware. Vælg den korrekte fil.", + "非SYD固件,请选择正确的文件": "Ikke SYD firmware, vælg venligst den korrekte fil.", + "文件校验失败 0x01": "Verifikation af filen mislykkedes 0x1", + "解析元数据失败,请选择正确的文件": "Kunne ikke fortolke metadata. Vælg den korrekte fil.", + "文件校验失败 0x02": "Filverifikation mislykkedes 0x02", + "文件校验失败 0x03": "Verifikation af filen mislykkedes 0x03", + "固件升级完成": "Firmware- opgradering gennemført", + "记录": "Registreringer", + "开通高级功能后才可以对锁进行管理": "Aktivér venligst avanceret funktion først til at håndtere låse.", + "去开通": "Aktivér aktivt", + "实名认证": "Godkendelse af reelle navne", + "当前剩余数量": "Resterende.", + "购买": "Køb", + "实名认证为付费功能,请购买后再使用": "Real-navn godkendelse er en betalt funktion, brug den efter køb", + "密码不一致哦": "Adgangskoderne er inkonsekvente", + "退出添加": "Stop tilføjning", + "管理员已满": "Administrativ fuldt", + "用户已满": "Brugeren er fuld", + "锁上面添加指纹已满": "Tilføj fingeraftryk på lås er fuldt", + "指纹已存在": "Fingeraftrykket findes allerede.", + "锁上面添加人脸已满": "Lås over add face er fuld", + "人脸已存在": "Ansigtet findes allerede.", + "锁上面添加卡已满": "Lås over add kortet er fuldt", + "卡已存在": "Kort eksisterer", + "锁上面添加密码已满": "Lås over adgangskode er fuld", + "密码已存在": "En identisk adgangskode findes allerede.Vælg en anden", + "请输入密码": "Indtast venligst adgangskode", + "暂无密码,无需重置": "Ingen adgangskode, ingen behov for at nulstille", + "真实姓名": "Rigtige navn", + "身份证号": "ID-nummer", + "请输入真实姓名": "Indtast venligst dit rigtige navn.", + "请输入身份证号": "Indtast venligst dit ID- nummer", + "请输入身份证号和真实姓名": "Indtast venligst dit ID- nummer og rigtige navn.", + "点击返回设备配对": "Tryk på Tilbage til enhedsparing", + "无法连接?尝试升级": "Kan ikke forbinde?", + "固件升级提示": "Prompt for opgradering af FirmwareName", + "请先获取固件文件到手机本地,再选择升级": "Få venligst firmware-filen til den lokale telefon først, og vælg derefter Opgrader", + "固件升级中": "Firmwaren bliver opgraderet", + "取消升级": "Annullér opgraderingen", + "固件传输中": "Firmaer i transit", + "关闭": "Sluk for:", + "传输中'": "I transit", + "操作记录": "Registreringer", + "修改姓名": "Redigér navn", + "传输中": "I transit", + "发送人": "Udstedt af:", + "发送时间": "Udstedt tid", + "钥匙详情": "Ekey- infoName", + "姓名": "Navn", + "发送": "Send", + "请确认姓名全名和身份证号码是否正确": "Bekræft venligst, at det fulde navn og ID-nummer er korrekt.", + "传输期间请勿离开当前页面": "Forlade ikke den aktuelle side under overførsel", + "机型": "Modeller", + "硬件版本": "Hardware-versionen", + "固件版本": "Firmware-versionen", + "手动升级": "Manuel opgradering", + "设备连接中...": "Enhedsforbindelse...", + "未避免异常情况,请在门打开时升级": "Undgåelige undtagelser, opgrader venligst når døren er åben.", + "钥匙无效": "Nøglen er ugyldig", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Kan ikke forbinde til låsen.Genstart telefonens Blutooth og prøv igen.", + "如果是全自动锁,请使屏幕变亮": "Hvis det er en fuldautomatisk lås, bedes skærmen gøre lysere", + "正在尝试闭锁……": "Forsøger at låse. Vent venligst...", + "清空记录": "Ryd optegnelser", + "是否要删除操作记录?": "Fortsæt med at slette poster?", + "被删除的记录不能恢复": "Optegnelserne kan ikke inddrives efter sletning.", + "全部事件": "Alle begivenheder", + "开锁事件": "Lås op begivenheden", + "异常事件": "Unormal hændelse:", + "门铃事件": "Dørklokke begivenheden", + "视频事件": "Videobegivenheden", + "请开启蓝牙": "Slå Bluetooth på", + "请选择有效日": "Vælg den effektive dag", + "公司名字长度不能小于 6 ": "Virksomhedens navn kan ikke være mindre end 6.", + "已是最新版本": "Ingen opdateringer", + "新建短信模版": "Opret SMS- skabelon", + "新建邮件模版": "Opret e- mail- skabelon", + "自定义短信模版": "SMS- skabelon", + "自定义邮件模版": "E- mail- skabelon", + "名称": "Navn", + "星星锁": "Stjernelås", + "无考勤记录": "Ingen registreringer", + "大家干劲十足": "Alle kommer i tide.", + "工作时长未出炉": "Ingen arbejdstider", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Valget af land/region vil påvirke datasikkerheden.Du har i øjeblikket valgt Albanien, bekræft venligst før du fortsætter.", + "确认国家或地区": "Bekræft land/region", + "我知道了": "Forstået.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "For at modtage vigtige opdateringer skal du klikke på \"OK\" og aktivere meddelelser i indstillingerne.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Efter at have tændt, kan du re-strøm på ved længe at trykke på indstillingstasten på låsen, og tilføje det igen med APP.", + "已有": "Nuværende", + "新增": "Nyt", + "账号格式错误": "Dårligt format", + "接收者信息为空": "Modtagerinformationen er tom", + "请输入时间(秒)": "Indtast venligst tid (sec)", + "加载数据失败": "Kunne ikke indlæse data", + "重试": "Prøv igen", + "升级中,是否退出": "Under opgraderingen, om der skal afsluttes.", + "下一步": "Næste", + "公寓": "Lejlighed:", + "个人用户": "Personligt", + "星寓": "Stjerne lejlighed.", + "账号": "Konto:", + "请输入手机号或email": "Telefonnummer eller e- mail", + "请输入星寓管理员的账号": "Indtast kontoen til stjerne lejlighedsadministratoren", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Alle data for den/de valgte låse/de valgte lås vil blive permanent overført til modtageren.", + "暂不支持跨平台转移,敬请期待": "Cross-platform overførsel er ikke understøttet for øjeblikket, se venligst frem til det", + "移除坏锁": "Flyt fejl / beskadigede låse til papirkurv", + "转移确认": "Bekræft overføring", + "本次共转移": "Denne gang i alt", + "把智能锁": "Smart lås", + "确认": "OK", + "移除成功": "Fjern effektivt", + "转移成功": "Succes til overførseln", + "该已锁被删除": "Den låste er slettet", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Den autoriserede admin kan kun administrere adgangskoder,ekeys og etccreated af sig selv.", + "添加授权管理员": "Opret administration", + "导出记录": "Eksportregistre", + "选择时间段": "Vælg tidsperiode", + "导出": "Eksportører", + "批量导出": "Batch-eksport", + "读取记录": "Genopfrisk poster", + "设备": "Enhed", + "消息": "Meddelelser", + "智能分析": "Intelligent analyse", + "精准识别设备事件,过滤无效信息": "Identificer enhedshændelser præcist og filtrerer ugyldig information ude", + "系统设置": "Systemindstillinger", + "系统的全局配置在此项内进行设置": "Systemets globale konfiguration er sat i dette punkt.", + "导出操作记录": "Eksportregistre", + "立即查看": "Vis VisComment", + "导出成功": "Eksporteret lykkes", + "发送钥匙": "Send ekey", + "进度": "Sats", + "失败": "Mislykkedes", + "人脸详情": "Ansigtsoplysninger", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Når nogen fornemmes ca. 1,5 meter foran døren, vil ansigtsgenkendelsen automatisk blive startet.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Når nogen fornemmes ca. 0,8 meter foran døren, vil ansigtsgenkendelsen automatisk blive startet.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Når nogen fornemmes omkring 0,5 meter foran døren, vil ansigtsgenkendelsen automatisk blive startet.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Følingsafstanden er blevet slukket, skal du manuelt røre enhver tast på tastaturet for at udføre ansigtsgenkendelse oplåsning.", + "防误开已打开,开锁后": "Anti- fejl åbningen er blevet tændt, og efter låsningen", + "秒内不可使用面容开锁": "Ansigtslåsning kan ikke bruges inden for få sekunder", + "掌静脉": "Palmevere", + "添加掌静脉": "Tilføj palmevere", + "胁迫掌静脉": "Tvunget palmevere", + "请不要将胁迫掌静脉用于日常开锁": "Brug venligst ikke tvang palmeårer til daglig oplåsning", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Forbundet til låsen, åbn håndfladen naturligt.", + "掌静脉详情": "Palme vene detaljer", + "掌静脉号": "Palmevene antal", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth er ikke tændt, tænd venligst Bluetooth i indstillingerne", + "删除用户时,会将用户拥有的钥匙一起删除。": "Hvis en bruger er DELETET enhver ekeys forbundet med brugeren vil også blive DELETET.", + "配置网络": "Indstil netværk", + "你好": "Goddag.", + "成功": "Lykkes", + "类型选择": "Type valg", + "请选择要使用哪种类型": "Vælg venligst hvilken type der skal bruges.", + "系统邮件(推荐)": "System- e-mail (Anbefalet)", + "系统短信(推荐)": "System- SMS (anbefalet)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-mailen vil blive sendt fra denne app.Køb e-mail-pakken først.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS vil blive sendt fra denne app.Køb e-mail-pakken først.", + "个人邮件": "Personlig e- mail", + "个人短信": "Personlig SMS", + "邮件将从你的个人邮箱发给用户": "E-mailen vil blive sendt fra din personlige e-mail-konto.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS-meddelelsen vil blive sendt fra dit personlige telefonnummer.Du betaler til din teleoperatør.", + "为了更好地应用体验,请确定权限": "For en bedre oplevelse af ansøgning, bedes du bekræfte tilladelser", + "您第一次拒绝权限,请确定权限": "Du nægtede tilladelse for første gang, bekræft tilladelsen.", + "您第二次拒绝权限,请去应用设置开启权限": "Du nægtede tilladelse for anden gang, gå til programmets indstillinger for at aktivere tilladelser", + "去应用市场": "Gå til app- storen", + "温馨提示": "Varm prompt", + "关闭应用": "Luk programmet", + "开启微信接收报警消息需要先关注": "For at åbne WeChat for at modtage alarmbeskeder, skal du følge", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat, gem QR-koden og brug WeChat til at scanne indstillingerne", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Realnavn godkendelse er en betalt funktion, kontakt låseadministratoren for at købe og bruge", + "位置权限": "Placering", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Bemærk appen til at bruge din locatian.Det bruges til at scanne BLE-låse og gateways.", + "相机/相册权限": "Tilladelse til kamera/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Giv appen til at læse og skrive foto og filer fra lager.", + "点击选择": "Klik for at vælge", + "微信": "WeChat", + "朋友圈": "Øjeblikker", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "Weibo Formand", + "FaceBook": "Facebook", + "链接": "Tilknytning", + "今天": "I dag", + "密码错误": "Ugyldig adgangskode", + "网络中断": "Netafbrydelse", + "钥匙不存在": "Nøglen findes ikke.", + "钥匙过期": "Nøgle udløbet", + "钥匙已存在": "Nøglen findes allerede.", + "密码失效": "Ugyldig adgangskod", + "门锁时间异常": "Unormal dørlåsetid", + "APP(手机)未联网": "APP (mobiltelefon) er ikke tilsluttet internettet.", + "数据不存在": "Data findes ikke", + "待接收": "Modtages", + "已冻结": "Frosne", + "已删除": "Slettet", + "未知": "Ukendt", + "拖动下方滑块完成拼图": "Træk skyderen til den rigtige indlæsning", + "验证成功": "Succes af verifikationen", + "验证失败": "Verifikation mislykkedes", + "向右拖动滑块填充拼图": "Træk skyderen til højre for at udfylde puslespilet", + "请先获取到位置信息哦": "Få venligst oplysninger om placeringen først.", + "请选择国家": "Vælg et land", + "获取锁信息": "Hent låseinformationer", + "锁数据异常,请重试": "Låsdata er unormal, prøv igen.", + "连接设备中...": "Forbindelsesenhed...", + "把锁": "Låser", + "条": "Strip", + "封": "Forsegling", + "次": "Tider", + "支付成功": "Betale succes.", + "查看详情": "Vis detaljer", + "请输入模板名称": "Indtast skabelonsnavn", + "模版类型": "Type", + "再返回一次退出": "Afslut igen.", + "请先添加锁": "Tilføj venligst låsen først.", + "可视对讲": "Visuel interkom.", + "详细日志": "Detaljeret log logName", + "已复制到剪切板": "Kopieret", + "拍照": "Fotografi", + "从相册选择": "Vælg mellem albumet", + "选择问题": "Vælg et spørgsmål", + "确认长度不足8位": "Bekræft længde mindre end 8 cifre.", + "新密码长度不足8位": "Ny adgangskode længde mindre end 8 cifre.", + "两次密码不一致": "Password fejlmatch.Prøv venligst igen.", + "请点击获取验证码,验证码将发送到": "Få venligst en bekræftelseskode.Koden vil blive sendt til", + "切换": "Skift", + "验证": "Verificér", + "验证成功,账号已删除": "Verifikation vellykket, konto slettet", + "该密码不是自定义密码,无法修改": "Denne adgangskode er ikke en brugerdefineret adgangskode og kan ikke ændres", + "请选择设备要关联哪些姓名": "Vælg hvilke navne enheden skal knyttes til", + "请选择姓名要关联哪些设备": "Vælg hvilke enheder navnet skal knyttes til:", + "确定要移除所选中的坏锁吗?": "Fjerne låsen?", + "邮件通知": "Meddelelse via e- mail", + "短信通知": "Meddelelse via SMS", + "您好,您的授权管理员生成成功": "Hej, din autoriserede administrator er blevet genereret med succet", + "请输入接收者姓名": "Indtast venligst her.", + "版本更新": "Version- opdatering", + "下次再说": "Næste gang", + "配网成功": "Succes af netværksdistribution", + "配网失败": "Netværksdistribution mislykkedes", + "该锁的无线键盘都将被删除": "Alle trådløse tastaturer til denne lås vil blive udelukket", + "实时画面": "Realtidsbillede", + "适合门口较为安全的环境。": "Velegnet til relativt sikre miljøer ved døren.", + "仅发生特定事件才录像,并可查看实时画面。": "Kun specifikke begivenheder registreres, og billedet i realtid kan ses.", + "一般情况下,满电可使用7-8个月": "Under normale omstændigheder kan det anvendes i 7-8 måneder, når det er fuldt opladet", + "有人逗留或发生特定事件才录像,可随时查看": "Nogen opholder sig eller bestemte begivenheder registreres, og kan ses når som helst.", + "实时画面。": "Realtidsbillede.", + "一般情况下,满电可使用5~6个月。": "Under normale omstændigheder, kan det bruges i 5 ~ 6 måneder, når fuldt opladet.", + "适合门口人员复杂、较不安全的环境。": "Velegnet til komplekse og relativt usikre miljøer ved døren.", + "有人出现就录像,可随时查看实时画面。": "Optag når nogen dukker op, og se billedet i realtid når som helst.", + "一般情况下,满电可使用2~4个月。": "Under normale omstændigheder, kan det bruges i 2 ~ 4 måneder, når fuldt opladet.", + "根据您家门口实际情况设置录像和实时画面功能。": "Indstil video- og realtidsbilledfunktioner i henhold til den faktiske situation på din dør.", + "可使用时长由具体设置决定。": "Anvendelsens varighed bestemmes af de specifikke indstillinger.", + "查看": "Vis VisComment", + "有人按门铃或发生": "Nogen ringer på.", + "异常事件时": "Unormale hændelser", + "不录像": "Ingen video.", + "有人出现、按门铃": "Nogen dukker op, ringer på dørklokken.", + "或发生异常事件时": "Eller en unormal hændelse opstår", + "逗留达到10秒": "Bliv i 10 sekunder", + "约1.5米": "Omkring 1,5 meter.", + "随时": "Når som helst.", + "立即录像": "Optag straks", + "录像时机": "Video timing", + "有人出现时录像": "Optag når nogen dukker op.", + "人体侦测距离": "Detektionsafstand for mennesker", + "查看实时画面": "Vis realtidsbillede", + "自定义时间": "Tilpasset tid", + "当日": "I dag", + "次日": "Næste dag.", + "自定义时段": "Brugerdefineret tidsperiode", + "发生事件时查看": "Vis når en begivenhed opstår", + "实时查看": "Realtidsvisning", + "有人在门口出现10秒后开始录像。": "Nogen dukker op ved døren i 10 sekunder før optagelsen.", + "有人按门铃时立即录像。": "Optag straks, når nogen ringer på døren.", + "有人出现在门前1.5米范围时启动录像": "Begynd at optage, når nogen kommer inden for 1,5 meter foran døren.", + "约0.8米": "Omkring 0,8 meter", + "约3.0米": "Omkring 3,0 meter.", + "添加指纹失败": "Operation mislykkedes.", + "项": "Poster", + "播放中": "Spiller", + "下载": "Hent", + "暂无下载内容": "Intet download indhold", + "亮度": "Lysstyrde", + "音量": "Mængde", + "快进至": "Hurtig fremad", + "快退至": "Spol tilbage", + "暂无视频信息": "Ingen videoinformation", + "加载出错": "Indlæsningsfejl", + "请单人正对门锁,距离一个成年人手臂长度": "Stå venligst foran dørlåsen alene, i en armlængde.", + "(约0.6米)。": "(Ca. 0,6 meter).", + "保持脸部无遮挡,露出五官。": "Hold dit ansigt uophørligt og vis dine ansigtsfunktioner.", + "准备好了,开始添加": "Klar, begynd at tilføje", + "正在录入中...": "Optager...", + "添加人脸失败": "Kunne ikke tilføje ansigt", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Efter nulstilling vil låsens ansigter blive slettet. Er du sikker på at du vil nulstille?", + "人脸号": "Ansigtsnummer", + "虹膜详情": "Iris detaljer", + "虹膜号": "Iris-nummer", + "选择设备类型": "Vælg enhedstypen", + "照明灯具": "Belysningsarmaturer", + "电动窗帘": "Gardiner, elektriske", + "门窗传感器": "Dør- og vinduesensor", + "传感器": "Sensor", + "清除数据成功": "Data ryddet lykkes", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Låsen er ikke forbundet til internettet, så registreringen af kode, kort, fingeraftryk, og andre døråbningsmetoder kan ikke uploades i realtid.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Hvis du har brug for at holde de historiske optegnelser, kan du eksportere dem.", + "看不到操作记录,可能原因有": "Kan ikke se operationer, mulige årsager", + "操作记录详情": "Oplysninger om driftsregistre", + "操作时间": "Betjeningstid", + "此模块功能需要锁联网后设置方可生效": "Denne modul funktion skal indstilles efter låsen er tilsluttet internettet for at få virkning.", + "用户已存在": "Brugeren eksisterer", + "钥匙数量已到上限": "Antallet af taster har nået den øvre grænser", + "附近没有可用网关": "Der er ingen gateway i nærheden.", + "正在创建安全连接...": "Opretter en sikker forbindelse ...", + "监视状态下不能发送录音": "Kan ikke sende optagelser i overvågningstilstand", + "挂断": "Læg på.", + "监视中暂不能开锁": "Oplåsning er ikke tilgængelig under overvågning", + "长按说话": "Tryk og hold for at tale.", + "松开发送": "Frigivelse", + "请输入6位数字开锁密码": "Indtast venligst en 6-cifret adgangskode til opløsning", + "请输入开锁密码": "Indtast venligst adgangskoden for åbning af adgangskoden", + "接收者在有效期内可以不限次数使用": "Modtagere kan anvende ekeys i ubegrænsede tider inden for gyldighedsperioden.", + "接收者可以使用此App开关锁": "Modtager er i stand til at låse / åbne ved denne app.", + "单次钥匙有效期为1小时,只能使用一次": "Engangs ekey er gyldig i en time og kan kun bruges ENNCE.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Modtagere er i stand til at bruge ekeys for ubegrænsede tider inden for den faste cyklustid.", + "获取模板失败": "Kunne ikke få skabelonen", + "微信通知": "WeChat-meddelelser", + "系统短信": "System- SMS", + "系统邮件": "System- e- mail", + "模板": "Skabelon", + "新建模版": "Opret skabelon", + "您好,您的密码是": "Hej, din adgangskode er.", + "密码名字": "Adgangskodenavn", + "请输入6-9位密码": "Angiv venligst en 6-9- cifret adgangskode", + "设置密码": "Sæt adgangskode", + "操作成功,密码为": "Gennemført.Adgangskoden", + "类型:自定义-永久": "Type:Custom-Permanent", + "实时播放": "Afspilning i realtid", + "点击对讲": "Klik for at interfone", + "长按开锁": "Lang tryk for at låse op.", + "接听失败": "Kunne ikke besvares", + "请在锁设置中开启远程开锁": "Aktivér venligst fjernlåsning i låseindstillinger", + "接听": "Svar:", + "截图已保存到相册": "Skærmaftryk gemt på albummet", + "添加遥控": "Tilføj fjernbetjening", + "已连接到锁,请按遥控": "Forbundet til låsen, tryk venligst på fjernbetjeningen.", + "遥控号": "Fjernbetjeningsnummer", + "遥控详情": "Fjernbetjeningsoplysninger", + "照明": "Belysning", + "退出演示模式": "Afslut demo- tilstand", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tip: Den nuværende grænseflade er en display-grænseflade. Efter tilføjelse af enheden, kan du fortsætte med at bruge den", + "门已上锁": "Døren er låst.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Din konto er blevet brugt til at logge ind fra en ny enhed", + "开门成功": "Åbn døren med held", + "开门失败": "Kunne ikke åbne døren?", + "呼叫提醒": "Påmindelse af opkald", + "收到来自": "Modtaget fra", + "锁的呼叫": "Lås kald", + "加载数据中": "Indlæser data", + "搜索所有锁类型": "Søg i alle låstyper", + "锁电量更新时间": "Lås batteriopdateringstid", + "1月": "Jan.", + "2月": "Feb", + "3月": "Marr", + "4月": "Apr", + "5月": "Maj maj.", + "6月": "Jun", + "7月": "Julel", + "8月": "Aug", + "9月": "Sep", + "10月": "Okt", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Varme byer", + "导出锁数据": "Eksportér låsdata", + "一键开锁": "Et-klik oplås", + "已开通": "Åbnet", + "编辑员工": "Redigér personale", + "一": "Én", + "二": "To:", + "三": "Tre.", + "四": "Fire", + "五": "Fem", + "六": "Seks", + "日": "Solen", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?", + "在线": "OnlineComment", + "离线": "OfflineComment", + "购买记录": "Købsregistre", + "使用记录": "Brugerrekord", + "失效时间要大于当前时间": "Udløbstiden skal være længere end nuværende tidspunkt.", + "修改名字": "Redigér navn", + "时": "Time", + "分": "Minutt", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Du kan bruge Alexa til at låse op, låse og kontrollere låsen status.", + "支持的国家": "Støttede lande", + "支持的国家值": "USA, Canada, Storbritannien, Australien, Indien, Tyskland, Frankrig, Italien, Spanien, Japan.", + "操作流程": "Driftsprocesser", + "操作流程值": "1 Tilføj en lås og gateway med Smart lås APP\n\n2 Aktiver den fjernlåsefunktion af låsen i APP (denne funktion er slukket som standard). Hvis du ikke har denne indstilling, understøtter låsen ikke Alexa\n\n3 Tilføj færdigheder til Alexa og autorisere dem med Smart lås APP konto og adgangskode. Når godkendelsen er vellykket, kan du opdage enheder under kontoen\n\n4 Find låsen i Alexa-appen, tænd stemme oplåsfunktionen og indstille adgangskoden for sproget.\n\n5 Låsen kan betjenes gennem Alexa", + "Google Home": "Google-hjemName", + "Action name": "Handlingsnavn", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Understøttede sprog", + "英语": "Engelsk", + "Google Home操作流程的值": "1. Brug Smart lås APP til at tilføje låse og gateways\n\n2. Aktiver den fjernlåsefunktion af låsen i APP (denne funktion er slukket som standard). Uden denne indstilling understøtter låsen ikke Google Home.\n\n3. Installer Google Home APP og klik på \" \" knappen i øverste venstre hjørne\n\n4. På siden Indstillinger skal du vælge \"Arbejd med Google\"\n\n5. Søg efter \"ScienerSmart\" og brug den smart lås APP-konto og adgangskode til at autorisere", + "密码需至少包含数字/字母/字符中的2种组合": "Adgangskoden skal indeholde mindst 2 af følgende: tal, bogstaver og særlige tegn", + "已开锁": "Ulåset", + "已闭锁": "Låset", + "两次密码不一致哦": "Adgangskoderne er inkonsekvente", + "中功率": "Mellem effekt", + "常规使用": "Regelmæssig anvendelse", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Når gateway er tændt, tryk og hold nulstillingsknappen i 5 sekunder, og klik Next, når indikator lys blinker skiftevist", + "扫描设备": "Scan- enhed", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Sletning mislykkedes. Porten er måske offline. Vil du tvinge slette data?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_de.json b/lan/lan_de.json new file mode 100644 index 00000000..9b95837e --- /dev/null +++ b/lan/lan_de.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Sterns chloss", + "锁通通": "Verriegeln Sie sich durch", + "点击开锁,长按闭锁": "Berühren Sie, um sich zu entsperren, halten Sie, um zu sperren", + "考勤": "Teilnahme", + "考勤设置": "Anwesenheit seins tel lungen", + "电子钥匙": "EKeys", + "添加卡": "Karte hinzufügen", + "卡号": "Karten nummer", + "添加指纹": "Finger abdruck hinzufügen", + "指纹号": "Finger abdruck nummer", + "遥控": "Fernbedienung", + "添加人脸": "Gesicht hinzufügen", + "门锁日志": "Türschloss protokoll", + "密码号": "Kennwort nummer", + "添加者": "Betreiber", + "添加时间": "Zeit", + "重置": "Zurücksetzen", + "请输入手机号或者邮箱": "Telefonnummer/E-Mail", + "工作时间": "Arbeitszeit", + "工作日设置": "Arbeitstag einstellung", + "星期一": "Montag", + "星期二": "Dienstag", + "星期三": "Mittwoch", + "星期四": "Donnerstag", + "星期五": "Freitag", + "星期六": "Samstag", + "星期日": "Sonntag", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mo", + "周二": "Di", + "周三": "Mi", + "周四": "Do", + "周五": "Fr", + "周六": "Sa", + "周日": "Sonne", + "群发钥匙": "Senden Sie mehrere ekeys", + "锁": "Schloss", + "请添加": "Empfänger", + "允许远程开锁": "Ferns chloss", + "请输入验证码": "Verifizierungscode", + "获取密码": "Passcode generieren", + "请给密码命名": "Geben Sie einen Namen für diesen Passcode ein", + "密码有限期为6个小时,只能使用一次": "Dieser Passcode MUSS innerhalb von 6 Stunden ab dem aktuellen Zeitpunkt verwendet werden, sonst wird er aus Sicherheits gründen AUSGESETZT. Dieser Passcode kann nur EINMAL verwendet werden.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Geben Sie 6-9 Ziffern manuell als Passwort ein. Kann per Telefon Bluetooth neben dem Schloss hinzugefügt werden oder über das Gateway aus der Ferne hinzugefügt werden", + "获取": "Holen Sie sich", + "添加": "Hinzufügen", + "删除公司": "Firma löschen", + "密码详情": "Passcode-Info", + "修改密码": "Passcode ändern", + "添加虹膜": "Iris hinzufügen", + "添加门磁": "Tür sensor", + "添加无线键盘": "Drahtlose Tastatur", + "添加手掌": "Palm hinzufügen", + "请输入员工账号": "Geben Sie das Konto des Mitarbeiters ein", + "批量授权锁": "Gewähren Sie mehrere Schlösser", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Der autorisierte Admini strator hat die Mehrheits berechtigung, um diese Sperre zu betreiben.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Mit dieser Funktion können Sie die Smart Lock über ein Gateway entsperren. Diese Funktion kann NUR über Bluetooth eingesc haltet oder aus geschaltet werden.", + "排列方式": "Listen typ", + "早到榜": "Frühe Liste", + "迟到榜": "Verspätete Liste", + "当前模式": "Aktueller Modus", + "勤奋榜": "Arbeits liste hart", + "延迟时间": "Verzögerung szeit", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Das Schloss wird nach der Zeit automatisch gesperrt. Bitte entsperren Sie es zuerst einmal, um die Einstellung zur Verfügung zu stellen.", + "时间": "Zeit", + "开始时间": "Startzeit", + "结束时间": "Endzeit", + "工作时间设置": "Arbeitszeit einstellung", + "常开模式": "Durchgangs modus", + "常开时间": "In diesem Zeitraum", + "常开日期": "An diesen Tagen", + "添加员工": "Mitarbeiter hinzufügen", + "节假日": "Feiertag", + "打卡方式": "Methode", + "员工是否有钥匙": "Hat schon ekey", + "上班时间": "Startzeit", + "下班时间": "Schließ zeit", + "本周": "Diese Woche", + "单休": "Ein-Tages-wochen ende", + "双休": "Zwei-Tage-wochen ende", + "单双休": "Ein-zwei-Tage-wochen ende", + "年": "Jahr", + "月": "Monat", + "放假日期": "Feiertag", + "补班日期": "Arbeitstage", + "添加假日": "Fügen Sie Urlaub hinzu", + "开始日期": "Startdatum", + "必填": "Erforderlich", + "结束日期": "Enddatum", + "日榜": "Täglich", + "月榜": "Monatlich", + "考勤记录": "Aufzeichnungen", + "假日信息": "Urlaubs info", + "基本信息": "Grundlagen", + "无线键盘": "Drahtlose Tastatur", + "选择无线键盘": "Tastatur hinzufügen", + "门磁": "Tür sensor", + "自动闭锁": "Autos chloss", + "锁声音": "Lock Sound", + "防撬报警": "Manipulation salarm", + "重置键": "Reset-Taste", + "锁时间": "Sperr uhr", + "诊断": "Diagnose", + "上传数据": "Daten hochladen", + "导入其他锁数据": "Importieren Sie von einem anderen Schloss", + "锁升级": "Firmware-Update", + "标记房态": "Zimmers tatus", + "开锁提醒": "Benachricht igung entsperren", + "微信二维码": "QR-Code freischalten", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Personen mit elektronischen Schlüsseln können die Tür öffnen, indem sie diesen QR-Code über WeChat scannen. Der QR-Code jedes Schlosses ist unterschied lich. Sie können es ausdrucken und neben dem entsprechenden Schloss einfügen", + "锁编号": "Sperr nummer", + "电量": "Batterie", + "锁分组": "Sperr gruppe", + "选择分组": "Gruppe auswählen", + "创建新分组": "Eine Gruppe erstellen", + "管理员开锁密码": "Admin Passcode", + "更新": "Aktualisieren", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Der Batteries tand wird durch Gateway oder Telefon Bluetooth aktualisiert", + "当屏幕闪烁时,点击下一步": "Klicken Sie auf Weiter, wenn die Tastatur blinkt", + "输入*529#或按设置键": "Geben Sie README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # ein oder drücken Sie die Einstellungen-Taste", + "长按重置键2秒": "Drücken und halten Sie die Reset-Taste 2 Sekunden", + "附近的设备": "Ausrüstung in der Nähe", + "暂无数据": "Keine Daten", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Sie können den Tür status mit einem Tür sensor zusammen mit einem Gateway erhalten. Nur ein Sensor darf mit einem Schloss assoziiert werden.", + "开始": "Start", + "全天": "Alle Stunden", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Sie können mehrere Zeiträume für den Durchgangs modus festlegen. Innerhalb der eingestellten Zeiträume bleibt die Sperre nach dem Entsperren in einem offenen Zustand.", + "请选择锁音量": "Bitte wählen Sie Schloss volumen", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Durch Einschalten hören Sie den Ton aus dem Schloss", + "低": "Niedrig", + "较低": "Mittel niedrig", + "中": "Medium", + "较高": "Mittel hoch", + "高": "Hoch", + "开启后,锁被撬动时,会发出报警声": "Durch Einschalten aktivieren Sie die TAMPER-Warnung.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Durch Ausschalten wird die RESET-Taste deaktiviert.", + "校准时间": "Zeit kalibrieren", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Die Diagnose besteht darin, die Konfiguration informationen innerhalb des Schlosses zu lesen und hochzuladen, damit das Personal die Ursache des Fehlers analysieren kann", + "上传": "Hochladen", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Daten von Schloss auf Server hochladen. Es kann einige Minuten dauern", + "请选择要从哪把锁导入": "Wählen Sie eine Sperre zum Importieren aus", + "有新版本": "Haben Sie neue Version", + "当前版本": "Aktuelle Version", + "升级": "Aktualisieren", + "空闲": "Leerstand", + "已入住": "Besetzt", + "多语言": "Sprachen", + "添加锁": "Schloss hinzufügen", + "锁地址": "Sperr adresse", + "选择锁类型": "Wählen Sie den Schloss typ", + "NFC无源锁": "Passives Schloss NFC", + "添加设备": "Gerät hinzufügen", + "网关": "Gateway", + "客服": "Kunden service", + "设置": "Einstellungen", + "更多设置": "Mehr Set", + "消息推送": "Benachricht igung Push", + "锁用户管理": "Benutzer sperren", + "拥有的钥匙": "EKeys, die mit diesem Benutzer verbunden sind", + "批量授权": "Behörden leitung", + "关联设备": "Assoziiertes Gerät", + "关联姓名": "Assoziierter Name", + "转移智能锁": "Transfers chloss", + "选择锁": "Bildschirms perre", + "接收人信息": "Empfänger", + "转移网关": "Transfer-Gateway", + "锁屏": "Bildschirms perre", + "已关闭": "Aus", + "已开启": "Auf", + "开启": "Einschalten", + "确定要开启重置键?": "Weiter die Reset-Taste aktivieren?", + "确定要关闭重置键?": "Weiter die Reset-Taste deaktivieren?", + "隐藏无效开锁权限": "Ungültiger Zugriff ausblenden", + "APP开锁时需手机连网的锁": "Schlösser, die Telefon online benötigen", + "增值服务": "Dienstleistungen", + "关于": "Über", + "退出": "Abmelden", + "删除账号": "Konto löschen", + "个人信息": "Konto informationen", + "头像": "Avatar", + "昵称": "NickName", + "请输入昵称": "Bitte geben Sie Ihren Spitznamen ein", + "修改昵称": "Umbenennen", + "修改账号": "Konto bearbeiten", + "重置密码": "Passwort zurücksetzen", + "安全问题": "Sicherheits frage", + "为了你的账号安全,修改账号前请先使用验证码验证": "Für die Sicherheit Ihres Kontos verwenden Sie bitte die Konto kennwort überprüfung, bevor Sie das Konto ändern", + "请输入新账号": "Bitte geben Sie das neue Konto ein", + "找回密码和登录新设备时,可通过绑定的手机验证": "Die verbindliche Telefon nummer wird verwendet, um den Verifizierungs code zu erhalten.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Die verbindliche E-Mail wird verwendet, um den Verifizierungs code zu erhalten.", + "原密码": "Aktuelles Passwort", + "新密码": "Neues Passwort", + "确认密码": "Passwort bestätigen", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Falls Ihr Telefon verloren geht, können Sie sich bei einem neuen Telefon anmelden, indem Sie Sicherheits fragen beantworten.", + "问题一": "Frage 1", + "问题二": "Frage 2", + "问题三": "Frage 3", + "请输入你的答案": "Bitte geben Sie Ihre Antwort ein", + "即将到期": "Bald abgelaufen", + "去授权": "Gehen Sie zu autorisieren", + "修改名称": "Name bearbeiten", + "状态": "Status", + "WiFi名称": "Wifi-Name", + "网络MAC": "Netzwerk MAC", + "网关升级": "Gateway-Update", + "网关连接的锁": "Sperren, die mit diesem Gateway verbunden sind", + "信号强": "Stark", + "选择网关类型": "Wählen Sie Gateway-Typ", + "添加网关": "Gateway hinzufügen", + "重新通电": "Re Verbinden Sie die Strom versorgung", + "指示灯": "Anzeige leuchte", + "选择网关": "Wählen Sie Gateway", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G wird nicht unterstützt, Bitte wählen Sie ein WiFi von 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "WLAN-Passwort eingeben", + "网关名称": "Gateway-Name", + "请输入网关名称": "Gateway-Name eingeben", + "IP地址": "IP-Adresse", + "子网掩码": "Subnetz maske", + "默认网关": "Standard-Gateway", + "自动获取DNS服务器地址": "Holen Sie sich automatisch die DNS-Server-Adresse", + "首选DNS": "Bevorzugte DNS", + "备选DNS": "Alternative DNS", + "不使用静态IP": "Keine statische IP wird verwendet", + "使用静态IP": "Statische IP verwenden", + "请输入IP地址": "IP-Adresse eingeben", + "请输入子网掩码": "Geben Sie die Subnetz maske ein", + "请输入默认网关": "Geben Sie Standard-Gateway ein", + "所有锁": "Alle Schlösser", + "搜索所有类型的锁": "Scannen Sie alle Arten von Schlössern", + "门锁": "Türschloss", + "挂锁": "Vorhänge schloss", + "保险箱锁": "Sichere Verriegelung", + "智能门禁": "Intelligente Zugangs kontrolle", + "车位锁": "Parks chloss", + "摸亮触摸屏": "Berühren Sie eine beliebige Taste, um die Tastatur zu aktivieren", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Bitte berühren Sie eine beliebige Taste, um die Sperre zu aktivieren und sie in den Paarungs modus zu versetzen. Drücken Sie Next", + "附近的锁": "Schlösser in der Nähe", + "如需修改名字请重新命名,点击确定添加锁": "Wenn Sie den Namen ändern möchten, bitte umbenennen, klicken Sie auf OK, um die Sperre hinzuzufügen", + "添加锁时,手机必须在锁旁边": "Beim Hinzufügen eines Schlosses muss sich das Telefon neben dem Schloss", + "登录": "Login", + "注册": "Registrieren", + "我已阅读并同意": "Ich habe gelesen und zugestimmt", + "验证码": "Code", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Ihr Passwort muss 8-20 Zeichen haben und mindestens zwei Arten von Zahlen, Buchstaben und Symbolen enthalten", + "手机": "Telefon", + "邮箱": "E-Mail", + "请输入邮箱": "Geben Sie Ihre E-Mail-Adresse ein", + "国家/地区": "Land/Region", + "你所在的国家/地区": "Ihr Land/Ihre Region", + "选择国家/地区": "Wählen Sie Ihr Land oder Ihre Region", + "获取验证码": "Code erhalten", + "商务合作": "Geschäft", + "电脑网页版": "Web-System", + "酒店系统": "Hotel-System", + "说明书网页版": "Benutzer handbuch", + "高级功能": "Fort geschrittene Funktion", + "记录保存": "Rekorde Aufbewahrung", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Die SMS kann verwendet werden, um Passcode-und ekey-Informationen an den Empfänger zu senden.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Die E-Mail kann verwendet werden, um Passcode und ekey-Informationen an den Empfänger zu senden.", + "购买实名认证提示": "Nachdem die Funktion aktiviert ist, müssen Sie Ihren Finger abdruck, Ihr Gesicht oder Ihr Konto kennwort verwenden, um die APP zu öffnen. Es besteht keine Notwendigkeit, 3 Minuten lang erneut zu überprüfen", + "请选择你希望的实名认证频次": "Bitte wählen Sie die gewünschte Authentifizierungs frequenz", + "仅首次": "Zum ersten Mal", + "每日一次": "Einmal am Tag", + "每周一次": "Einmal pro Woche", + "每月一次": "Einmal im Monat", + "当前状态": "Aktueller Status", + "试用中": "Vor Gericht", + "高级功能权益内容": "Fort geschrittene Funktionen", + "短信模板": "SMS-Vorlage", + "邮件模板": "E-Mail-Vorlage", + "发卡工具": "Karten-Encoder", + "购买高级功能须知": "Hinweis", + "购买高级功能提示": "Erweiterte Funktionen sind in der Entwicklung, und wenn Sie sie benötigen, können Sie den Service basierend auf der Anzahl der Schlösser öffnen. Erweiterte Funktionen sind nur für Ihre eigenen Schlösser verfügbar. Wenn Sie ein autorisierter Admini strator sind, wenden Sie sich bitte an den obersten Admini strator des Schlosses, um den Dienst zu öffnen", + "免费体验": "Kostenlose Testversion", + "立即开通": "Jetzt öffnen", + "购买短信": "SMS kaufen", + "购买邮件": "EMail kaufen", + "购买实名认证次数": "Kaufen Sie Authentifizierungs zeiten für echte Namen", + "开通高级功能": "Erweiterte Funktion aktivieren", + "选择套餐": "Wählen Sie Paket", + "支付方式": "Zahlungs modus", + "支付宝": "Alipay", + "去支付": "Bezahlen", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Sie dürfen die Nachricht selbst definieren. Es wird verwendet, um Informationen von Passcode und ekey an andere zu senden.", + "高级功能仅能用于你自己的锁": "Die erweiterte Funktion kann nur Ihre eigenen Schlösser angewendet werden.", + "新建模板": "Kreat Vorlage", + "类型": "Typ", + "模版内容": "Vorlagen inhalt", + "预览": "Vorschau", + "房间名": "Zimmer", + "预计产生短信条数": "Geschätzte Nachrichten segmente", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Mit dieser Funktion können Sie Pass codes,ekeys, Karten und Finger abdrücke ausblenden, die für einen bestimmten Zeitraum ungültig sind.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Das Telefon des Benutzers muss online sein, um diese ausgewählten Schlösser mit APP zu entsperren.", + "配置WiFi": "WiFi konfigurieren", + "请输入WiFi名字": "Bitte geben Sie den Wifi-Namen ein", + "WiFi配网": "WiFi-Vertriebs netz", + "胁迫卡": "Stress karte", + "员工是否有密码": "Hat bereits Passcode", + "员工是否有卡": "Hat bereits Karte", + "员工是否有指纹": "Stellen Sie bereits den Finger abdruck ein", + "获取钥匙": "Holen Sie sich den Schlüssel", + "获取卡": "Karte erhalten", + "获取指纹": "Finger abdruck bekommen", + "安全验证": "Überprüfung der Identität", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle Ihre Konto informationen werden DAUERHAFT von der Plattform entfernt und können nicht wieder hergestellt werden. Möchten Sie löschen?", + "监控": "Monitor", + "视频日志": "Video protokoll", + "开门器": "Türöffner", + "面容开锁": "Gesicht öffnet sich", + "开门方向设置": "Öffnungs richtung Set", + "电机功率设置": "Motorpower-Einstellung", + "开锁时是否需联网": "Wenn das Internet beim Entsperren erforderlich ist", + "选择要加入分组的锁": "Wählen Sie LockS, um diese Gruppe hinzuzufügen", + "锁数量": "Schloss zählung", + "小米IOT平台": "Xiaomi IOT Plattform", + "面容开锁设置": "Gesicht entriegelt Set", + "感应距离": "Abstand abspüren", + "防误开": "Falsches Öffnen verhindern", + "防误开已关闭,关门后仍可使用面容开锁": "Verhindern Sie Fehleinschöpfen wurde geschlossen, nach dem Schließen der Tür kann immer noch Gesichts entriegelung verwenden", + "添加和使用面容开锁时": "Gesicht beim Entsperren hinzufügen und verwenden", + "添加和使用面容开锁时提示": "\n1, bitte versuchen Sie, eine einzelne Person vor dem Tür betrieb zu halten;\n2, bitte stehen Sie vor dem Türschloss etwa 0,5 ~ 0,8 Meter vor dem Türschloss;\n3. Bitte halten Sie Ihr Gesicht frei und legen Sie Ihre Gesichtszüge frei;\n4. Wenn die Gesichts erkennung abnormal ist, können Sie eine beliebige Taste auf der digitalen Tastatur berühren, um die Gesichts erkennung manuell neu zu starten.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Bitte wählen Sie die Motor leistung sorgfältig entsprechend der tatsächlichen Situation des Türschlosses:", + "小功率:": "Miniwatt:", + "耗电少": "Weniger Strom verbrauch", + "大功率": "Hoch leistungs:", + "大功率提示": "Wenn die Verriegelung zunge beim Entriegeln nicht normal zurück gezogen werden kann oder gefahren werden muss", + "开门方向设置提示": "Bitte wählen Sie sorgfältig die Richtung, um die Tür Ihres Hauses zu öffnen (wenn Sie die falsche Richtung wählen, können Sie die Tür nicht richtig öffnen und schließen):", + "左开": "Offen links", + "右开": "Offen rechts", + "判断方法:": "判断方法:", + "判断方法内容": "Der Mann stand vor dem Haus, gegenüber der Eingangstür.", + "录像时段": "Video-Slot", + "密码": "Passcodes", + "卡": "Karten", + "指纹": "Finger abdruck", + "人脸": "Gesicht", + "配件商城": "Lock Mall", + "公司名称": "Name des Unternehmens", + "请输入公司名字": "Name des Unternehmens eingeben", + "提示": "Hinweis", + "是否删除?": "Ob zu löschen?", + "员工信息": "Informationen zum Personal", + "员工": "Personal", + "打卡方式无效": "Nicht verfügbar", + "中国": "China", + "选择钥匙": "Wählen Sie ekey", + "编辑": "Bearbeiten", + "无": "Nein", + "有": "Ja", + "请输入姓名": "Bitte geben Sie einen Namen ein", + "获取人脸": "Gesichter bekommen", + "选择密码": "Wählen Sie Passcode", + "选择卡": "Wählen Sie Karte", + "选择指纹": "Wählen Sie Finger abdruck", + "选择人脸": "Gesicht auswählen", + "员工是否有人脸": "Ob der Mitarbeiter ein Gesicht hat", + "同时删除员工钥匙": "Löschen Sie seinen ekey", + "删除": "Debet", + "确定要删除员工吗?": "Diesen Mitarbeiter löschen", + "月统计": "Monatliche Statistiken", + "迟到": "Spät", + "早退": "Früh gehen", + "未打卡": "Keine Aufzeichnung", + "钥匙将在": "Dieser ekey wird in", + "天后失效": "Tag (en)", + "电量更新时间:": "Batterie-Update-Zeit:", + "新增配件": "Hinzufügen", + "钥匙不可用": "Schlüssel ist nicht verfügbar", + "正在开锁中...": "Entsperren...", + "你的钥匙": "Ihr Schlüssel", + "常开模式启动!长按闭锁": "Offener Modus gestartet! Lange drücken, um zu verriegeln", + "演示模式": "Demo-Modus", + "请先同意用户协议及隐私政策": "Bitte stimmen Sie zuerst der Benutzer vereinbarung und den Datenschutz bestimmungen zu", + "用户协议": "Nutzungs bedingungen", + "隐私政策": "Datenschutz richtlinie", + "注册成功": "Anmeldung erfolgreich", + "你所在的": "Sie sind in", + "手机号": "Telefon nummer", + "忘记密码": "Passwort vergessen", + "重置成功": "Erfolg zurücksetzen", + "确定要退出吗?": "Ausgang?", + "功能暂未开放": "Funktion ist noch nicht geöffnet", + "设置成功": "Erfolgreich eingerichtet", + "删除成功": "Erfolgreich löschen", + "单次": "Einmalig", + "永久": "Dauerhaft", + "限时": "Zeitlich", + "自定义": "Custom", + "清空码": "Löschen", + "循环": "Wiederkehrend", + "工作日": "Arbeitstag", + "每日": "Täglich", + "周末": "Wochen ende", + "确定要删除吗?": "Löschen?", + "该锁的密码都将被删除": "Alle Passcodes für dieses Schloss werden GELÖSCHT", + "已过期": "Ungültig", + "该锁的电子钥匙都将被删除": "Alle eKeys für dieses Schloss werden GELÖSCHT", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "LÖSCHEN Sie alle ekeys, die mit diesem ekey verbunden sind. Dieser Schritt kann nicht UNDONE sein!", + "删除钥匙会在用户APP连网后生效": "Der ekey wird GELÖSCHT", + "有效时间": "Effektive Zeit", + "接收者": "Empfänger", + "仅管理自己创建的用户": "Verwalten Sie nur seine eigenen Benutzer", + "远程开锁": "Fern entsperren", + "请输入钥匙名称": "Bitte geben Sie den Namen des Schlüssels ein", + "修改成功": "Erfolg ändern", + "冻结": "Einfrieren", + "解除冻结": "Tauwetter", + "授权": "Autorisieren", + "取消授权": "De-Autorisieren", + "同时解冻其发送的钥匙": "Alle von diesem Benutzer ausgestellten ekeys auftauen", + "会在用户APP连网后生效": "Dieser Ekey wird THAWED, wenn die APP des Benutzers eine Verbindung zu einem Netzwerk herstellt", + "同时冻结其发送的钥匙": "Alle von diesem Benutzer ausgestellten ekeys einfrieren", + "冻结会在用户APP连网后生效": "Dieser Ekey wird GEFROREN, wenn die APP des Benutzers eine Verbindung zu einem Netzwerk herstellt", + "取消授权会在用户APP连网后生效": "Der Benutzer wird seine Berechtigungen verlieren, wenn die APP des Benutzers eine Verbindung zu einem Netzwerk herstellt", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Der autorisierte Benutzer hat fast die gleichen Berechtigungen wie der LOCK Manager (z. B. Fähigkeit, ekeys und Passcodes zu senden)", + "失效时间需晚于生效时间": "Die Ablauf zeit muss später als die effektive Zeit sein", + "生效时间需晚于当前时间": "Die effektive Zeit muss später als die aktuelle Zeit sein", + "失效日期需晚于生效日期": "Das Ablaufdatum muss später als das Datum des Inkrafttretens liegen", + "修改有效期": "Änderungs zeitraum", + "生效日期": "Startdatum", + "失效日期": "Enddatum", + "开锁": "Entsperren", + "开锁成功": "Erfolg freischalten", + "请选择锁": "Bitte wählen Sie Schlösser", + "请选择接收者": "Bitte wählen Sie den Empfänger", + "请选择有效期": "Bitte wählen Sie die Gültigkeit dauer", + "请选择发送方式": "Bitte wählen Sie die Sende methode", + "请选择结束时间": "Bitte wählen Sie die Endzeit", + "完成": "Komplett", + "有效日": "Radfahren weiter", + "发送成功": "Erfolg senden", + "请选择开始时间": "Bitte wählen Sie die Startzeit", + "选择用户": "Empfänger auswählen", + "已选中": "Ausgewählt", + "确定": "OK", + "请选择要发送的锁": "Bitte wählen Sie Schlösser", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Face Real-Name-Authentifizierung bezieht sich auf die Notwendigkeit des Benutzers, sein Gesicht vor dem Entsperren der Telefon-APP zu überprüfen, und die Verifizierung kann entsperrt werden.", + "分享": "Teilen", + "请输入接收者账号": "Bitte geben Sie das Empfänger konto ein", + "接收者号码未注册,请重新发送": "Die Empfänger nummer ist nicht registriert, bitte erneut senden", + "是否发送电子钥匙给未注册账号": "Möchten Sie einen ekey an ein neues Konto senden", + "取消": "Abbrechen", + "标记成功": "Erfolg markieren", + "微信好友": "WeChat Freunde", + "短信": "SMS", + "邮件": "E-Mail", + "更多": "Mehr", + "您好,您的电子钥匙生成成功": "Hallo, Ihr elektronischer Schlüssel wird erfolgreich generiert", + "生效时间不能小于当前时间": "Die effektive Zeit kann nicht kleiner sein als die aktuelle Zeit", + "结束时间不能小于当前时间": "Die Endzeit kann nicht kleiner sein als die aktuelle Zeit", + "是否为管理员": "Ist es ein Admini strator", + "已连接到锁,请将卡靠近门锁的读卡区": "Verbunden. Platzieren Sie die Karte gegen den Kartenleser", + "尝试连接设备...": "Verbindung mit Schloss. Bitte warten Sie...", + "地理位置": "Geografische Lage", + "检查以确保以下地址是正确的": "Stellen Sie sicher, dass die folgende Adresse korrekt ist", + "地图加载中,请稍候。。": "Die Karte wird geladen, bitte warten Sie...", + "跳过": "Überspringen", + "还未获取到位置信息哦,请耐心等待一下!": "Die Standort informationen wurden noch nicht erhalten, bitte warten Sie geduldig!", + "请填写信息": "Bitte geben Sie die Informationen ein", + "有效期": "Gültigkeit dauer", + "生效时间": "Startzeit", + "失效时间": "Endzeit", + "上传成功": "Erfolgreich hochgeladen", + "未生效": "Inaktiv", + "已生效": "Wirksam", + "指纹详情": "Info zum Finger abdruck", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Sie müssen Ihren Finger mehrmals am Sensor platzieren. Bitte folgen Sie den Anweisungen...", + "开始添加": "Start", + "请将您的手指按下": "Platzieren Sie Ihren Finger auf dem Sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Befolgen Sie die Anweisungen... Sie müssen Ihren Finger für die nächste Aufzeichnung entfernen und auf den Sensor legen", + "添加成功": "Fügen Sie Erfolg hinzu", + "更新成功": "Update-Erfolg", + "搜索": "Suche", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen wird die Karte der Sperre gelöscht. Möchten Sie sie zurücksetzen?", + "已失效": "Ungültig", + "卡详情": "Karten-Info", + "请输入": "Bitte geben Sie hier ein", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Durch Ausschalten bleibt die Sperre den ganzen Tag frei geschaltet, bis sie manuell gesperrt wird", + "请输入小于或等于60的数字": "Bitte geben Sie eine Nummer unter 60 ein", + "操作成功": "Betrieb erfolgreich", + "管理员密码相同,无需修改": "Das Admini strator kennwort ist das gleiche und muss nicht geändert werden", + "请输入6-9位数字": "6-9 Ziffern in der Länge", + "请输入6-9位管理员密码": "Bitte geben Sie ein 6-9-stelliges Admini strator passwort ein", + "请输入新的管理员密码": "Bitte geben Sie ein neues Admini strator passwort ein", + "未分组": "Nicht gruppiert", + "请输入分组名称": "Eine Gruppe erstellen", + "创建成功": "Erfolg schaffen", + "设置锁分组成功": "Stellen Sie die Sperr gruppe erfolgreich ein", + "电池1电量": "Batterie 1", + "电池2电量": "Batterie 2", + "电量更新时间": "Zeit für die Aktualisierung der Batterie", + "锁电量更新成功": "Lock Power Update Erfolg", + "您的钥匙未生效": "Ihr Schlüssel ist nicht wirksam", + "您的钥匙已冻结": "Ihr Schlüssel wurde eingefroren", + "您的钥匙已过期": "Ihr Schlüssel ist abgelaufen", + "常开模式开启": "Das Schloss befindet sich im Durchgangs modus", + "超级管理员": "Super Admin", + "授权管理员": "Autorisierter Admin", + "普通用户": "Gewöhnlicher Benutzer", + "余": "Bilanz", + "天": "Tag", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Nach dem Löschen der Sperre werden alle Informationen zusammen gelöscht. Möchten Sie die Sperre wirklich löschen?", + "请输入登录密码": "Bitte geben Sie das Anwendungs passwort ein", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Das Gerät konnte nicht gelöscht werden. Stellen Sie sicher, dass sich das Gerät in der Nähe des Geräts befindet, das Gerät nicht anges ch lossen ist und das Gerät eingesc haltet ist", + "用户无权限": "Benutzer hat keine Erlaubnis", + "创建公司后,考勤功能才能使用": "Bitte erstellen Sie zuerst ein Unternehmen", + "是否删除钥匙?": "Diesen ekey löschen?", + "邮箱绑定成功": "E-Mail bindender Erfolg", + "手机绑定成功": "Handy bindungs erfolg", + "网络访问失败,请检查网络是否正常": "Anfrage fehl geschlagen. Netzwerk nicht verfügbar, Bitte überprüfen und verbinden Sie Ihr Gerät mit 3G/4G/WIFI", + "清空": "Klar", + "是否清空?": "Klar?", + "消息详情": "Nachricht Info", + "创建时间": "Schöpfung szeit", + "管理员详情": "Details zum Admini strator", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Wenn jemand Sie zwingt, die Tür zu öffnen, können Sie diese Karte verwenden. Die Alarm meldung wird an die Verwalter gesendet. Um diese Funktion zu verwenden, stellen Sie bitte sicher, dass Ihre Sperre online ist.", + "请不要将胁迫卡用于日常开锁": "Bitte verwenden Sie die erzwungene Karte nicht für den täglichen Gebrauch.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Wenn jemand Sie zwingt, die Tür zu öffnen, können Sie diesen Finger abdruck verwenden. Die Alarm meldung wird an die Verwalter gesendet. Um diese Funktion zu verwenden, stellen Sie bitte sicher, dass Ihre Sperre online ist.", + "请不要将胁迫指纹用于日常开锁": "Bitte verwenden Sie den erzwungenen Finger abdruck nicht für den täglichen Gebrauch.", + "创建公司": "Erstellen Sie ein Unternehmen", + "公司名称不能超过30个字符": "Firmenname darf 30 Zeichen nicht überschreiten", + "公司名称不能小于6个字符": "Der Firmenname darf nicht weniger als 6 Zeichen betragen", + "WIFI列表": "WIFI-Liste", + "刷新": "Aktualisieren", + "手动配网": "Manuelles Vertriebs netz", + "远距离": "Langstrecke", + "中距离": "Mittlerer Abstand", + "近距离": "Kurze Distanz", + "锁时间更新成功": "Lock Time Update Erfolg", + "锁用户": "Benutzer sperren", + "请选择常开日期": "Bitte wählen Sie das offene Datum", + "结束时间不能小于开始时间哦": "Die Endzeit kann nicht kleiner sein als die Startzeit", + "介绍": "Unsere Geschichte", + "个人信息收集清单": "Liste der Sammlung personen bezogener Informationen", + "应用权限说明": "Beschreibung der Anwendungs erlaubnis", + "第三方信息共享清单": "Liste des Informations austauschs durch Dritte", + "请选择您的位置": "Bitte wählen Sie Ihren Standort", + "请先选择位置": "Bitte wählen Sie zuerst den Standort", + "管理员密码": "Admin Passcode", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Wenn Sie ändern müssen, geben Sie bitte ein neues Admini strator kennwort ein (6 Ziffern), klicken Sie auf OK zu ändern", + "修改": "Ändern", + "网络摄像头": "Kamera", + "重命名": "Umbenennen", + "分组下的锁将被移到未分组里": "Schlösser unter der Gruppe werden auf nicht gruppierte verschoben", + "编辑成功": "Erfolg bearbeiten", + "厂商": "Hersteller", + "型号": "Modell", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Nachdem das Passwort generiert wurde, verwenden Sie es bitte einmal für die Aktivierung vor 23:59 Uhr am selben Tag, andernfalls wird es nach 0 Uhr ungültig. Nachdem das Passwort aktiviert ist, kann es innerhalb der Gültigkeit dauer unbegrenzt verwendet werden.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Nachdem das Passwort generiert wurde, verwenden Sie es bitte vor 23:59 Uhr am selben Tag, andernfalls wird es nach 0 Uhr ungültig. Der klare Code wird verwendet, um alle Passwörter zu löschen, die heute vor 0 Uhr generiert wurden.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Nachdem das Passwort generiert wurde, verwenden Sie es bitte vor 23:59 Uhr am selben Tag, andernfalls wird es nach 0 Uhr ungültig.", + "清空密码底部提示": "Das Passwort ist am Tag der Leerung bis 23:59 Uhr gültig", + "相机": "Kamera", + "相册": "Fotos", + "读写": "Lagerung", + "定位": "Standort", + "需要访问相机权限才能拍照上传文件例如头像上传": "Der Zugriff auf die Kamera ist erforderlich, um Fotos aufzunehmen und Dateien hochzuladen, z. B. das Hochladen eines Profil bildes", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Der Zugriff auf die Kamera ist erforderlich, um Dateien und Avatare mithilfe von Album bildern hochzuladen", + "需要访问读写权限才能使用本地图片上传头像": "Zugriff auf Lese-und Schreib berechtigungen ist erforderlich, um Avatare mit lokalen Bildern hochzuladen", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Zugriff auf Standort informationen ist erforderlich, um die Funktion zum Hinzufügen von Tasten verwenden zu können", + "申请": "Anwendung", + "权限": "Erlaubnis", + "不允许": "Nicht erlaubt", + "允许": "Erlaubt", + "权限被拒绝": "Erlaubnis verweigert", + "请手动在系统设置中开启": "Bitte aktivieren Sie es manuell in den Systeme in stellungen", + "权限以继续使用应用": "Erlaubnis, die Anwendung weiterhin zu verwenden.", + "去设置": "Gehen Sie es einrichten", + "当前网络": "Aktuelles Netz", + "位置信息": "Standort informationen", + "请输入wifi名称": "Bitte geben Sie den WLAN-Namen ein", + "虹膜": "Iris", + "手掌": "Handfläche", + "商城": "Einkaufs zentrum", + "我的": "Meine", + "微信公众号推送": "Wechat öffentliches Konto", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Um Wechat zu öffnen, um Alarm meldungen zu erhalten, müssen Sie zuerst auf das öffentliche Konto von Skye Smart Lock wechat achten. Speichern Sie den QR-Code und verwenden Sie wechat, um die Einstellungen zu scannen", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Zugriff auf Bluetooth-Berechtigungen ist erforderlich, um die Standort informationen der Add-Key-Funktion zu verwenden", + "请输入Email": "Geben Sie Ihre E-Mail-Adresse ein", + "请输入手机号": "Geben Sie Ihre Telefon nummer ein", + "家人到家": "Familien mitglied nach Hause gekommen", + "添加家人": "Familien mitglied hinzufügen", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Wenn das Schloss nicht mit dem Internet verbunden ist, können Erinnerungen für Passcode, Karte, Finger abdruck und andere Türöffnung methoden nicht rechtzeitig gesendet werden.", + "消息提醒": "Erinnerung", + "开门通知": "Bekanntmachung zur Eröffnung", + "N天未开门": "N Tage ohne Türöffnung", + "门未关好": "Die Tür ist nicht geschlossen", + "防拆报警": "Manipulation salarm", + "低电量提醒": "Niedrige Batterie", + "胁迫开门": "Erzwungene Türöffnung", + "有人按门铃": "Jemand klingelt an der Tür", + "有人出现在门口": "Jemand erscheint an der Tür", + "提醒方式": "Erinnerungs methode", + "开门方式": "Türöffnung methode", + "请选择": "Bitte wählen Sie", + "家人": "Familien mitglied", + "保存": "Sparen", + "APP推送": "APP-Push", + "管理员": "Admin", + "未启用": "Nicht aktiviert", + "已启用": "Aktiviert", + "省电模式": "Energie spar modus", + "逗留抓拍模式": "Aufnahme modus bleiben", + "实时监控模式": "Echtzeit-Überwachungs modus", + "自定义模式": "Benutzer definierter Modus", + "猫眼设置": "Katzenaugen-Einstellung", + "猫眼工作模式": "Katzenaugen-Arbeits modus", + "自动亮屏": "Automatischer heller Bildschirm", + "亮屏持续时间": "Bildschirm pünktlich", + "逗留警告": "Bleiben Sie Warnung", + "异常警告": "Abnormale Warnung", + "短信提醒": "SMS", + "邮件提醒": "E-Mail", + "N天未开门提醒": "N Tage ohne Türöffnung", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Wenn jemand Sie zwingt, Schloss zu öffnen, können Sie diesen Finger abdruck verwenden. Die Alarm meldung wird an die Verwalter gesendet. Um diese Funktion zu verwenden, stellen Sie sicher, dass Ihr Schloss online ist.", + "胁迫指纹": "Erzwungener Finger abdruck", + "指纹列表": "Finger abdruck liste", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Wenn das Schloss nach der festgelegten Zeit nicht geöffnet wird, sendet das System eine Erinnerungs nachricht an den angegebenen Empfänger. Für diese Funktion muss die Sperre mit dem Internet verbunden sein.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Nachdem Sie die Erinnerung aktiviert haben, sendet das System eine Erinnerungs nachricht an den angegebenen Empfänger, wenn die Sperr batterie unter 20%, 10% und 5% liegt.", + "未开门时间": "Tage ohne Türöffnung", + "添加和使用面容开锁时:": "Gesicht beim Entsperren hinzufügen und verwenden:", + "关锁": "Schließ schloss", + "功能": "Funktion", + "配件": "Teile", + "云存": "Cloud-Speicher", + "本地": "Diese Lokalität", + "3天滚动储存": "3 Tage rollende Lagerung", + "去升级": "Jetzt aufrüsten", + "下载列表": "Download-Liste", + "已下载": "Herunter geladen", + "全部视频": "Alle Videos", + "已为本设备免费提供3大滚动视频储存服务": "Für dieses Gerät wurden drei Scrolling-Videosp eicher dienste kostenlos bereit gestellt", + "视频播放": "Video wiedergabe", + "全选": "Alle", + "请选择要删除的视频": "Bitte wählen Sie das Video, das Sie löschen möchten", + "请选择要下载的视频": "Bitte wählen Sie das Video, das Sie herunter laden möchten", + "欢迎使用": "Willkommen zu verwenden", + "用户协议和隐私政策概要": "Zusammenfassung der Benutzer vereinbarung und der Datenschutz richtlinie", + "协议概要": "Zusammenfassung des Protokolls", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Vielen Dank für die Verwendung dieser Anwendung. Wir legen großen Wert auf Ihre persönlichen Daten und den Schutz der Privatsphäre. Bevor Sie dieses Produkt verwenden, lesen Sie es bitte sorgfältig durch", + "《用户协议》": "Nutzungs bedingungen", + "和": "Und", + "《隐私政策》": "Tab Datenschutz richtlinie", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Der gesamte Inhalt von. Durch Klicken auf \"Zustimmen\" stimmen Sie zu und akzeptieren alle Bedingungen. Wenn Sie nicht zustimmen, können Sie unsere Produkte und Dienstleistungen nicht nutzen und beenden die Anwendung.", + "不同意": "Uneinigkeit", + "同意": "Zustimmen", + "该功能是高级功能,请开通后再使用": "Das ist die fort geschrittene Funktion. Bitte aktivieren Sie es zuerst.", + "常用程序": "Gemeinsame Programme", + "该锁已被重置": "Das Schloss wurde zurück gesetzt", + "需要访问读写权限才能使用手动升级固件": "Zugriff auf Lese-und Schreib berechtigungen ist erforderlich, um die Firmware manuell zu aktualisieren", + "错误D固件,请选择正确的文件": "Falsche Firmware, wählen Sie bitte die richtige Datei", + "非SYD固件,请选择正确的文件": "Nicht SYD Firmware, wählen Sie bitte die richtige Datei", + "文件校验失败 0x01": "Datei überprüfung fehl geschlagen 0x01", + "解析元数据失败,请选择正确的文件": "Metadaten nicht analysiert, wählen Sie bitte die richtige Datei", + "文件校验失败 0x02": "Datei überprüfung fehl geschlagen 0x02", + "文件校验失败 0x03": "Datei überprüfung fehl geschlagen 0x03", + "固件升级完成": "Firmware-Upgrade abgeschlossen", + "记录": "Aufzeichnungen", + "开通高级功能后才可以对锁进行管理": "Bitte aktivieren Sie zuerst die erweiterte Funktion, um Sperren zu verwalten.", + "去开通": "Aktivieren", + "实名认证": "Authentifizierung mit echtem Namen", + "当前剩余数量": "Verbleibende", + "购买": "Kaufen", + "实名认证为付费功能,请购买后再使用": "Die Authentifizierung mit echtem Namen ist eine kosten pflicht ige Funktion. Bitte verwenden Sie sie nach dem Kauf", + "密码不一致哦": "Die Passwörter sind inkonsistent", + "退出添加": "Aufgeben", + "管理员已满": "Admin voll", + "用户已满": "Der Nutzer ist voll", + "锁上面添加指纹已满": "Hinzufügen Finger abdruck auf Schloss ist voll", + "指纹已存在": "Der Finger abdruck existiert bereits.", + "锁上面添加人脸已满": "Die Sperre über dem Add-Gesicht ist voll", + "人脸已存在": "Das Gesicht existiert bereits", + "锁上面添加卡已满": "Die Sperre über der Add-Karte ist voll", + "卡已存在": "Karte bereits vorhanden", + "锁上面添加密码已满": "Sperren über Passwort hinzufügen ist voll", + "密码已存在": "Ein Identischer Passcode ist bereits vorhanden. Bitte wählen Sie einen anderen", + "请输入密码": "Bitte Passwort eingeben", + "暂无密码,无需重置": "Kein Passwort, keine Notwendigkeit zum Zurücksetzen", + "真实姓名": "Bürgerlicher Name", + "身份证号": "ID-Nummer", + "请输入真实姓名": "Bitte geben Sie Ihren richtigen Namen ein", + "请输入身份证号": "Bitte geben Sie Ihre ID-Nummer ein", + "请输入身份证号和真实姓名": "Bitte geben Sie Ihre ID-Nummer und Ihren echten Namen ein", + "点击返回设备配对": "Tippen Sie auf Zurück zur Geräte paarung", + "无法连接?尝试升级": "Kann keine Verbindung herstellen? Upgrade versucht", + "固件升级提示": "Firmware-Upgrade-Eingabe aufforderung", + "请先获取固件文件到手机本地,再选择升级": "Bitte holen Sie die Firmware-Datei zuerst auf das lokale Telefon, und wählen Sie dann Upgrade", + "固件升级中": "Die Firmware wird aktualisiert", + "取消升级": "Das Upgrade abbrechen", + "固件传输中": "Firmware im Transit", + "关闭": "Ausschalten", + "传输中'": "Auf der Durchreise", + "操作记录": "Aufzeichnungen", + "修改姓名": "Name bearbeiten", + "传输中": "Auf der Durchreise", + "发送人": "Ausgestellt von", + "发送时间": "Ausgegebene Zeit", + "钥匙详情": "Ekey Info", + "姓名": "Name", + "发送": "Senden", + "请确认姓名全名和身份证号码是否正确": "Bitte bestätigen Sie, dass der vollständige Name und die ID-Nummer korrekt sind", + "传输期间请勿离开当前页面": "Verlassen Sie die aktuelle Seite während des Transfers nicht", + "机型": "Modelle", + "硬件版本": "Hardware-Version", + "固件版本": "Firmware-Version", + "手动升级": "Manuelles Upgrade", + "设备连接中...": "Gerät verbinden...", + "未避免异常情况,请在门打开时升级": "Unvermeidbare Ausnahmen, bitte aktualisieren Sie, wenn die Tür geöffnet ist", + "钥匙无效": "Der Schlüssel ist ungültig", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Es kann keine Verbindung zur Sperre hergestellt werden. Bitte starten Sie den Blu tooth Ihres Telefons neu und versuchen Sie es erneut.", + "如果是全自动锁,请使屏幕变亮": "Wenn es sich um eine voll automatische Sperre handelt, machen Sie den Bildschirm bitte heller", + "正在尝试闭锁……": "Ich versuche zu sperren. Bitte warten Sie...", + "清空记录": "Klare Rekorde", + "是否要删除操作记录?": "Datensätze weiter löschen?", + "被删除的记录不能恢复": "Die Datensätze können nach dem Löschen nicht wieder hergestellt werden.", + "全部事件": "Alle Veranstaltungen", + "开锁事件": "Veranstaltung freischalten", + "异常事件": "Abnormales Ereignis", + "门铃事件": "Türklingel veranstaltung", + "视频事件": "Video veranstaltung", + "请开启蓝牙": "Bitte schalten Sie Bluetooth ein", + "请选择有效日": "Bitte wählen Sie den effektiven Tag", + "公司名字长度不能小于 6 ": "Die Länge des Firmennamens darf nicht weniger als 6 betragen", + "已是最新版本": "Keine Updates", + "新建短信模版": "Kreat SMS-Vorlage", + "新建邮件模版": "Kreat E-Mail-Vorlage", + "自定义短信模版": "SMS-Vorlage", + "自定义邮件模版": "E-Mail-Vorlage", + "名称": "Name", + "星星锁": "Sterns chloss", + "无考勤记录": "Keine Aufzeichnungen", + "大家干劲十足": "Jeder kommt rechtzeitig", + "工作时长未出炉": "Keine Arbeits stunden", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Die Wahl des Landes/der Region wirkt sich auf die Daten sicherheit aus. Sie haben derzeit Albanien ausgewählt, bitte bestätigen Sie, bevor Sie fortfahren.", + "确认国家或地区": "Land/Region bestätigen", + "我知道了": "Ich habe es verstanden", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Um wichtige Updates zu erhalten, klicken Sie auf \"OK\" und aktivieren Sie Benachricht igungen in den Einstellungen.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Nach dem Einschalten können Sie das Einschalten wieder einschalten, indem Sie die Einstellungs taste auf dem Schloss lange drücken und es mit der APP erneut hinzufügen", + "已有": "Aktuell", + "新增": "Neu", + "账号格式错误": "Schlechtes Format", + "接收者信息为空": "Die Empfängerin formationen sind leer", + "请输入时间(秒)": "Bitte geben Sie die Zeit ein (Sek)", + "加载数据失败": "Daten nicht geladen", + "重试": "Versuchen Sie es erneut", + "升级中,是否退出": "Während des Upgrades, ob zu beenden", + "下一步": "Weiter", + "公寓": "Wohnung", + "个人用户": "Persönliche", + "星寓": "Sterne Wohnung", + "账号": "Konto", + "请输入手机号或email": "Telefon nummer oder E-Mail", + "请输入星寓管理员的账号": "Bitte geben Sie das Konto des Star-Apartment-Admini strators ein", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Alle Daten der ausgewählten Sperre (n) werden dauerhaft an den Empfänger übertragen.", + "暂不支持跨平台转移,敬请期待": "Plattform übergreifen der Transfer wird vorerst nicht unterstützt, bitte freuen Sie sich darauf", + "移除坏锁": "Bewegen Sie fehlerhafte/beschädigte Schlösser in den Papierkorb", + "转移确认": "Transfer bestätigen", + "本次共转移": "Diesmal insgesamt", + "把智能锁": "Smartes Schloss", + "确认": "OK", + "移除成功": "Erfolgreich entfernen", + "转移成功": "Transfer erfolg", + "该已锁被删除": "Das gesperrte wird gelöscht", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Der autorisierte Admini strator kann nur Pass codes,ekeys und etcmached selbst verwalten.", + "添加授权管理员": "Admin erstellen", + "导出记录": "Datensätze exportieren", + "选择时间段": "Zeitraum auswählen", + "导出": "Export", + "批量导出": "Batch-Export", + "读取记录": "Rekorde auffrischen", + "设备": "Gerät", + "消息": "Nachrichten", + "智能分析": "Intelligente Analytik", + "精准识别设备事件,过滤无效信息": "Geräte ereignisse genau identifizieren und ungültige Informationen herausfiltern", + "系统设置": "Systeme in stellungen", + "系统的全局配置在此项内进行设置": "Die globale Konfiguration des Systems wird in diesem Artikel festgelegt", + "导出操作记录": "Datensätze exportieren", + "立即查看": "Ansicht", + "导出成功": "Erfolgreich exportiert", + "发送钥匙": "Ekey senden", + "进度": "Rate", + "失败": "Fehl geschlagen", + "人脸详情": "Gesichts details", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Wenn jemand etwa 1,5 Meter vor der Tür wahrgenommen wird, wird automatisch die Gesichts erkennungs entriegelung gestartet.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Wenn jemand etwa 0,8 Meter vor der Tür wahrgenommen wird, wird automatisch die Gesichts erkennungs entriegelung gestartet.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Wenn jemand etwa 0,5 Meter vor der Tür wahrgenommen wird, wird automatisch die Gesichts erkennungs entriegelung gestartet.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Der Erfassungs abstand wurde aus geschaltet. Sie müssen eine beliebige Taste auf der Tastatur manuell berühren, um das Entsperren der Gesichts erkennung durch zuführen.", + "防误开已打开,开锁后": "Die Anti-Fehler-Öffnung wurde eingesc haltet und nach dem Entriegeln", + "秒内不可使用面容开锁": "Gesichts entriegelung kann nicht innerhalb von Sekunden verwendet werden", + "掌静脉": "Palmen ader", + "添加掌静脉": "Fügen Sie Palm vene hinzu", + "胁迫掌静脉": "Erzwungene Palm vene", + "请不要将胁迫掌静脉用于日常开锁": "Bitte verwenden Sie keine Zwangs palmen venen zum täglichen Entsperren", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Mit dem Schloss verbunden, öffnen Sie bitte natürlich Ihre Handfläche, die Handfläche steht vor der Kamera", + "掌静脉详情": "Palmen venen details", + "掌静脉号": "Handle ader nummer", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth ist nicht eingesc haltet, bitte schalten Sie Bluetooth in den Einstellungen ein", + "删除用户时,会将用户拥有的钥匙一起删除。": "Wenn ein Benutzer GELÖSCHT ist, werden alle mit dem Benutzer verbundenen ekeys ebenfalls GELÖSCHT.", + "配置网络": "Netzwerk konfigurieren", + "你好": "Hallo", + "成功": "Erfolgreich", + "类型选择": "Typ auswählen", + "请选择要使用哪种类型": "Bitte wählen Sie den zu verwendenden Typ aus", + "系统邮件(推荐)": "System-E-Mail (empfohlen)", + "系统短信(推荐)": "System SMS (empfohlen)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Die E-Mail wird von dieser App gesendet. Bitte kaufen Sie zuerst das E-Mail-Paket.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Die SMS wird von dieser App gesendet. Bitte kaufen Sie zuerst E-Mail-Paket.", + "个人邮件": "Persönliche E-Mail", + "个人短信": "Persönliche SMS", + "邮件将从你的个人邮箱发给用户": "Die E-Mail wird von Ihrem persönlichen E-Mail-Konto gesendet.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Die SMS-Nachricht wird von Ihrer persönlichen Telefon nummer gesendet. Sie zahlen an Ihren Telekom-Betreiber.", + "为了更好地应用体验,请确定权限": "Für eine bessere Anwendungs erfahrung bestätigen Sie bitte die Berechtigungen", + "您第一次拒绝权限,请确定权限": "Sie haben die Erlaubnis zum ersten Mal verweigert, bitte bestätigen Sie die Erlaubnis", + "您第二次拒绝权限,请去应用设置开启权限": "Sie haben die Erlaubnis zum zweiten Mal verweigert. Gehen Sie bitte zu den Anwendungs einstellungen, um die Berechtigung zu aktivieren", + "去应用市场": "Gehen Sie zum App Store", + "温馨提示": "Warme Eingabe aufforderung", + "关闭应用": "Schließen Sie die Anwendung", + "开启微信接收报警消息需要先关注": "Um WeChat zu öffnen, um Alarm meldungen zu erhalten, müssen Sie folgen", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat öffentliches Konto, speichern Sie den QR-Code und verwenden Sie WeChat, um die Einstellungen zu scannen", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Die Authentifizierung mit echtem Namen ist eine kosten pflicht ige Funktion. Bitte wenden Sie sich an den Sperr admini strator, um zu kaufen und zu verwenden", + "位置权限": "Standort genehmigung", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Bitte gewähren Sie die App, um Ihren locatian zu verwenden. Es wird verwendet, um BLE-Sperren und Gateways zu scannen.", + "相机/相册权限": "Kamera/Album Erlaubnis", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Bitte gewähren Sie der App, um Fotos und Dateien aus dem Speicher zu lesen und zu schreiben.", + "点击选择": "Klicken Sie auf, um auszuwählen", + "微信": "WeChat", + "朋友圈": "Momente", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Link", + "今天": "Heute", + "密码错误": "Ungültiges Passwort", + "网络中断": "Netz unterbrechung", + "钥匙不存在": "Schlüssel existiert nicht", + "钥匙过期": "Schlüssel abgelaufen", + "钥匙已存在": "Schlüssel bereits vorhanden", + "密码失效": "Passwort ungültig", + "门锁时间异常": "Türschloss zeit abnormal", + "APP(手机)未联网": "APP (Handy) ist nicht mit dem Internet verbunden", + "数据不存在": "Daten existieren nicht", + "待接收": "Erhielt", + "已冻结": "Gefroren", + "已删除": "Gelöschte", + "未知": "Unbekannt", + "拖动下方滑块完成拼图": "Ziehen Sie den Schieber egler auf die richtige Position", + "验证成功": "Verifizierungserfolg", + "验证失败": "Überprüfung fehl geschlagen", + "向右拖动滑块填充拼图": "Ziehen Sie den Schieber egler nach rechts, um das Puzzle zu füllen", + "请先获取到位置信息哦": "Bitte holen Sie sich zuerst die Standort informationen", + "请选择国家": "Bitte wählen Sie ein Land", + "获取锁信息": "Sperr informationen abrufen", + "锁数据异常,请重试": "Sperr daten sind abnormal, bitte versuchen Sie es erneut", + "连接设备中...": "Verbindungs gerät...", + "把锁": "Schlösser", + "条": "Streifen", + "封": "Dichtung", + "次": "Mal", + "支付成功": "Erfolg zahlen", + "查看详情": "Details anzeigen", + "请输入模板名称": "Bitte den Namen der Vorlage eingeben", + "模版类型": "Typ", + "再返回一次退出": "Ausfahrt wieder", + "请先添加锁": "Bitte fügen Sie zuerst das Schloss hinzu", + "可视对讲": "Visuelle Gegensprechanlage", + "详细日志": "Detailliertes Protokoll", + "已复制到剪切板": "Kopiert", + "拍照": "Foto", + "从相册选择": "Wählen Sie aus dem Album", + "选择问题": "Bitte wählen Sie eine Frage", + "确认长度不足8位": "Bestätigen Sie die Länge von weniger als 8 Ziffern", + "新密码长度不足8位": "Neue Passwort länge weniger als 8 Ziffern", + "两次密码不一致": "Nicht übereinstimmung mit dem Passwort. Bitte versuchen Sie es erneut", + "请点击获取验证码,验证码将发送到": "Bitte erhalten Sie einen Bestätigung scode. Der Code wird an gesendet", + "切换": "Schalter", + "验证": "Verifizieren", + "验证成功,账号已删除": "Überprüfung erfolgreich, Konto gelöscht", + "该密码不是自定义密码,无法修改": "Dieses Passwort ist kein benutzer definiertes Passwort und kann nicht geändert werden", + "请选择设备要关联哪些姓名": "Bitte wählen Sie aus, mit welchen Namen das Gerät verknüpft werden soll", + "请选择姓名要关联哪些设备": "Bitte wählen Sie aus, mit welchen Geräten der Name verknüpft werden soll", + "确定要移除所选中的坏锁吗?": "Entfernen Sie das defekte Schloss?", + "邮件通知": "Per E-Mail benachrichtigen", + "短信通知": "Per SMS benachrichtigen", + "您好,您的授权管理员生成成功": "Hallo, Ihr autorisierter Admini strator wurde erfolgreich generiert", + "请输入接收者姓名": "Bitte geben Sie hier ein", + "版本更新": "Versions-Update", + "下次再说": "Nächstes Mal", + "配网成功": "Netzwerk vertriebs erfolg", + "配网失败": "Netzwerk verteilung fehl geschlagen", + "该锁的无线键盘都将被删除": "Alle kabellosen Tastaturen für dieses Schloss werden GELÖSCHT", + "实时画面": "Echtzeit bild", + "适合门口较为安全的环境。": "Geeignet für relativ sichere Umgebungen an der Tür.", + "仅发生特定事件才录像,并可查看实时画面。": "Es werden nur bestimmte Ereignisse auf gezeichnet und das Echtzeit bild kann angezeigt werden.", + "一般情况下,满电可使用7-8个月": "Unter normalen Umständen kann es für 7-8 Monate verwendet werden, wenn es voll aufgeladen ist", + "有人逗留或发生特定事件才录像,可随时查看": "Jemand bleibt oder bestimmte Ereignisse werden auf gezeichnet und können jederzeit eingesehen werden", + "实时画面。": "Echtzeit bild.", + "一般情况下,满电可使用5~6个月。": "Unter normalen Umständen kann es für 5 ~ 6 Monate verwendet werden, wenn es voll aufgeladen ist.", + "适合门口人员复杂、较不安全的环境。": "Geeignet für komplexe und relativ unsichere Umgebungen an der Tür.", + "有人出现就录像,可随时查看实时画面。": "Nehmen Sie auf, wenn jemand erscheint, und sehen Sie sich das Echtzeit bild jederzeit an.", + "一般情况下,满电可使用2~4个月。": "Unter normalen Umständen kann es für 2 ~ 4 Monate verwendet werden, wenn es voll aufgeladen ist.", + "根据您家门口实际情况设置录像和实时画面功能。": "Stellen Sie die Video-und Echtzeit bild funktionen entsprechend der tatsächlichen Situation an Ihrer Tür ein.", + "可使用时长由具体设置决定。": "Die Nutzungs dauer wird durch die spezifischen Einstellungen bestimmt.", + "查看": "Ansicht", + "有人按门铃或发生": "Jemand klingelt an der Tür oder", + "异常事件时": "Abnormales Ereignis", + "不录像": "Kein Video", + "有人出现、按门铃": "Jemand erscheint, klingelt an der Tür", + "或发生异常事件时": "Oder es tritt ein abnormales Ereignis auf", + "逗留达到10秒": "Bleiben Sie für 10 Sekunden", + "约1.5米": "Etwa 1,5 Meter", + "随时": "Jederzeit", + "立即录像": "Sofort aufzeichnen", + "录像时机": "Video-Timing", + "有人出现时录像": "Aufzeichnen, wenn jemand erscheint", + "人体侦测距离": "Menschlicher Erkennungs abstand", + "查看实时画面": "Echtzeit bild anzeigen", + "自定义时间": "Custom zeit", + "当日": "Heute", + "次日": "Am nächsten Tag", + "自定义时段": "Benutzer definierter Zeitraum", + "发生事件时查看": "Anzeigen, wann ein Ereignis auftritt", + "实时查看": "Echtzeit ansicht", + "有人在门口出现10秒后开始录像。": "Jemand erscheint 10 Sekunden vor der Aufnahme an der Tür.", + "有人按门铃时立即录像。": "Nehmen Sie sofort auf, wenn jemand an der Tür klingelt.", + "有人出现在门前1.5米范围时启动录像": "Aufnahme starten, wenn jemand innerhalb von 1,5 Metern vor der Tür auftaucht", + "约0.8米": "Etwa 0,8 Meter", + "约3.0米": "Etwa 3,0 Meter", + "添加指纹失败": "Der Betrieb ist fehl geschlagen.", + "项": "Artikel", + "播放中": "Spielen", + "下载": "Herunter laden", + "暂无下载内容": "Kein Download-Inhalt", + "亮度": "Helligkeit", + "音量": "Volumen", + "快进至": "Schneller Vorlauf zu", + "快退至": "Rücklauf an", + "暂无视频信息": "Keine Video informationen", + "加载出错": "Lade fehler", + "请单人正对门锁,距离一个成年人手臂长度": "Stellen Sie sich bitte allein auf Armlänge vor das Türschloss", + "(约0.6米)。": "(Ca. 0,6 Meter).", + "保持脸部无遮挡,露出五官。": "Halten Sie Ihr Gesicht frei und zeigen Sie Ihre Gesichtszüge.", + "准备好了,开始添加": "Bereit, fang an hinzuzufügen", + "正在录入中...": "Aufnahme...", + "添加人脸失败": "Gesicht konnte nicht hinzugefügt werden", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Gesichter des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?", + "人脸号": "Gesichts nummer", + "虹膜详情": "Iris Details", + "虹膜号": "Iris-Nummer", + "选择设备类型": "Gerätetyp auswählen", + "照明灯具": "Beleuchtungs körper", + "电动窗帘": "Elektrische Vorhänge", + "门窗传感器": "Tür-und Fensters ensor", + "传感器": "Sensor", + "清除数据成功": "Daten erfolgreich gelöscht", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Das Schloss ist nicht mit dem Internet verbunden, daher können die Rückwörter von Passcode, Karte, Finger abdruck und anderen Türöffnung methoden nicht in Echtzeit hochgeladen werden.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Wenn Sie die historischen Aufzeichnungen aufbewahren müssen, können Sie sie exportieren.", + "看不到操作记录,可能原因有": "Kann die Operations aufzeichnungen nicht sehen, mögliche Gründe", + "操作记录详情": "Details zum Betriebs datensatz", + "操作时间": "Betriebszeit", + "此模块功能需要锁联网后设置方可生效": "Diese Modul funktion muss eingestellt werden, nachdem die Sperre mit dem Internet verbunden ist, um wirksam zu werden", + "用户已存在": "Benutzer bereits vorhanden", + "钥匙数量已到上限": "Die Anzahl der Schlüssel hat die Obergrenze erreicht", + "附近没有可用网关": "Es gibt kein verfügbares Gateway in der Nähe", + "正在创建安全连接...": "Eine sichere Verbindung schaffen...", + "监视状态下不能发送录音": "Im Überwachungs modus können keine Aufnahmen gesendet werden", + "挂断": "Auflegen", + "监视中暂不能开锁": "Entsperren ist während der Überwachung nicht verfügbar", + "长按说话": "Drücken und halten, um zu sprechen", + "松开发送": "Freigabe zum Senden", + "请输入6位数字开锁密码": "Bitte geben Sie ein 6-stelliges Ent sperr passwort ein", + "请输入开锁密码": "Bitte geben Sie das Ent sperr passwort ein", + "接收者在有效期内可以不限次数使用": "Die Empfänger können die ekeys innerhalb der Gültigkeit dauer unbegrenzt verwenden.", + "接收者可以使用此App开关锁": "Empfänger sind in der Lage, Sperren/Entsperren durch diese App.", + "单次钥匙有效期为1小时,只能使用一次": "Der One-time ekey ist gültig für eine Stunde und kann nur EINMAL verwendet werden.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Die Empfänger können die ekeys innerhalb der festen Zykluszeit unbegrenzt verwenden.", + "获取模板失败": "Die Vorlage konnte nicht erhalten werden", + "微信通知": "WeChat-Benachricht igung", + "系统短信": "System SMS", + "系统邮件": "System-E-Mail", + "模板": "Vorlage", + "新建模版": "Vorlage erstellen", + "您好,您的密码是": "Hallo, dein Passwort ist", + "密码名字": "Passwort name", + "请输入6-9位密码": "Bitte geben Sie ein 6-9-stelliges Passwort ein", + "设置密码": "Passwort festlegen", + "操作成功,密码为": "Erfolgreich. Der Passcode ist", + "类型:自定义-永久": "Typ: Custom-Permanent", + "实时播放": "Echtzeit-Wiedergabe", + "点击对讲": "Klicken Sie auf die Gegensprechanlage", + "长按开锁": "Lange drücken, um zu entsperren", + "接听失败": "Antwort fehl geschlagen", + "请在锁设置中开启远程开锁": "Bitte aktivieren Sie die Fernent sperrung in den Sperr einstellungen", + "接听": "Antwort", + "截图已保存到相册": "Screenshot zum Album gespeichert", + "添加遥控": "Fernbedienung hinzufügen", + "已连接到锁,请按遥控": "An das Schloss anges ch lossen, drücken Sie bitte die Fernbedienung", + "遥控号": "Fernsteuerung nummer", + "遥控详情": "Details zur Fernbedienung", + "照明": "Beleuchtung", + "退出演示模式": "Demo-Modus ausschalten", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tipp: Die aktuelle Schnitts telle ist eine Anzeige schnitts telle. Nachdem Sie das Gerät hinzugefügt haben, können Sie es weiterhin verwenden", + "门已上锁": "Die Tür ist verschlossen", + "您的账号在异地登录,如非本人,请尽快修改密码": "Ihr Konto wurde verwendet, um sich von einem neuen Gerät aus anzumelden", + "开门成功": "Öffnen Sie die Tür erfolgreich", + "开门失败": "Die Tür konnte nicht geöffnet werden", + "呼叫提醒": "Erinnerung rufen", + "收到来自": "Empfingen von", + "锁的呼叫": "Sperr anruf", + "加载数据中": "Daten laden", + "搜索所有锁类型": "Alle Schloss typen durchsuchen", + "锁电量更新时间": "Update-Zeit für die Batterie sperren", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Mai", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Okt.", + "11月": "Nov.", + "12月": "Dez", + "热门城市": "Heiße Städte", + "导出锁数据": "Sperr daten exportieren", + "一键开锁": "Ein-Klick-Entsperren", + "已开通": "Geöffnet", + "编辑员工": "Mitarbeiter bearbeiten", + "一": "Eine", + "二": "Zwei", + "三": "Drei", + "四": "Vier", + "五": "Fünf", + "六": "Sechs", + "日": "Sonne", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Kauf rekord", + "使用记录": "Benutzer aufzeichnung", + "失效时间要大于当前时间": "Die Ablauf zeit muss länger sein als die aktuelle Zeit", + "修改名字": "Name bearbeiten", + "时": "Stunde", + "分": "Minute", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Sie können Alexa verwenden, um den Sperr status zu entsperren, zu sperren und zu überprüfen", + "支持的国家": "Unterstützte Länder", + "支持的国家值": "USA, Kanada, Großbritannien, Australien, Indien, Deutschland, Frankreich, Italien, Spanien, Japan", + "操作流程": "Betriebs prozess", + "操作流程值": "1 Fügen Sie ein Schloss und ein Gateway mit der Smart Lock APP hinzu\n\n2 Aktivieren Sie die Remote-Entriegelung funktion der Sperre in der APP (diese Funktion ist standard mäßig deaktiviert). Wenn Sie diese Option nicht haben, unterstützt die Sperre Alexa nicht\n\n3 Fügen Sie Alexa Fähigkeiten hinzu und autorisieren Sie sie mit dem Konto und Passwort der Smart Lock APP. Nachdem die Autor isierung erfolgreich ist, können Sie Geräte unter dem Konto entdecken\n\n4 Suchen Sie die Sperre in der Alexa-App, schalten Sie die Funktion zum Ent sperren der Stimme ein und legen Sie das Sprach kennwort fest\n\n5 Das Schloss kann durch Alexa betrieben werden", + "Google Home": "Google Home", + "Action name": "Name der Aktion", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Unterstützte Sprachen", + "英语": "Englisch", + "Google Home操作流程的值": "1. Verwenden Sie die Smart Lock APP, um Schlösser und Gateways hinzuzufügen\n\n2. Aktivieren Sie die Remote-Entriegelung funktion der Sperre in der APP (diese Funktion ist standard mäßig deaktiviert). Ohne diese Option unterstützt die Sperre Google Home nicht\n\n3. Installieren Sie die Google Home APP und klicken Sie auf die Schaltfläche \"\" in der oberen linken Ecke\n\n4. Wählen Sie auf der Seite Einstellungen \"Mit Google arbeiten\"\n\n5. Suchen Sie nach \"ScienerS mart\" und verwenden Sie das Smart Lock APP-Konto und das Passwort, um es zu autorisieren", + "密码需至少包含数字/字母/字符中的2种组合": "Das Passwort muss mindestens 2 der folgenden Zahlen enthalten: Zahlen, Buchstaben und Sonder zeichen", + "已开锁": "Entsperrt", + "已闭锁": "Gesperrt", + "两次密码不一致哦": "Die Passwörter sind inkonsistent", + "中功率": "Mittlere Leistung", + "常规使用": "Regelmäßige Verwendung", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Nachdem das Gateway eingesc haltet ist, drücken und halten Sie die Reset-Taste für 5 Sekunden, und klicken Sie auf Weiter, wenn die Kontroll leuchte blinkt abwechselnd", + "扫描设备": "Scan-Gerät", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Löschung fehl geschlagen. Das Gateway ist möglicher weise offline gegangen. Möchten Sie das Löschen der Daten erzwingen?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_el.json b/lan/lan_el.json new file mode 100644 index 00000000..6c459d12 --- /dev/null +++ b/lan/lan_el.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Κλειδαριά αστέρα", + "锁通通": "Κλείδωση", + "点击开锁,长按闭锁": "Αγγίγηση για να ξεκλειδώσετε, κρατήστε στην κλειδαριά", + "考勤": "Παρακολούθηση", + "考勤设置": "Ρυθμίσεις συμμετοχής", + "电子钥匙": "EKeys", + "添加卡": "Προσθήκη κάρτας", + "卡号": "Αριθμός κάρτας", + "添加指纹": "Προσθήκη αποτυπώματος", + "指纹号": "Αριθμός αποτυπωμάτων", + "遥控": "Απομακρυσμένος", + "添加人脸": "Προσθήκη πρόσωπου", + "门锁日志": "Καταγραφή κλειδώματος πόρτας", + "密码号": "Αριθμός κωδικού πρόσβασης", + "添加者": "Αερομεταφορέας", + "添加时间": "Χρόνο", + "重置": "Επαναφοράς", + "请输入手机号或者邮箱": "Tηλεφώνο/email", + "工作时间": "Χρόνος εργασίας", + "工作日设置": "Ρύθμιση ημέρας εργασίας", + "星期一": "Δευτέρα.", + "星期二": "Τρίτη.", + "星期三": "Τετάρτη.", + "星期四": "Πέμπτη", + "星期五": "Παρασκευή", + "星期六": "Σάββατο.", + "星期日": "Κυριακή.", + "简写周一": "Ν", + "简写周二": "Τ", + "简写周三": "Υ", + "简写周四": "Τ", + "简写周五": "ΣΤ", + "简写周六": "Ζ", + "简写周日": "Ζ", + "周一": "Μον.", + "周二": "Τάι", + "周三": "ΠΑΡΑΡΤΗΜΑ", + "周四": "Πέτη", + "周五": "Πρός", + "周六": "Σάτη", + "周日": "Ήλιο", + "群发钥匙": "Αποστολή πολλαπλών ekeys", + "锁": "Κλείδωση", + "请添加": "Αποδέκτης", + "允许远程开锁": "Απομακρυσμένο ξεκλείδωμα", + "请输入验证码": "Κωδικός επαλήθευσης", + "获取密码": "Δημιουργία κωδικού πρόσβασης", + "请给密码命名": "Εισάγετε ένα όνομα για αυτόν τον κωδικό πρόσβασης", + "密码有限期为6个小时,只能使用一次": "Αυτός ο κωδικός πρόσβασης πρέπει να χρησιμοποιείται εντός 6 ωρών από την τρέχουσα ώρα ή θα είναι υπεύθυνος για λόγους ασφάλειας. Αυτός ο κωδικός πρόσβασης μπορεί να χρησιμοποιηθεί μόνο μία φορά.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Χειροκίνητα εισάγετε 6-9 ψηφία ως κωδικό πρόσβασης. Μπορεί να προστεθεί μέσω τηλεφώνου Bluetooth δίπλα στην κλειδαριά, ή να προστεθεί απομακρυσμένα μέσω της πύλης", + "获取": "Φύγε.", + "添加": "Προσθήκη", + "删除公司": "Διαγραφή Εταιρείας", + "密码详情": "Πληροφορίες κωδικού πρόσβασης", + "修改密码": "Αλλαγή κωδικού πρόσβασης", + "添加虹膜": "Προσθήκη ιρίδας", + "添加门磁": "Αισθητήρας πόρτας", + "添加无线键盘": "Ασύρματο πληκτρολόγιο", + "添加手掌": "Προσθήκη παλάμης", + "请输入员工账号": "Εισάγετε λογαριασμό υπαλλήλων", + "批量授权锁": "Χορήγηση πολλαπλών κλειδαριών", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Ο εξουσιοδοτημένος διαχειριστής θα έχει πλειοψηφία άδεια να λειτουργήσει αυτή την κλειδαριά.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Αυτή η λειτουργία σας επιτρέπει να ξεκλειδώσετε την έξυπνη κλειδαριά απομακρυσμένα μέσω μιας πύλης. Αυτό το χαρακτηριστικό μπορεί ΜΟΝΟ να ενεργοποιηθεί ή απενεργοποιηθεί μέσω Bluetooth.", + "排列方式": "Τύπος λίστας", + "早到榜": "Πρώιμη λίστας", + "迟到榜": "Κατάλογος καθυστέρησης", + "当前模式": "Τρέχουσα λειτουργία", + "勤奋榜": "Λίστα εργασίας", + "延迟时间": "Χρόνος καθυστέρησης", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Η κλειδαριά θα κλειδώνει αυτόματα μετά την ώρα.Παρακαλώ ξεκλειδώστε την για μία φορά πρώτα για να κάνετε τη ρύθμιση διαθέσιμη.", + "时间": "Χρόνο", + "开始时间": "Ώρα έναρξης", + "结束时间": "Τέλος χρόνου", + "工作时间设置": "Ρύθμιση χρόνου εργασίας", + "常开模式": "ΜΟΔΟΣ Πέρασμας", + "常开时间": "Σε αυτή την χρονική περίοδο.", + "常开日期": "Σε αυτές τις ημέρες", + "添加员工": "Προσθήκη προσωπικού", + "节假日": "Διακοπή", + "打卡方式": "Μέθοδος", + "员工是否有钥匙": "Έχω ήδη τον Έικι.", + "上班时间": "Ώρα έναρξης", + "下班时间": "Χρόνος κλείσιμου", + "本周": "Αυτή την εβδομάδα", + "单休": "Εβδομάδα", + "双休": "Διήμερο", + "单双休": "Σαββατοκύριακο 1 2 ημέρα", + "年": "Έτος", + "月": "Μήνας", + "放假日期": "Διακοπή", + "补班日期": "Ημέρες εργασίας", + "添加假日": "Προσθήκη διακοπών", + "开始日期": "Ημερομηνία έναρξης", + "必填": "Απαιτούμενο", + "结束日期": "Ημερομηνία λήξης", + "日榜": "Καθημερινά", + "月榜": "Μηνιαία", + "考勤记录": "Καταγραφή", + "假日信息": "Πληροφορίες διακοπώνName", + "基本信息": "Βασικά", + "无线键盘": "Ασύρματο πληκτρολόγιο", + "选择无线键盘": "Προσθήκη πληκτρολόγιου", + "门磁": "Αισθητήρας πόρτας", + "自动闭锁": "Αυτόματη κλείδωση", + "锁声音": "Κλείδωμα ήχου", + "防撬报警": "Προειδοποίηση", + "重置键": "Επαναφορά κουμπί", + "锁时间": "Κλείδωμα ρολογιού", + "诊断": "Διάγνωση", + "上传数据": "Αποστολή δεδομένων", + "导入其他锁数据": "Εισαγωγή από μια άλλη κλειδαριά", + "锁升级": "Ενημέρωση FirmwareComment", + "标记房态": "Κατάσταση δωματίου", + "开锁提醒": "Ξεκλείδωση", + "微信二维码": "Ξεκλείδωσε κώδικα QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Άτομα με ηλεκτρονικά κλειδιά μπορούν να ανοίξουν την πόρτα σαρώνοντας αυτόν τον κώδικα QR μέσω WeChat. Ο κωδικός QR κάθε κλειδαριά είναι διαφορετικός. Μπορείτε να το εκτυπώσετε και να το επικολλήσετε δίπλα στην αντίστοιχη κλειδαριά", + "锁编号": "Αριθμός κλειδαριάς", + "电量": "Μπαταρία", + "锁分组": "Κλείδωμα ομάδας", + "选择分组": "Επιλογή ομάδας", + "创建新分组": "Δημιουργία ομάδας", + "管理员开锁密码": "Κωδικός διαχειριστής", + "更新": "Ενημέρωση", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Το επίπεδο της μπαταρίας θα ενημερωθεί από την πύλη ή τηλέφωνο bluetooth", + "当屏幕闪烁时,点击下一步": "Κάντε κλικ στο επόμενο όταν το πληκτρολόγιο αναλαμπή", + "输入*529#或按设置键": "Εισάγετε README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# ή πατήστε το πλήκτρο ρυθμίσεων", + "长按重置键2秒": "Πατήστε και κρατήστε το κουμπί επαναφορά 2 δευτερόλεπτα", + "附近的设备": "Κοντινός Εξοπλισμός", + "暂无数据": "Χωρίς δεδομένα", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Θα μπορέσετε να πάρετε την κατάσταση της πόρτας με έναν αισθητήρα πόρτας μαζί με μια πύλη. Μόνο ένας αισθητήρας επιτρέπεται να συνδέεται με μια κλειδαριά.", + "开始": "Εκκίνηση", + "全天": "Όλες οι ώρες", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Μπορείτε να ορίσετε πολλαπλές χρονικές περιόδους για τη λειτουργία διέλευσης.Μέσα στις ορισμένες χρονικές περιόδους, η κλειδαριά θα παραμείνει σε ανοιχτή κατάσταση αφού ξεκλειδώσει.", + "请选择锁音量": "Παρακαλώ επιλέξτε ένταση κλειδών", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Με το να γυρίσεις, θα ακούσεις τον ήχο από την κλειδαριά", + "低": "Χαμηλό", + "较低": "Μεσαίο χαμηλό", + "中": "Μεσαίο", + "较高": "Μεσαίο υψηλό", + "高": "Υψηλό", + "开启后,锁被撬动时,会发出报警声": "Ενεργώντας, ενεργοποιείς τον συναγερμό TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Με την απενεργοποίηση, το κουμπί RESET είναι απενεργοποιημένο.", + "校准时间": "Βαθμονόμηση χρόνου", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Η διάγνωση είναι να διαβάσετε τις πληροφορίες διαμόρφωσης μέσα στην κλειδαριά και να το ανεβάσετε έτσι ώστε το προσωπικό να μπορεί να αναλύσει την αιτία της αποτυχίας", + "上传": "Αποστολής", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Αποστολή δεδομένων από κλειδαριά στο διακομιστή.Μπορεί να πάρει αρκετά λεπτά", + "请选择要从哪把锁导入": "Επιλέξτε μια κλειδαριά από την εισαγωγή", + "有新版本": "Έχει Νέα έκδοση", + "当前版本": "Τρέχουσα έκδοση", + "升级": "Ενημέρωση", + "空闲": "Κενό", + "已入住": "Καταλημένες", + "多语言": "Γλώσσες", + "添加锁": "Προσθήκη κλειδώματος", + "锁地址": "Κλείδωση", + "选择锁类型": "Επιλογή τύπου κλειδώματος", + "NFC无源锁": "Παθητική κλειδαριά NFC", + "添加设备": "Προσθήκη συσκευής", + "网关": "Πύλη πύλης", + "客服": "Υπηρεσία πελατών", + "设置": "Ρυθμίσεις", + "更多设置": "Περισσότερα", + "消息推送": "Πίεση κοινοποίησης", + "锁用户管理": "Κλείδωμα χρηστών", + "拥有的钥匙": "EKeys που σχετίζονται με αυτόν τον χρήστη", + "批量授权": "Διαχείριση της αρχής", + "关联设备": "Συνδεδεμένη συσκευή", + "关联姓名": "Σχετικό όνομα", + "转移智能锁": "Κλείδωμα μεταφοράς", + "选择锁": "Κλείδωμα οθόνης", + "接收人信息": "Αποδέκτης", + "转移网关": "Πύλη μεταφοράς", + "锁屏": "Κλείδωμα οθόνης", + "已关闭": "Ανοιχτός", + "已开启": "Εμπρός", + "开启": "Ενεργοποιήστε το.", + "确定要开启重置键?": "Συνέχιση ενεργοποίησης του κουμπιού Επαναφοράς;", + "确定要关闭重置键?": "Συνέχιση της απενεργοποίησης του κουμπιού Επαναφοράς;", + "隐藏无效开锁权限": "Απόκρυψη μη έγκυρης πρόσβασης", + "APP开锁时需手机连网的锁": "Κλειδαριές που απαιτούν τηλέφωνο στο διαδίκτυο", + "增值服务": "Υπηρεσίες", + "关于": "Σχετικά με το θέμα.", + "退出": "Σύνδεση", + "删除账号": "Διαγραφή λογαριασμού", + "个人信息": "Πληροφορίες λογαριασμού", + "头像": "Άβαταρ", + "昵称": "NickNameName", + "请输入昵称": "Παρακαλώ εισάγετε το ψευδώνυμό σας", + "修改昵称": "Μετονομασία", + "修改账号": "Επεξεργασία λογαριασμού", + "重置密码": "Επαναφορά κωδικού πρόσβασης", + "安全问题": "Ερώτηση ασφαλείας", + "为了你的账号安全,修改账号前请先使用验证码验证": "Για την ασφάλεια του λογαριασμού σας, παρακαλούμε να χρησιμοποιήσετε την επαλήθευση του κωδικού πρόσβασης του λογαριασμού πριν την τροποποίηση του λογαριασμού σας.", + "请输入新账号": "Παρακαλώ εισάγετε το νέο λογαριασμό", + "找回密码和登录新设备时,可通过绑定的手机验证": "Ο αριθμός δεσμευτικών τηλεφώνων θα χρησιμοποιηθεί για να παραλάβει τον κώδικα επαλήθευσης.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Το Δεσμευτικό email θα χρησιμοποιηθεί για να λάβει τον κώδικα επαλήθευσης.", + "原密码": "Τρέχων κωδικός πρόσβασης", + "新密码": "Νέο κωδικό πρόσβασης", + "确认密码": "Επιβεβαίωση κωδικού πρόσβασης", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Σε περίπτωση που το τηλέφωνό σας χάθηκε, μπορείτε να συνδεθείτε σε νέο τηλέφωνο απαντώντας σε ερωτήσεις ασφαλείας.", + "问题一": "Ερώτηση 1", + "问题二": "Ερώτηση 2ο", + "问题三": "Ερώτηση 3:", + "请输入你的答案": "Παρακαλώ πληκτρολογήστε την απάντησή σας", + "即将到期": "Λήγει σύντομα", + "去授权": "Μετάβαση στην έγκριση έγκρισης", + "修改名称": "Επεξεργασία όνομας", + "状态": "Κατάσταση", + "WiFi名称": "Όνομα WiFi", + "网络MAC": "Δικτυακό MAC", + "网关升级": "Ενημέρωση πύλης", + "网关连接的锁": "Κλειδαριά(-ες) συνδέονται με αυτή την πύλη πύλης", + "信号强": "Ισχυρό", + "选择网关类型": "Επιλογή τύπου πύλης", + "添加网关": "Προσθήκη πύλης", + "重新通电": "Συνδέστε τη δύναμη", + "指示灯": "Φως δείκτης", + "选择网关": "Επιλογή πύλης", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "Το 5G δεν υποστηρίζεται.Παρακαλώ επιλέξτε ένα WiFi των 2.4G.", + "WiFi密码": "WiFi", + "请输入WiFi密码": "Εισάγετε κωδικό πρόσβασης WiFi", + "网关名称": "Όνομα πύλης", + "请输入网关名称": "Εισάγετε όνομα πύλης", + "IP地址": "Διεύθυνση IP", + "子网掩码": "Μάσκα υποδικτύου", + "默认网关": "Προκαθορισμένη πύλη πύλης", + "自动获取DNS服务器地址": "Αυτόματα", + "首选DNS": "Προτιμώμενο DNS", + "备选DNS": "Εναλλακτικό DNS", + "不使用静态IP": "Δεν χρησιμοποιείται στατική IP", + "使用静态IP": "Χρήση στατικής IP", + "请输入IP地址": "Εισάγετε διεύθυνση IP", + "请输入子网掩码": "Εισάγετε μάσκα υποδικτύου", + "请输入默认网关": "Εισαγωγή προκαθορισμένης πύλης", + "所有锁": "Όλες οι κλειδαριές", + "搜索所有类型的锁": "Σάρωση όλων των τύπων κλειδαριών", + "门锁": "Κλειδαριά θυρών", + "挂锁": "Το λουκέτου", + "保险箱锁": "Ασφαλής κλείδωση", + "智能门禁": "Ευφυής έλεγχος πρόσβασης", + "车位锁": "Κλειδαριά στάθμευσης", + "摸亮触摸屏": "Αγγίξτε οποιοδήποτε κλειδί για να ενεργοποιήσετε το πληκτρολόγιο.", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Παρακαλώ αγγίξτε οποιοδήποτε πλήκτρο για να ενεργοποιήσετε την κλειδαριά και να το βάλετε σε λειτουργία PAIRING.", + "附近的锁": "Κοντινές κλειδαριές", + "如需修改名字请重新命名,点击确定添加锁": "Αν θέλετε να αλλάξετε το όνομα, παρακαλώ μετονομάστε, κάντε κλικ στο OK για να προσθέσετε κλειδαριά", + "添加锁时,手机必须在锁旁边": "Κατά την προσθήκη μιας κλειδαριάς, το τηλέφωνο πρέπει να είναι δίπλα στην κλειδαριά", + "登录": "Σύνδεση", + "注册": "Μητρώο", + "我已阅读并同意": "Διάβασα και συμφώνησα", + "验证码": "Κωδικός", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Ο κωδικός σας πρέπει να έχει 8-20 χαρακτήρες και να περιλαμβάνει τουλάχιστον δύο τύπους αριθμών, γράμματα και συμβόλων", + "手机": "Τηλέφωνο", + "邮箱": "Ηλεκτρονικό ταχυδρομείο", + "请输入邮箱": "Εισάγετε το email σας", + "国家/地区": "Χώρα/Περιφέρεια", + "你所在的国家/地区": "Χώρα/περιοχή σας", + "选择国家/地区": "Επιλέξτε τη χώρα ή την περιοχή σας", + "获取验证码": "Λήψη κώδικας", + "商务合作": "Επιχειρήσεις:", + "电脑网页版": "Σύστημα ιστοσελίδας", + "酒店系统": "Σύστημα ξενοδοχείου", + "说明书网页版": "Εγχειρίδιο χρήστη", + "高级功能": "Προχωρημένη λειτουργία", + "记录保存": "Διατήρηση αρχείων", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Το SMS μπορεί να χρησιμοποιηθεί για να αποστείλει πληροφορίες πρόσβασης και ekey στον παραλήπτη.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Το ηλεκτρονικό ταχυδρομείο μπορεί να χρησιμοποιηθεί για να στείλει κωδικό πρόσβασης και πληροφορίες ekey στον παραλήπτη.", + "购买实名认证提示": "Αφού ενεργοποιηθεί η λειτουργία, θα πρέπει να χρησιμοποιήσετε τον κωδικό πρόσβασης για να ανοίξετε το APP. Δεν χρειάζεται να επαληθεύσετε και πάλι για 3 λεπτά", + "请选择你希望的实名认证频次": "Παρακαλώ επιλέξτε τη συχνότητα ταυτοποίησης με πραγματικό όνομα που θέλετε", + "仅首次": "Για πρώτη φορά...", + "每日一次": "Μία φορά την ημέρα", + "每周一次": "Μία φορά την εβδομάδα.", + "每月一次": "Μία φορά κάθε μήνας", + "当前状态": "Τρέχον κατάσταση", + "试用中": "Σε Δίκη", + "高级功能权益内容": "Προηγμένες λειτουργίες", + "短信模板": "Πρότυπο SMS", + "邮件模板": "Πρότυπο ηλεκτρονικού ταχυδρομείου", + "发卡工具": "Κωδικοποιητής χαρτιών", + "购买高级功能须知": "Ανακοίνωση", + "购买高级功能提示": "Πιο προηγμένα χαρακτηριστικά είναι υπό ανάπτυξη, και αν τα χρειαστείτε, είστε ευπρόσδεκτοι να ανοίξετε την υπηρεσία βάσει του αριθμού των κλειδαριών. Τα προηγμένα χαρακτηριστικά είναι διαθέσιμα μόνο για τις δικές σας κλειδαριές. Εάν είστε εξουσιοδοτημένος διαχειριστής, παρακαλούμε επικοινωνήστε με τον κορυφαίο διαχειριστή της κλειδαριάς για να ανοίξετε την υπηρεσία.", + "免费体验": "Δωρεάν δοκιμή", + "立即开通": "Άνοιγμα τώρα", + "购买短信": "Αγορά SMS", + "购买邮件": "Αγορά ηλεκτρονικού ταχυδρομείου", + "购买实名认证次数": "Αγορά Πραγματικός Όνομα Χρόνων Ταυτοποίησης", + "开通高级功能": "Ενεργοποίηση προηγμένης συνάρτησης", + "选择套餐": "Επιλογή πακέτου", + "支付方式": "Τρόπος πληρωμής", + "支付宝": "Αλιπάι", + "去支付": "Πληρωμή", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Σας επιτρέπεται να ορίσετε το μήνυμα από τον εαυτό σας.Το χρησιμοποιείται για να στείλετε πληροφορίες του κωδικού πρόσβασης και ekey σε άλλους.", + "高级功能仅能用于你自己的锁": "Η προηγμένη λειτουργία μπορεί να εφαρμοστεί μόνο τις δικές σας κλειδαριές.", + "新建模板": "Δημιουργία πρότυπου", + "类型": "Τύπος", + "模版内容": "Περιεχόμενο προτύπου", + "预览": "Προεπισκόπησης", + "房间名": "Δωμάτιο", + "预计产生短信条数": "Εκτιμώμενα τμήματα μηνυμάτων", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Αυτό το χαρακτηριστικό σας επιτρέπει να κρύψετε κωδικούς πρόσβασης, keys, κάρτες και δακτυλικά αποτυπώματα που είναι άκυρα για ένα χρονικό διάστημα.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Το τηλέφωνο του χρήστη πρέπει να είναι online για να ξεκλειδώσει αυτές τις επιλεγμένες κλειδαριές με APP.", + "配置WiFi": "Ρύθμιση WiFi", + "请输入WiFi名字": "Παρακαλώ εισάγετε όνομα WiFi", + "WiFi配网": "Δίκτυο διανομής WiFi", + "胁迫卡": "Κάρτα Άγχης", + "员工是否有密码": "Έχει ήδη κωδικό πρόσβασης", + "员工是否有卡": "Έχει ήδη κάρτα", + "员工是否有指纹": "Ήδη ορίστηκε το αποτύπωμα δακτυλού", + "获取钥匙": "Πάρτε το κλειδί.", + "获取卡": "Λήψη κάρτας", + "获取指纹": "Λήψη αποτύπων", + "安全验证": "Επαλήθευση ταυτότητας", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Όλες οι πληροφορίες λογαριασμού σας θα αφαιρεθούν από την πλατφόρμα ΜΟΝΑ και δεν μπορούν να ανακτηθούν. Θέλετε να διαγραφείτε;", + "监控": "Παρακολούθηση", + "视频日志": "Καταγραφή βίντεο", + "开门器": "Ανοιχτή πόρτας", + "面容开锁": "Ξεκλείδωμα πρόσωπου", + "开门方向设置": "Άνοιγμα σύνολο κατεύθυνσης", + "电机功率设置": "Ρύθμιση Powers", + "开锁时是否需联网": "Αν απαιτείται το Διαδίκτυο κατά την ξεκλείδωση", + "选择要加入分组的锁": "Επιλέξτε κλειδαριά για προσθήκη σε αυτή την ομάδα.", + "锁数量": "Κλείδωση", + "小米IOT平台": "Πλατφόρμα Xiaomi IOT", + "面容开锁设置": "Ξεκλείδωμα προσώπου ορίζοντας", + "感应距离": "Απόσταση αισθησίας", + "防误开": "Αποτροπή λανθασμένου άνοιγματος", + "防误开已关闭,关门后仍可使用面容开锁": "Η πρόληψη της λάθος ανοίγματος έχει κλείσει, μετά το κλείσιμο της πόρτας μπορεί ακόμη να χρησιμοποιήσει το πρόσωπο ξεκλειδώνει το πρόσωπο.", + "添加和使用面容开锁时": "Προσθήκη και χρήση προσωπικού κατά την ξεκλείδωση", + "添加和使用面容开锁时提示": "\n1, παρακαλώ προσπαθήστε να κρατήσετε ένα άτομο μπροστά από την επιχείρηση της πόρτας?\n2, παρακαλώ στέκεστε μπροστά από την κλειδαριά της πόρτας περίπου 0,5~0,8 μέτρα, αντιμετωπίζοντας την κλειδαριά της πόρτας?\n3. Παρακαλώ κρατήστε το πρόσωπό σας χωρίς εμπόδιο και εκθέστε τα χαρακτηριστικά του προσώπου σας?\n4. Όταν η αναγνώριση προσώπου είναι μη φυσιολογική, μπορείτε να αγγίξετε οποιοδήποτε πλήκτρο στο ψηφιακό πληκτρολόγιο για να επανεκκινήσετε την αναγνώριση προσώπου χειροκίνητα.", + "秒": "Ζ", + "请根据门锁实际情况,请谨慎选择电机功率:": "Παρακαλώ επιλέξτε την ισχύ κινητήρα προσεκτικά σύμφωνα με την πραγματική κατάσταση της κλειδαριάς της πόρτας:", + "小功率:": "Μίνι-βάτ:", + "耗电少": "Λιγότερη κατανάλωση ισχύος", + "大功率": "Υψηλή ισχύς:", + "大功率提示": "Εάν η γλώσσα κλειδαριά δεν μπορεί να ανασυρθεί κανονικά όταν ξεκλειδώσει, ή χρειάζεται να οδηγείν", + "开门方向设置提示": "Παρακαλώ επιλέξτε προσεκτικά την κατεύθυνση για να ανοίξετε την πόρτα του σπιτιού σας (αν επιλέξετε τη λάθος κατεύθυνση, Δεν θα μπορέσετε να ανοίξετε και να κλείσετε την πόρτα σωστά) :", + "左开": "Άνοιγμα αριστερά", + "右开": "Άνοιγμα δεξιού", + "判断方法:": "Νέα:", + "判断方法内容": "Ο άνθρωπος στεκόταν έξω από το σπίτι, κοιτάζοντας την πόρτα της εισόδου.", + "录像时段": "Υποδοχή βίντεο", + "密码": "Κωδικοί πρόσβασης", + "卡": "Κάρτες", + "指纹": "Δακτυλικό αποτύπωμα", + "人脸": "Πρόσωπος", + "配件商城": "Κλείδωμα εμπορικού", + "公司名称": "Επωνυμία εταιρείας", + "请输入公司名字": "Εισάγετε όνομα εταιρείας", + "提示": "Υπόδειγμα", + "是否删除?": "Αν θα διαγραφεί;", + "员工信息": "Πληροφορίες προσωπικού", + "员工": "Προσωπικό", + "打卡方式无效": "Μη διαθέσιμο", + "中国": "Κίνα", + "选择钥匙": "Επιλέξτε ekey", + "编辑": "Επεξεργασία", + "无": "Οχι", + "有": "Μάλιστα.", + "请输入姓名": "Παρακαλώ εισάγετε ένα Όνομα", + "获取人脸": "Πάρτε πρόσωπα", + "选择密码": "Επιλογή κωδικού πρόσβασης", + "选择卡": "Επιλογή χαρτιού", + "选择指纹": "Επιλέξτε αποτυπώματος", + "选择人脸": "Επιλογή πρόσωπου", + "员工是否有人脸": "Εάν ο εργαζόμενος έχει πρόσωπο.", + "同时删除员工钥匙": "Διαγραφή του", + "删除": "Διαγραφή", + "确定要删除员工吗?": "Διαγραφή αυτού του υπαλλήλου", + "月统计": "Μηνιαίες στατιστικές", + "迟到": "Αργά.", + "早退": "Φύγετε Νωρίς", + "未打卡": "Χωρίς εγγραφή", + "钥匙将在": "Αυτή η ευκαιρία θα λήξει.", + "天后失效": "Ημέρα( ες)", + "电量更新时间:": "Ώρα ενημέρωσης μπαταρίας:", + "新增配件": "Προσθήκη", + "钥匙不可用": "Το κλειδί δεν είναι διαθέσιμο", + "正在开锁中...": "Ξεκλείδωμα...", + "你的钥匙": "Το κλειδί σου", + "常开模式启动!长按闭锁": "Έναρξη λειτουργίας ανοιχτής! Μεγάλη πίεση για κλειδώσεις", + "演示模式": "Λειτουργία επίδειξης", + "请先同意用户协议及隐私政策": "Παρακαλώ συμφωνήστε με τη συμφωνία χρήστη και την πολιτική απορρήτου πρώτα.", + "用户协议": "Όροι χρήστη", + "隐私政策": "Πολιτική απορρήτου", + "注册成功": "Εγγραφή επιτυχή", + "你所在的": "Είσαι μέσα.", + "手机号": "Αριθμός τηλεφώνου", + "忘记密码": "Ξεχάσατε τον κωδικό πρόσβασης", + "重置成功": "Επαναφορά επιτυχίας", + "确定要退出吗?": "Έξοδος;", + "功能暂未开放": "Η λειτουργία δεν είναι ακόμα ανοικτής", + "设置成功": "Ρύθμιση με επιτυχία", + "删除成功": "Διαγραφή με επιτυχία", + "单次": "Μία φορά,", + "永久": "Μόνιμο", + "限时": "Χρονομετρούμενο", + "自定义": "Προσαρμοσμένο", + "清空码": "Διαγραφή", + "循环": "Επαναλαμβανόμενη", + "工作日": "Εργασία", + "每日": "Καθημερινά", + "周末": "Σαββατοκύριο", + "确定要删除吗?": "Διαγραφή;", + "该锁的密码都将被删除": "Όλοι οι κωδικοί πρόσβασης για αυτή την κλειδαριά θα απελευθερωθούν.", + "已过期": "Μη έγκυρο", + "该锁的电子钥匙都将被删除": "Όλα τα eKeys για αυτή την κλειδαριά θα αφαιρεθούν.", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Όλα ekeys που σχετίζονται με αυτό το ekey.Αυτό το βήμα δεν μπορεί να είναι UNDONE!", + "删除钥匙会在用户APP连网后生效": "Το τέικι θα αφαιρεθεί.", + "有效时间": "Αποτελεσματικός χρόνος", + "接收者": "Αποδέκτης", + "仅管理自己创建的用户": "Διαχειριστείτε τους δικούς του χρήστες μόνον", + "远程开锁": "Απομακρυσμένο ξεκλείδωτο", + "请输入钥匙名称": "Παρακαλώ εισάγετε το όνομα κλειδιού", + "修改成功": "Τροποποίηση επιτυχίας", + "冻结": "Πάγωση", + "解除冻结": "Αποψύχωση", + "授权": "Εξουσιοδότηση", + "取消授权": "Εγκρινόμενο", + "同时解冻其发送的钥匙": "Απόψιση όλων των ekeys που εκδόθηκαν από αυτόν τον χρήστη", + "会在用户APP连网后生效": "Αυτό το ekey θα είναι THAWED όταν η APP του χρήστη συνδέεται με ένα δίκτυο", + "同时冻结其发送的钥匙": "Πάγωμα όλων των ekeys που εκδόθηκαν από αυτόν τον χρήστη", + "冻结会在用户APP连网后生效": "Αυτό το ekey θα είναι FROZEN όταν η APP του χρήστη συνδέεται με ένα δίκτυο", + "取消授权会在用户APP连网后生效": "Ο χρήστης θα χάσει τις άδειες του/της όταν η APP του χρήστη συνδέεται με ένα δίκτυο", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Ο εξουσιοδοτημένος χρήστης έχει σχεδόν τις ίδιες άδειες με τον διαχειριστή LOCK (eg. Δυνατότητα αποστολής ekeys και κωδικούς πρόσβασης)", + "失效时间需晚于生效时间": "Ο χρόνος λήξης πρέπει να είναι αργότερο από την ημερομηνία ισχύος", + "生效时间需晚于当前时间": "Ο αποτελεσματικός χρόνος πρέπει να είναι αργότερο από την τρέχουσα ώρα.", + "失效日期需晚于生效日期": "Η ημερομηνία λήξης πρέπει να είναι μεταγενέστερη από την ημερομηνία ισχύος.", + "修改有效期": "Περίοδος μεταβολής", + "生效日期": "Ημερομηνία έναρξης", + "失效日期": "Ημερομηνία λήξης", + "开锁": "Ξεκλείδωση", + "开锁成功": "Ξεκλείδωση", + "请选择锁": "Παρακαλώ επιλέξτε κλειδαριά", + "请选择接收者": "Παρακαλώ επιλέξτε τον δέκτη.", + "请选择有效期": "Παρακαλώ επιλέξτε την περίοδο ισχύοςς", + "请选择发送方式": "Παρακαλώ επιλέξτε τη μέθοδο αποστολής", + "请选择结束时间": "Παρακαλώ επιλέξτε την ώρα λήξης", + "完成": "Ολοκληρώθηκε", + "有效日": "Κύκλωση", + "发送成功": "Αποστολή επιτυχίας", + "请选择开始时间": "Παρακαλώ επιλέξτε την ώρα έναρξης", + "选择用户": "Επιλογή παραλήπτων", + "已选中": "Επιλεγμένα", + "确定": "Εντάξει..", + "请选择要发送的锁": "Παρακαλώ επιλέξτε κλειδαριά", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Πρόσωπο πραγματική ονομασία αναφέρεται στην ανάγκη του χρήστη να επαληθεύσει το πρόσωπό του πριν ξεκλειδώσει το τηλέφωνο APP, και η επαλήθευση μπορεί να ξεκλειδωθεί.", + "分享": "Μοιρασία", + "请输入接收者账号": "Παρακαλώ εισάγετε το λογαριασμό παραλήπτη", + "接收者号码未注册,请重新发送": "Ο αριθμός δέκτη δεν είναι εγγεγραμμένος.", + "是否发送电子钥匙给未注册账号": "Θέλετε να στείλετε ένα EKey σε ένα νέο λογαριασμό", + "取消": "Ακύρωση", + "标记成功": "Σημείωση επιτυχίας", + "微信好友": "Φίλοι WeChat", + "短信": "SMS", + "邮件": "Ηλεκτρονικό ταχυδρομείο", + "更多": "Περισσότερα.", + "您好,您的电子钥匙生成成功": "Γεια σας, το ηλεκτρονικό κλειδί δημιουργείται με επιτυχία", + "生效时间不能小于当前时间": "Ο αποτελεσματικός χρόνος δεν μπορεί να είναι μικρότερος από την τρέχουσα ώρα.", + "结束时间不能小于当前时间": "Ο χρόνος λήξης δεν μπορεί να είναι μικρότερος από την τρέχουσα ώρα.", + "是否为管理员": "Είναι διαχειριστής.", + "已连接到锁,请将卡靠近门锁的读卡区": "Τοποθετήστε την κάρτα ενάντια στον αναγνώστη κάρτας", + "尝试连接设备...": "Σύνδεση με το Lock.Παρακαλώ περιμένετε....", + "地理位置": "Γεωγραφική θέση", + "检查以确保以下地址是正确的": "Ελέγξτε για να βεβαιωθείτε ότι η ακόλουθη διεύθυνση είναι σωστή", + "地图加载中,请稍候。。": "Ο χάρτης φορτώνεται, παρακαλώ περιμένετε...", + "跳过": "Παράλειψη", + "还未获取到位置信息哦,请耐心等待一下!": "Οι πληροφορίες τοποθεσίας δεν έχουν ληφθεί ακόμα, παρακαλώ περιμένετε υπομονετικά!", + "请填写信息": "Παρακαλώ συμπληρώστε τις πληροφορίες", + "有效期": "Περίοδος ισχύος", + "生效时间": "Ώρα έναρξης", + "失效时间": "Τέλος χρόνου", + "上传成功": "Αποστολή με επιτυχία", + "未生效": "Ανενεργό", + "已生效": "Αποτελεσματικό", + "指纹详情": "Πληροφορίες δακτυλικών αποτυπωμάτων", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Θα χρειαστεί να τοποθετήσετε το δάχτυλό σας στο αισθητήρα αρκετές φορές.Παρακαλώ ακολουθήστε τις ερωτήσεις....", + "开始添加": "Εκκίνηση", + "请将您的手指按下": "Τοποθετήστε το δάχτυλό σας στον αισθητήρα", + "根据提示,抬起手指后再进行下一次指纹采集": "Ακολουθήστε τις ερωτήσεις ... θα πρέπει να αφαιρέσετε και τοποθετήστε το δάχτυλό σας στο αισθητήρα για την επόμενη εγγραφή", + "添加成功": "Προσθήκη επιτυχίας", + "更新成功": "Επιτυχία ενημέρωσης", + "搜索": "Αναζήτησης", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, το φύλλο της κλειδαριάς θα διαγραφεί, επιθυμείτε την επαναφορά;", + "已失效": "Μη έγκυρο", + "卡详情": "Πληροφορίες χαρτιών", + "请输入": "Παρακαλώ εισάγετε εδώ.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Με την απενεργοποίηση, η κλειδαριά θα παραμείνει ξεκλείδωτη όλη την ημέρα μέχρι να είναι χειροκίνητα κλειδωμένο", + "请输入小于或等于60的数字": "Παρακαλώ εισάγετε έναν αριθμό μικρότερο από 60", + "操作成功": "Επιτυχής λειτουργίας", + "管理员密码相同,无需修改": "Ο κωδικός πρόσβασης διαχειριστή είναι ο ίδιος και δεν χρειάζεται να τροποποιηθεί", + "请输入6-9位数字": "6-9 ψηφία σε μήκος", + "请输入6-9位管理员密码": "Παρακαλώ εισάγετε έναν κωδικό πρόσβασης διαχειριστή 6-9 ψηφίου", + "请输入新的管理员密码": "Παρακαλώ εισάγετε έναν νέο κωδικό πρόσβασης διαχειριστή", + "未分组": "Μη ομαδοποιημένο", + "请输入分组名称": "Δημιουργία ομάδας", + "创建成功": "Δημιουργία επιτυχίας", + "设置锁分组成功": "Ορισμός της ομάδας κλειδαριάς", + "电池1电量": "Μπαταρία 1", + "电池2电量": "Μπαταρία 2", + "电量更新时间": "Χρόνος ενημέρωσης μπαταρίας", + "锁电量更新成功": "Επιτυχία ενημέρωσης ενέργειας κλειδών", + "您的钥匙未生效": "Το κλειδί σου δεν είναι αποτελεσματικό.", + "您的钥匙已冻结": "Το κλειδί σου έχει παγώσει.", + "您的钥匙已过期": "Το κλειδί σας έχει λήξει", + "常开模式开启": "Η κλειδαριά είναι σε λειτουργία πέρασης", + "超级管理员": "Σούπερ διαχειριστή", + "授权管理员": "Εξουσιοδοτημένος διαχειριστή", + "普通用户": "Τακτικός χρήστης", + "余": "Υπόλοιπος", + "天": "Ημέρα", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Μετά τη διαγραφή της κλειδαριάς, όλες οι πληροφορίες θα διαγραφούν μαζί, είστε σίγουροι ότι θέλετε να διαγράψετε την κλειδαριά;", + "请输入登录密码": "Παρακαλώ εισάγετε τον κωδικό πρόσβασης εφαρμογής", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Αποτυχία διαγραφής της συσκευής, παρακαλώ βεβαιωθείτε ότι η συσκευή είναι κοντά στη συσκευή, η συσκευή δεν είναι συνδεδεμένη, και η συσκευή είναι ενεργή", + "用户无权限": "Ο χρήστης δεν έχει άδεια", + "创建公司后,考勤功能才能使用": "Παρακαλώ Δημιουργήστε μια Εταιρεία πρώτα", + "是否删除钥匙?": "Διαγραφή αυτό το ekey;", + "邮箱绑定成功": "Επιτυχία σύνδεσης email", + "手机绑定成功": "Επιτυχία δέσμευσης κινητού τηλεφώνου", + "网络访问失败,请检查网络是否正常": "Αποτυχημένη αίτηση.Network μη διαθέσιμο, παρακαλώ ελέγξτε και συνδέστε τη συσκευή σας με 3G/4G/WIFI", + "清空": "Καθαρός", + "是否清空?": "Κατάλαβες;", + "消息详情": "Πληροφορίες μηνύματος", + "创建时间": "Χρόνος δημιουργίας", + "管理员详情": "Λεπτομέρειες διαχειριστή", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Αν κάποιος σε αναγκάσει να ανοίξεις την πόρτα, μπορείς να χρησιμοποιήσεις αυτή την κάρτα. Το μήνυμα του συναγερμού θα σταλεί στους διευθυντές. Για να χρησιμοποιήσετε αυτή τη δυνατότητα, παρακαλούμε βεβαιωθείτε ότι η κλειδαριά σας είναι online.", + "请不要将胁迫卡用于日常开锁": "Παρακαλώ μην χρησιμοποιείτε την καταναγκωμένη κάρτα για καθημερινή χρήση.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Αν κάποιος σε αναγκάσει να ανοίξεις την πόρτα, μπορείς να χρησιμοποιήσεις αυτό το αποτύπωμα. Το μήνυμα του συναγερμού θα σταλεί στους διευθυντές. Για να χρησιμοποιήσετε αυτή τη δυνατότητα, παρακαλούμε βεβαιωθείτε ότι η κλειδαριά σας είναι online.", + "请不要将胁迫指纹用于日常开锁": "Σε παρακαλώ μην χρησιμοποιήσεις το καταναγκασμένο αποτύπωμα για καθημερινή χρήση.", + "创建公司": "Δημιουργία εταιρείας", + "公司名称不能超过30个字符": "Το όνομα της εταιρείας δεν μπορεί να υπερβαίνει τους 30 χαρακτήρων", + "公司名称不能小于6个字符": "Το όνομα της εταιρείας δεν μπορεί να είναι μικρότερο από 6 χαρακτήρες", + "WIFI列表": "Λίστα WIFI", + "刷新": "Ανανέωση", + "手动配网": "Δίκτυο χειροκίνητων διανομής", + "远距离": "Μεγάλη απόσταση", + "中距离": "Μέση απόσταση", + "近距离": "Σύντομη απόσταση", + "锁时间更新成功": "Επιτυχία ενημέρωσης χρόνου κλείδωσης", + "锁用户": "Κλειδώστε τους χρήστες", + "请选择常开日期": "Παρακαλώ επιλέξτε την ανοικτή ημερομηνία", + "结束时间不能小于开始时间哦": "Ο χρόνος τέλους δεν μπορεί να είναι μικρότερος από το χρόνο έναρξης", + "介绍": "Η Ιστορία μας", + "个人信息收集清单": "Κατάλογος συλλογής προσωπικών πληροφοριών", + "应用权限说明": "Περιγραφή άδειας εφαρμογής", + "第三方信息共享清单": "Κατάλογος ανταλλαγής πληροφοριών τρίτων μερών", + "请选择您的位置": "Παρακαλώ επιλέξτε την τοποθεσία σας", + "请先选择位置": "Παρακαλώ επιλέξτε την τοποθεσία πρώτα.", + "管理员密码": "Κωδικός διαχειριστής", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Αν θέλετε να τροποποιήσετε, παρακαλώ εισάγετε έναν νέο κωδικό πρόσβασης διαχειριστή (6 ψηφία), κάντε κλικ στο OK για να τροποποιήσε", + "修改": "Τροποποίηση", + "网络摄像头": "Κάμερα", + "重命名": "Μετονομασία", + "分组下的锁将被移到未分组里": "Οι κλειδαριές κάτω από την ομάδα θα μετακινηθούν σε μη ομαδοποιημένες", + "编辑成功": "Επεξεργασία επιτυχίας", + "厂商": "Παραγωγός", + "型号": "Υπόδειγμα:", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Αφού παράγεται ο κωδικός πρόσβασης, παρακαλούμε να τον χρησιμοποιήσετε μία φορά για ενεργοποίηση πριν από τις 23:59 την ίδια ημέρα, Αλλιώς θα είναι άκυρη μετά τις 0. Αφού ενεργοποιηθεί ο κωδικός πρόσβασης, μπορεί να χρησιμοποιηθεί απεριόριστες ώρες εντός της περιόδου ισχύος.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Αφού δημιουργηθεί ο κωδικός πρόσβασης, παρακαλούμε να το χρησιμοποιήσετε πριν από τις 23:59 την ίδια μέρα, αλλιώς θα είναι άκυρο μετά το 0 η ώρα. Ο σαφής κώδικας χρησιμοποιείται για να καθαρίσει όλους τους κωδικούς πρόσβασης που παράγονται πριν από το 0 η ώρα σήμερα.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Αφού δημιουργηθεί ο κωδικός πρόσβασης, παρακαλούμε να το χρησιμοποιήσετε πριν από τις 23:59 την ίδια μέρα, αλλιώς θα είναι άκυρο μετά το 0 η ώρα.", + "清空密码底部提示": "Ο κωδικός πρόσβασης ισχύει μέχρι τις 23:59 την ημέρα της αδειοδότησης", + "相机": "Μηχανή", + "相册": "Φωτογραφίες", + "读写": "Αποθήκευσης", + "定位": "Τοποθεσία", + "需要访问相机权限才能拍照上传文件例如头像上传": "Η πρόσβαση στην κάμερα απαιτείται για να τραβήξετε φωτογραφίες και να ανεβάσετε αρχεία, όπως η αποστολή μιας εικόνας προφίλ.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Απαιτείται πρόσβαση στην φωτογραφική μηχανή για την αποστολή αρχείων και avatars χρησιμοποιώντας εικόνες άλμπουμ", + "需要访问读写权限才能使用本地图片上传头像": "Απαιτείται πρόσβαση σε άδειες ανάγνωσης και εγγραφής για την αποστολή των avatars χρησιμοποιώντας τοπικές εικόνες", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Απαιτείται πρόσβαση στις πληροφορίες τοποθεσίας για τη χρήση της λειτουργίας βασικής προσθήκης", + "申请": "Αίτηση", + "权限": "Άδεια", + "不允许": "Δεν επιτρέπεται", + "允许": "Επιτρέπεται", + "权限被拒绝": "Απορρίφθηκε η άδεια", + "请手动在系统设置中开启": "Παρακαλώ ενεργοποιήστε το χειροκίνητα στις ρυθμίσεις συστήματος", + "权限以继续使用应用": "Άδεια να συνεχίσετε τη χρήση της εφαρμογής.", + "去设置": "Πήγαινε να το στήσεις", + "当前网络": "Τρέχον δίκτυο", + "位置信息": "Πληροφορίες τοποθεσίας", + "请输入wifi名称": "Παρακαλώ εισάγετε το όνομα WiFi", + "虹膜": "Ίριδας", + "手掌": "Φοίνικα", + "商城": "Εμπορικό", + "我的": "Μου", + "微信公众号推送": "Συνομιλία δημόσιου λογαριασμού", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Για να ανοίξετε τη συζήτηση για να λάβετε μηνύματα συναγερμού, θα πρέπει να δώσετε προσοχή στο Skye Smart Lock δημόσιο λογαριασμό για τη συζήτηση. παρακαλώ αποθηκεύστε τον κωδικό QR και χρησιμοποιήστε τη συνομιλία για σάρωση των ρυθμίσεων", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Απαιτείται πρόσβαση στις άδειες Bluetooth για τη χρήση των πληροφοριών τοποθεσίας της λειτουργίας βασικής προσθήκης", + "请输入Email": "Εισάγετε το email σας", + "请输入手机号": "Εισάγετε τον αριθμό τηλεφώνου σας", + "家人到家": "Μέλος της οικογένειας έφτασε στο σπίτι.", + "添加家人": "Προσθήκη μέλους της οικογένειας", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Αν η κλειδαριά δεν είναι συνδεδεμένη με το Διαδίκτυο, υπενθυμίσεις για κωδικό πρόσβασης, κάρτα, αποτύπωμα, και άλλες μέθοδοι ανοίγματος θύρων δεν μπορούν να αποσταλούν εγκαίρως.", + "消息提醒": "Υπενθύμιση", + "开门通知": "Προκήρυξη έναρξης", + "N天未开门": "N ημέρες χωρίς άνοιγμα πόρτας", + "门未关好": "Η πόρτα δεν είναι κλειστή.", + "防拆报警": "Εμφάνιση συναγερμού", + "低电量提醒": "Χαμηλή μπαταρία", + "胁迫开门": "Άνοιγμα εξαναγκασμένου θύρα", + "有人按门铃": "Κάποιος χτυπάει το κουδούνι.", + "有人出现在门口": "Κάποιος εμφανίζεται στην πόρτα.", + "提醒方式": "Μέθοδος υπενθύμισης", + "开门方式": "Μέθοδος ανοίγματος της θύρας", + "请选择": "Παρακαλώ επιλέξτε.", + "家人": "Μέλος της οικογένειας", + "保存": "Αποθήκευση", + "APP推送": "Πίεση APP", + "管理员": "Διαχειριστή", + "未启用": "Μη ενεργοποιημένο", + "已启用": "Ενεργοποιημένο", + "省电模式": "Λειτουργία εξοικονόμησης ενέργειας", + "逗留抓拍模式": "Λειτουργία σύλληψης", + "实时监控模式": "Λειτουργία παρακολούθησης σε πραγματικό χρόνο.", + "自定义模式": "Προσαρμοσμένη λειτουργία", + "猫眼设置": "Ρυθμίσεις ματιών γάτας", + "猫眼工作模式": "Λειτουργία λειτουργίας ματιών γάτας", + "自动亮屏": "Αυτόματη φωτεινή οθόνη", + "亮屏持续时间": "Οθόνη στην ώρα του χρόνου", + "逗留警告": "Μείνε προειδοποιητικός.", + "异常警告": "Μη φυσιολογική προειδοποίηση", + "短信提醒": "SMS", + "邮件提醒": "Ηλεκτρονικό ταχυδρομείο", + "N天未开门提醒": "N ημέρες χωρίς άνοιγμα πόρτας", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Αν κάποιος σε αναγκάσει να ανοίξεις την κλειδαριά, μπορείς να χρησιμοποιήσεις αυτό το αποτύπωμα. Το μήνυμα συναγερμού θα σταλεί στους διευθυντές.TO χρησιμοποιεί αυτό το χαρακτηριστικό, παρακαλούμε βεβαιωθείτε ότι η κλειδαριά σας είναι online.", + "胁迫指纹": "Αναγκασμένο δακτυλικό αποτύπωμα", + "指纹列表": "Λίστα δακτυλικών αποτυπωμάτων", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Μετά την ορισμένη ώρα, αν η κλειδαριά δεν ανοίξει, το σύστημα θα στείλει ένα μήνυμα υπενθύμισης στον ορισμένο παραλήπτη. Αυτή η λειτουργία απαιτεί η κλειδαριά να συνδεθεί με το διαδίκτυο.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Μετά την ενεργοποίηση της υπενθύμισης , όταν η μπαταρία κλειδώματος είναι κάτω από 20%, 10%, και 5%, το σύστημα θα στείλει μήνυμα υπενθύμισης στον καθορισμένο παραλήπτη.", + "未开门时间": "Ημέρες χωρίς άνοιγμα πόρτας", + "添加和使用面容开锁时:": "Προσθήκη και χρήση Face κατά την ξεκλείδωση:", + "关锁": "Κλειδαριά", + "功能": "Συνάρτησης", + "配件": "Μέρη", + "云存": "Αποθήκευση νεφών", + "本地": "Αυτή η τοποθεσία", + "3天滚动储存": "3 ημέρες", + "去升级": "Αναβάθμιση τώρα", + "下载列表": "Λίστα λήψης", + "已下载": "Λήψης", + "全部视频": "Όλα τα βίντεο", + "已为本设备免费提供3大滚动视频储存服务": "Τρεις υπηρεσίες αποθήκευσης βίντεο παρέχονται δωρεάν για τη συσκευή αυτή.", + "视频播放": "Αναπαραγωγή βίντεο", + "全选": "Όλα", + "请选择要删除的视频": "Παρακαλώ επιλέξτε το βίντεο που θέλετε να διαγράψετε το βίντεο", + "请选择要下载的视频": "Παρακαλώ επιλέξτε το βίντεο που θέλετε να λήψης", + "欢迎使用": "Καλώς ήρθατε για χρήση.", + "用户协议和隐私政策概要": "Περίληψη της Συμφωνίας Χρήστης και Πολιτικής Απορρήτου", + "协议概要": "Περίληψη πρωτοκόλλου", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Σας ευχαριστώ για τη χρήση αυτής της εφαρμογής. Δίνουμε μεγάλη σημασία στις προσωπικές σας πληροφορίες και προστασία απορρήτου. Πριν χρησιμοποιήσετε αυτό το προϊόν, παρακαλούμε διαβάστε το προσεκτικά", + "《用户协议》": "Όροι χρήστη", + "和": "Και,", + "《隐私政策》": "Πολιτική ιδιωτικότητας", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Όλο το περιεχόμενο του. Κάνοντας κλικ στο \"Συμφωνήστε\", συμφωνείτε και αποδέχεστε όλους τους όρους. Εάν επιλέξετε να μην συμφωνήσετε, δεν θα μπορέσετε να χρησιμοποιήσετε τα προϊόντα και τις υπηρεσίες μας και θα αποχωρήσετε από την εφαρμογή.", + "不同意": "Διαφωνώ.", + "同意": "Συμφωνώ", + "该功能是高级功能,请开通后再使用": "Αυτή είναι η προηγμένη λειτουργία. Παρακαλώ ενεργοποίησέ το πρώτα.", + "常用程序": "Κοινά προγράμματα", + "该锁已被重置": "Η κλειδαριά επαναφέρθηκε.", + "需要访问读写权限才能使用手动升级固件": "Απαιτείται πρόσβαση σε άδειες ανάγνωσης και εγγραφής για τη χειροκίνητη αναβάθμιση του firmware.", + "错误D固件,请选择正确的文件": "Λάθος υλικό, παρακαλώ επιλέξτε το σωστό αρχείο.", + "非SYD固件,请选择正确的文件": "Μη SYD firmware, παρακαλώ επιλέξτε το σωστό αρχείο.", + "文件校验失败 0x01": "Η επαλήθευση αρχείου απέτυχε 0x1", + "解析元数据失败,请选择正确的文件": "Αποτυχία ανάλυσης μεταδεδομένων, παρακαλώ επιλέξτε το σωστό αρχείο.", + "文件校验失败 0x02": "Η επαλήθευση αρχείου απέτυχε 0x02", + "文件校验失败 0x03": "Η επαλήθευση αρχείου απέτυχε 0x03", + "固件升级完成": "Η αναβάθμιση του Firmware ολοκληρώθηκε", + "记录": "Καταγραφή", + "开通高级功能后才可以对锁进行管理": "Παρακαλώ ενεργοποιήστε την προηγμένη λειτουργία πρώτα για τη διαχείριση κλειδαριών.", + "去开通": "Ενεργοποίηση ενεργοποίησης", + "实名认证": "Ταυτοποίηση πραγματικού όνομας", + "当前剩余数量": "Λοιπόν", + "购买": "Αγορά", + "实名认证为付费功能,请购买后再使用": "Η ταυτοποίηση πραγματικού ονόματος είναι μια πληρωμένη λειτουργία, παρακαλώ χρησιμοποιήστε την μετά την αγορά.", + "密码不一致哦": "Οι κωδικοί πρόσβασης δεν είναι συνεπείς.", + "退出添加": "Σταμάτηση", + "管理员已满": "Πλήρη διαχειριστή", + "用户已满": "Ο χρήστης είναι πλήρης", + "锁上面添加指纹已满": "Προσθήκη δακτυλικών αποτύπων", + "指纹已存在": "Το αποτύπωμα υπάρχει ήδη.", + "锁上面添加人脸已满": "Η κλείδωση πάνω από την προσθήκη είναι πλήρης", + "人脸已存在": "Το πρόσωπο υπάρχει ήδη.", + "锁上面添加卡已满": "Κλείδωμα πάνω από την κάρτα προσθήκης είναι πλήρης", + "卡已存在": "Η κάρτα υπάρχει ήδη", + "锁上面添加密码已满": "Κλειδώστε πάνω τον κωδικό πρόσθεσης είναι πλήρης", + "密码已存在": "Ένας ίδιος κωδικός πρόσβασης υπάρχει ήδη.Παρακαλώ επιλέξτε ένα διαφορετικό.", + "请输入密码": "Παρακαλώ εισάγετε κωδικό πρόσβασης", + "暂无密码,无需重置": "Χωρίς κωδικό πρόσβασης, δεν χρειάζεται επαναφορά", + "真实姓名": "Πραγματικό όνομα.", + "身份证号": "Αριθμός ταυτότητας", + "请输入真实姓名": "Παρακαλώ εισάγετε το πραγματικό σας όνομα.", + "请输入身份证号": "Παρακαλώ εισάγετε τον αριθμό ID σας", + "请输入身份证号和真实姓名": "Παρακαλώ εισάγετε τον αριθμό ID και το πραγματικό σας όνομα", + "点击返回设备配对": "Πατήστε Πίσω στη συσκευή ζεύξης", + "无法连接?尝试升级": "Δεν μπορείτε να συνδεθείτε;", + "固件升级提示": "Προτεινόμενη αναβάθμιση του Firmware", + "请先获取固件文件到手机本地,再选择升级": "Παρακαλώ αποκτήστε πρώτα το αρχείο firmware στο τοπικό τηλέφωνο και στη συνέχεια επιλέξτε Αναβάθμιση", + "固件升级中": "Το firmware αναβαθμίζεταιName", + "取消升级": "Ακύρωση της αναβάθμισης", + "固件传输中": "Άρθρο 10", + "关闭": "Κλείσιμο", + "传输中'": "Διακόπτων", + "操作记录": "Καταγραφή", + "修改姓名": "Επεξεργασία όνομας", + "传输中": "Διακόπτων", + "发送人": "Εκδόθηκε από την Επιτροπή.", + "发送时间": "Χρόνος έκδοσης", + "钥匙详情": "Πληροφορίες ekey", + "姓名": "Όνομα", + "发送": "Αποστολής", + "请确认姓名全名和身份证号码是否正确": "Παρακαλώ επιβεβαιώστε ότι το πλήρες όνομα και αριθμό ταυτότητας είναι σωστό", + "传输期间请勿离开当前页面": "Μην εγκαταλείψετε την τρέχουσα σελίδα κατά τη μεταφοράς", + "机型": "Μοντέλα", + "硬件版本": "Έκδοση υλικού υλικού", + "固件版本": "Έκδοση Firmware", + "手动升级": "Χειροκίνητη αναβάθμιση", + "设备连接中...": "Σύνδεση συσκευής...", + "未避免异常情况,请在门打开时升级": "Αναπόφευκτες εξαιρέσεις, παρακαλώ αναβαθμίστε όταν η πόρτα είναι ανοιχτή.", + "钥匙无效": "Το κλειδί δεν είναι έγκυρο", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Αδυναμία σύνδεσης με την κλειδαριά.Παρακαλώ Ξαναενεργοποιήστε το Blutooth του τηλεφώνου σας και δοκιμάστε ξανά.", + "如果是全自动锁,请使屏幕变亮": "Αν είναι μια πλήρως αυτόματη κλειδαριά, παρακαλώ κάνετε την οθόνη πιο φωτεινή", + "正在尝试闭锁……": "Προσπαθώ να κλειδώσω. Παρακαλώ περιμένετε...", + "清空记录": "Καθαρισμός εγγραφών", + "是否要删除操作记录?": "Συνεχίστε να διαγράψετε εγγραφές;", + "被删除的记录不能恢复": "Τα αρχεία δεν μπορούν να ανακτηθούν μετά τη διαγραφή.", + "全部事件": "Όλα τα γεγονότα", + "开锁事件": "Ξεκλείδωση", + "异常事件": "Μη φυσιολογικό συμβάν", + "门铃事件": "Εκδήλωση κουδουνιών πόρτας", + "视频事件": "Βίντεο γεγονός", + "请开启蓝牙": "Παρακαλώ γύρισε το Bluetooth.", + "请选择有效日": "Παρακαλώ επιλέξτε την ημέρα αποτελεσματικότητας", + "公司名字长度不能小于 6 ": "Η διάρκεια της ονομασίας της εταιρείας δεν μπορεί να είναι μικρότερη από 6", + "已是最新版本": "Χωρίς ενημερώσεις", + "新建短信模版": "Δημιουργία πρότυπου SMS", + "新建邮件模版": "Δημιουργία προτύπου email", + "自定义短信模版": "Πρότυπο SMS", + "自定义邮件模版": "Πρότυπο ηλεκτρονικού ταχυδρομείου", + "名称": "Όνομα", + "星星锁": "Κλειδαριά αστεριού", + "无考勤记录": "Χωρίς εγγραφή", + "大家干劲十足": "Όλοι έρχονται στο χρόνο.", + "工作时长未出炉": "Χωρίς Ώρες Εργασίας", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Η επιλογή της χώρας/περιοχής θα επηρεάσει την ασφάλεια των δεδομένων. Έχετε επιλέξει αυτή τη στιγμή την Αλβανία, παρακαλούμε επιβεβαιώστε πριν προχωρήσετε.", + "确认国家或地区": "Επιβεβαίωση χώρα/περιφέρεια", + "我知道了": "Το 'πιασα.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Για να λάβετε σημαντικές ενημερώσεις, κάντε κλικ στο 'OK' και ενεργοποιήστε τις ειδοποιήσεις στις ρυθμίσεις.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Μετά την ενεργοποίηση, μπορείτε να επανενεργοποιήσετε πατώντας το πλήκτρο ρύθμισης στην κλειδαριά, και να το ξαναπροσθέσετε με το APP.", + "已有": "Τρέχοντα", + "新增": "Νέο", + "账号格式错误": "Κακή μορφή", + "接收者信息为空": "Οι πληροφορίες του παραλήπτη είναι κενές", + "请输入时间(秒)": "Παρακαλώ εισάγετε την ώρα (sec)", + "加载数据失败": "Αποτυχία φόρτωσης δεδομένων", + "重试": "Προσπάθησε ξανά", + "升级中,是否退出": "Κατά τη διάρκεια της αναβάθμισης, αν θα εξόδουν", + "下一步": "Επόμενο", + "公寓": "Διαμέρισμα", + "个人用户": "Προσωπική", + "星寓": "Διαμέρισμα αστέριο", + "账号": "Λογαριασμός", + "请输入手机号或email": "Αριθμός τηλεφώνου ή email", + "请输入星寓管理员的账号": "Παρακαλώ εισάγετε τον λογαριασμό του διαχειριστή διαμερισμάτων αστέρων διαμερισμάτων.", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Όλα τα δεδομένα των επιλεγμένων κλειδαριών θα μεταβιβαστούν μόνιμα στον παραλήπτη.", + "暂不支持跨平台转移,敬请期待": "Διασκέδαση της πλατφόρμας δεν υποστηρίζεται προς το παρόν, παρακαλούμε αναμένετε να το αναμένει", + "移除坏锁": "Μετακινήστε ελαττωματικές / καταστροφές κλειδαριές στα σκουπίδια", + "转移确认": "Επιβεβαίωση μεταφοράς", + "本次共转移": "Αυτή τη φορά συνολικά.", + "把智能锁": "Έξυπνη κλειδαριά", + "确认": "Εντάξει..", + "移除成功": "Αφαίρεση με επιτυχία", + "转移成功": "Επιτυχία μεταφοράς", + "该已锁被删除": "Το κλειδωμένο διαγράφεται.", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Ο εξουσιοδοτημένος διαχειριστής μπορεί μόνο να διαχειριστεί κωδικούς πρόσβασης, Keys και να κλαπεί από τον εαυτό του.", + "添加授权管理员": "Δημιουργία διαχειριστής", + "导出记录": "Αρχεία εξαγωγής", + "选择时间段": "Επιλέξτε χρονική περίοδος", + "导出": "Εξαγωγή", + "批量导出": "Παρτίδα εξαγωγή", + "读取记录": "Ανανέωση εγγραφής", + "设备": "Συσκευή", + "消息": "Μηνύματα", + "智能分析": "Ευφυής αναλυτικός", + "精准识别设备事件,过滤无效信息": "Ακριβώς αναγνώριση γεγονότων συσκευών και φιλτράρισμα μη έγκυρων πληροφοριών", + "系统设置": "Ρυθμίσεις συστήματος", + "系统的全局配置在此项内进行设置": "Η καθολική διαμόρφωση του συστήματος ορίζεται σε αυτό το στοιχείο", + "导出操作记录": "Αρχεία εξαγωγής", + "立即查看": "Προβολή", + "导出成功": "Εξαγωγή με επιτυχία", + "发送钥匙": "Αποστολή Έικι", + "进度": "Ποσοστός", + "失败": "Αποτυχία", + "人脸详情": "Λεπτομέρειες πρόσωπου", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Όταν κάποιος αισθάνεται περίπου 1,5 μέτρα μπροστά από την πόρτα, η αναγνώριση του προσώπου θα ξεκινήσει αυτόματα.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Όταν κάποιος αισθάνεται περίπου 0,8 μέτρα μπροστά από την πόρτα, η αναγνώριση του προσώπου θα ξεκινήσει αυτόματα.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Όταν κάποιος αισθάνεται περίπου 0,5 μέτρα μπροστά από την πόρτα, η αναγνώριση του προσώπου θα ξεκινήσει αυτόματα.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Η απόσταση των αισθητήσεων έχει απενεργοποιηθεί, πρέπει να αγγίξετε χειροκίνητα οποιοδήποτε πλήκτρο στο πληκτρολόγιο για να εκτελέσετε την αναγνώριση προσώπου.", + "防误开已打开,开锁后": "Το αντι-λάθος άνοιγμα έχει ενεργοποιηθεί, και μετά την ξεκλείδωση", + "秒内不可使用面容开锁": "Η ξεκλείδωση προσώπου δεν μπορεί να χρησιμοποιηθεί μέσα σε δευτερόλεπτα", + "掌静脉": "Φλέβη φοινίκων", + "添加掌静脉": "Προσθέστε φλέβα φοίνικας", + "胁迫掌静脉": "Αναγκασμένη φλέβα φοίνικα", + "请不要将胁迫掌静脉用于日常开锁": "Παρακαλώ μην χρησιμοποιείτε εξαναγκασμένες φλέβες φοίνικας για την καθημερινή ξεκλείδωση", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Συνδεδεμένο με την κλειδαριά, παρακαλώ ανοίξτε φυσικά την παλάμη σας, η παλάμη κοιτάει την κάμερα.", + "掌静脉详情": "Λεπτομέρειες φλέβα φοινίκων", + "掌静脉号": "Αριθμός φλέβας φοινίκων", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth δεν είναι ενεργοποιημένο, παρακαλώ ενεργοποιήστε Bluetooth στις ρυθμίσεις", + "删除用户时,会将用户拥有的钥匙一起删除。": "Εάν ένας χρήστης είναι ΑΔΕΙΤΕΣ οποιαδήποτε ekeys που σχετίζονται με τον χρήστη θα είναι επίσης ΑΔΕΛΕΜΕΝΑ.", + "配置网络": "Ρύθμιση δικτύου", + "你好": "Γεια.", + "成功": "Επιτυχημένος", + "类型选择": "Επιλογή τύπου:", + "请选择要使用哪种类型": "Παρακαλώ επιλέξτε τον τύπο να χρησιμοποιήσετε τον τύπο.", + "系统邮件(推荐)": "Σύστημα email (συνιστάται)", + "系统短信(推荐)": "Συστήματος SMS (συνιστάται)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Το email θα σταλεί από αυτή την εφαρμογή.Παρακαλώ αγορά πακέτο email πρώτα.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Το SMS θα σταλεί από αυτή την εφαρμογή.Παρακαλώ αγορά πακέτο email πρώτα.", + "个人邮件": "Προσωπικό email", + "个人短信": "Προσωπικό SMS", + "邮件将从你的个人邮箱发给用户": "Το email θα σταλεί από τον προσωπικό σας λογαριασμό email.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Το μήνυμα SMS θα αποσταλεί από τον προσωπικό σας αριθμό τηλεφώνου.", + "为了更好地应用体验,请确定权限": "Για μια καλύτερη εμπειρία εφαρμογής, επιβεβαιώστε τις άδειες", + "您第一次拒绝权限,请确定权限": "Αρνήσατε την άδεια για πρώτη φορά, παρακαλώ επιβεβαιώστε την άδεια.", + "您第二次拒绝权限,请去应用设置开启权限": "Αρνήσατε την άδεια για δεύτερη φορά, παρακαλώ πηγαίνετε στις ρυθμίσεις εφαρμογής για να ενεργοποιήσετε την άδεια", + "去应用市场": "Μετάβαση στο κατάστημα εφαρμογής", + "温馨提示": "Ζεστή έμφαση", + "关闭应用": "Κλείσιμο της εφαρμογής", + "开启微信接收报警消息需要先关注": "Για να ανοίξετε το WeChat για να λαμβάνετε μηνύματα συναγερμού, πρέπει να ακολουθήσετε.", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat δημόσιο λογαριασμό, αποθήκευση του κωδικού QR και χρησιμοποιήστε το WeChat για να σαρώσετε τις ρυθμίσεις", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Η ταυτοποίηση του πραγματικού ονόματος είναι μια πληρωμένη λειτουργία, παρακαλώ επικοινωνήστε με τον διαχειριστή κλειδαριών για να αγοράσετε και να χρησιμοποιήσετε τη χρήση σας.", + "位置权限": "Άδεια τοποθεσίας", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Παρακαλώ χορηγήστε την Εφαρμογή για να χρησιμοποιήσετε το locatian σας.Το χρησιμοποιείται για να σαρώσετε κλειδαριές BLE και πύλες.", + "相机/相册权限": "Άδεια φωτογραφικής μηχανής/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Παρακαλώ χορηγήστε την εφαρμογή για να διαβάσετε και να γράψετε φωτογραφίες και αρχεία από την αποθήκευση.", + "点击选择": "Κάντε κλικ για επιλογή", + "微信": "WeChat", + "朋友圈": "Στιγμές", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "Γουίβο", + "FaceBook": "Βιβλίο Facebook", + "链接": "Δεσμός", + "今天": "Σήμερα", + "密码错误": "Μη έγκυρος κωδικός πρόσβασης", + "网络中断": "Διακοπή δικτύου", + "钥匙不存在": "Το κλειδί δεν υπάρχει.", + "钥匙过期": "Το κλειδί έληξε.", + "钥匙已存在": "Το κλειδί υπάρχει ήδη", + "密码失效": "Μη έγκυρος κωδικός πρόσβασης", + "门锁时间异常": "Μη φυσιολογικό χρόνο κλειδώματος πόρτας", + "APP(手机)未联网": "APP (κινητό τηλέφωνο) δεν είναι συνδεδεμένο με το Διαδίκτυο", + "数据不存在": "Δεδομένα δεν υπάρχουν.", + "待接收": "Δεχθείτε.", + "已冻结": "Κατεψυγμένα", + "已删除": "Διαγράφεται", + "未知": "Άγνωστο", + "拖动下方滑块完成拼图": "Σύρετε το κύλιση στη σωστή θέση", + "验证成功": "Επιτυχία επαλήθευσης", + "验证失败": "Η επαλήθευση απέτυχε", + "向右拖动滑块填充拼图": "Σύρετε το κύλιση προς τα δεξιά για να γεμίσετε το παζλ", + "请先获取到位置信息哦": "Παρακαλώ πάρτε πρώτα τις πληροφορίες τοποθεσίας", + "请选择国家": "Παρακαλώ επιλέξτε μια χώρα", + "获取锁信息": "Λήψη πληροφοριών κλειδαριά", + "锁数据异常,请重试": "Τα δεδομένα κλειδώματος είναι μη φυσιολογικά, παρακαλώ δοκιμάστε ξανά.", + "连接设备中...": "Συσκευή σύνδεσης...", + "把锁": "Κλειδαριά", + "条": "Ταινία", + "封": "Σφράγιση", + "次": "Φορές", + "支付成功": "Επιτυχία πληρωμής", + "查看详情": "Προβολή λεπτομέρειες", + "请输入模板名称": "Παρακαλώ εισάγετε όνομα προτύπου", + "模版类型": "Τύπος", + "再返回一次退出": "Έξοδος ξανά", + "请先添加锁": "Προσθέστε την κλειδαριά πρώτα.", + "可视对讲": "Οπτική ενδοεπικοινωνία", + "详细日志": "Λεπτομερές καταγραφές", + "已复制到剪切板": "Αντιγραφή", + "拍照": "Φωτογραφία", + "从相册选择": "Επιλέξτε από άλμπουμ", + "选择问题": "Παρακαλώ Επιλέξτε μια ερώτηση", + "确认长度不足8位": "Επιβεβαίωση μήκους κάτω από 8 ψηφία", + "新密码长度不足8位": "Μήκος νέου κωδικού πρόσβασης", + "两次密码不一致": "Καθαρό κωδικό πρόσβασης.Παρακαλώ δοκιμάστε ξανά", + "请点击获取验证码,验证码将发送到": "Παρακαλώ λάβετε έναν κωδικό επαλήθευσης.", + "切换": "Εναλλαγή", + "验证": "Επαλήθευση", + "验证成功,账号已删除": "Επιτυχής επαλήθευση, διαγραφές", + "该密码不是自定义密码,无法修改": "Ο κωδικός πρόσβασης δεν είναι προσαρμοσμένος κωδικός πρόσβασης και δεν μπορεί να τροποποιηθεί", + "请选择设备要关联哪些姓名": "Παρακαλώ επιλέξτε με ποια ονόματα πρέπει να συσχετιστεί η συσκευή", + "请选择姓名要关联哪些设备": "Παρακαλώ επιλέξτε με ποιες συσκευές πρέπει να συσχετιστεί το όνομα με το όνομα.", + "确定要移除所选中的坏锁吗?": "Να αφαιρέσουμε τη δυσλειτουργία;", + "邮件通知": "Ειδοποίηση μέσω email", + "短信通知": "Ειδοποίηση μέσω SMS", + "您好,您的授权管理员生成成功": "Γεια σας, ο εξουσιοδοτημένος διαχειριστής σας δημιουργήθηκε με επιτυχία", + "请输入接收者姓名": "Παρακαλώ εισάγετε εδώ.", + "版本更新": "Ενημέρωση έκδοσης", + "下次再说": "Την επόμενη φορά.", + "配网成功": "Επιτυχία διανομής δικτύου", + "配网失败": "Η διανομή δικτύου απέτυχε", + "该锁的无线键盘都将被删除": "Όλα τα ασύρματα", + "实时画面": "Εικόνα σε πραγματικό χρόνο.", + "适合门口较为安全的环境。": "Κατάλληλο για σχετικά ασφαλή περιβάλλοντα στην πόρτα.", + "仅发生特定事件才录像,并可查看实时画面。": "Καταγράφονται μόνο συγκεκριμένα γεγονότα και η εικόνα σε πραγματικό χρόνο μπορεί να δει.", + "一般情况下,满电可使用7-8个月": "Υπό κανονικές συνθήκες, μπορεί να χρησιμοποιηθεί για 7-8 μήνες όταν φόρτιζε πλήρως.", + "有人逗留或发生特定事件才录像,可随时查看": "Κάποιος μένει ή ηχογραφούνται συγκεκριμένα γεγονότα, και μπορούν να δουν ανά πάσα στιγμή.", + "实时画面。": "Φωτογραφία σε πραγματικό χρόνο.", + "一般情况下,满电可使用5~6个月。": "Υπό κανονικές συνθήκες, μπορεί να χρησιμοποιηθεί για 5 ~ 6 μήνες όταν φορτιστεί πλήρως.", + "适合门口人员复杂、较不安全的环境。": "Κατάλληλο για περίπλοκα και σχετικά μη ασφαλή περιβάλλοντα στην πόρτα.", + "有人出现就录像,可随时查看实时画面。": "Καταγράψτε όταν εμφανίζεται κάποιος, και δείτε την εικόνα σε πραγματικό χρόνο ανά πάσα στιγμή.", + "一般情况下,满电可使用2~4个月。": "Υπό κανονικές συνθήκες, μπορεί να χρησιμοποιηθεί για 2~4 μήνες όταν φορτιστεί πλήρως.", + "根据您家门口实际情况设置录像和实时画面功能。": "Ρυθμίστε το βίντεο και τις λειτουργίες εικόνας σε πραγματικό χρόνο σύμφωνα με την πραγματική κατάσταση στην πόρτα σας.", + "可使用时长由具体设置决定。": "Η διάρκεια της χρήσης καθορίζεται από τις συγκεκριμένες ρυθμίσεις.", + "查看": "Προβολή", + "有人按门铃或发生": "Κάποιος χτυπάει το κουδούνι.", + "异常事件时": "Μη φυσιολογικό συμβάν", + "不录像": "Κανένα βίντεο", + "有人出现、按门铃": "Κάποιος εμφανίζεται, χτυπάει το κουδούνι της πόρτας.", + "或发生异常事件时": "Ή ένα μη φυσιολογικό συμβάν", + "逗留达到10秒": "Μείνετε για 10 δευτερόλεπτα", + "约1.5米": "Περίπου 1,5 μέτρα", + "随时": "Όποτε θες.", + "立即录像": "Καταγραφή αμέσως.", + "录像时机": "Χρονισμός βίντεο", + "有人出现时录像": "Καταγράψτε όταν εμφανιστεί κάποιος", + "人体侦测距离": "Απόσταση ανίχνευσης ανθρώπων", + "查看实时画面": "Προβολή εικόνας σε πραγματικό χρόνου", + "自定义时间": "Προσαρμοσμένος χρόνος", + "当日": "Σήμερα", + "次日": "Την επόμενη μέρα.", + "自定义时段": "Προσαρμοσμένη χρονική περίοδος", + "发生事件时查看": "Προβολή πότε ένα γεγονότο", + "实时查看": "Προβολή πραγματικού χρόνου", + "有人在门口出现10秒后开始录像。": "Κάποιος εμφανίζεται στην πόρτα για 10 δευτερόλεπτα πριν την καταγραφή.", + "有人按门铃时立即录像。": "Κατέγραψε αμέσως όταν κάποιος χτυπήσει το κουδούνι.", + "有人出现在门前1.5米范围时启动录像": "Ξεκινήστε την καταγραφή όταν κάποιος εμφανίζεται σε απόσταση 1,5 μέτρων μπροστά από την πόρτα.", + "约0.8米": "Περίπου 0,8 μέτρα", + "约3.0米": "Περίπου 3,0 μέτρα", + "添加指纹失败": "Η λειτουργία απέτυχε.", + "项": "Στοιχεία", + "播放中": "Παιχνίδια", + "下载": "Λήψης", + "暂无下载内容": "Χωρίς περιεχόμενο λήψης", + "亮度": "Φωτεινότητα", + "音量": "Τόμος", + "快进至": "Γρήγορα προς τα εμπρός", + "快退至": "Γύρισμα πίσω", + "暂无视频信息": "Χωρίς πληροφορίες βίντεο", + "加载出错": "Σφάλμα φόρτωσης", + "请单人正对门锁,距离一个成年人手臂长度": "Παρακαλώ στάσου μπροστά από την κλειδαριά της πόρτας, στο μήκος ενός χεριού.", + "(约0.6米)。": "(Περίπου 0,6 μέτρα)", + "保持脸部无遮挡,露出五官。": "Κρατήστε το πρόσωπό σας χωρίς εμπόδιο και δείξτε τα χαρακτηριστικά του προσώπου σας.", + "准备好了,开始添加": "Έτοιμοι, ξεκίνα.", + "正在录入中...": "Καταγραφή...", + "添加人脸失败": "Αποτυχία προσθήκης πρόσωπου", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, τα πρόσωπα της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;", + "人脸号": "Αριθμός προσώπως", + "虹膜详情": "Λεπτομέρειες Ίρις", + "虹膜号": "Αριθμός Ιρίδας", + "选择设备类型": "Επιλογή τύπου συσκευής", + "照明灯具": "Συσκευές φωτισμού", + "电动窗帘": "Ηλεκτρικές κουρτίνες", + "门窗传感器": "Αισθητήρας πόρτας και παραθύρου", + "传感器": "Αισθητήρα", + "清除数据成功": "Εκκαθάριση δεδομένων με επιτυχία", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Η κλειδαριά δεν είναι συνδεδεμένη με το ίντερνετ, οπότε τα αναγνωριστικά του κωδικού, κάρτα, δαχτυλίδια, και άλλες μέθοδοι ανοίγματος πόρτας δεν μπορούν να μεταφορτωθούν σε πραγματικό χρόνο.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Αν θέλετε να κρατήσετε τα ιστορικά αρχεία, μπορείτε να τα εξάγετε.", + "看不到操作记录,可能原因有": "Δεν μπορώ να δω τα αρχεία λειτουργίας, πιθανοί λόγοι.", + "操作记录详情": "Λεπτομέρειες αρχείου λειτουργίας", + "操作时间": "Χρόνος λειτουργίας", + "此模块功能需要锁联网后设置方可生效": "Αυτή η λειτουργία ενότητας πρέπει να ρυθμιστεί αφού η κλειδαριά είναι συνδεδεμένη με το Διαδίκτυο για να τεθεί σε ισχύ σε ισχύ η κλειδαριά", + "用户已存在": "Ο χρήστης υπάρχει ήδη", + "钥匙数量已到上限": "Ο αριθμός των πλήκτρων έχει φτάσει στο ανώτερο όριο", + "附近没有可用网关": "Δεν υπάρχει διαθέσιμη πύλη κοντά", + "正在创建安全连接...": "Δημιουργία μιας ασφαλής σύνδεσης...", + "监视状态下不能发送录音": "Αδυναμία αποστολής εγγραφών σε λειτουργία παρακολούθησης", + "挂断": "Κλείσε το τηλέφωνο.", + "监视中暂不能开锁": "Η ξεκλείδωση δεν είναι διαθέσιμη κατά την παρακολούθηση", + "长按说话": "Πιέστε και κρατήστε να μιλήσετε.", + "松开发送": "Αποστολής", + "请输入6位数字开锁密码": "Παρακαλώ εισάγετε έναν 6-ψήφιο κωδικό ξεκλειδώματος πρόσβασης", + "请输入开锁密码": "Παρακαλώ εισάγετε τον κωδικό πρόσβασης ξεκλείδωμας", + "接收者在有效期内可以不限次数使用": "Οι παραλήπτες μπορούν να χρησιμοποιήσουν τα EEY για απεριόριστους χρόνους εντός της περιόδου ισχύος.", + "接收者可以使用此App开关锁": "Ο παραλήπτης είναι σε θέση να κλειδώσει / Ξεκλειδώσει με αυτή την εφαρμογή.", + "单次钥匙有效期为1小时,只能使用一次": "Η μία φορά ekey ισχύει για μία ώρα και μπορεί να χρησιμοποιηθεί μόνο ΕΝΑ.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Οι παραλήπτες μπορούν να χρησιμοποιήσουν τα EEYs για απεριόριστους χρόνους εντός του καθορισμένου χρόνου κύκλου.", + "获取模板失败": "Αποτυχία λήψης του προτύπου", + "微信通知": "Ειδοποίηση WeChat", + "系统短信": "Συστήματος SMS", + "系统邮件": "Συστήματος", + "模板": "Πρότυπο", + "新建模版": "Δημιουργία πρότυπου", + "您好,您的密码是": "Γεια σας, ο κωδικός σας είναι.", + "密码名字": "Όνομα κωδικού πρόσβασης", + "请输入6-9位密码": "Παρακαλώ εισάγετε έναν κωδικό πρόσβασης 6-9 ψηφίου", + "设置密码": "Ορισμός κωδικού πρόσβασης", + "操作成功,密码为": "Ο κωδικός πρόσβασης είναι επιτυχής.", + "类型:自定义-永久": "Τύπος:Προσαρμοσμένο-Μόνιμο", + "实时播放": "Αναπαραγωγή πραγματικού χρόνου", + "点击对讲": "Κάντε κλικ για ενδοεπικοινωνία", + "长按开锁": "Μεγάλη πίεση για ξεκλείδωση", + "接听失败": "Αποτυχία απάντησης", + "请在锁设置中开启远程开锁": "Παρακαλώ ενεργοποιήστε την απομακρυσμένη ξεκλείδωση", + "接听": "Απάντηση", + "截图已保存到相册": "Στιγμιότυπο οθόνης αποθηκεύτηκε στο άλμπουμ", + "添加遥控": "Προσθήκη απομακρυσμένου ελέγχους", + "已连接到锁,请按遥控": "Συνδεδεμένο με την κλειδαριά, παρακαλώ πατήστε το τηλεχειριστήριο.", + "遥控号": "Αριθμός τηλεχειριστηρίου", + "遥控详情": "Λεπτομέρειες τηλεχειριστηρίου", + "照明": "Φωτισμός", + "退出演示模式": "Έξοδος λειτουργίας demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Συμβουλή: Η τρέχουσα διεπαφή είναι μια διεπαφή οθόνης. Μετά την προσθήκη της συσκευής, μπορείτε να συνεχίσετε να τη χρησιμοποιήτε.", + "门已上锁": "Η πόρτα είναι κλειδωμένη.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Ο λογαριασμός σας χρησιμοποιήθηκε για τη σύνδεση από μια νέα συσκευή", + "开门成功": "Άνοιξε την πόρτα επιτυχώς.", + "开门失败": "Αποτυχία ανοίγματος της πόρτας", + "呼叫提醒": "Υπενθύμιση κλήσης", + "收到来自": "Ελήφθη από την ημερομηνία", + "锁的呼叫": "Κλείδωση", + "加载数据中": "Φόρτωση δεδομένων", + "搜索所有锁类型": "Αναζήτηση όλων των τύπων κλειδαριών", + "锁电量更新时间": "Ώρα ενημέρωσης της μπαταρίας", + "1月": "Ιαν.", + "2月": "Φεβρουαρία", + "3月": "Μαρτ", + "4月": "Απρ.", + "5月": "Μάιος", + "6月": "Τζουν.", + "7月": "Ιουλ.", + "8月": "Αυγ.", + "9月": "Σεπτεμβ", + "10月": "Οκτ.", + "11月": "Νοεμβ", + "12月": "Δεκ", + "热门城市": "Καυτές πόλεις", + "导出锁数据": "Εξαγωγή δεδομένων κλειδαριάς", + "一键开锁": "Ξεκλείδωμα ενός κλικ", + "已开通": "Άνοιγμα", + "编辑员工": "Επεξεργασία προσωπικού", + "一": "Ένας", + "二": "Δύο", + "三": "Τρία", + "四": "Τέσσερα", + "五": "Πέντε.", + "六": "Έξι.", + "日": "Ήλιο", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;", + "在线": "Σε απευθείας σύνδεση", + "离线": "Εκτός σύνδεσης:", + "购买记录": "Αρχείο αγοράς", + "使用记录": "Καταγραφή χρήστη", + "失效时间要大于当前时间": "Ο χρόνος λήξης πρέπει να είναι μεγαλύτερος από την τρέχουσα ώρα.", + "修改名字": "Επεξεργασία όνομας", + "时": "Ώρα", + "分": "Λεπτό", + "Amazon Alexa": "Αμαζόνιο Αλέξα", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Μπορείτε να χρησιμοποιήσετε Alexa για να ξεκλειδώσετε, να κλειδώσετε και να ελέγξετε την κατάσταση κλειδαριάς", + "支持的国家": "Υποστηριζόμενες χώρες", + "支持的国家值": "ΗΠΑ, Καναδάς, Ηνωμένο Βασίλειο, Αυστραλία, Ινδία, Γερμανία, Γαλλία, Ιταλία, Ισπανία, Ιαπωνία", + "操作流程": "Διαδικασία λειτουργίας", + "操作流程值": "1 Προσθέστε μια κλειδαριά και πύλη με την Smart κλειδαριά APP\n\n2 Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στο APP (αυτή η συνάρτηση είναι απενεργοποιημένη από προεπιλογή). Αν δεν έχετε αυτή την επιλογή, η κλειδαριά δεν υποστηρίζει Alexa\n\n3 Προσθέστε τις δεξιότητες στην Alexa και να τις εξουσιοδοτήσετε με το λογαριασμό και τον κωδικό πρόσβασης Smart. Μετά την επιτυχία της εξουσιοδότησης, μπορείτε να ανακαλύψετε συσκευές κάτω από τον λογαριασμό\n\n4 Εντοπίστε την κλειδαριά στην εφαρμογή Alexa, ενεργοποιήστε τη λειτουργία φωνής ξεκλειδώματος, και να ορίσετε τον κωδικό πρόσβασης γλώσσας\n\n5 Η κλειδαριά μπορεί να λειτουργήσει μέσω Alexa", + "Google Home": "Σπίτι του GoogleName", + "Action name": "Όνομα ενέργειας", + "ScienerSmart": "ΕπιστήμοναςSmart", + "支持的语言": "Υποστηριζόμενες γλώσσες", + "英语": "Αγγλική", + "Google Home操作流程的值": "1. Χρησιμοποιήστε το Smart Lock APP για να προσθέσετε κλειδαριές και πύλες\n\n2. Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στο APP (αυτή η λειτουργία είναι απενεργοποιημένη από προεπιλογή). Χωρίς αυτή την επιλογή, η κλειδαριά δεν υποστηρίζει το Google HomeName\n\n3. Εγκαταστήστε το Google Home APP και κάντε κλικ στο \" \" πλήκτρο στην επάνω αριστερή γωνία\n\n4. Στη σελίδα Ρυθμίσεις, επιλέξτε \"Εργασία με Google\"\n\n5. Αναζητήστε το \"ScienerSmart\" και να χρησιμοποιήσετε τον έξυπνο λογαριασμό και τον κωδικό πρόσβασης για να εξουσιοδοτήσει", + "密码需至少包含数字/字母/字符中的2种组合": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 2 από τα ακόλουθα: αριθμούς, γράμματα και ειδικούς χαρακτήρες.", + "已开锁": "Ξεκλείδωμα", + "已闭锁": "Κλειδωμένο", + "两次密码不一致哦": "Οι κωδικοί πρόσβασης δεν είναι συνεπείς.", + "中功率": "Μέση ισχύς", + "常规使用": "Κανονική χρήση:", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Αφού ενεργοποιηθεί η πύλη, πατήστε και κρατήστε το κουμπί επαναφοράς για 5 δευτερόλεπτα, και κάντε κλικ Next όταν το φως δείκτη αναβοσβήνει εναλλάξα", + "扫描设备": "Συσκευή σάρωσης", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Η διαγραφή απέτυχε. Η πύλη μπορεί να έχει εκτός λειτουργίας. Θέλετε να αναγκάσετε τη διαγραφή των δεδομένων;", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_en.json b/lan/lan_en.json old mode 100755 new mode 100644 index 8b18d1b4..2bc8eeaf --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1,923 +1,1125 @@ -{ - "星锁": "Star Lock", - "锁通通": "Lock Through", - "点击开锁,长按闭锁": "Click To Unlock And Hold Down to Close", - "考勤": "Check In", - "考勤设置": "Check In Settings", - "电子钥匙": "eKeys", - "添加卡": "Add Card", - "卡号": "Card Number", - "添加指纹": "Add Fingerprint", - "指纹号": "Fingerprint Number", - "遥控": "Remote Control", - "添加人脸": "添加人脸", - "门锁日志": "Door lock log", - "密码号": "Password Number", - "添加者": "Adder", - "添加时间": "Add Time", - "重置": "Reset", - "请输入手机号或者邮箱": "Please enter the number or email", - "工作时间": "Working Time", - "工作日设置": "Workday Settings", - "星期一": "Monday", - "星期二": "Tuesday", - "星期三": "Wednesday", - "星期四": "Thursday", - "星期五": "Friday", - "星期六": "Saturday", - "星期日": "Sunday", - - "简写周一": "M", - "简写周二": "T", - "简写周三": "W", - "简写周四": "T", - "简写周五": "F", - "简写周六": "S", - "简写周日": "S", - - "周一": "Mon", - "周二": "Tue", - "周三": "Wed", - "周四": "Thu", - "周五": "Fri", - "周六": "Sat", - "周日": "Sun", - - "群发钥匙": "Send Group Key", - "锁": "Lock", - "请添加": "Please Add", - "允许远程开锁": "Remote Unlocking Allowed", - "请输入验证码": "Please enter the verification code", - "获取密码": "Get Password", - "请给密码命名": "Please Name Your Password", - "密码有限期为6个小时,只能使用一次": "The password is valid for 6 hours and can only be used once", - "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Manually enter 6-9 digits as the password. Can be added by phone Bluetooth next to the lock, or remotely added through the gateway", - "获取": "Get", - "添加": "Add", - "删除公司": "Delete Company", - "密码详情": "Password Detail", - "修改密码": "Modify Password", - "添加虹膜": "Add Iris", - "添加门磁": "Add Door Magnetic", - "添加无线键盘": "Add Wireless Keyboard", - "添加手掌": "Add Palm", - - "accountNumber": "AccountNumber", - "volumeAuthorizationLock": "Volume Authorization Lock", - "authorizedAdminTip": "The authorized administrator has important access to this lock, so make sure you only send it to people you trust", - "lockOperatingRecordTip": "The historical records can be retained only for a certain period of time. If you want to retain historical records, export them in the upper right corner", - "rankingList": "Ranking List", - "earlyArrivalList": "Early Arrival List", - "lateList": "Late List", - "hardWorkingList": "Hard Working List", - "company": "Company", - "staff": "Staff", - "work": "Work", - "workday": "Workday", - "holidays": "Holidays", - "punchingMode": "Punching Mode", - "whetherTheEmployeeHasAKey": "If The Employee Has A Key", - "selectKey": "Select Key", - "officeHours": "Office Hours", - "closingTime": "Closing Time", - "thisWeek": "This Week", - "singleDayWeekend": "Single Day Weekend", - "twoDaysOff": "Two Days Off", - "oddOrEvenDaysOff": "Odd Or Even Days Off", - "year": "Year", - "month": "Month", - "libertyDay": "Liberty Day", - "coverDate": "Cover Date", - "addedHoliday": "Added Holiday", - "startDate": "Start Date", - "accessDate": "Access Date", - "mustFillIn": "Must Fill In", - "endDate": "End Date", - "dailyCharts": "Daily Charts", - "monthlyLeaderboard": "Monthly Leader board", - "noAttendanceRecord": "No Attendance Record", - "attendanceRecord": "Attendance Record", - "everyoneIsVeryMotivated": "Everyone Is Very Motivated", - "workingHoursWereNotReleased": "Working Hours Were Not Released", - "beLate": "Be Late", - "leaveEarly": "Leave Early", - "noCardPunched": "No Card Punched", - "holidayInfo": "Holiday Info", - "basicInformation": "Basic Information", - "wirelessKeyboard": "Wireless Keyboard", - "doorMagnetic": "Door Magnetic", - "remoteUnlocking": "Remote Unlocking", - "automaticBlocking": "Automatic Blocking", - "normallyOpenMode": "Normally Open Mode", - "automaticUnLock": "Automatic UnLock", - "automaticUnLockTip": "After opening, the lock will open automatically at the beginning of the normally open mode", - "lockSound": "Lock Sound", - "burglarAlarm": "Burglar Alarm", - "resetButton": "Reset Button", - "lockTime": "Lock Time", - "diagnose": "Diagnose", - "uploadData": "Upload Data", - "importOtherLockData": "Import Other Lock Data", - "lockEscalation": "Lock Escalation", - "markedHouseState": "Marked House State", - "unlockReminder": "Unlock Reminder", - "unlockQRCode": "Unlock QR Code", - "lockNumber": "Lock Number", - "electricQuantity": "Electric Quantity", - "lockName": "Lock Name", - "lockGrouping": "Lock Grouping", - "selectGroup": "Selective grouping", - "createNewGroup": "Create a new group", - "adminOpenLockPassword": "Admin Open Lock Password", - "update": "Update", - "updateElectricQuantityTip": "The battery information can be updated remotely via the gateway or next to the lock via Bluetooth on the phone\n", - "adminOpenLockPasswordTip": "If you have changed the password on the lock, the actual valid password inside the lock may be different from the one shown here\n", - "updateLockAdminPassword": "Upload the lock administrator password", - "whenScreenFlashesClickNext": "When the screen flashes, click Next", - "theScreenNeverFlickered": "The screen never flickered", - "enterNumberOrPressSet": "Enter *529# or press the Settings key", - "theLocationOfTheSetKeyWillBeDifferent": "The location of the set key will be different", - "pressAndHoldTheResetButtonTwoSeconds": "Press And Hold The Reset Button 2 Seconds", - "nearbyEquipment": "Nearby Equipment", - "noData": "No Data", - "doorMagneticListTopTip": "You can query the open and close status of a door by using the door status sensor. Add a door magnet to each lock", - "remoteUnlockingPageTip": "When enabled, you will be able to open the lock remotely through the gateway. This function can only be turned on and off near the lock via Bluetooth on the phone.", - "currentMode": "Current Mode", - "delayTime": "Delay Time", - "automaticBlockingTip": "After the time set above, the lock will automatically close. After you enable or modify the Settings, open the lock once for the time to take effect.", - "time": "Time", - "normallyOpen": "Normally Open", - "date": "Date", - "begin": "Begin", - "end": "End", - "allDay": "All Day", - "save": "Save", - "normallyOpenModeTip": "During the set normal opening time, the lock will remain open after opening until it is manually closed During the set normal opening time, the lock will remain open after opening until it is manually closed", - "pleaseSelectLockVolume": "Please Select Lock Volume", - "lockSoundTip": "When the function is enabled, you can hear the prompt tone of the smart lock. Including low battery, incorrect password and so on.", - "low": "Low", - "lower": "Lower", - "medium": "Medium", - "high": "High", - "higher": "Higher", - "burglarAlarmTip": "After opening, an alarm sound will be issued when the lock is picked", - "resetButtonTip1": "After opening, you can re-add with APP by long pressing the reset key on the lock.", - "resetButtonTip2": "After closing, the reset key is invalid, and the lock can be re-added only after being deleted by app", - "calibrationTime": "Calibration Time", - "setTheDSTMode": "Set The DST Mode", - "diagnoseTip": "Diagnosis is to read the configuration information inside the lock and upload it so that the staff can analyze the cause of the failure", - "uploading": "Uploading", - "uploadDataTip": "This operation will upload the locked data to the server, which may take several minutes", - "importOtherLockDataTip": "Please select which lock you want to import from", - "haveNewVersion": "Have New Version", - "currentVersion": "Current Version", - "newVersion": "New Version", - "upgrade": "Upgrade", - "leisure": "Leisure", - "checkedIn": "Checked In", - "lanEnglish": "English", - "lanChinese": "Chinese", - "multilingual": "Multilingual", - "addLock": "Add Lock", - "lockAddress": "Lock Address", - "selectLockType": "Select lock type", - "videoIntercomDoorLock": "Video intercom door lock", - "NFCPassiveLock": "NFC Passive Lock", - "addDevice": "Add device", - "gateway": "Gateway", - "message": "Message", - "supportStaff": "Support Staff", - "set": "Setting", - "moreServices": "More Services", - "moreSet": "More Set", - "prompTone": "Promp Tone", - "touchUnlock": "Touch Unlock", - "pushNotification": "Push Notification", - "lockUserManagement": "Lock User Management", - "ownedKey": "Owned key", - "authorityManagement": "Authority management", - "associatedDevice": "Associated device", - "associatedName": "Associated name", - "device": "Device", - "aboutToExpire": "About to expire", - "deAuthorize": "de-authorize", - "changeName": "Change name", - "authorizedAdmin": "Admin", - "addAuthorizedAdmin": "Adding an Authorized Administrator", - "lockGroup": "Lock Group", - "transferSmartLock": "Transfer Smart Lock", - "selectiveLock": "Selective lock", - "recipientInformation": "recipientInformation", - "transferGateway": "Transfer Gateway", - "multiLanguage": "Multi Language", - "lockScreen": "Lock Screen", - "closed": "Closed", - "opened": "Opened", - "close": "Close", - "open": "Open", - "hideInvalidUnlockPermissions": "Hide Invalid Unlock Permissions", - "appUnlockRequiresMobilePhoneAccessToTheLock": "APP Unlock Requires Phone Access To Lock", - "valueAddedServices": "Value Added Services", - "about": "About", - "userAgreement": "User Agreement", - "privacyPolicy": "Privacy Policy", - "personalInformationCollectionList": "Personal Information Collection List", - "applicationPermissionDescription": "Application Permission Description", - "thirdPartyInformationSharingList": "Third party information sharing list", - "logout": "Logout", - "deleteAccount": "Delete Account", - "personalInformation": "Personal Information", - "avatar": "Avatar", - "nickName": "NickName", - "changeNickName": "Change NickName", - "modifyAccount": "Modify Account", - "重置密码": "Reset Passwords", - "safetyProblem": "Safety Problem", - "modifyAccountTip": "For the security of your account, please use the account password verification before modifying the account", - "pleaseEnterAccountNumber": "Please enter your account number", - "pleaseEnterNewAccountNumber": "Please enter your new account number", - "changeIphoneTip": "When you retrieve your password and log in to a new device, you can verify it with the attached phone", - "changeEmailTip": "When you retrieve your password and log in to a new device, you can verify it with the attached Email", - "goBind": "Go Bind", - "originalPassword": "Original Password", - "newPassword": "New Password", - "确认密码": "Sure Password", - "safetyProblemTip": "When you lose your phone, you can log in to the new device by answering the security questions you set", - "problemOne": "Problem One", - "problemTwo": "Problem Two", - "problemThree": "Problem Three", - "pleaseEnterYourAnswer": "Please Enter Your Answer", - "designation": "designation", - "state": "State", - "wifiName": "Wifi Name", - "networkMAC": "Network MAC", - "gatewayUpgrade": "Gateway Upgrade", - "gatewayConnectionLock": "Gateway Connection Lock", - "strongSignal": "Strong Signal", - "mediumSignal": "Medium Signal", - "averageSignal": "Average Signal", - "weakSignal": "Weak Signal", - "selectGatewayType": "Select Gateway Type", - "addGateway": "Add Gateway", - "turnThePowerBackOn": "Turn The Power Back On", - "indicatorLight": "Indicator Light", - "selectGatewayTypeNextTip": "Repower the gateway and click Next when the indicator light flashes alternately", - "selectGateway": "Select Gateway", - "gatewayConfigurationWifiTip": "5G WiFi network is not supported, please choose 2.4G WiFi network for configuration", - "wifiPassward": "WiFi Passward", - "pleaseEnterTheWiFiPassword": "Please Enter The WiFi Password", - "gatewayName": "Gateway Name", - "pleaseEnterGatewayName": "Please Enter Gateway Name", - "wifiMAC": "WiFi MAC", - "ipAddress": "IP Address", - "subnetMask": "Subnet Mask", - "defaultGateway": "Default Gateway", - "automaticallyGetTheDNSServerAddress": "Automatically Get The DNS Server Address", - "preferredDNS": "Preferred DNS", - "alternativeDNS": "Alternative DNS", - "noStaticIPIsUsed": "No Static IP Is Used", - "allLock": "All Lock", - "searchAllLockType": "Search All Lock Type", - "doorLock": "Door Lock", - "padlock": "Pad lock", - "safeLock": "Safe Lock", - "intelligentLockCore": "Intelligent Lock Core", - "itelligentAccessControl": "Intelligent access control", - "parkingLock": "Parking Lock", - "bicycleLock": "Bicycle Lock", - "longRangeControl": "LongRange Control", - "lightTouchScreen": "Light Touch Screen", - "lightTouchScreenTip": "Light Touch Screen Tip", - "next": "Next", - "nearbyLock": "Nearby Lock", - "addSuccessfullyPleaseRename": "If you want to change the name, please rename, click OK to add lock", - "whenAddingLockThePhoneMustBeNextToTheLock": "When adding a lock, the phone must be next to the lock", - "login": "Login", - "register": "Register", - "forgetPassword": "Forget Password", - "readAndAgree": "I Have Read And Agree", - "verificationCode": "VerificationCode", - "registerPasswordTip": "The password must be 8-20 characters, including at least 2 of the numbers/letters/symbols", - "iphone": "Iphone", - "email": "Email", - "mobileNumber": "Mobile phone number", - "countryAndRegion": "Country And Region", - "select": "Select", - "getVerificationCode": "Get Verification Code", - "businessCooperation": "Business Cooperation", - "officialWebsite": "Official Website", - "computerWebVersion": "Computer Web Version", - "hotelSystem": "Hotel System", - "manualWebVersion": "Manual Web Version", - "introduce": "Introduce", - "note": "Note", - "mail": "Mail", - "advancedFunction": "Advanced Function", - "pushMessage": "Push Message", - "recordsRetention": "Records Retention", - "smsBuyTip": "You can send the password and electronic key information to the recipient via SMS.", - "emailBuyTip": "You can send the password and electronic key information to the recipient by email.", - "currentRemainingQuantity": "Current Remaining Quantity", - "buy": "Buy", - "customSMSTemplate": "Custom SMS Template", - "customMailTemplate": "Custom Mail Template", - "record": "Record", - "forTheFirstTime": "For the first time", - "onceDay": "once a day", - "weekOnce": "once a week", - "monthOnce": "once every month", - "currentState": "Current State", - "onTrial": "On Trial", - "haveNotOpened": "Have Not Opened", - "advancedFeaturesAndBenefitsContent": "Advanced Features And Benefits Content", - "smsTemplate": "SMS Template", - "emailTemplate": "Email Template", - "cardIssuingtool": "Card Issuing tool", - "titleForBuyingAdvancedFeatures": "Tips for buying advanced features", - "tipsForBuyingAdvancedFeatures": "More advanced features are under development, and if you need them, you are welcome to open the service based on the number of locks. Advanced features are only available for your own locks. If you are an authorized administrator, please contact the top administrator of the lock to open the service", - "freeTrial": "Free Trial", - "openNow": "Open Now", - "buySMS": "Buy SMS", - "buyMail": "Buy Mail", - "buyRealNameAuthenticationTimes": "Purchase Real Name Authentication Times", - "enablingAdvancedFeatures": "Enabling Advanced Features", - "chooseAPackage": "Choose A Package", - "modeOfPayment": "Mode Of Payment", - "alipay": "Alipay", - "goToPay": "Go To Pay", - "customTemplatesTip": "You can define the content of your own template for sending passwords or electronic key information to others", - "haveOpened": "Have Opened", - "unHaveOpenedTip1": "This function is an advanced function, please open it before using", - "unHaveOpenedTip2": "Advanced features are only available for your own locks", - "freeTrialKeywords": "Free Trial", - "goToTheOpen": "Go to the open", - "creatingANewTemplate": "Creating a new template", - "type": "Type", - "templateContent": "Template Content", - "preview": "Preview", - "hello": "Hello", - "yourRoomIs": "Your room is", - "roomName": "Room Name", - "theCodeToOpenTheDoorIs": "The code to open the door is", - "templateTip1": "After entering the password, please press the # key or other unlocking key to end. The password must be used at least once within 24 hours of being valid, otherwise it will be invalid", - "templateTip2": "You have received an electronic key, please use the applet to open the door.", - "templateTip3": "Or install an App to open the door。", - "expectedNotoCount": "The number of short creeds is expected to be generated", - "templateTip4": "Tip: When sending messages to other people, be critical", - "and": "And", - "willBeReplacedWithTheActualValue": "Will be replaced with the actual value", - "downloadLink": "Download Link", - "lockScreenTip": "After the function is enabled, you need to use your fingerprint, face or account password to open the APP. There is no need to verify again for 3 minutes", - "hideInvalidUnlockPermissionsTip": "After the function is enabled, the password, electronic key, card, fingerprint and other unlocking permissions that have been invalid for a long time will be hidden and not displayed in the list.", - "appUnlockRequiresMobilePhoneAccessToTheLockTip": "For the selected locks, when the user uses the APP to unlock the lock, his phone needs to be connected to the Internet, otherwise the lock cannot be unlocked", - "checkAll": "Check All", - "wifiDistributionNetwork": "WiFi Distribution Network", - "configuringWiFi": "Configuring WiFi", - "pleaseEnterWifiName": "Please Enter Wifi Name", - "wifiPwd": "WiFi password", - "pleaseEnterWifiPwd": "Please Enter WiFi Password", - "edit": "Edit", - "stressFingerprint": "Stress Fingerprint", - "effectiveDay": "Effective Day", - "stressCard": "Stress Card", - "stressPassword": "Stress Password", - "whetherTheEmployeeHasPassword": "If The Employee Has A Password", - "whetherTheEmployeeHasCard": "If The Employee Has A Card", - "whetherTheEmployeeHasFingerprint": "If The Employee Has A Fingerprint", - "selectPassword": "Select Password", - "selectCard": "Select Card", - "selectFingerprint": "Select Fingerprint", - "getKey": "Get Key", - "getCard": "Get Card", - "getFingerprint": "Get Fingerprint", - "safeVerify": "Security verification", - "deleteAccountTips": "After deleting the account, all your information and related records will be completely deleted from the platform, and can not be recovered, delete or not", - "humanFace": "HmFace", - "monitoring": "Monitoring", - "videoLog": "Video Log", - "messageReminding": "Notice", - "superAdmin": "Super Admin", - "normalUser": "Normal User", - "gatewayDevice": "Gateway Device", - "illumination": "Illumination", - "doorOpener": "Door Opener", - "faceUnlocks": "Face Unlocks", - "catEyeSet": "Cat Eye Set", - "openingDirectionSet": "Opening Direction Set", - "motorPowerSetting": "MotorPower Setting", - "bluetoothBroadcast": "Bluetooth Broadcast", - "whetherInternetRequiredWhenUnlocking": "If Internet Is Required When Unlocking", - "selectTheLockToJoinTheGroup": "Select the lock to join the group", - "lockTrCount": "Lock Count", - "xiaomiIOTPlatform": "Xiaomi IOT Platform", - "connectBlueErrorTip": "Not connected to the device, make sure that in the vicinity of the device, the device is not connected and the device is turned on", - "pleaseEnterAGroupName": "Please enter a group name", - "hint": "Hint", - "areYouSureYouWantToDeleteIt": "Are you sure you want to delete it?", - "faceUnlocksSet": "Face Unlocks Set", - "automaticBrighteningScreen": "Automatic brightening screen", - "sensingDistance": "Sensing distance", - "sensingDistanceTip": "When someone is sensed about 1.5 meters in front of the door, facial recognition will automatically start to unlock.", - "preventWrongOpening": "Prevent wrong opening", - "preventWrongOpeningTip": "Prevent misopening has been closed, after closing the door can still use face unlock", - "remote": "Remote", - "closeRange": "Close Range", - "addAndUseFaceWhenUnlocking": "Add and use face when unlocking", - "addAndUseFaceWhenUnlockingTip": "\n1, please try to keep a single person in front of the door operation; \n2, please stand in front of the door lock about 0.5~0.8 meters, facing the door lock; \n3. Please keep your face unobstructed and expose your facial features; \n4. When face recognition is abnormal, you can touch any key on the digital keyboard to restart face recognition manually.", - "second": "S", - "motorPowerSettingTip": "Please choose the motor power carefully according to the actual situation of the door lock:", - "miniwatt": "miniwatt:", - "miniwattTip": "Less power consumption", - "highPower": "high-power:", - "highPowerTip": "If the lock tongue can not be retracted normally when unlocking, or need to be driven \nHeaven and earth hook, it is recommended to choose high power. At this point, the power consumption will be \nIncrease.", - "openingDirectionSetTip": "Please carefully choose the direction to open the door of your home (if you choose the wrong direction, you will not be able to open and close the door properly) :", - "openLeft": "Open Left", - "openRight": "Open Right", - "judgmentMethod": "Judgment Method:\n", - "judgmentMethodContent": "The man stood outside the house, facing the entrance door. \nIf the hinge or shaft of the door is on the left, the door is left open; \nA door is right-open if its hinge or shaft is on the right. \nIf the setting is wrong, it will not open and close the door properly. \nRecommended to be operated by installation or maintenance personnel.", - "customMode": "Custom mode", - "videoSlot": "Video slot", - - "密码": "Password", - "卡": "Card", - "指纹": "Finger", - "人脸": "Face", - "配件商城": "Lock Mall", - "公司名称": "Company Name", - "修改公司名字": "Change company name", - "请输入公司名字": "Please nter the company name", - "提示": "Hint", - "是否删除?": "Whether to delete?", - "员工信息": "Staff's Information", - "员工": "Staff", - "打卡方式无效": "The clocking method is invalid", - "中国": "China", - "选择钥匙": "Select the key", - "编辑": "Edit", - "无": "Unhave", - "有": "have", - "请输入姓名": "Please enter name", - "获取人脸": "Getting faces", - "选择密码": "Choosing a password", - "选择卡": "Select card", - "选择指纹": "Select fingerprint", - "选择人脸": "Select face", - "员工是否有人脸": "Whether the employee has a face", - "同时删除员工钥匙": "Also delete the employee key", - "删除": "Delet", - "确定要删除员工吗?": "Are you sure you want to delete the employee?", - "月统计": "Monthly statistics", - "迟到": "Be late", - "早退": "Leave early", - "未打卡": "No card punched", - "钥匙将在": "The key will be in", - "天后失效": "Days later invalid", - "电量更新时间:": "Power update time:", - "新增配件": "Add", - "钥匙不可用": "Key is not available", - "正在开锁中...": "Unlocking...", - "你的钥匙": "Your key", - "常开模式启动!长按闭锁": "Open mode started! Long press to lock", - "演示模式": "Demo mode", - "请先同意用户协议及隐私政策": "Please agree to the user agreement and privacy policy first", - "用户协议": "User agreement", - "隐私政策": "Privacy policy", - "注册成功": "Registration success", - "你所在的": "You are in", - "手机号": "Mobile phone number", - "忘记密码": "Forget password", - "重置成功": "Reset success", - "确定要退出吗?": "Are you sure you want to exit?", - "功能暂未开放": "Function is not yet open", - "设置成功": "Set up successfully", - "删除成功": "Delete successfully", - "单次": "Once", - "永久": "Permanent", - "限时": "Time limit", - "自定义": "Custom", - "清空码": "Clear code", - "循环": "Cycle", - "工作日": "Workday", - "每日": "Daily", - "周末": "Weekend", - - "确定要删除吗?": "Are you sure you want to delete?", - "该锁的密码都将被删除": "The password of the lock will be deleted", - "已过期": "Expired", - "该锁的电子钥匙都将被删除": "The electronic key of the lock will be deleted", - "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Also delete all the keys sent by it, the key can not be restored after deletion", - "删除钥匙会在用户APP连网后生效": "Deleting the key will take effect after the user APP is connected to the network", - "有效时间": "Effective time", - "接收者": "Receiver", - "仅管理自己创建的用户": "Only manage users created by yourself", - "远程开锁": "Remote unlock", - "请输入钥匙名称": "Please enter the key name", - "修改成功": "Modify success", - "冻结": "Freeze", - "取消冻结": "Unfreeze", - "授权": "Authorization", - "取消授权": "Cancel authorization", - "同时解冻其发送的钥匙": "Unfreeze the keys sent by it", - "取消冻结会在用户APP连网后生效": "Unfreezing will take effect after the user APP is connected to the network", - "同时冻结其发送的钥匙": "Freeze the keys sent by it", - "冻结会在用户APP连网后生效": "Freezing will take effect after the user APP is connected to the network", - "取消授权会在用户APP连网后生效": "Canceling authorization will take effect after the user APP is connected to the network", - "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Authorized users have most of the permissions of the administrator, such as sending keys, sending passwords", - "失效时间需大于生效时间": "The expiration time must be greater than the effective time", - "生效时间需大于当前时间": "The effective time must be greater than the current time", - "失效日期要大于生效日期": "The expiration date must be greater than the effective date", - "失效时间要大于生效时间": "The expiration time must be greater than the effective time", - "修改有效期": "Modify the validity period", - "生效日期": "Effective date", - "失效日期": "Expiration date", - "开锁": "Unlock", - "开锁成功": "Unlock success", - "请选择锁": "Please select the lock", - "请选择接收者": "Please select the receiver", - "请选择有效期": "Please select the validity period", - "请选择发送方式": "Please select the sending method", - "请选择结束时间": "Please select the end time", - "完成": "Complete", - "有效日": "Effective day", - "发送成功": "Send success", - "请选择开始时间": "Please select the start time", - "选择用户": "Select user", - "已选中": "Selected", - "确定": "Determine", - "请选择要发送的锁": "Please select the lock to send", - "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Face real-name authentication refers to the user's need to verify his face before unlocking the phone APP, and the verification can be unlocked.", - "分享": "Share", - "请输入接收者账号": "Please enter the receiver account", - "接收者号码未注册,请重新发送": "The receiver number is not registered, please resend", - "是否发送电子钥匙给未注册账号": "Whether to send the electronic key to the unregistered account", - "取消": "Cancel", - "标记成功": "Mark success", - "微信好友": "WeChat friends", - "短信": "SMS", - "邮件": "Mail", - "更多": "More", - "您好,您的电子钥匙生成成功": "Hello, your electronic key is generated successfully", - "生效时间不能小于当前时间": "The effective time cannot be less than the current time", - "结束时间不能小于当前时间": "The end time cannot be less than the current time", - "是否为管理员": "Is it an administrator", - "已连接到锁,请将卡靠近锁的读卡区": "Connected to the lock, please put the card close to the card reading area of the lock", - "尝试连接设备...": "Trying to connect to the device...", - "地理位置": "Geographical location", - "检查以确保以下地址是正确的": "Check to make sure the following address is correct", - "地图加载中,请稍候。。": "The map is loading, please wait...", - "跳过": "Skip", - "还未获取到位置信息哦,请耐心等待一下!": "The location information has not been obtained yet, please wait patiently!", - "请填写信息": "Please fill in the information", - "有效期": "Validity period", - "生效时间": "Effective time", - "失效时间": "Expiration time", - "上传成功": "Upload success", - "未生效": "Not effective", - "已生效": "Effective", - "指纹详情": "Fingerprint details", - "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "During the addition process, please follow the prompts and lift and press multiple times on the fingerprint collector", - "开始添加": "Start adding", - "请将您的手指按下": "Please press your finger", - "根据提示,抬起手指后再进行下一次指纹采集": "According to the prompt, lift your finger and then collect the fingerprint again", - "添加成功": "Add success", - "更新成功": "Update success", - "搜索": "Search", - "重置后,该锁的卡都将被删除哦,确认要重置吗?": "After resetting, the card of the lock will be deleted, do you want to reset?", - "已失效": "Invalid", - "卡详情": "Card details", - "请输入": "Please enter", - "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "After closing, the smart lock will be set to all-day open mode until manually closed", - "请输入小于或等于60的数字": "Please enter a number less than 60", - "操作成功": "Operation success", - "管理员密码相同,无需修改": "The administrator password is the same and does not need to be modified", - "请输入6-9位数字": "Please enter 6-9 digits", - "请输入6-9位管理员密码": "Please enter a 6-9 digit administrator password", - "请输入新的管理员密码": "Please enter a new administrator password", - "未分组": "Not grouped", - "请输入分组名称": "Please enter the group name", - "创建成功": "Create success", - "设置锁分组成功": "Set the lock group successfully", - "电池1": "Battery 1", - "电池2": "Battery 2", - "电量更新时间": "Electric quantity update time", - "锁电量更新成功": "Lock power update success", - "您的钥匙未生效": "Your key is not effective", - "您的钥匙已冻结": "Your key has been frozen", - "您的钥匙已过期": "Your key has expired", - "常开模式开启": "Open mode on", - "超级管理员": "Super administrator", - "授权管理员": "Authorized administrator", - "普通用户": "Ordinary user", - "余": "Balance", - "天": "Day", - "删除锁后,所有信息都会一起删除,确定删除锁吗?": "After deleting the lock, all information will be deleted together, are you sure you want to delete the lock?", - "请输入登录密码": "Please enter the login password", - "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Failed to delete the device, please make sure that the device is near the device, the device is not connected, and the device is turned on", - "。如果是全自动锁,请使屏幕变亮": ". If it is a fully automatic lock, please make the screen brighter", - "用户无权限": "User has no permission", - "创建公司后,考勤功能才能使用": "After creating the company, the attendance function can be used", - "是否删除钥匙?": "Whether to delete the key?", - "邮箱绑定成功": "Email binding success", - "手机绑定成功": "Mobile phone binding success", - "网络访问失败,请检查网络是否正常": "网络访问失败,请检查网络是否正常", - "清空": "Clear", - "是否清空?": "Whether to empty?", - "消息详情": "Message details", - "创建时间": "Creation time", - "管理员详情": "Administrator details", - "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "When being coerced to forcibly unlock, using a coercion card will trigger an alarm, and the alarm information will be pushed to the administrator. This function requires the lock to be networked.", - "请不要将胁迫卡用于日常开锁": "Please do not use coercion cards for daily unlocking", - "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "When being coerced to forcibly unlock, using coercion fingerprints will trigger an alarm, and the alarm information will be pushed to the administrator. This function requires the lock to be networked.", - "请不要将胁迫指纹用于日常开锁": "Please do not use coercion fingerprints for daily unlocking", - "创建公司": "Create company", - "公司名称不能超过30个字符": "Company name cannot exceed 30 characters", - "公司名称不能小于6个字符": "Company name cannot be less than 6 characters", - "WIFI列表": "WIFI list", - "刷新": "Refresh", - "手动配网": "Manual distribution network", - "远距离": "Long distance", - "中距离": "Medium distance", - "近距离": "Short distance", - "锁时间更新成功": "Lock time update success", - "锁用户": "Lock user", - "请选择常开日期": "Please select the open date", - "结束时间不能小于开始时间哦": "The end time cannot be less than the start time", - "介绍": "Introduction", - "个人信息收集清单": "Personal information collection list", - "应用权限说明": "Application permission description", - "第三方信息共享清单": "Third party information sharing list", - "请选择您的位置": "Please select your location", - "请先选择位置": "Please select the location first", - "管理员密码": "Administrator password", - "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "If you need to modify, please enter a new administrator password (6 digits), click OK to modify", - "修改": "Modify", - "网络摄像头": "Network camera", - "重命名": "Rename", - "分组下的锁将被移到未分组里": "The locks under the group will be moved to ungrouped", - "编辑成功": "Edit success", - "厂商": "Manufacturer", - "型号": "Model", - "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "After the password is generated, please use it once for activation before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. After the password is activated, it can be used unlimited times within the validity period.", - "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "After the password is generated, please use it before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. The clear code is used to clear all the passwords generated before 0 o'clock today.", - "密码生成后,请在当日23:59前使用,否则过0点后失效。": "After the password is generated, please use it before 23:59 on the same day, otherwise it will be invalid after 0 o'clock.", - "清空密码底部提示": "The password is valid until 23:59 on the day of emptying\n Empty Content 1: All passwords generated before 0:00 of the day (Passwords generated after 0:00 of the day are not affected by clearing passwords and can continue to be used) \nEmpty content 2: Clear passwords Clear all custom passwords (used and unused) immediately after use \nTo completely clear all passwords, use the Reset All Passwords feature", - "相机": "camera", - "相册": "photos", - "读写": "storage", - "定位": "location", - "需要访问相机权限才能拍照上传文件例如头像上传": "Access to the camera is required to take photos and upload files, such as uploading a profile picture", - "需要访问相机权限才能使用相册图片上传文件上传头像": "Access to camera is required to upload files and avatars using album images", - "需要访问读写权限才能使用本地图片上传头像": "Access to read and write permissions is required to upload avatars using local images", - "需要访问定位权限才能使用添加钥匙功能的位置信息": "Access to location information is required to use the add key function", - "申请": "application", - "权限": "permission", - "不允许": "Not Allowed", - "允许": "Allowed", - "权限被拒绝": "Permission denied", - "请手动在系统设置中开启": "Please manually enable it in the system settings", - "权限以继续使用应用": "Permission to continue using the application.", - "去设置": "Go set it up", - "当前网络": "Current network", - "位置信息": "Location information", - "请输入wifi名称": "Please enter the wifi name", - "虹膜": "iris", - "手掌": "palm", - "商城": "mall", - "我的": "my", - "微信公众号推送": "Wechat public account", - "开启微信接收报警消息需要先关注锁通通锁微信公众号,请保存二维码并使用微信扫一扫设置": "To open wechat to receive alarm messages, you need to pay attention to Skye Smart Lock wechat public account first, please save the QR code and use wechat to scan the Settings", - "蓝牙": "Bluetooth", - "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Access to Bluetooth permissions is required to use the location information of the add key function", - "请输入Email": "Please enter Email", - "请输入手机号": "Please enter mobile phone number", - "家人到家": "Family gets home", - "添加家人": "Add family", - "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "If the lock is not connected to the Internet, in addition to the electronic key, the password, card, fingerprint and other door reminders can not be sent in time, please choose according to your actual situation", - "消息提醒": "Message reminder", - "开门通知": "Opening notice", - "N天未开门": "N days without opening the door", - "门未关好": "The door is not closed", - "防拆报警": "Tamper alarm", - "低电量提醒": "Low power reminder", - "胁迫开门": "Forced door opening", - "有人按门铃": "Someone rings the doorbell", - "有人出现在门口": "Someone appears at the door", - "提醒方式": "Reminder mode", - "开门方式": "Opening mode", - "请选择": "Please select", - "家人": "Family", - "保存": "Save", - "APP推送": "APP push", - "管理员": "Administrator", - "未启用": "Not enabled", - "已启用": "Enabled", - "省电模式": "Power saving mode", - "逗留抓拍模式": "Stay capture mode", - "实时监控模式": "Real-time monitoring mode", - "自定义模式": "Custom mode", - "秒": "second", - "猫眼设置": "Cat eye setting", - "猫眼工作模式": "Cat eye working mode", - "自动亮屏": "Automatic bright screen", - "亮屏持续时间": "Screen on time", - "逗留警告": "Stay warning", - "异常警告": "Abnormal warning", - "短信提醒": "SMS reminder", - "邮件提醒": "Email reminder", - "N天未开门提醒": "N days did not open the door reminder", - "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "When forced to open the lock, the use of coercive fingerprint will trigger the alarm, the alarm message will be pushed to the administrator, the function requires the lock network", - "胁迫指纹": "Stress fingerprint", - "指纹列表": "Fingerprint list", - "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "After the above set time, the lock is not opened, the system will send a reminder message to the specified object, this function requires the lock network", - "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "After the reminder is enabled, when the lock power is below 20%, 10%, and 5%, the system will send a reminder message to the specified object. Power reading mode: gateway reading or APP reading.", - "门未开时间": "Door not open time", - "添加和使用面容开锁时:": "Add and use Face when unlocking:", - "关锁": "close lock", - "功能": "function", - "配件": "parts", - "云存": "Cloud storage", - "本地": "This locality", - "3天滚动储存": "3 days rolling storage", - "去升级": "Upgrade Now", - "下载列表": "Download list", - "已下载": "Downloaded", - "全部视频": "All videos", - "已为本设备免费提供3大滚动视频储存服务": "Three scrolling video storage services have been provided for this device free of charge", - "视频播放": "Video playback", - "全选": "Select all", - "请选择要删除的视频": "Please select the video you want to delete", - "请选择要下载的视频": "Please select the video you want to download", - "欢迎使用": "Welcome to use", - "用户协议和隐私政策概要": "Summary of User Agreement and Privacy Policy", - "协议概要": "Protocol Summary", - "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Thank you for using this application. We attach great importance to your personal information and privacy protection. Before using this product, please read it carefully", - "《用户协议》": "《User Agreement》", - "和": "and", - "《隐私政策》": "《Privacy Policy》", - "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "The entire content of. By clicking \"Agree\", you agree and accept all terms. If you choose not to agree, you will not be able to use our products and services and will exit the application.", - "不同意": "Disagree", - "同意": "agree", - "已开通": "Current status: Enabled", - "该功能是高级功能,请开通后再使用": "This function is an advanced function. Please enable it before using it", - "常用程序": "Common Programs", - "该锁已被重置": "The lock has been reset", - "需要访问读写权限才能使用手动升级固件": "Access to read and write permissions is required to manually upgrade firmware", - "错误D固件,请选择正确的文件": "Wrong firmware, please select the correct file", - "非SYD固件,请选择正确的文件": "Non SYD firmware, please select the correct file", - "文件校验失败 0x01": "File verification failed 0x01", - "解析元数据失败,请选择正确的文件": "Failed to parse metadata, please select the correct file", - "文件校验失败 0x02": "File verification failed 0x02", - "文件校验失败 0x03": "File verification failed 0x03", - "固件升级完成": "Firmware upgrade completed", - "记录": "Record", - "开通高级功能后才可以对锁进行管理": "You can manage locks only after the advanced function is enabled", - "去开通": "Go and Activate", - "实名认证": "Real-name authentication", - "当前剩余数量": "Current surplus quantity", - "购买": "Buy", - "实名认证为付费功能,请购买后再使用": "Real-name authentication is a paid function, please use it after purchase", - "密码不一致哦": "The passwords are inconsistent", - "退出添加": "Quit adding", - "管理员已满": "Admin full", - "用户已满": "The user is full", - "锁上面添加指纹已满": "Add fingerprint on lock is full", - "指纹已存在": "The fingerprint already exists.", - "锁上面添加人脸已满": "Lock above add face is full", - "人脸已存在": "The face already exists", - "锁上面添加卡已满": "Lock above add card is full", - "卡已存在": "Card already exists", - "锁上面添加密码已满": "Lock above add password is full", - "密码已存在": "Password already exists", - "请输入密码": "Please enter password", - "暂无密码,无需重置": "No password, no need to reset", - "真实姓名": "Real name", - "身份证号": "ID number", - "请输入真实姓名": "Please enter your real name", - "请输入身份证号": "Please enter your ID number", - "请输入身份证号和真实姓名": "Please enter your ID number and real name", - "点击返回设备配对": "Tap Back to device pairing", - "无法连接?尝试升级": "Can't connect?Upgrade attempted", - "固件升级提示": "Firmware upgrade prompt", - "请先获取固件文件到手机本地,再选择升级": "Please obtain the firmware file to the local phone first, and then select Upgrade", - "固件升级中": "The firmware is being upgraded", - "取消升级": "Cancel the upgrade", - "固件传输中": "Firmware in transit", - "关闭": "Shut down", - "传输中'": "In transit", - "操作记录": "Record", - "修改姓名": "Modify name", - "传输中": "In transit", - "发送人": "Sender", - "发送时间": "Send time", - "钥匙详情": "Key details", - "姓名": "Name", - "发送": "Send", - "请确认姓名全名和身份证号码是否正确": "Please confirm that the full name and ID number are correct", - "传输期间请勿离开当前页面": "Do not leave the current page during transfer", - "机型": "models", - "硬件版本": "Hardware version", - "固件版本": "Firmware version", - "手动升级": "Manual upgrade", - "设备连接中...": "Device Connecting...", - "未避免异常情况,请在门打开时升级": "Unavoidable exceptions, please upgrade when the door is open", - "钥匙无效": "The key is invalid", - "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "The operation failed. Please confirm whether the lock is nearby, or restart your phone's Bluetooth and try again.", - "如果是全自动锁,请使屏幕变亮": "If it is a fully automatic lock, please make the screen brighter", - "正在尝试闭锁……": "Attempting to lock...", - "清空记录": "Clear record", - "是否要删除操作记录?": "Do you want to delete the operation record?", - "被删除的记录不能恢复": "The deleted record cannot be restored", - "全部事件": "All events", - "开锁事件": "Unlock event", - "异常事件": "Abnormal event", - "门铃事件": "Doorbell event", - "视频事件": "Video event", - "请开启蓝牙": "Please turn on Bluetooth", - "请选择有效日": "Please select the effective day", - "公司名字长度不能小于 6 ": "The length of the company name cannot be less than 6", - "已是最新版本": "It is the latest version", - - "新建短信模版":"New SMS template", - "新建邮件模版":"New email template", - "自定义短信模版":"Custom SMS template", - "自定义邮件模版":"Custom email template", - "名称":"Name", - "星星锁": "Star lock", - "无考勤记录": "No attendance record", - "大家干劲十足": "Everyone is full of energy", - "工作时长未出炉": "Working hours are not available", - "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "The selection of the country or region will affect data security. You have currently selected Albania. Please confirm before continuing", - "确认国家或地区": "Confirm country or region", - "我知道了": "I know", - - "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "To receive important updates, please click 'OK' and enable notifications in the settings.", - "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "After turning on, you can re-power on by long pressing the setting key on the lock, and re-add it with the APP", - "已有": "Already has", - "新增": "New", - "账号格式错误": "The account format is incorrect", - "接收者信息为空": "The recipient information is empty", - "请输入时间(秒)": "Please enter the time (seconds)", - "加载数据失败": "Failed to load data", - "重试": "Retry", - "升级中,是否退出": "During the upgrade, whether to exit", - - "下一步": "Next", - "公寓": "Apartment", - "个人用户": "Personal user", - "星寓": "Star apartment", - "账号": "Account", - - "请输入手机号或email": "Please enter mobile phone number or email", - "请输入星寓管理员的账号": "Please enter the account of the star apartment administrator", - "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "The selected smart lock will be transferred to the account you entered, and you will lose the management rights of the lock", - "暂不支持跨平台转移,敬请期待": "Cross-platform transfer is not supported for the time being, please look forward to it", - "移除坏锁": "Remove bad lock", - "转移确认": "Transfer confirmation", - "本次共转移": "This time a total of", - "把智能锁": "Smart lock", - "确认": "Confirm", - "移除成功": "Remove successfully", - "转移成功": "Transfer success", - "该已锁被删除": "The locked is deleted", - "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Authorized administrators can only view and manage the keys, passwords, etc. they issued", - "添加授权管理员": "Add authorized administrator", - "导出记录":"Export record", - "选择时间段":"Select time period", - "导出":"Export", - "批量导出":"Batch export", - "读取记录":"Read record", - "手机需联网":"NeedNet", - "设备":"Device", - "消息":"Message", - "智能分析":"Intelligent analytics", - "精准识别设备事件,过滤无效信息":"Accurately identify device events and filter out invalid information", - "系统设置":"System settings", - "系统的全局配置在此项内进行设置":"The global configuration of the system is set in this item", - "导出操作记录":"Export operation record", - "立即查看":"View now", - "导出成功":"Export success", - "发送钥匙": "Send key", - "进度": "Progress", - "失败": "Failure", - "人脸详情": "Face details", - "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 1.5 meters in front of the door, the face recognition unlocking will be automatically started.", - "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.8 meters in front of the door, the face recognition unlocking will be automatically started.", - "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.5 meters in front of the door, the face recognition unlocking will be automatically started.", - "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "The sensing distance has been turned off, you need to manually touch any key on the keyboard to perform face recognition unlocking.", - "防误开已打开,开锁后": "The anti-mistake opening has been turned on, and after unlocking", - "秒内不可使用面容开锁": "Face unlocking cannot be used within seconds", - "Amazon Alexa": "Amazon Alexa", - "您可以使用Alexa进行开锁、闭锁和查看锁状态": "You can use Alexa to unlock, lock, and view the lock status", - "支持的国家": "Supported countries", - "支持的国家值":"United States, Canada, United Kingdom, Germany, France, Italy, Spain, Australia, New Zealand, India, Japan", - "操作流程": "Operation process", - "操作流程值": "1. Open the Alexa app and search for the Skye Smart Lock skill\n2. Click Enable Skill and log in to your Skye account\n3. Say 'Alexa, discover devices' to Alexa\n4. After discovering the device, you can use the voice command to control the lock", - "密码需至少包含数字/字母/字符中的2种组合": "The password must contain at least 2 combinations of numbers/letters/characters", - "Google Home": "Google Home", - "Action name": "Action name", - "ScienerSmart": "ScienerSmart", - "支持的语言": "Supported languages", - "英语": "English", - "Google Home操作流程的值": "1. Add the lock and gateway with the Smart lock APP\n\n2. Open the remote unlocking function of the lock in the APP (this function is turned off by default). Without this option, the lock does not support Google Home \n\n3. To install the Google Home APP, click the + button in the top left corner\n\n4. On the Settings page, select Work with Google\n\n5. Search for ScienerSmart and authorize with your Smart Lock APP account and password", - "开启": "Open" -} +{ + "星锁": "Star Lock", + "锁通通": "Lock Through", + "点击开锁,长按闭锁": "Touch to Unlock,Hold to Lock", + "考勤": "Attendance", + "考勤设置": "Attendance Settings", + "电子钥匙": "eKeys", + "添加卡": "Add Card", + "卡号": "Card Number", + "添加指纹": "Add Fingerprint", + "指纹号": "Fingerprint Number", + "遥控": "Remote", + "添加人脸": "Add Face", + "门锁日志": "Door lock log", + "密码号": "Password Number", + "添加者": "Operator", + "添加时间": "Time", + "重置": "Reset", + "请输入手机号或者邮箱": "Phone Number or Email", + "工作时间": "Working Time", + "工作日设置": "Workday Setting", + "星期一": "Monday", + "星期二": "Tuesday", + "星期三": "Wednesday", + "星期四": "Thursday", + "星期五": "Friday", + "星期六": "Saturday", + "星期日": "Sunday", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Sun", + "群发钥匙": "Send multiple ekeys", + "锁": "Locks", + "请添加": "Recipient", + "允许远程开锁": "Remote Unlock", + "请输入验证码": "Verification Code", + "获取密码": "Generate Passcode", + "请给密码命名": "Enter a name for this Passcode", + "密码有限期为6个小时,只能使用一次": "This Passcode MUST BE used within 6 Hours from the Current Time or it will be SUSPENDED for security Reasons.This Passcode can Only be used ONCE.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Manually enter 6-9 digits as the password. Can be added by phone Bluetooth next to the lock, or remotely added through the gateway", + "获取": "Get", + "添加": "Add", + "删除公司": "Delete Company", + "密码详情": "Passcode Info", + "修改密码": "Change passcode", + "添加虹膜": "Add Iris", + "添加门磁": "Door Sensor", + "添加无线键盘": "Wireless Keypad", + "添加手掌": "Add Palm", + "请输入员工账号": "Enter Employee's Account", + "批量授权锁": "Grant multiple locks", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "The authorized administrator will have majority permission to operate this lock.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。":"This feature allows you to Unlock the Smart Lock Remotely via a Gateway.This Feature can ONLY be Turned ON or OFF via Bluetooth.", + "排列方式": "List Type", + "早到榜": "Early List", + "迟到榜": "Late List", + "当前模式": "Current Mode", + "勤奋榜": "Working Hard List", + "延迟时间": "Delay Time", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "The lock will lock automatically after the time.Please unlock it for one time first to make the setting available.", + "时间": "Time", + "开始时间": "Start Time", + "结束时间": "End Time", + "工作时间设置": "Working Time Setting", + "常开模式": "Passage MODE", + "常开时间": "In this time period", + "常开日期": "On these Days", + "添加员工": "Add Staff", + "编辑员工": "Edit Staff", + "节假日": "Holiday", + "打卡方式": "Method", + "员工是否有钥匙": "Already has ekey", + "上班时间": "Starting Time", + "下班时间": "Closing Time", + "本周": "This Week", + "单休": "One-day Weekend", + "双休": "Two-day Weekend", + "单双休": "One-two-day Weekend", + "年": "Year", + "月": "Month", + "放假日期": "Holiday", + "补班日期": "Work Days", + "添加假日": "Add Holiday", + "开始日期": "Start Date", + "必填": "Required", + "结束日期": "End Date", + "日榜": "Daily", + "月榜": "Monthly", + "考勤记录": "Records", + "假日信息": "Holiday Info", + "基本信息": "Basics", + "无线键盘": "Wireless Keypad", + "选择无线键盘": "Add Keypad", + "门磁": "Door Sensor", + "自动闭锁": "Auto lock", + "锁声音": "Lock Sound", + "防撬报警": "Tamper Alert", + "重置键": "Reset Button", + "锁时间": "Lock Clock", + "诊断": "Diagnose", + "上传数据": "Upload Data", + "导入其他锁数据": "Import frome another lock", + "锁升级": "Firmware Update", + "标记房态": "Room status", + "开锁提醒": "Unlock Notification", + "微信二维码": "Unlock QR Code", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "People with electronic keys can open the door by scanning this QR code through WeChat. The QR code of each lock is different. You can print it out and paste it next to the corresponding lock", + "锁编号": "Lock Number", + "电量": "Battery", + "锁分组": "Lock Group", + "选择分组": "Select group", + "创建新分组": "Create a Group", + "管理员开锁密码": "Admin Passcode", + "更新": "Update", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "The battery level will be updated by gateway or phone bluetooth", + "当屏幕闪烁时,点击下一步": "Click next when the keypad flashes", + "输入*529#或按设置键": "Enter *529# or press the Settings key", + "长按重置键2秒": "Press And Hold The Reset Button 2 Seconds", + "附近的设备": "Nearby Equipment", + "暂无数据": "No Data", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "You will be able to get door status with a door sensor together with a gateway.Only one sensor is allowed to associate with a lock.", + "开始": "Start", + "全天": "All Hours", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "You can set multiple time periods for passage mode.Within the set time periods,the lock will remain in an open state after being unlocked.", + "请选择锁音量": "Please select lock volume", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "By Turning ON,you will hear the sound from the lock", + "低": "Low", + "较低": "Medium low", + "中": "Medium", + "较高": "Medium high", + "高": "High", + "开启后,锁被撬动时,会发出报警声": "By turning on,you enable the TAMPER alert.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "By turning off,the RESET button is disabled.", + "校准时间": "Calibrate Time", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnosis is to read the configuration information inside the lock and upload it so that the staff can analyze the cause of the failure", + "上传": "Upload", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Upload data from lock to server.It may take several minutes", + "请选择要从哪把锁导入": "Select a lock to import from", + "有新版本": "Have New Version", + "当前版本": "Current Version", + "升级": "Update", + "空闲": "Vacant", + "已入住": "Occupied", + "多语言": "Languages", + "添加锁": "Add Lock", + "锁地址": "Lock Address", + "选择锁类型": "Select lock type", + "NFC无源锁": "NFC Passive Lock", + "添加设备": "Add device", + "网关": "Gateway", + "客服": "Customer Service", + "设置": "Settings", + "更多设置": "More Set", + "消息推送": "Notification push", + "锁用户管理": "Lock Users", + "拥有的钥匙": "eKeys associated with this User", + "批量授权": "Authority management", + "关联设备": "Associated device", + "关联姓名": "Associated name", + "转移智能锁": "Transfer Lock", + "选择锁": "Screen lock", + "接收人信息": "Recipient", + "转移网关": "Transfer Gateway", + "锁屏": "Screen Lock", + "已关闭": "Off", + "已开启": "On", + "开启": "Turn On", + "确定要开启重置键?": "Continue to enable the Reset button?", + "确定要关闭重置键?": "Continue to disable the Reset button?", + "隐藏无效开锁权限": "Hide invalid access", + "APP开锁时需手机连网的锁": "Locks requiring phone online", + "增值服务": "Services", + "关于": "About", + "退出": "Logout", + "删除账号": "Delete Account", + "个人信息": "Account info", + "头像": "Avatar", + "昵称": "NickName", + "请输入昵称": "Please enter your nickname", + "修改昵称": "Rename", + "修改账号": "Edit account", + "重置密码": "Reset Password", + "安全问题": "Security Question", + "为了你的账号安全,修改账号前请先使用验证码验证": "For the security of your account, please use the account password verification before modifying the account", + "请输入新账号": "Please enter the new account", + "找回密码和登录新设备时,可通过绑定的手机验证": "The Binding Phone number will be used to receive the Verification Code.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "The Binding email will be used to receive the Verification Code.", + "原密码": "Current Password", + "新密码": "New Password", + "确认密码": "Confirm Password", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "In case your phone lost,you can login to new phone by answering security questions.", + "问题一": "Question 1", + "问题二": "Question 2", + "问题三": "Question 3", + "请输入你的答案": "Please type Your Answer", + "即将到期": "Expires Soon", + "去授权": "Go to authorize", + "修改名称": "Edit Name", + "状态": "Status", + "WiFi名称": "Wifi Name", + "网络MAC": "Network MAC", + "网关升级": "Gateway Update", + "网关连接的锁": "Lock(s) connected to this Gateway", + "信号强": "Strong", + "选择网关类型": "Choose Gateway Type", + "添加网关": "Add Gateway", + "重新通电": "Re Connect the Power", + "指示灯": "Indicator Light", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds, and click Next when the indicator light flashes alternately", + "选择网关": "Choose Gateway", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G is not supported,.Please select a WiFi of 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "Enter WiFi Password", + "网关名称": "Gateway Name", + "请输入网关名称": "Enter Gateway Name", + "IP地址": "IP Address", + "子网掩码": "Subnet Mask", + "默认网关": "Default Gateway", + "自动获取DNS服务器地址": "Automatically Get The DNS Server Address", + "首选DNS": "Preferred DNS", + "备选DNS": "Alternative DNS", + "不使用静态IP": "No Static IP Is Used", + "使用静态IP": "Use Static IP", + "请输入IP地址": "Enter IP Address", + "请输入子网掩码": "Enter Subnet Mask", + "请输入默认网关": "Enter Default Gateway", + "所有锁": "All Locks", + "搜索所有类型的锁": "Scan all types of locks", + "门锁": "Door Lock", + "挂锁": "Padlock", + "保险箱锁": "Safe Lock", + "智能门禁": "Intelligent access control", + "车位锁": "Parking Lock", + "摸亮触摸屏": "Touch any key to Activate the Keypad", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Please touch any key to Activate the Lock and put it in PAIRING Mode.Press Next", + "附近的锁": "Nearby Locks", + "如需修改名字请重新命名,点击确定添加锁": "If you want to change the name, please rename, click OK to add lock", + "添加锁时,手机必须在锁旁边": "When adding a lock, the phone must be next to the lock", + "登录": "Login", + "注册": "Register", + "我已阅读并同意": "I've read and agreed", + "验证码": "Code", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Your password must have 8-20 characters, and include a minimum of two types of numbers, letters and symbols", + "手机": "Phone", + "邮箱": "Email", + "请输入邮箱": "Enter your Email", + "国家/地区": "Country/Region", + "你所在的国家/地区": "Your country/region", + "选择国家/地区": "Choose your Country or Region", + "获取验证码": "Get Code", + "商务合作": "Business", + "电脑网页版": "Web System", + "酒店系统": "Hotel System", + "说明书网页版": "User Manual", + "高级功能": "Advanced Function", + "记录保存": "Records Retention", + "您可通过短信将密码、电子钥匙信息发给接收人。": "The SMS can be used to send passcode and ekey information to recipient.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "The email can be used to send passcode and ekey information to recipient.", + "购买实名认证提示": "After the function is enabled, you need to use your fingerprint, face or account password to open the APP. There is no need to verify again for 3 minutes", + "请选择你希望的实名认证频次": "Please select the real-name authentication frequency you want", + "仅首次": "For the first time", + "每日一次": "once a day", + "每周一次": "once a week", + "每月一次": "once every month", + "当前状态": "Current Status", + "试用中": "On Trial", + "高级功能权益内容": "Advanced functions", + "短信模板": "SMS Template", + "邮件模板": "Email Template", + "发卡工具": "Card encoder", + "购买高级功能须知": "Notice", + "购买高级功能提示": "More advanced features are under development, and if you need them, you are welcome to open the service based on the number of locks. Advanced features are only available for your own locks. If you are an authorized administrator, please contact the top administrator of the lock to open the service", + "免费体验": "Free Trial", + "立即开通": "Open Now", + "购买短信": "Buy SMS", + "购买邮件": "Buy EMail", + "购买实名认证次数": "Purchase Real Name Authentication Times", + "开通高级功能": "Enable Advanced function", + "选择套餐": "Choose Package", + "支付方式": "Mode Of Payment", + "支付宝": "Alipay", + "去支付": "Pay", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "You are allowed to define the message by yourself.It is used to send information of passcode and ekey to others.", + "高级功能仅能用于你自己的锁": "The advanced function can only be applied your own locks.", + "新建模板": "Creat template", + "类型": "Type", + "模版内容": "Template Content", + "预览": "Preview", + "房间名": "Room", + "预计产生短信条数": "Estimated message segments", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "This Feature allows you to hide passcodes,ekeys,cards,and fingerprints which are invalid for a period of time.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "User's phone is required to be online to unlock these selected locks with APP.", + "配置WiFi": "Configuring WiFi", + "请输入WiFi名字": "Please Enter Wifi Name", + "WiFi配网": "WiFi Distribution Network", + "胁迫卡": "Stress Card", + "员工是否有密码": "Already has Passcode", + "员工是否有卡": "Already has Card", + "员工是否有指纹": "Already Set the Fingerprint", + "获取钥匙": "Get Key", + "获取卡": "Get Card", + "获取指纹": "Get Fingerprint", + "安全验证": "Identity verification", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "All your Account information will be Removed from the Platform PERMANENTLY and cannot be Recovered.Do you want to Delete?", + "监控": "Monitor", + "视频日志": "Video Log", + "开门器": "Door Opener", + "面容开锁": "Face Unlocks", + "开门方向设置": "Opening Direction Set", + "电机功率设置": "MotorPower Setting", + "开锁时是否需联网": "If Internet Is Required When Unlocking", + "选择要加入分组的锁": "Select lockS to add to this group", + "锁数量": "Lock amount", + "小米IOT平台": "Xiaomi IOT Platform", + "面容开锁设置": "Face Unlocks Set", + "感应距离": "Sensing distance", + "防误开": "Prevent wrong opening", + "防误开已关闭,关门后仍可使用面容开锁": "Prevent misopening has been closed, after closing the door can still use face unlock", + "添加和使用面容开锁时": "Add and use face when unlocking", + "添加和使用面容开锁时提示": "\n1, please try to keep a single person in front of the door operation; \n2, please stand in front of the door lock about 0.5~0.8 meters, facing the door lock; \n3. Please keep your face unobstructed and expose your facial features; \n4. When face recognition is abnormal, you can touch any key on the digital keyboard to restart face recognition manually.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Please choose the motor power carefully according to the actual situation of the door lock:", + "小功率:": "miniwatt:", + "耗电少": "Less power consumption", + "大功率": "high-power:", + "大功率提示": "If the lock tongue can not be retracted normally when unlocking, or need to be driven \nHeaven and earth hook, it is recommended to choose high power. At this point, the power consumption will be \nIncrease.", + "开门方向设置提示": "Please carefully choose the direction to open the door of your home (if you choose the wrong direction, you will not be able to open and close the door properly) :", + "左开": "Open Left", + "右开": "Open Right", + "判断方法:": "判断方法:", + "判断方法内容": "The man stood outside the house, facing the entrance door. \nIf the hinge or shaft of the door is on the left, the door is left open; \nA door is right-open if its hinge or shaft is on the right. \nIf the setting is wrong, it will not open and close the door properly. \nRecommended to be operated by installation or maintenance personnel.", + "录像时段": "Video slot", + "密码": "Passcodes", + "卡": "Cards", + "指纹": "Fingerprints", + "人脸": "Faces", + "配件商城": "Lock Mall", + "公司名称": "Company Name", + "请输入公司名字": "Enter Company Name", + "提示": "Hint", + "是否删除?": "Whether to delete?", + "员工信息": "Staff Info", + "员工": "Staff", + "打卡方式无效": "Unavailable", + "中国": "China", + "选择钥匙": "Choose ekey", + "编辑": "Edit", + "无": "No", + "有": "Yes", + "请输入姓名": "Please enter a Name", + "获取人脸": "Getting faces", + "选择密码": "Choose Passcode", + "选择卡": "Choose card", + "选择指纹": "Choose fingerprint", + "选择人脸": "Select face", + "员工是否有人脸": "Whether the employee has a face", + "同时删除员工钥匙": "Delete his/her ekey", + "删除": "Delet", + "确定要删除员工吗?": "Delete this Employee", + "月统计": "Monthly statistics", + "迟到": "late", + "早退": "Leave Early", + "未打卡": "No Record", + "钥匙将在": "This ekey will expire in", + "天后失效": "day(s)", + "电量更新时间:": "Battery update time:", + "新增配件": "Add", + "钥匙不可用": "Key is not available", + "正在开锁中...": "Unlocking...", + "你的钥匙": "Your key", + "常开模式启动!长按闭锁": "Open mode started! Long press to lock", + "演示模式": "Demo mode", + "请先同意用户协议及隐私政策": "Please agree to the user agreement and privacy policy first", + "用户协议": "User Terms", + "隐私政策": "Privacy policy", + "注册成功": "Registration successful", + "你所在的": "You are in", + "手机号": "Phone Number", + "忘记密码": "Forgot password", + "重置成功": "Reset success", + "确定要退出吗?": "Exit?", + "功能暂未开放": "Function is not yet open", + "设置成功": "Set up successful", + "删除成功": "Delete successful", + "单次": "One-time", + "永久": "Permanent", + "限时": "Timed", + "自定义": "Custom", + "清空码": "Erase", + "循环": "Recurring", + "工作日": "Workday", + "每日": "Daily", + "周末": "Weekend", + "确定要删除吗?": "Delete?", + "该锁的密码都将被删除": "All Passcodes for this Lock will be DELETED", + "已过期": "Invalid", + "该锁的电子钥匙都将被删除": "All eKeys for this Lock will be DELETED", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE All ekeys associated with this ekey.This Step cannot be UNDONE!", + "删除钥匙会在用户APP连网后生效": "The eKey will be DELETED when the User's APP connects to a Network", + "有效时间": "Effective time", + "接收者": "Recipient", + "仅管理自己创建的用户": "Manage his own users only", + "远程开锁": "Remote unlock", + "请输入钥匙名称": "Please enter the key name", + "修改成功": "Modify successful", + "冻结": "Freeze", + "解除冻结": "Thaw", + "授权": "Authorize", + "取消授权": "De-authorize", + "同时解冻其发送的钥匙": "Thaw all ekeys issued by this user", + "会在用户APP连网后生效": "This ekey will be THAWED when the User's APP connects to a Network", + "同时冻结其发送的钥匙": "Freeze all ekeys issued by this user", + "冻结会在用户APP连网后生效": "This ekey will be FROZEN when the User's APP connects to a Network", + "取消授权会在用户APP连网后生效": "The User will LOOSE his/her Permissions when User's APP connects to a Network", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "The Authorized user has almost the same permissions as the LOCK Manager(eg.Ability to Send ekeys and Passcodes)", + "失效时间需晚于生效时间": "The expiration time must be later than the effective time", + "生效时间需晚于当前时间": "The effective time must be later than the current time", + "失效日期需晚于生效日期": "The expiration date must be later than the effective date", + "修改有效期": "Change Period", + "生效日期": "Start Date", + "失效日期": "End Date", + "开锁": "Unlock", + "开锁成功": "Unlock success", + "请选择锁": "Please select locks", + "请选择接收者": "Please select the receiver", + "请选择有效期": "Please select the validity period", + "请选择发送方式": "Please select the sending method", + "请选择结束时间": "Please select the end time", + "完成": "Complete", + "有效日": "Cycle on", + "发送成功": "Send success", + "请选择开始时间": "Please select the start time", + "选择用户": "Select recipients", + "已选中": "Selected", + "确定": "Sure", + "请选择要发送的锁": "Please select locks", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Face real-name authentication refers to the user's need to verify his face before unlocking the phone APP, and the verification can be unlocked.", + "分享": "Share", + "请输入接收者账号": "Please enter the receiver account", + "接收者号码未注册,请重新发送": "The receiver number is not registered, please resend", + "是否发送电子钥匙给未注册账号": "Do you want to send an ekey to a new account", + "取消": "Cancel", + "标记成功": "Mark success", + "微信好友": "WeChat friends", + "短信": "SMS", + "邮件": "Email", + "更多": "More", + "您好,您的电子钥匙生成成功": "Hello, your electronic key is generated successfully", + "生效时间不能小于当前时间": "The effective time cannot be less than the current time", + "结束时间不能小于当前时间": "The end time cannot be less than the current time", + "是否为管理员": "Is it an administrator", + "已连接到锁,请将卡靠近门锁的读卡区": "Connected.Place the Card against the Card Reader ", + "尝试连接设备...": "Connecting With Lock.Please wait...", + "地理位置": "Geographical location", + "检查以确保以下地址是正确的": "Check to make sure the following address is correct", + "地图加载中,请稍候。。": "The map is loading, please wait...", + "跳过": "Skip", + "还未获取到位置信息哦,请耐心等待一下!": "The location information has not been obtained yet, please wait patiently!", + "请填写信息": "Please fill in the information", + "有效期": "Validity period", + "生效时间": "Start Time", + "失效时间": "End Time", + "上传成功": "Uploaded successfully", + "未生效": "Inactive", + "已生效": "Effective", + "指纹详情": "Fingerprint Info", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "You will be required to Place your Finger to the Sensor several times.Please follow the prompts...", + "开始添加": "Start", + "请将您的手指按下": "Place your Finger on the Sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Follow the prompts...You will be required to Remove and Place your Finger to the Sensor for Next Record", + "添加成功": "Add successful", + "更新成功": "Update success", + "搜索": "Search", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "After resetting, the card of the lock will be deleted, do you want to reset?", + "已失效": "Invalid", + "卡详情": "Card Info", + "请输入": "Please enter here", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "By turning OFF,the Lock will remain Unlocked all day until it is manually Locked", + "请输入小于或等于60的数字": "Please enter a number less than 60", + "操作成功": "Operation successful", + "管理员密码相同,无需修改": "The administrator password is the same and does not need to be modified", + "请输入6-9位数字": "6-9 Digits in length", + "请输入6-9位管理员密码": "Please enter a 6-9 digit administrator password", + "请输入新的管理员密码": "Please enter a new administrator password", + "未分组": "Ungrouped", + "请输入分组名称": "Create a Group", + "创建成功": "Create success", + "设置锁分组成功": "Set the lock group successfully", + "电池1电量": "Battery 1", + "电池2电量": "Battery 2", + "电量更新时间": "Battery update time", + "锁电量更新成功": "Lock power update success", + "您的钥匙未生效": "Your key is not effective", + "您的钥匙已冻结": "Your key has been frozen", + "您的钥匙已过期": "Your key has expired", + "常开模式开启": "The lock is in Passage Mode", + "超级管理员": "Super admin", + "授权管理员": "Make admin", + "普通用户": "Ordinary user", + "余": "Balance", + "天": "Day", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "After deleting the lock, all information will be deleted together, are you sure you want to delete the lock?", + "请输入登录密码": "Please enter the Application password", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Failed to delete the device, please make sure that the device is near the device, the device is not connected, and the device is turned on", + "用户无权限": "User has no permission", + "创建公司后,考勤功能才能使用": "Please Create a Company first", + "是否删除钥匙?": "Delete this ekey?", + "邮箱绑定成功": "Email binding success", + "手机绑定成功": "Mobile phone binding success", + "网络访问失败,请检查网络是否正常": "Request Failed.Network unavailable,Please Check and Connect your Device to 3G/4G/WIFI", + "清空": "Clear", + "是否清空?": "Clear?", + "消息详情": "Message Info", + "创建时间": "Creation time", + "管理员详情": "Administrator details", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "If someone forces you to open door,you can use this card.The alarm message will be sent to the administors.To use this feature,please make sure your lock is online.", + "请不要将胁迫卡用于日常开锁": "Please don't use the forced card for daily use.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "If someone forces you to open door, you can use this fingerprint.The alarm message will be sent to the administors.To use this feature,please make sure your lock is online.", + "请不要将胁迫指纹用于日常开锁": "Please don't use the forced fingerprint for daily use.", + "创建公司": "Create a company", + "公司名称不能超过30个字符": "Company name cannot exceed 30 characters", + "公司名称不能小于6个字符": "Company name cannot be less than 6 characters", + "WIFI列表": "WIFI list", + "刷新": "Refresh", + "手动配网": "Manual distribution network", + "远距离": "Long distance", + "中距离": "Medium distance", + "近距离": "Short distance", + "锁时间更新成功": "Lock time update success", + "锁用户": "Lock users", + "请选择常开日期": "Please select the open date", + "结束时间不能小于开始时间哦": "The end time cannot be less than the start time", + "介绍": "Our Story", + "个人信息收集清单": "Personal information collection list", + "应用权限说明": "Application permission description", + "第三方信息共享清单": "Third party information sharing list", + "请选择您的位置": "Please select your location", + "请先选择位置": "Please select the location first", + "管理员密码": "Admin passcode", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "If you need to modify, please enter a new administrator password (6 digits), click OK to modify", + "修改": "Modify", + "网络摄像头": "Camera", + "重命名": "Rename", + "分组下的锁将被移到未分组里": "Locks under the group will be moved to ungrouped", + "编辑成功": "Edit successful", + "厂商": "Manufacturer", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "After the password is generated, please use it once for activation before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. After the password is activated, it can be used unlimited times within the validity period.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "After the password is generated, please use it before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. The clear code is used to clear all the passwords generated before 0 o'clock today.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "After the password is generated, please use it before 23:59 on the same day, otherwise it will be invalid after 0 o'clock.", + "清空密码底部提示": "The password is valid until 23:59 on the day of emptying\n Empty Content 1: All passwords generated before 0:00 of the day (Passwords generated after 0:00 of the day are not affected by clearing passwords and can continue to be used) \nEmpty content 2: Clear passwords Clear all custom passwords (used and unused) immediately after use \nTo completely clear all passwords, use the Reset All Passwords feature", + "相机": "camera", + "相册": "photos", + "读写": "storage", + "定位": "location", + "需要访问相机权限才能拍照上传文件例如头像上传": "Access to the camera is required to take photos and upload files, such as uploading a profile picture", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Access to camera is required to upload files and avatars using album images", + "需要访问读写权限才能使用本地图片上传头像": "Access to read and write permissions is required to upload avatars using local images", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Access to location information is required to use the add key function", + "申请": "application", + "权限": "permission", + "不允许": "Not Allowed", + "允许": "Allowed", + "权限被拒绝": "Permission denied", + "请手动在系统设置中开启": "Please manually enable it in the system settings", + "权限以继续使用应用": "Permission to continue using the application.", + "去设置": "Go set it up", + "当前网络": "Current network", + "位置信息": "Location information", + "请输入wifi名称": "Please enter the wifi name", + "虹膜": "iris", + "手掌": "palm", + "商城": "mall", + "我的": "my", + "微信公众号推送": "Wechat public account", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "To open wechat to receive alarm messages, you need to pay attention to Skye Smart Lock wechat public account first, please save the QR code and use wechat to scan the Settings", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Access to Bluetooth permissions is required to use the location information of the add key function", + "请输入Email": "Enter your Email", + "请输入手机号": "Enter your phone number", + "家人到家": "Family member arrived home", + "添加家人": "Add family member", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "If the lock is not connected to the Internet,reminders for passcode, card, fingerprint, and other door opening methods cannot be sent in a timely manner.", + "消息提醒": "Reminder", + "开门通知": "Opening notice", + "N天未开门": "N days without door opening", + "门未关好": "The door is not closed", + "防拆报警": "Tamper alarm", + "低电量提醒": "Low battery", + "胁迫开门": "Forced door opening", + "有人按门铃": "Someone rings the doorbell", + "有人出现在门口": "Someone appears at the door", + "提醒方式": "Reminder method", + "开门方式": "Door opening method", + "请选择": "Please select", + "家人": "Family member", + "保存": "Save", + "APP推送": "APP push", + "管理员": "Admin", + "未启用": "Not enabled", + "已启用": "Enabled", + "省电模式": "Power saving mode", + "逗留抓拍模式": "Stay capture mode", + "实时监控模式": "Real-time monitoring mode", + "自定义模式": "Custom mode", + "猫眼设置": "Cat eye setting", + "猫眼工作模式": "Cat eye working mode", + "自动亮屏": "Automatic bright screen", + "亮屏持续时间": "Screen on time", + "逗留警告": "Stay warning", + "异常警告": "Abnormal warning", + "短信提醒": "SMS", + "邮件提醒": "Email", + "N天未开门提醒": "N days without door opening", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "If someone forces you to open lock, you can use this fingerprint. The alarm message will be sent to the administors.TO use this feature,please make sure your lock is online.", + "胁迫指纹": "Forced fingerprint", + "指纹列表": "Fingerprint list", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "After the set time, if the lock is not opened, the system will send a reminder message to the designated recipient. This function requires the lock to be connected to the internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "After enabling the reminder , when the lock battery is below 20%, 10%, and 5%, the system will send a reminder message to the designated recipient.", + "未开门时间": "Days without door opening", + "添加和使用面容开锁时:": "Add and use Face when unlocking:", + "关锁": "close lock", + "功能": "function", + "配件": "parts", + "云存": "Cloud storage", + "本地": "This locality", + "3天滚动储存": "3 days rolling storage", + "去升级": "Upgrade Now", + "下载列表": "Download list", + "已下载": "Downloaded", + "全部视频": "All videos", + "已为本设备免费提供3大滚动视频储存服务": "Three scrolling video storage services have been provided for this device free of charge", + "视频播放": "Video playback", + "全选": "All", + "请选择要删除的视频": "Please select the video you want to delete", + "请选择要下载的视频": "Please select the video you want to download", + "欢迎使用": "Welcome to use", + "用户协议和隐私政策概要": "Summary of User Agreement and Privacy Policy", + "协议概要": "Protocol Summary", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Thank you for using this application. We attach great importance to your personal information and privacy protection. Before using this product, please read it carefully", + "《用户协议》": "User Terms", + "和": "and", + "《隐私政策》": "《Privacy Policy》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "The entire content of. By clicking \"Agree\", you agree and accept all terms. If you choose not to agree, you will not be able to use our products and services and will exit the application.", + "不同意": "Disagree", + "同意": "agree", + "该功能是高级功能,请开通后再使用": "This is the advanced function. Please enable it first.", + "常用程序": "Common Programs", + "该锁已被重置": "The lock has been reset", + "需要访问读写权限才能使用手动升级固件": "Access to read and write permissions is required to manually upgrade firmware", + "错误D固件,请选择正确的文件": "Wrong firmware, please select the correct file", + "非SYD固件,请选择正确的文件": "Non SYD firmware, please select the correct file", + "文件校验失败 0x01": "File verification failed 0x01", + "解析元数据失败,请选择正确的文件": "Failed to parse metadata, please select the correct file", + "文件校验失败 0x02": "File verification failed 0x02", + "文件校验失败 0x03": "File verification failed 0x03", + "固件升级完成": "Firmware upgrade completed", + "记录": "Records", + "开通高级功能后才可以对锁进行管理": "Please enable advanced function first to manage locks.", + "去开通": "Enable", + "实名认证": "Real-name authentication", + "当前剩余数量": "Remaining", + "购买": "Buy", + "实名认证为付费功能,请购买后再使用": "Real-name authentication is a paid function, please use it after purchase", + "密码不一致哦": "The passwords are inconsistent", + "退出添加": "Quit adding", + "管理员已满": "Admin full", + "用户已满": "The user is full", + "锁上面添加指纹已满": "Add fingerprint on lock is full", + "指纹已存在": "The fingerprint already exists.", + "锁上面添加人脸已满": "Lock above add face is full", + "人脸已存在": "The face already exists", + "锁上面添加卡已满": "Lock above add card is full", + "卡已存在": "Card already exists", + "锁上面添加密码已满": "Lock above add password is full", + "密码已存在": "An Identical Passcode already exists.Please choose a different one", + "请输入密码": "Please enter password", + "暂无密码,无需重置": "No password, no need to reset", + "真实姓名": "Real name", + "身份证号": "ID number", + "请输入真实姓名": "Please enter your real name", + "请输入身份证号": "Please enter your ID number", + "请输入身份证号和真实姓名": "Please enter your ID number and real name", + "点击返回设备配对": "Tap Back to device pairing", + "无法连接?尝试升级": "Can't connect?Upgrade attempted", + "固件升级提示": "Firmware upgrade prompt", + "请先获取固件文件到手机本地,再选择升级": "Please obtain the firmware file to the local phone first, and then select Upgrade", + "固件升级中": "The firmware is being upgraded", + "取消升级": "Cancel the upgrade", + "固件传输中": "Firmware in transit", + "关闭": "Turn Off", + "传输中'": "In transit", + "操作记录": "Records", + "修改姓名": "Edit Name", + "传输中": "In transit", + "发送人": "Issued by", + "发送时间": "Time Issued", + "钥匙详情": "ekey Info", + "姓名": "Name", + "发送": "Send", + "请确认姓名全名和身份证号码是否正确": "Please confirm that the full name and ID number are correct", + "传输期间请勿离开当前页面": "Do not leave the current page during transfer", + "机型": "models", + "硬件版本": "Hardware version", + "固件版本": "Firmware version", + "手动升级": "Manual upgrade", + "设备连接中...": "Device Connecting...", + "未避免异常情况,请在门打开时升级": "Unavoidable exceptions, please upgrade when the door is open", + "钥匙无效": "The key is invalid", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Unable to Connect to the Lock.Please Restart your phone's Blutooth and try again.", + "如果是全自动锁,请使屏幕变亮": "If it is a fully automatic lock, please make the screen brighter", + "正在尝试闭锁……": "Trying to lock.Please wait...", + "清空记录": "Clear records", + "是否要删除操作记录?": "Continue to delete records?", + "被删除的记录不能恢复": "The records cannot be recovered after deleting.", + "全部事件": "All events", + "开锁事件": "Unlock event", + "异常事件": "Abnormal event", + "门铃事件": "Doorbell event", + "视频事件": "Video event", + "请开启蓝牙": "Please turn Bluetooth On", + "请选择有效日": "Please select the effective day", + "公司名字长度不能小于 6 ": "The length of the company name cannot be less than 6", + "已是最新版本": "No updates", + "一":"One", + "二":"Two", + "三":"Three", + "四":"Four", + "五":"Five", + "六":"Six", + "日":"Sun", + "新建短信模版":"Creat SMS template", + "新建邮件模版":"Creat email template", + "自定义短信模版":"SMS template", + "自定义邮件模版":"Email template", + "名称":"Name", + "星星锁": "Star lock", + "无考勤记录": "No Records", + "大家干劲十足": "Everyone comes in time", + "工作时长未出炉": "No Working Hours", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "The choice of country/region will affect data security.You have currently selected Albania,please confirm before proceeding.", + "确认国家或地区": "Confirm country/region", + "我知道了": "Got it", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "To receive important updates, please click 'OK' and enable notifications in the settings.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "After turning on, you can re-power on by long pressing the setting key on the lock, and re-add it with the APP", + "已有": "Current", + "新增": "New", + "账号格式错误": "Bad format", + "接收者信息为空": "The recipient information is empty", + "请输入时间(秒)": "Please enter the time (sec)", + "加载数据失败": "Failed to load data", + "重试": "Try Again", + "升级中,是否退出": "During the upgrade, whether to exit", + "下一步": "Next", + "公寓": "Apartment", + "个人用户": "Personal", + "星寓": "Star apartment", + "账号": "Account", + "请输入手机号或email": "Phone Number or Email", + "请输入星寓管理员的账号": "Please enter the account of the star apartment administrator", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "All data of the selected lock(s) will be permanently transferred to the recipient.", + "暂不支持跨平台转移,敬请期待": "Cross-platform transfer is not supported for the time being, please look forward to it", + "移除坏锁": "Move Faulty/Damaged Locks to Trash", + "转移确认": "Confirm Transfer", + "本次共转移": "This time a total of", + "把智能锁": "Smart lock", + "确认": "OK", + "移除成功": "Remove successfully", + "转移成功": "Transfer success", + "该已锁被删除": "The locked is deleted", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "The authorized admin can only manage passcodes,ekeys and etccreated by himself.", + "添加授权管理员": "Create Admin", + "导出记录":"Export records", + "选择时间段":"Select time period", + "导出":"Export", + "批量导出":"Batch export", + "读取记录":"Refresh Records", + "设备":"Device", + "消息":"Messages", + "智能分析":"Intelligent analytics", + "精准识别设备事件,过滤无效信息":"Accurately identify device events and filter out invalid information", + "系统设置":"System settings", + "系统的全局配置在此项内进行设置":"The global configuration of the system is set in this item", + "导出操作记录":"Export records", + "立即查看":"View", + "导出成功":"Exported successfully", + "发送钥匙": "Send ekey", + "进度": "Rate", + "失败": "Failed", + "人脸详情": "Face details", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 1.5 meters in front of the door, the face recognition unlocking will be automatically started.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.8 meters in front of the door, the face recognition unlocking will be automatically started.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.5 meters in front of the door, the face recognition unlocking will be automatically started.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "The sensing distance has been turned off, you need to manually touch any key on the keyboard to perform face recognition unlocking.", + "防误开已打开,开锁后": "The anti-mistake opening has been turned on, and after unlocking", + "秒内不可使用面容开锁": "Face unlocking cannot be used within seconds", + "掌静脉": "Palm vein", + "添加掌静脉": "Add palm vein", + "胁迫掌静脉": "Forced palm vein", + "请不要将胁迫掌静脉用于日常开锁": "Please do not use coercion palm veins for daily unlocking", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Connected to the lock, please naturally open your palm, the palm is facing the camera", + "掌静脉详情": "Palm vein details", + "掌静脉号": "Palm vein number", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth is not turned on, please turn on Bluetooth in the settings", + "删除用户时,会将用户拥有的钥匙一起删除。": "If a User is DELETED any ekeys associated with the User will also be DELETED.", + "配置网络": "Configure network", + "你好": "Hello", + "成功": "successful", + "类型选择": "Type select", + "请选择要使用哪种类型": "Please select which type to use", + "系统邮件(推荐)": "System email (Recommended)", + "系统短信(推荐)": "System SMS (Recommended)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "The email will be sent from this App.Please buy email package first.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "The SMS will be sent from this App.Please buy email package first.", + "个人邮件": "Personal email", + "个人短信": "Personal SMS", + "邮件将从你的个人邮箱发给用户": "The email will be sent from your personal email account.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "The SMS message will be sent from your personal phone number.You pay to your telecom operator.", + "为了更好地应用体验,请确定权限": "For a better application experience, please confirm the permissions", + "您第一次拒绝权限,请确定权限": "You refused permission for the first time, please confirm the permission", + "您第二次拒绝权限,请去应用设置开启权限": "You refused permission for the second time, please go to the application settings to enable permission", + "去应用市场": "Go to the app store", + "温馨提示": "Warm prompt", + "关闭应用": "Close the application", + "开启微信接收报警消息需要先关注": "To open WeChat to receive alarm messages, you need to follow", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat public account, save the QR code and use WeChat to scan the settings", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Real-name authentication is a paid function, please contact the lock administrator to purchase and use", + "位置权限": "Location permission", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Please grant the App to use your locatian.It is used to scan BLE locks and gateways.", + "相机/相册权限": "Camera/Album permission", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Please grant the App to read and write photo and files from Storage.", + "点击选择": "Click to select", + "微信": "WeChat", + "朋友圈": "Moments", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "FaceBook", + "链接": "Link", + "今天": "Today", + "密码错误": "Invalid Password", + "网络中断": "Network interruption", + "钥匙不存在": "Key does not exist", + "钥匙过期": "Key expired", + "钥匙已存在": "Key already exists", + "密码失效": "Password invalid", + "门锁时间异常": "Door lock time abnormal", + "APP(手机)未联网": "APP (mobile phone) is not connected to the Internet", + "数据不存在": "Data does not exist", + "待接收": "BeReceived", + "已冻结": "Frozen", + "已删除": "Deleted", + "未知": "Unknown", + "拖动下方滑块完成拼图": "Drag the slider to the correct postion", + "验证成功": "Verification success", + "验证失败": "Verification failed", + "向右拖动滑块填充拼图": "Drag the slider to the right to fill the puzzle", + "请先获取到位置信息哦": "Please get the location information first", + "请选择国家": "Please select a country", + "获取锁信息": "Get lock information", + "锁数据异常,请重试": "Lock data is abnormal, please try again", + "连接设备中...": "Connecting device...", + "把锁": "locks", + "条": "strip", + "封": "seal", + "次": "times", + "支付成功": "Pay success", + "查看详情": "View details", + "请输入模板名称": "Please enter template name", + "模版类型": "Type", + "再返回一次退出": "Exit again", + "请先添加锁": "Please add the lock first", + "可视对讲": "Visual intercom", + "详细日志": "Detailed log", + "已复制到剪切板": "Copied", + "拍照": "Photo", + "从相册选择": "Choose from album", + "选择问题": "Please Select a Question", + "确认长度不足8位": "Confirm length less than 8 digits", + "新密码长度不足8位": "New password length less than 8 digits", + "两次密码不一致": "Password Mismatch.Please try again", + "请点击获取验证码,验证码将发送到": "Please get a verification code.The code will be sent to", + "切换": "Switch", + "验证": "Verify", + "验证成功,账号已删除": "Verification successful, account deleted", + "该密码不是自定义密码,无法修改": "This password is not a custom password and cannot be modified", + "请选择设备要关联哪些姓名": "Please select which names the device should be associated with", + "请选择姓名要关联哪些设备": "Please select which devices the name should be associated with", + "确定要移除所选中的坏锁吗?": "Remove the malfunctioning lock?", + "邮件通知": "Notify via email", + "短信通知": "Notify via SMS", + "您好,您的授权管理员生成成功": "Hello, your authorized administrator has been generated successfully", + "请输入接收者姓名": "Please enter here", + "版本更新": "Version update", + "下次再说": "Next time", + "配网成功": "Network distribution success", + "配网失败": "Network distribution failed", + "该锁的无线键盘都将被删除": "All wireless keypads for this lock will be DELETED", + "实时画面": "Real-time picture", + "适合门口较为安全的环境。": "Suitable for relatively safe environments at the door.", + "仅发生特定事件才录像,并可查看实时画面。": "Only specific events are recorded and the real-time picture can be viewed.", + "一般情况下,满电可使用7-8个月": "Under normal circumstances, it can be used for 7-8 months when fully charged", + "有人逗留或发生特定事件才录像,可随时查看": "Someone stays or specific events are recorded, and can be viewed at any time", + "实时画面。": "Real-time picture.", + "一般情况下,满电可使用5~6个月。": "Under normal circumstances, it can be used for 5~6 months when fully charged.", + "适合门口人员复杂、较不安全的环境。": "Suitable for complex and relatively unsafe environments at the door.", + "有人出现就录像,可随时查看实时画面。": "Record when someone appears, and view the real-time picture at any time.", + "一般情况下,满电可使用2~4个月。": "Under normal circumstances, it can be used for 2~4 months when fully charged.", + "根据您家门口实际情况设置录像和实时画面功能。": "Set the video and real-time picture functions according to the actual situation at your door.", + "可使用时长由具体设置决定。": "The duration of use is determined by the specific settings.", + "查看": "View", + "有人按门铃或发生": "Someone rings the doorbell or", + "异常事件时": "abnormal event", + "不录像": "No video", + "有人出现、按门铃": "Someone appears, rings the doorbell", + "或发生异常事件时": "or an abnormal event occurs", + "逗留达到10秒": "Stay for 10 seconds", + "约1.5米": "About 1.5 meters", + "随时":"Anytime", + "立即录像": "Record immediately", + "录像时机": "Video timing", + "有人出现时录像": "Record when someone appears", + "人体侦测距离": "Human detection distance", + "查看实时画面": "View real-time picture", + "自定义时间": "Custom time", + "当日": "Today", + "次日": "Next day", + "自定义时段": "Custom time period", + "发生事件时查看": "View when an event occurs", + "实时查看": "Real-time view", + "有人在门口出现10秒后开始录像。": "Someone appears at the door for 10 seconds before recording.", + "有人按门铃时立即录像。": "Record immediately when someone rings the doorbell.", + "有人出现在门前1.5米范围时启动录像": "Start recording when someone appears within 1.5 meters in front of the door", + "约0.8米": "About 0.8 meters", + "约3.0米": "About 3.0 meters", + "添加指纹失败": "Operation failed.", + "项": "items", + "播放中": "Playing", + "下载": "Download", + "暂无下载内容": "No download content", + "亮度": "Brightness", + "音量": "Volume", + "快进至": "Fast forward to", + "快退至": "Rewind to", + "暂无视频信息": "No video information", + "加载出错": "Loading error", + "请单人正对门锁,距离一个成年人手臂长度": "Please stand in front of the door lock alone, at an arm's length", + "(约0.6米)。": "(about 0.6 meters).", + "保持脸部无遮挡,露出五官。": "Keep your face unobstructed and show your facial features.", + "准备好了,开始添加": "Ready, start adding", + "正在录入中...": "Recording...", + "添加人脸失败": "Failed to add face", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "After resetting, the faces of the lock will be deleted. Are you sure you want to reset?", + "人脸号": "Face number", + "虹膜详情": "Iris details", + "虹膜号": "Iris number", + "选择设备类型": "Select device type", + "照明灯具": "Lighting fixtures", + "电动窗帘": "Electric curtains", + "门窗传感器": "Door and window sensor", + "传感器": "Sensor", + "清除数据成功": "Data cleared successfully", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "The lock is not connected to the internet,so the recods of passcode,card,fingerprint,and other door opening methods cannot be uploaded in real-time.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "If you need to keep the historical records,you can export the them.", + "看不到操作记录,可能原因有": "Cannot see the operation records,possible reasons", + "操作记录详情": "Operation record details", + "操作时间": "Operation time", + "此模块功能需要锁联网后设置方可生效": "This module function needs to be set after the lock is connected to the Internet to take effect", + "用户已存在": "User already exists", + "钥匙数量已到上限": "The number of keys has reached the upper limit", + "附近没有可用网关": "There is no available gateway nearby", + "正在创建安全连接...": "Creating a secure connection...", + "监视状态下不能发送录音": "Cannot send recordings in monitoring mode", + "挂断": "Hang up", + "监视中暂不能开锁": "Unlocking is not available during monitoring", + "长按说话": "Press and hold to speak", + "松开发送": "Release to send", + "请输入6位数字开锁密码": "Please enter a 6-digit unlock password", + "请输入开锁密码": "Please enter the unlock password", + "接收者在有效期内可以不限次数使用": "Recipients are able to use the ekeys for unlimited times within the validity period.", + "接收者可以使用此App开关锁": "Recipient are able to Lock/Unlock by this App.", + "单次钥匙有效期为1小时,只能使用一次": "The One-time ekey is valid for ONE hour and can only be used ONCE.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Recipients are able to use the ekeys for unlimited times within the fixed cycle time.", + "获取模板失败": "Failed to get the template", + "微信通知": "WeChat notification", + "系统短信": "System SMS", + "系统邮件": "System email", + "模板": "Template", + "新建模版": "Create template", + "您好,您的密码是": "Hello, your password is", + "密码名字": "Password name", + "请输入6-9位密码": "Please enter a 6-9 digit password", + "设置密码": "Set password", + "操作成功,密码为": "Succeeded.The Passcode is", + "类型:自定义-永久": "Type:Custom-Permanent", + "实时播放": "Real-time playback", + "点击对讲": "Click to intercom", + "长按开锁": "Long press to unlock", + "接听失败": "Failed to answer", + "请在锁设置中开启远程开锁": "Please enable remote unlocking in the lock settings", + "接听": "Answer", + "截图已保存到相册": "Screenshot saved to album", + "添加遥控": "Add remote control", + "已连接到锁,请按遥控": "Connected to the lock, please press the remote control", + "遥控号": "Remote control number", + "遥控详情": "Remote control details", + "照明": "Lighting", + "退出演示模式": "Exit demo mode", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tip: The current interface is a display interface. After adding the device, you can continue to use it", + "门已上锁": "The door is locked", + "您的账号在异地登录,如非本人,请尽快修改密码": "Your Account has been used to Login from a New Device", + "开门成功": "Open the door successfully", + "开门失败": "Failed to open the door", + "呼叫提醒": "Call reminder", + "收到来自": "Received from", + "锁的呼叫": "Lock call", + "加载数据中": "Loading data", + "搜索所有锁类型": "Search all lock types", + "锁电量更新时间": "Lock battery update time", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "May", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Oct", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Hot cities", + "导出锁数据": "Export lock data", + "一键开锁": "One-click unlock", + "已开通": "Opened", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "After reset, the metacarpal veins of the lock will be deleted. Are you sure you want to reset?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Purchase record", + "使用记录": "User Record", + "失效时间要大于当前时间": "The expiration time must be longer than the current time", + "修改名字": "Edit name", + "时": "hour", + "分": "minute", + + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "You can use Alexa to unlock, lock and check the lock status", + "支持的国家": "Supported countries", + "支持的国家值": "USA, Canada, UK, Australia, India, Germany, France, Italy, Spain, Japan", + "操作流程": "Operation process", + "操作流程值":"1 Add a lock and gateway with the Smart lock APP \n\n2 Enable the remote unlocking function of the lock in the APP (this function is turned off by default). If you do not have this option, the lock does not support Alexa \n\n3 Add skills to Alexa and authorize them with the Smart lock APP's account and password. After the authorization is successful, you can discover devices under the account \n\n4 Locate the lock in the Alexa app, turn on the voice unlock function, and set the language password \n\n5 The lock can be operated through Alexa", + "Google Home": "Google Home", + "Action name": "Action name", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Supported languages", + "英语": "English", + "Google Home操作流程的值": "1. Use the Smart lock APP to add locks and gateways \n\n2. Enable the remote unlocking function of the lock in the APP (this function is turned off by default). Without this option, the lock does not support Google Home \n\n3. Install the Google Home APP and click the \"+\" button in the top left corner \n\n4. On the Settings page, select \"Work with Google\" \n\n5. Search for \"ScienerSmart\" and use the smart lock APP account and password to authorize", + + "密码需至少包含数字/字母/字符中的2种组合": "The password must contain at least 2 of the following: numbers, letters, and special characters", + "已开锁": "Unlocked", + "已闭锁": "Locked", + "两次密码不一致哦": "The passwords are inconsistent", + + "中功率": "Medium power", + "常规使用": "Regular use", + "扫描设备": "Scan device", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Deletion failed. The gateway may have gone offline. Do you want to force delete the data?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} diff --git a/lan/lan_es.json b/lan/lan_es.json new file mode 100644 index 00000000..79c49887 --- /dev/null +++ b/lan/lan_es.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Estrella de bloqueo", + "锁通通": "Bloqueo a través", + "点击开锁,长按闭锁": "Toque para desbloquear, mantenga presionado para bloquear", + "考勤": "Asistencia", + "考勤设置": "Configuración de asistencia", + "电子钥匙": "EKeys", + "添加卡": "Agregar tarjeta", + "卡号": "Número de tarjeta", + "添加指纹": "Añadir huella digital", + "指纹号": "Número de huella dactilar", + "遥控": "Remoto", + "添加人脸": "Añadir cara", + "门锁日志": "Registro de cerradura de puerta", + "密码号": "Número de contraseña", + "添加者": "Operador", + "添加时间": "Tiempo", + "重置": "Restablecer", + "请输入手机号或者邮箱": "Teléfono/email", + "工作时间": "Tiempo de trabajo", + "工作日设置": "Configuración de Workday", + "星期一": "Lunes", + "星期二": "Martes", + "星期三": "Miércoles", + "星期四": "Jueves", + "星期五": "Viernes", + "星期六": "Sábado", + "星期日": "Domingo", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Por Thu", + "周五": "Fri", + "周六": "Sáb", + "周日": "Sol", + "群发钥匙": "Enviar múltiples ekeys", + "锁": "Cerradura", + "请添加": "Destinatario", + "允许远程开锁": "Desbloqueo remoto", + "请输入验证码": "Código de verificación", + "获取密码": "Generar código de acceso", + "请给密码命名": "Introduzca un nombre para esta contraseña", + "密码有限期为6个小时,只能使用一次": "Este código de acceso DEBE SER utilizado dentro de las 6 horas a partir de la hora actual o será SUSPENDIDO por razones de seguridad.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Introduzca manualmente 6-9 dígitos como la contraseña. Se puede agregar por teléfono Bluetooth al lado de la cerradura, o agregar de forma remota a través de la puerta de enlace", + "获取": "Obtener", + "添加": "Añadir", + "删除公司": "Eliminar empresa", + "密码详情": "Información de contraseña", + "修改密码": "Cambiar código de acceso", + "添加虹膜": "Añadir Iris", + "添加门磁": "Sensor de puerta", + "添加无线键盘": "Teclado inalámbrico", + "添加手掌": "Añadir palma", + "请输入员工账号": "Entrar en la cuenta del empleado", + "批量授权锁": "Otorgar bloqueos múltiples", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "El administrador autorizado tendrá permiso mayoritario para operar este bloqueo.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Esta característica le permite desbloquear el Smart Lock remotamente a través de una puerta de enlace. Esta característica sólo se puede encender o apagar a través de Bluetooth.", + "排列方式": "Tipo de lista", + "早到榜": "Lista temprana", + "迟到榜": "Lista tardía", + "当前模式": "Modo actual", + "勤奋榜": "Lista de trabajo duro", + "延迟时间": "Tiempo de retardo", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "El bloqueo se bloqueará automáticamente después de la hora. por favor, desbloquearlo por una vez primero para hacer la configuración disponible.", + "时间": "Tiempo", + "开始时间": "Hora de inicio", + "结束时间": "Hora de finalización", + "工作时间设置": "Ajuste del tiempo de trabajo", + "常开模式": "MODO DE Pasaje", + "常开时间": "En este período de tiempo", + "常开日期": "En estos días", + "添加员工": "Agregar personal", + "节假日": "Vacaciones", + "打卡方式": "Método", + "员工是否有钥匙": "Ya tiene Ekey", + "上班时间": "Tiempo de inicio", + "下班时间": "Tiempo de cierre", + "本周": "Esta semana", + "单休": "Fin de semana de un día", + "双休": "Fin de semana de dos días", + "单双休": "Un fin de semana de dos días", + "年": "Año", + "月": "Mes", + "放假日期": "Vacaciones", + "补班日期": "Días de trabajo", + "添加假日": "Agregar vacaciones", + "开始日期": "Fecha de inicio", + "必填": "Necesario", + "结束日期": "Fecha de finalización", + "日榜": "Diario", + "月榜": "Mensual", + "考勤记录": "Registros", + "假日信息": "Información de vacaciones", + "基本信息": "Fundamentos", + "无线键盘": "Teclado inalámbrico", + "选择无线键盘": "Añadir teclado", + "门磁": "Sensor de puerta", + "自动闭锁": "Cerradura auto", + "锁声音": "Bloqueo de sonido", + "防撬报警": "Alerta de manipulación", + "重置键": "Botón Reset", + "锁时间": "Cerradura Reloj", + "诊断": "Diagnosticar", + "上传数据": "Cargar datos", + "导入其他锁数据": "Importación frame otra cerradura", + "锁升级": "Actualización de firmware", + "标记房态": "Estado de la habitación", + "开锁提醒": "Notificación de desbloqueo", + "微信二维码": "Desbloquear código QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Las personas con llaves electrónicas pueden abrir la puerta escaneando este código QR a través de WeChat. El código QR de cada cerradura es diferente. Puede imprimirlo y pegarlo junto a la cerradura correspondiente", + "锁编号": "Número de bloqueo", + "电量": "Batería", + "锁分组": "Grupo de bloqueo", + "选择分组": "Seleccionar grupo", + "创建新分组": "Crear un grupo", + "管理员开锁密码": "Admin Código de acceso", + "更新": "Actualización", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "El nivel de la batería será actualizado por gateway o teléfono bluetooth", + "当屏幕闪烁时,点击下一步": "Haga clic en Siguiente cuando el teclado parpadee", + "输入*529#或按设置键": "Ingrese README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # o presione la tecla Configuración", + "长按重置键2秒": "Presione y mantenga pulsado el botón de reinicio 2 segundos", + "附近的设备": "Equipos cercanos", + "暂无数据": "Sin datos", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Podrá obtener el estado de la puerta con un sensor de puerta junto con una puerta de enlace. Solo se permite asociar un sensor con una cerradura.", + "开始": "Inicio", + "全天": "Todas las horas", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Puede establecer varios períodos de tiempo para el modo de paso. Dentro de los períodos de tiempo establecidos, el bloqueo permanecerá en un estado abierto después de desbloquearse.", + "请选择锁音量": "Seleccione el volumen de bloqueo", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Al encender, escuchará el sonido de la cerradura", + "低": "Bajo", + "较低": "Medio bajo", + "中": "Medio", + "较高": "Medio alto", + "高": "Alto", + "开启后,锁被撬动时,会发出报警声": "Al activarse, se habilita la alerta TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Al desactivar, el botón RESET se desactiva.", + "校准时间": "Calibrar tiempo", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "El diagnóstico es leer la información de configuración dentro de la cerradura y cargarla para que el personal pueda analizar la causa de la falla", + "上传": "Cargar", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Cargar datos del bloqueo al servidor. Puede tardar varios minutos", + "请选择要从哪把锁导入": "Seleccione un bloqueo para importar", + "有新版本": "Tener nueva versión", + "当前版本": "Versión actual", + "升级": "Actualización", + "空闲": "Vacante", + "已入住": "Ocupado", + "多语言": "Idiomas", + "添加锁": "Añadir bloqueo", + "锁地址": "Dirección de bloqueo", + "选择锁类型": "Seleccionar tipo de bloqueo", + "NFC无源锁": "Cerradura pasiva de NFC", + "添加设备": "Agregar dispositivo", + "网关": "Puerta de enlace", + "客服": "Servicio al cliente", + "设置": "Configuración", + "更多设置": "Más Set", + "消息推送": "Notificación push", + "锁用户管理": "Bloquear usuarios", + "拥有的钥匙": "EKeys asociadas con este usuario", + "批量授权": "Gestión de la autoridad", + "关联设备": "Dispositivo asociado", + "关联姓名": "Nombre asociado", + "转移智能锁": "Cerradura de la transferencia", + "选择锁": "Bloqueo de pantalla", + "接收人信息": "Destinatario", + "转移网关": "Puerta de enlace de transferencia", + "锁屏": "Bloqueo de pantalla", + "已关闭": "Apagado", + "已开启": "En", + "开启": "Gire en", + "确定要开启重置键?": "¿Seguir activando el botón Reset?", + "确定要关闭重置键?": "¿Continuar desactivando el botón Reset?", + "隐藏无效开锁权限": "Ocultar el acceso no válido", + "APP开锁时需手机连网的锁": "Cerraduras que requieren teléfono en línea", + "增值服务": "Servicios", + "关于": "Acerca de", + "退出": "Cerrar sesión", + "删除账号": "Eliminar cuenta", + "个人信息": "Información de la cuenta", + "头像": "Avatar", + "昵称": "NickName", + "请输入昵称": "Ingrese su apodo", + "修改昵称": "Cambiar nombre", + "修改账号": "Editar cuenta", + "重置密码": "Restablecer contraseña", + "安全问题": "Pregunta de seguridad", + "为了你的账号安全,修改账号前请先使用验证码验证": "Para la seguridad de su cuenta, utilice la verificación de la contraseña de la cuenta antes de modificar la cuenta", + "请输入新账号": "Por favor ingrese la nueva cuenta", + "找回密码和登录新设备时,可通过绑定的手机验证": "El número de teléfono vinculante se utilizará para recibir el código de verificación.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "El correo electrónico vinculante se utilizará para recibir el código de verificación.", + "原密码": "Contraseña actual", + "新密码": "Nueva contraseña", + "确认密码": "Confirmar contraseña", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "En caso de que pierda su teléfono, puede iniciar sesión en el nuevo teléfono respondiendo preguntas de seguridad.", + "问题一": "Pregunta 1", + "问题二": "Pregunta 2", + "问题三": "Pregunta 3", + "请输入你的答案": "Escriba su respuesta", + "即将到期": "Expira pronto", + "去授权": "Ir a autorizar", + "修改名称": "Editar nombre", + "状态": "Estado", + "WiFi名称": "Nombre Wifi", + "网络MAC": "MAC de red", + "网关升级": "Actualización de Gateway", + "网关连接的锁": "Bloqueo (s) conectado (s) a esta puerta de enlace", + "信号强": "Fuerte", + "选择网关类型": "Elegir tipo de puerta de enlace", + "添加网关": "Agregar puerta de enlace", + "重新通电": "Re conectar el poder", + "指示灯": "Luz indicadora", + "选择网关": "Elegir puerta de enlace", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G no es compatible, Seleccione un WiFi de 2,4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "Ingrese la contraseña de WiFi", + "网关名称": "Nombre de la puerta de enlace", + "请输入网关名称": "Introducir nombre de puerta de enlace", + "IP地址": "Dirección IP", + "子网掩码": "Máscara de subred", + "默认网关": "Puerta de enlace predeterminada", + "自动获取DNS服务器地址": "Obtener automáticamente la dirección del servidor DNS", + "首选DNS": "DNS preferido", + "备选DNS": "DNS Alternativo", + "不使用静态IP": "No se utiliza IP estática", + "使用静态IP": "Usar IP estática", + "请输入IP地址": "Ingrese la dirección IP", + "请输入子网掩码": "Introducir máscara de subred", + "请输入默认网关": "Entrar en la puerta de enlace predeterminada", + "所有锁": "Todas las cerraduras", + "搜索所有类型的锁": "Escanear todo tipo de cerraduras", + "门锁": "Cerradura de puerta", + "挂锁": "Candado", + "保险箱锁": "Cerradura segura", + "智能门禁": "Control de acceso inteligente", + "车位锁": "Bloqueo de estacionamiento", + "摸亮触摸屏": "Toque cualquier tecla para activar el teclado", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Toque cualquier tecla para activar el bloqueo y póngalo en modo de emparejamiento. Pulse Siguiente", + "附近的锁": "Cerraduras cercanas", + "如需修改名字请重新命名,点击确定添加锁": "Si desea cambiar el nombre, cambie el nombre, haga clic en Aceptar para agregar bloqueo", + "添加锁时,手机必须在锁旁边": "Al agregar un bloqueo, el teléfono debe estar al lado del bloqueo.", + "登录": "Login", + "注册": "Registro", + "我已阅读并同意": "He leído y estoy de acuerdo", + "验证码": "Código", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Su contraseña debe tener de 8 a 20 caracteres e incluir un mínimo de dos tipos de números, letras y símbolos.", + "手机": "Teléfono", + "邮箱": "Correo electrónico", + "请输入邮箱": "Ingrese su correo electrónico", + "国家/地区": "País/Región", + "你所在的国家/地区": "Su país/región", + "选择国家/地区": "Elige tu país o región", + "获取验证码": "Obtener código", + "商务合作": "Negocio", + "电脑网页版": "Sistema Web", + "酒店系统": "Sistema del hotel", + "说明书网页版": "Manual del usuario", + "高级功能": "Función avanzada", + "记录保存": "Retención de registros", + "您可通过短信将密码、电子钥匙信息发给接收人。": "El SMS se puede utilizar para enviar código de acceso e información clave al destinatario.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "El correo electrónico se puede utilizar para enviar el código de acceso y la información clave al destinatario.", + "购买实名认证提示": "Después de habilitar la función, debe usar su huella digital, rostro o contraseña de cuenta para abrir la aplicación. No hay necesidad de verificar de nuevo durante 3 minutos", + "请选择你希望的实名认证频次": "Seleccione la frecuencia de autenticación de nombre real que desee", + "仅首次": "Por primera vez", + "每日一次": "Una vez al día", + "每周一次": "Una vez a la semana", + "每月一次": "Una vez cada mes", + "当前状态": "Estado actual", + "试用中": "En el juicio", + "高级功能权益内容": "Funciones avanzadas", + "短信模板": "Plantilla SMS", + "邮件模板": "Plantilla de correo electrónico", + "发卡工具": "Codificador de tarjeta", + "购买高级功能须知": "Aviso", + "购买高级功能提示": "Las funciones más avanzadas están en desarrollo, y si las necesita, puede abrir el servicio en función del número de bloqueos. Las características avanzadas sólo están disponibles para sus propias cerraduras. Si usted es un administrador autorizado, póngase en contacto con el administrador superior de la cerradura para abrir el servicio", + "免费体验": "Prueba gratuita", + "立即开通": "Abrir ahora", + "购买短信": "Comprar SMS", + "购买邮件": "Comprar correo electrónico", + "购买实名认证次数": "Tiempos de autenticación de nombre real de compra", + "开通高级功能": "Habilitar función avanzada", + "选择套餐": "Elegir paquete", + "支付方式": "Modo de pago", + "支付宝": "Alipay", + "去支付": "Pagar", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Se le permite definir el mensaje por sí mismo. Se utiliza para enviar información de código de acceso y clave a otros.", + "高级功能仅能用于你自己的锁": "La función avanzada sólo se puede aplicar sus propios bloqueos.", + "新建模板": "Plantilla de Creat", + "类型": "Tipo", + "模版内容": "Contenido de la plantilla", + "预览": "Vista previa", + "房间名": "Habitación", + "预计产生短信条数": "Segmentos de mensaje estimados", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Esta función le permite ocultar códigos de acceso, llaves, tarjetas y huellas dactilares que no son válidos durante un período de tiempo.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Se requiere que el teléfono del usuario esté en línea para desbloquear estos bloqueos seleccionados con APP.", + "配置WiFi": "Configuración de WiFi", + "请输入WiFi名字": "Introduzca el nombre de Wifi", + "WiFi配网": "Red de distribución WiFi", + "胁迫卡": "Tarjeta Estrés", + "员工是否有密码": "Ya tiene código de acceso", + "员工是否有卡": "Ya tiene la tarjeta", + "员工是否有指纹": "Ya ha establecido la huella dactilar", + "获取钥匙": "Obtener clave", + "获取卡": "Obtener tarjeta", + "获取指纹": "Obtener huella dactilar", + "安全验证": "Verificación de identidad", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toda la información de su cuenta se eliminará de la plataforma de forma permanente y no se podrá recuperar.", + "监控": "Monitor", + "视频日志": "Registro de vídeo", + "开门器": "Abrelatas de la puerta", + "面容开锁": "Desbloquea la cara", + "开门方向设置": "Conjunto de dirección de apertura", + "电机功率设置": "Configuración de MotorPower", + "开锁时是否需联网": "Si se requiere Internet al desbloquear", + "选择要加入分组的锁": "Seleccionar lockS para agregar a este grupo", + "锁数量": "Conteo de bloqueo", + "小米IOT平台": "Plataforma Xiaomi IOT", + "面容开锁设置": "Cara Desbloquea Set", + "感应距离": "Distancia de detección", + "防误开": "Evitar una apertura incorrecta", + "防误开已关闭,关门后仍可使用面容开锁": "Evitar que se haya cerrado la apertura incorrecta, después de cerrar la puerta aún puede usar desbloqueo facial", + "添加和使用面容开锁时": "Añadir y usar cara al desbloquear", + "添加和使用面容开锁时提示": "\n1, por favor trate de mantener a una sola persona frente a la operación de la puerta;\n2, por favor, póngase delante de la cerradura de la puerta alrededor de 0,5 ~ 0,8 metros, frente a la cerradura de la puerta;\nPor favor, mantenga su cara sin obstrucciones y exponga sus rasgos faciales;\n4. cuando el reconocimiento facial es anormal, puede tocar cualquier tecla en el teclado digital para reiniciar el reconocimiento facial manualmente.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Elija la potencia del motor cuidadosamente según la situación real de la cerradura de la puerta:", + "小功率:": "Miniwatt:", + "耗电少": "Menos consumo de energía", + "大功率": "Alta potencia:", + "大功率提示": "Si la lengüeta de la cerradura no puede ser retraída normalmente al desbloquear, o necesita ser conducida", + "开门方向设置提示": "Por favor elija cuidadosamente la dirección para abrir la puerta de su casa (si elige la dirección incorrecta, no podrá abrir y cerrar la puerta correctamente):", + "左开": "Abierto a la izquierda", + "右开": "Abrir derecho", + "判断方法:": "判断方法:", + "判断方法内容": "El hombre estaba fuera de la casa, frente a la puerta de entrada.", + "录像时段": "Ranura de vídeo", + "密码": "Códigos de acceso", + "卡": "Tarjetas", + "指纹": "Huella dactilar", + "人脸": "Cara", + "配件商城": "Centro comercial Lock", + "公司名称": "Nombre de la empresa", + "请输入公司名字": "Introduzca el nombre de la empresa", + "提示": "Hint", + "是否删除?": "¿Si eliminar?", + "员工信息": "Información del personal", + "员工": "Personal", + "打卡方式无效": "No disponible", + "中国": "China", + "选择钥匙": "Elegir eKey", + "编辑": "Editar", + "无": "No", + "有": "Sí", + "请输入姓名": "Introduzca un nombre", + "获取人脸": "Obtención de rostros", + "选择密码": "Elegir código de acceso", + "选择卡": "Elegir tarjeta", + "选择指纹": "Elegir huella dactilar", + "选择人脸": "Seleccionar cara", + "员工是否有人脸": "Si el empleado tiene rostro", + "同时删除员工钥匙": "Borrar su Ekey", + "删除": "Dlet", + "确定要删除员工吗?": "Eliminar este empleado", + "月统计": "Estadísticas mensuales", + "迟到": "Tarde", + "早退": "Salir temprano", + "未打卡": "Sin registro", + "钥匙将在": "Este Ekey expirará en", + "天后失效": "Día (s)", + "电量更新时间:": "Tiempo de actualización de la batería:", + "新增配件": "Añadir", + "钥匙不可用": "La clave no está disponible", + "正在开锁中...": "Desbloquear...", + "你的钥匙": "Tu clave", + "常开模式启动!长按闭锁": "¡Se ha iniciado el modo abierto! Prensa larga para bloquear", + "演示模式": "Modo de demostración", + "请先同意用户协议及隐私政策": "Por favor, acepte primero el acuerdo de usuario y la política de privacidad", + "用户协议": "Términos del usuario", + "隐私政策": "Política de privacidad", + "注册成功": "Registro exitoso", + "你所在的": "Estás en", + "手机号": "Número de teléfono", + "忘记密码": "Olvidó la contraseña", + "重置成功": "Restablecer el éxito", + "确定要退出吗?": "¿Salida?", + "功能暂未开放": "La función aún no está abierta", + "设置成功": "Configurar con éxito", + "删除成功": "Eliminar correctamente", + "单次": "De una sola vez", + "永久": "Permanente", + "限时": "Temporizado", + "自定义": "Personalizado", + "清空码": "Borrar", + "循环": "Recurrente", + "工作日": "Día de trabajo", + "每日": "Diario", + "周末": "Fin de semana", + "确定要删除吗?": "¿Eliminar?", + "该锁的密码都将被删除": "Todos los códigos de acceso para este bloqueo serán", + "已过期": "No válido", + "该锁的电子钥匙都将被删除": "Todas las eKeys para este bloqueo serán", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "SUPRIMIR Todas las teclas asociadas a esta tecla. Este paso no se puede deshacer.", + "删除钥匙会在用户APP连网后生效": "La clave será SUPRIMADA", + "有效时间": "Tiempo efectivo", + "接收者": "Destinatario", + "仅管理自己创建的用户": "Administrar sólo sus propios usuarios", + "远程开锁": "Desbloqueo remoto", + "请输入钥匙名称": "Introduzca el nombre de la clave", + "修改成功": "Modificar éxito", + "冻结": "Congelar", + "解除冻结": "Deshielo", + "授权": "Autorizar", + "取消授权": "Desautorizar", + "同时解冻其发送的钥匙": "Descongelar todos los keys emitidos por este usuario", + "会在用户APP连网后生效": "Esta tecla se descongesará cuando la APP del usuario se conecte a una red", + "同时冻结其发送的钥匙": "Congelar todos los ekeys emitidos por este usuario", + "冻结会在用户APP连网后生效": "Esta clave se CONGELANDO cuando la APP del Usuario se conecte a una Red", + "取消授权会在用户APP连网后生效": "El Usuario LOSE sus Permisos cuando la APP del Usuario se conecte a una Red", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "El usuario autorizado tiene casi los mismos permisos que el LOCK Manager (por ejemplo, la capacidad de enviar claves y códigos de acceso)", + "失效时间需晚于生效时间": "El tiempo de expiración debe ser posterior al tiempo efectivo", + "生效时间需晚于当前时间": "La hora efectiva debe ser posterior a la hora actual", + "失效日期需晚于生效日期": "La fecha de vencimiento debe ser posterior a la fecha efectiva", + "修改有效期": "Período de cambio", + "生效日期": "Fecha de inicio", + "失效日期": "Fecha de finalización", + "开锁": "Desbloquear", + "开锁成功": "Desbloquear el éxito", + "请选择锁": "Seleccione las cerraduras", + "请选择接收者": "Seleccione el receptor", + "请选择有效期": "Seleccione el período de validez", + "请选择发送方式": "Seleccione el método de envío", + "请选择结束时间": "Seleccione la hora de finalización", + "完成": "Completa", + "有效日": "Ciclo en", + "发送成功": "Enviar éxito", + "请选择开始时间": "Seleccione la hora de inicio", + "选择用户": "Seleccionar destinatarios", + "已选中": "Seleccionado", + "确定": "OK", + "请选择要发送的锁": "Seleccione las cerraduras", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Face autenticación de nombre real se refiere a la necesidad del usuario de verificar su rostro antes de desbloquear la aplicación del teléfono, y la verificación se puede desbloquear.", + "分享": "Compartir", + "请输入接收者账号": "Introduzca la cuenta del receptor", + "接收者号码未注册,请重新发送": "El número del receptor no está registrado, por favor reenvíe", + "是否发送电子钥匙给未注册账号": "Desea enviar una clave a una nueva cuenta", + "取消": "Cancelar", + "标记成功": "Marca el éxito", + "微信好友": "Amigos de WeChat", + "短信": "SMS", + "邮件": "Correo electrónico", + "更多": "Más", + "您好,您的电子钥匙生成成功": "Hola, su clave electrónica se genera con éxito", + "生效时间不能小于当前时间": "El tiempo efectivo no puede ser menor que el tiempo actual.", + "结束时间不能小于当前时间": "El tiempo final no puede ser menor que el tiempo actual", + "是否为管理员": "¿Es un administrador", + "已连接到锁,请将卡靠近门锁的读卡区": "Conectado. Coloque la tarjeta contra el lector de tarjetas", + "尝试连接设备...": "Conectando con bloqueo. Espere...", + "地理位置": "Ubicación geográfica", + "检查以确保以下地址是正确的": "Compruebe para asegurarse de que la siguiente dirección es correcta", + "地图加载中,请稍候。。": "El mapa se está cargando, por favor espere...", + "跳过": "Omitir", + "还未获取到位置信息哦,请耐心等待一下!": "La información de ubicación aún no se ha obtenido, ¡espere pacientemente!", + "请填写信息": "Por favor, rellene la información", + "有效期": "Período de validez", + "生效时间": "Hora de inicio", + "失效时间": "Hora de finalización", + "上传成功": "Cargado correctamente", + "未生效": "Inactivo", + "已生效": "Eficaz", + "指纹详情": "Información de la huella dactilar", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Se le pedirá que coloque su dedo en el sensor varias veces. Siga las instrucciones...", + "开始添加": "Inicio", + "请将您的手指按下": "Coloque el dedo en el sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Siga las instrucciones... Se le pedirá que retire y coloque su dedo en el sensor para el siguiente registro", + "添加成功": "Añadir éxito", + "更新成功": "Éxito de la actualización", + "搜索": "Búsqueda", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Después de restablecer, la tarjeta de la cerradura se eliminará, ¿desea restablecer?", + "已失效": "No válido", + "卡详情": "Información de tarjeta", + "请输入": "Por favor ingrese aquí", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Al apagar, el bloqueo permanecerá desbloqueado todo el día hasta que se bloquee manualmente.", + "请输入小于或等于60的数字": "Ingrese un número menor que 60", + "操作成功": "Operación exitosa", + "管理员密码相同,无需修改": "La contraseña del administrador es la misma y no es necesario modificarla", + "请输入6-9位数字": "6-9 dígitos de longitud", + "请输入6-9位管理员密码": "Introduzca una contraseña de administrador de 6-9 dígitos", + "请输入新的管理员密码": "Introduzca una nueva contraseña de administrador", + "未分组": "Desagrupado", + "请输入分组名称": "Crear un grupo", + "创建成功": "Crear éxito", + "设置锁分组成功": "Establecer correctamente el grupo de bloqueo", + "电池1电量": "Batería 1", + "电池2电量": "Batería 2", + "电量更新时间": "Tiempo de actualización de la batería", + "锁电量更新成功": "Éxito de la actualización del poder de bloqueo", + "您的钥匙未生效": "La clave no es efectiva", + "您的钥匙已冻结": "Su clave ha sido congelada", + "您的钥匙已过期": "Su clave ha expirado", + "常开模式开启": "La cerradura está en modo de paso", + "超级管理员": "Super admin", + "授权管理员": "Admin autorizado", + "普通用户": "Usuario ordinario", + "余": "Equilibrio", + "天": "Día", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Después de eliminar el bloqueo, toda la información se eliminará junto, ¿está seguro de que desea eliminar el bloqueo?", + "请输入登录密码": "Introduzca la contraseña de la aplicación", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "No se pudo eliminar el dispositivo, por favor asegúrese de que el dispositivo está cerca del dispositivo, el dispositivo no está conectado, y el dispositivo está encendido", + "用户无权限": "El usuario no tiene permiso", + "创建公司后,考勤功能才能使用": "Crear una empresa primero", + "是否删除钥匙?": "¿Borrar esta clave?", + "邮箱绑定成功": "Éxito vinculante de correo electrónico", + "手机绑定成功": "Teléfono móvil vinculante éxito", + "网络访问失败,请检查网络是否正常": "Request Failed.Network no disponible, compruebe y conecte su dispositivo a 3G/4G/WIFI", + "清空": "Claro", + "是否清空?": "¿Despejado?", + "消息详情": "Mensaje Info", + "创建时间": "Tiempo de creación", + "管理员详情": "Detalles del administrador", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Si alguien lo obliga a abrir la puerta, puede usar esta tarjeta. El mensaje de alarma se enviará a los administradores. Para usar esta función, asegúrese de que su cerradura esté en línea.", + "请不要将胁迫卡用于日常开锁": "Por favor, no use la tarjeta forzada para el uso diario.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Si alguien le obliga a abrir la puerta, puede utilizar esta huella digital. El mensaje de alarma se enviará a los administradores. Para utilizar esta función, asegúrese de que su cerradura está en línea.", + "请不要将胁迫指纹用于日常开锁": "Por favor, no use la huella digital forzada para el uso diario.", + "创建公司": "Crear una empresa", + "公司名称不能超过30个字符": "El nombre de la empresa no puede superar los 30 caracteres", + "公司名称不能小于6个字符": "El nombre de la empresa no puede tener menos de 6 caracteres", + "WIFI列表": "Lista de WIFI", + "刷新": "Refrescar", + "手动配网": "Red de distribución manual", + "远距离": "Larga distancia", + "中距离": "Distancia media", + "近距离": "Distancia corta", + "锁时间更新成功": "Éxito de actualización de tiempo de bloqueo", + "锁用户": "Bloquear usuarios", + "请选择常开日期": "Seleccione la fecha de apertura", + "结束时间不能小于开始时间哦": "El tiempo de finalización no puede ser menor que el tiempo de inicio", + "介绍": "Nuestra historia", + "个人信息收集清单": "Lista de recopilación de información personal", + "应用权限说明": "Descripción del permiso de aplicación", + "第三方信息共享清单": "Lista de intercambio de información de terceros", + "请选择您的位置": "Seleccione su ubicación", + "请先选择位置": "Seleccione primero la ubicación", + "管理员密码": "Código de acceso de admin", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Si necesita modificar, introduzca una nueva contraseña de administrador (6 dígitos), haga clic en Aceptar para modificar", + "修改": "Modificar", + "网络摄像头": "Cámara", + "重命名": "Cambiar nombre", + "分组下的锁将被移到未分组里": "Los bloqueos bajo el grupo se moverán a desagrupados", + "编辑成功": "Editar éxito", + "厂商": "Fabricante", + "型号": "Modelo", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Después de generar la contraseña, utilícela una vez para la activación antes de las 23:59 del mismo día, de lo contrario no será válida después de las 0 en punto. Después de activar la contraseña, se puede utilizar un número ilimitado de veces dentro del período de validez.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Después de que se genere la contraseña, utilícela antes de las 23:59 del mismo día, de lo contrario no será válida después de las 0 en punto. El código claro se utiliza para borrar todas las contraseñas generadas antes de las 0 en punto de hoy.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Después de que se genere la contraseña, utilícela antes de las 23:59 del mismo día, de lo contrario no será válida después de las 0 en punto.", + "清空密码底部提示": "La contraseña es válida hasta las 23:59 del día del vaciado", + "相机": "Cámara", + "相册": "Fotos", + "读写": "Almacenamiento", + "定位": "Ubicación", + "需要访问相机权限才能拍照上传文件例如头像上传": "Se requiere acceso a la cámara para tomar fotos y cargar archivos, como cargar una foto de perfil", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Se requiere acceso a la cámara para cargar archivos y avatares utilizando imágenes de álbumes", + "需要访问读写权限才能使用本地图片上传头像": "Se requiere acceso a permisos de lectura y escritura para cargar avatares usando imágenes locales", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Se requiere acceso a la información de ubicación para usar la función de tecla agregar", + "申请": "Aplicación", + "权限": "Permiso", + "不允许": "No permitido", + "允许": "Permitido", + "权限被拒绝": "Permiso denegado", + "请手动在系统设置中开启": "Por favor, habilite manualmente en la configuración del sistema", + "权限以继续使用应用": "Permiso para continuar usando la aplicación.", + "去设置": "Ve a configurarlo", + "当前网络": "Red actual", + "位置信息": "Información de ubicación", + "请输入wifi名称": "Introduzca el nombre del wifi", + "虹膜": "Iris", + "手掌": "Palma", + "商城": "Centro comercial", + "我的": "Mi", + "微信公众号推送": "Cuenta pública de Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Para abrir wechat para recibir mensajes de alarma, debe prestar atención a Skye Smart Lock wechat cuenta pública primero, guarde el código QR y use wechat para escanear la configuración", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Se requiere el acceso a los permisos de Bluetooth para usar la información de ubicación de la función de tecla agregar", + "请输入Email": "Ingrese su correo electrónico", + "请输入手机号": "Ingrese su número de teléfono", + "家人到家": "Miembro de la familia llegó a casa", + "添加家人": "Añadir miembro de la familia", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Si la cerradura no está conectada a Internet, los recordatorios de código de acceso, tarjeta, huella digital y otros métodos de apertura de puertas no se pueden enviar de manera oportuna.", + "消息提醒": "Recordatorio", + "开门通知": "Aviso de apertura", + "N天未开门": "N días sin apertura de la puerta", + "门未关好": "La puerta no está cerrada", + "防拆报警": "Alarma de manipulación", + "低电量提醒": "Batería baja", + "胁迫开门": "Apertura forzada de la puerta", + "有人按门铃": "Alguien toca el timbre", + "有人出现在门口": "Alguien aparece en la puerta", + "提醒方式": "Método de recordatorio", + "开门方式": "Método de apertura de la puerta", + "请选择": "Por favor seleccione", + "家人": "Miembro de la familia", + "保存": "Guardar", + "APP推送": "APP empuje", + "管理员": "Admin", + "未启用": "No habilitado", + "已启用": "Habilitado", + "省电模式": "Modo de ahorro de energía", + "逗留抓拍模式": "Permanecer modo de captura", + "实时监控模式": "Modo de monitoreo en tiempo real", + "自定义模式": "Modo personalizado", + "猫眼设置": "Ajuste del ojo de gato", + "猫眼工作模式": "Modo de trabajo del ojo de gato", + "自动亮屏": "Pantalla brillante automática", + "亮屏持续时间": "Pantalla a tiempo", + "逗留警告": "Estancia de advertencia", + "异常警告": "Advertencia anormal", + "短信提醒": "SMS", + "邮件提醒": "Correo electrónico", + "N天未开门提醒": "N días sin apertura de la puerta", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Si alguien te obliga a abrir la cerradura, puedes usar esta huella digital. El mensaje de alarma se enviará a los administradores. Para utilizar esta función, asegúrese de que su cerradura esté en línea.", + "胁迫指纹": "Huella dactilar forzada", + "指纹列表": "Lista de huellas dactilares", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Después del tiempo establecido, si el bloqueo no se abre, el sistema enviará un mensaje de recordatorio al destinatario designado. Esta función requiere que la cerradura esté conectada a Internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Después de habilitar el recordatorio, cuando la batería de la cerradura está por debajo del 20%, 10% y 5%, el sistema enviará un mensaje de recordatorio al destinatario designado.", + "未开门时间": "Días sin apertura de puerta", + "添加和使用面容开锁时:": "Añadir y utilizar Cara al desbloquear:", + "关锁": "Cerrar cerradura", + "功能": "Función", + "配件": "Piezas", + "云存": "Almacenamiento en la nube", + "本地": "Esta localidad", + "3天滚动储存": "Almacenamiento rodante de 3 días", + "去升级": "Actualizar ahora", + "下载列表": "Lista de descargas", + "已下载": "Descargado", + "全部视频": "Todos los vídeos", + "已为本设备免费提供3大滚动视频储存服务": "Se han proporcionado tres servicios de almacenamiento de vídeo de desplazamiento para este dispositivo de forma gratuita", + "视频播放": "Reproducción de vídeo", + "全选": "Todos", + "请选择要删除的视频": "Seleccione el vídeo que desea eliminar", + "请选择要下载的视频": "Selecciona el vídeo que quieres descargar", + "欢迎使用": "Bienvenido al uso", + "用户协议和隐私政策概要": "Resumen del Acuerdo de Usuario y Política de Privacidad", + "协议概要": "Resumen del protocolo", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Gracias por usar esta aplicación. Damos gran importancia a su información personal y protección de la privacidad. Antes de usar este producto, por favor léalo cuidadosamente.", + "《用户协议》": "Términos del usuario", + "和": "Y", + "《隐私政策》": "《 Política de privacidad 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Todo el contenido de. Al hacer clic en \"Aceptar\", usted acepta y acepta todos los términos. Si decide no estar de acuerdo, no podrá utilizar nuestros productos y servicios y saldrá de la aplicación.", + "不同意": "En desacuerdo", + "同意": "De acuerdo", + "该功能是高级功能,请开通后再使用": "Esta es la función avanzada. Por favor, habilite primero.", + "常用程序": "Programas comunes", + "该锁已被重置": "El bloqueo se ha restablecido", + "需要访问读写权限才能使用手动升级固件": "Se requiere acceso a los permisos de lectura y escritura para actualizar el firmware manualmente", + "错误D固件,请选择正确的文件": "Firmware incorrecto, seleccione el archivo correcto", + "非SYD固件,请选择正确的文件": "Firmware no SYD, seleccione el archivo correcto", + "文件校验失败 0x01": "Falló la verificación de archivos 0x01", + "解析元数据失败,请选择正确的文件": "No se pudieron utilizar los metadatos, seleccione el archivo correcto", + "文件校验失败 0x02": "Falló la verificación de archivos 0x02", + "文件校验失败 0x03": "La verificación del archivo falló 0x03", + "固件升级完成": "Actualización de firmware completada", + "记录": "Registros", + "开通高级功能后才可以对锁进行管理": "Por favor, active primero la función avanzada para administrar las cerraduras.", + "去开通": "Habilitar", + "实名认证": "Autenticación de nombre real", + "当前剩余数量": "Restante", + "购买": "Comprar", + "实名认证为付费功能,请购买后再使用": "Autenticación de nombre real es una función de pago, por favor utilícelo después de la compra", + "密码不一致哦": "Las contraseñas son inconsistentes", + "退出添加": "Quita de agregar", + "管理员已满": "Admin completo", + "用户已满": "El usuario está lleno", + "锁上面添加指纹已满": "Añadir huella digital en bloqueo está lleno", + "指纹已存在": "La huella digital ya existe.", + "锁上面添加人脸已满": "Bloquear por encima de añadir cara está llena", + "人脸已存在": "La cara ya existe", + "锁上面添加卡已满": "Bloquear por encima de añadir la tarjeta está llena", + "卡已存在": "La tarjeta ya existe", + "锁上面添加密码已满": "Bloquear encima de agregar contraseña está lleno", + "密码已存在": "Ya existe un código de acceso idéntico. Elija uno diferente", + "请输入密码": "Introduzca la contraseña", + "暂无密码,无需重置": "Sin contraseña, sin necesidad de restablecer", + "真实姓名": "Nombre real", + "身份证号": "Número de identificación", + "请输入真实姓名": "Ingrese su nombre real", + "请输入身份证号": "Por favor ingrese su número de identificación", + "请输入身份证号和真实姓名": "Ingrese su número de identificación y nombre real", + "点击返回设备配对": "Toque Volver a emparejamiento de dispositivos", + "无法连接?尝试升级": "¿No se puede conectar? Se ha intentado actualizar", + "固件升级提示": "Aviso de actualización de firmware", + "请先获取固件文件到手机本地,再选择升级": "Primero obtenga el archivo de firmware en el teléfono local y luego seleccione Actualizar", + "固件升级中": "Se está actualizando el firmware", + "取消升级": "Cancelar la actualización", + "固件传输中": "Firmware en tránsito", + "关闭": "Apagar", + "传输中'": "En tránsito", + "操作记录": "Registros", + "修改姓名": "Editar nombre", + "传输中": "En tránsito", + "发送人": "Emitido por", + "发送时间": "Tiempo emitido", + "钥匙详情": "Información de Ekey", + "姓名": "Nombre", + "发送": "Enviar", + "请确认姓名全名和身份证号码是否正确": "Confirme que el nombre completo y el número de identificación son correctos", + "传输期间请勿离开当前页面": "No abandone la página actual durante la transferencia", + "机型": "Modelos", + "硬件版本": "Versión de hardware", + "固件版本": "Versión de firmware", + "手动升级": "Actualización manual", + "设备连接中...": "Dispositivo conectando...", + "未避免异常情况,请在门打开时升级": "Excepciones inevitables, actualice cuando la puerta esté abierta", + "钥匙无效": "La clave no es válida", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "No se puede conectar al bloqueo. Reinicie el Blutooth de su teléfono e inténtelo de nuevo.", + "如果是全自动锁,请使屏幕变亮": "Si se trata de un bloqueo totalmente automático, haga que la pantalla sea más brillante", + "正在尝试闭锁……": "Por favor espere...", + "清空记录": "Registros claros", + "是否要删除操作记录?": "¿Seguir eliminando registros?", + "被删除的记录不能恢复": "Los registros no se pueden recuperar después de eliminar.", + "全部事件": "Todos los eventos", + "开锁事件": "Desbloquear evento", + "异常事件": "Evento anormal", + "门铃事件": "Evento de timbre", + "视频事件": "Evento de vídeo", + "请开启蓝牙": "Por favor, encienda Bluetooth", + "请选择有效日": "Seleccione el día efectivo", + "公司名字长度不能小于 6 ": "La longitud del nombre de la empresa no puede ser inferior a 6", + "已是最新版本": "No hay actualizaciones", + "新建短信模版": "Plantilla de Creat SMS", + "新建邮件模版": "Creat plantilla de correo electrónico", + "自定义短信模版": "Plantilla de SMS", + "自定义邮件模版": "Plantilla de correo electrónico", + "名称": "Nombre", + "星星锁": "Cerradura de la estrella", + "无考勤记录": "No hay registros", + "大家干劲十足": "Todos llegan a tiempo", + "工作时长未出炉": "Sin horas de trabajo", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "La elección del país/región afectará a la seguridad de los datos. Actualmente ha seleccionado Albania, por favor confirme antes de continuar.", + "确认国家或地区": "Confirmar país/región", + "我知道了": "Lo tengo", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Para recibir actualizaciones importantes, haga clic en 'Aceptar' y habilite las notificaciones en la configuración.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Después de encender, puede volver a encender presionando la tecla de configuración en la cerradura, y volver a agregarla con la APP", + "已有": "Actual", + "新增": "Nuevo", + "账号格式错误": "Formato incorrecto", + "接收者信息为空": "La información del destinatario está vacía", + "请输入时间(秒)": "Por favor ingrese la hora (sec)", + "加载数据失败": "Error al cargar los datos", + "重试": "Inténtalo de nuevo", + "升级中,是否退出": "Durante la actualización, si se debe salir", + "下一步": "Siguiente", + "公寓": "Apartamento", + "个人用户": "Personal", + "星寓": "Apartamento estrella", + "账号": "Cuenta", + "请输入手机号或email": "Número de teléfono o correo electrónico", + "请输入星寓管理员的账号": "Introduzca la cuenta del administrador del apartamento estrella", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Todos los datos de la (s) cerradura (s) seleccionada (s) se transferirán permanentemente al destinatario.", + "暂不支持跨平台转移,敬请期待": "La transferencia multiplataforma no es compatible por el momento, por favor espere con ansias.", + "移除坏锁": "Mover cerraduras defectuosas/dañadas a la papelera", + "转移确认": "Confirmar transferencia", + "本次共转移": "Esta vez un total de", + "把智能锁": "Cerradura inteligente", + "确认": "OK", + "移除成功": "Eliminar correctamente", + "转移成功": "Transferencia de éxito", + "该已锁被删除": "El bloqueado se suprime", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "El administrador autorizado solo puede administrar contraseñas, keys y etccreados por él mismo.", + "添加授权管理员": "Crear Admin", + "导出记录": "Exportar registros", + "选择时间段": "Seleccionar período de tiempo", + "导出": "Exportación", + "批量导出": "Exportación de lotes", + "读取记录": "Actualizar registros", + "设备": "Dispositivo", + "消息": "Mensajes", + "智能分析": "Analítica inteligente", + "精准识别设备事件,过滤无效信息": "Identifique con precisión los eventos del dispositivo y filtre la información no válida", + "系统设置": "Configuración del sistema", + "系统的全局配置在此项内进行设置": "La configuración global del sistema se establece en este elemento", + "导出操作记录": "Exportar registros", + "立即查看": "Vista", + "导出成功": "Exportado con éxito", + "发送钥匙": "Enviar eKey", + "进度": "Tasa", + "失败": "Falló", + "人脸详情": "Detalles de la cara", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Cuando alguien se detecta a unos 1,5 metros frente a la puerta, el desbloqueo de reconocimiento facial se iniciará automáticamente.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Cuando alguien se detecta a unos 0,8 metros delante de la puerta, el desbloqueo de reconocimiento facial se iniciará automáticamente.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Cuando alguien se detecta a unos 0,5 metros delante de la puerta, el desbloqueo de reconocimiento facial se iniciará automáticamente.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "La distancia de detección se ha desactivado, debe tocar manualmente cualquier tecla del teclado para realizar el desbloqueo del reconocimiento facial.", + "防误开已打开,开锁后": "La apertura anti-error se ha activado, y después de desbloquear", + "秒内不可使用面容开锁": "El desbloqueo facial no se puede usar en segundos", + "掌静脉": "Vena de la palma", + "添加掌静脉": "Añadir la vena de la palma", + "胁迫掌静脉": "Vena forzada de la palma", + "请不要将胁迫掌静脉用于日常开锁": "Por favor, no utilice las venas de palma coerción para el desbloqueo diario", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Conectado a la cerradura, abra naturalmente su palma, la palma está frente a la cámara", + "掌静脉详情": "Detalles de la vena de la palma", + "掌静脉号": "Número de la vena de la palma", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth no está encendido, por favor encienda Bluetooth en la configuración", + "删除用户时,会将用户拥有的钥匙一起删除。": "Si un usuario es DELETADO, cualquier tecla asociada con el usuario también será DELETADA.", + "配置网络": "Configurar la red", + "你好": "Hola", + "成功": "Exitoso", + "类型选择": "Tipo seleccionar", + "请选择要使用哪种类型": "Seleccione el tipo que desea utilizar", + "系统邮件(推荐)": "Correo electrónico del sistema (recomendado)", + "系统短信(推荐)": "Sistema SMS (recomendado)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "El correo electrónico será enviado desde esta App. Por favor compre paquete de correo electrónico primero.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "El SMS será enviado desde esta App.Please comprar paquete de correo electrónico en primer lugar.", + "个人邮件": "Correo electrónico personal", + "个人短信": "SMS personales", + "邮件将从你的个人邮箱发给用户": "El correo electrónico se enviará desde su cuenta de correo electrónico personal.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "El mensaje SMS se enviará desde su número de teléfono personal. Usted paga a su operador de telecomunicaciones.", + "为了更好地应用体验,请确定权限": "Para una mejor experiencia de la aplicación, confirme los permisos", + "您第一次拒绝权限,请确定权限": "Usted rechazó el permiso por primera vez, por favor confirme el permiso.", + "您第二次拒绝权限,请去应用设置开启权限": "Usted rechazó el permiso por segunda vez, vaya a la configuración de la aplicación para habilitar el permiso", + "去应用市场": "Ir a la App Store", + "温馨提示": "Caliente pronta", + "关闭应用": "Cierre la aplicación", + "开启微信接收报警消息需要先关注": "Para abrir WeChat para recibir mensajes de alarma, debe seguir", + "微信公众号,请保存二维码并使用微信扫一扫设置": "La cuenta pública de WeChat, guarda el código QR y usa WeChat para escanear la configuración", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "La autenticación de nombre real es una función de pago, comuníquese con el administrador de la cerradura para comprar y usar", + "位置权限": "Permiso de ubicación", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Por favor, conceda la aplicación para utilizar su locatian.It se utiliza para escanear las cerraduras y pasarelas BLE.", + "相机/相册权限": "Permiso de cámara/álbum", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Por favor, conceda la aplicación para leer y escribir fotos y archivos de almacenamiento.", + "点击选择": "Haga clic para seleccionar", + "微信": "Wechat", + "朋友圈": "Momentos", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Vínculo", + "今天": "Hoy", + "密码错误": "Contraseña no válida", + "网络中断": "Interrupción de la red", + "钥匙不存在": "La clave no existe", + "钥匙过期": "Clave caducada", + "钥匙已存在": "La clave ya existe", + "密码失效": "Contraseña no válida", + "门锁时间异常": "Tiempo de bloqueo de puerta anormal", + "APP(手机)未联网": "APP (teléfono móvil) no está conectado a Internet", + "数据不存在": "Los datos no existen", + "待接收": "Recibido", + "已冻结": "Congelado", + "已删除": "Eliminado", + "未知": "Desconocido", + "拖动下方滑块完成拼图": "Arrastre el control deslizante a la posición correcta", + "验证成功": "Éxito de verificación", + "验证失败": "Falló la verificación", + "向右拖动滑块填充拼图": "Arrastre el control deslizante hacia la derecha para llenar el rompecabezas", + "请先获取到位置信息哦": "Por favor, obtenga la información de ubicación primero", + "请选择国家": "Seleccione un país", + "获取锁信息": "Obtener información de bloqueo", + "锁数据异常,请重试": "Los datos de bloqueo son anormales, inténtelo de nuevo", + "连接设备中...": "Conectando dispositivo...", + "把锁": "Cerraduras", + "条": "Tira", + "封": "Sello", + "次": "Tiempos", + "支付成功": "Pagar éxito", + "查看详情": "Ver detalles", + "请输入模板名称": "Introduzca el nombre de la plantilla", + "模版类型": "Tipo", + "再返回一次退出": "Salir de nuevo", + "请先添加锁": "Añada primero el candado", + "可视对讲": "Intercomunicador visual", + "详细日志": "Registro detallado", + "已复制到剪切板": "Copiado", + "拍照": "Foto", + "从相册选择": "Elegir del álbum", + "选择问题": "Por favor seleccione una pregunta", + "确认长度不足8位": "Confirmar longitud inferior a 8 dígitos", + "新密码长度不足8位": "Longitud de contraseña nueva inferior a 8 dígitos", + "两次密码不一致": "Contraseña no coincide. Inténtelo de nuevo", + "请点击获取验证码,验证码将发送到": "Por favor, obtenga un código de verificación. El código será enviado a", + "切换": "Interruptor", + "验证": "Verificar", + "验证成功,账号已删除": "Verificación exitosa, cuenta eliminada", + "该密码不是自定义密码,无法修改": "Esta contraseña no es una contraseña personalizada y no se puede modificar", + "请选择设备要关联哪些姓名": "Seleccione a qué nombres debe asociarse el dispositivo", + "请选择姓名要关联哪些设备": "Seleccione a qué dispositivos debe asociarse el nombre", + "确定要移除所选中的坏锁吗?": "¿Quitar la cerradura que funciona mal?", + "邮件通知": "Notificar por correo electrónico", + "短信通知": "Notificar a través de SMS", + "您好,您的授权管理员生成成功": "Hola, su administrador autorizado se ha generado con éxito", + "请输入接收者姓名": "Por favor ingrese aquí", + "版本更新": "Actualización de versión", + "下次再说": "La próxima vez", + "配网成功": "Éxito en la distribución de la red", + "配网失败": "Falló la distribución de red", + "该锁的无线键盘都将被删除": "Todos los teclados inalámbricos para este bloqueo serán SUPRIGIDOS", + "实时画面": "Imagen en tiempo real", + "适合门口较为安全的环境。": "Adecuado para entornos relativamente seguros en la puerta.", + "仅发生特定事件才录像,并可查看实时画面。": "Solo se registran eventos específicos y se puede ver la imagen en tiempo real.", + "一般情况下,满电可使用7-8个月": "En circunstancias normales, se puede utilizar durante 7-8 meses cuando está completamente cargada", + "有人逗留或发生特定事件才录像,可随时查看": "Alguien se queda o se registran eventos específicos, y se pueden ver en cualquier momento.", + "实时画面。": "Imagen en tiempo real.", + "一般情况下,满电可使用5~6个月。": "En circunstancias normales, se puede utilizar durante 5 ~ 6 meses cuando está completamente cargado.", + "适合门口人员复杂、较不安全的环境。": "Adecuado para entornos complejos y relativamente inseguros en la puerta.", + "有人出现就录像,可随时查看实时画面。": "Grabe cuando aparece alguien y vea la imagen en tiempo real en cualquier momento.", + "一般情况下,满电可使用2~4个月。": "En circunstancias normales, se puede utilizar durante 2 ~ 4 meses cuando está completamente cargado.", + "根据您家门口实际情况设置录像和实时画面功能。": "Configure las funciones de video e imagen en tiempo real de acuerdo con la situación real en su puerta.", + "可使用时长由具体设置决定。": "La duración del uso está determinada por la configuración específica.", + "查看": "Vista", + "有人按门铃或发生": "Alguien toca el timbre o", + "异常事件时": "Evento anormal", + "不录像": "No hay vídeo", + "有人出现、按门铃": "Alguien aparece, toca el timbre", + "或发生异常事件时": "O se produce un evento anormal", + "逗留达到10秒": "Quédate 10 segundos", + "约1.5米": "Cerca de 1,5 metros", + "随时": "En cualquier momento", + "立即录像": "Grabar inmediatamente", + "录像时机": "Vídeo temporización", + "有人出现时录像": "Grabar cuando alguien aparece", + "人体侦测距离": "Distancia de detección humana", + "查看实时画面": "Ver imagen en tiempo real", + "自定义时间": "Tiempo personalizado", + "当日": "Hoy", + "次日": "Siguiente día", + "自定义时段": "Período de tiempo personalizado", + "发生事件时查看": "Ver cuándo se produce un evento", + "实时查看": "Vista en tiempo real", + "有人在门口出现10秒后开始录像。": "Alguien aparece en la puerta durante 10 segundos antes de grabar.", + "有人按门铃时立即录像。": "Grabar inmediatamente cuando alguien toca el timbre.", + "有人出现在门前1.5米范围时启动录像": "Comience a grabar cuando alguien aparece a menos de 1,5 metros frente a la puerta.", + "约0.8米": "Cerca de 0,8 metros", + "约3.0米": "Alrededor de 3,0 metros", + "添加指纹失败": "Operación fallida.", + "项": "Artículos", + "播放中": "Jugando", + "下载": "Descargar", + "暂无下载内容": "Sin contenido de descarga", + "亮度": "Brillo", + "音量": "Volumen", + "快进至": "Avance rápido para", + "快退至": "Rebobinar a", + "暂无视频信息": "No hay información de vídeo", + "加载出错": "Error de carga", + "请单人正对门锁,距离一个成年人手臂长度": "Por favor, póngase de pie delante de la cerradura de la puerta solo, a la distancia de un brazo", + "(约0.6米)。": "(Unos 0,6 metros).", + "保持脸部无遮挡,露出五官。": "Mantenga su cara despejada y muestre sus rasgos faciales.", + "准备好了,开始添加": "Listo, comience a agregar", + "正在录入中...": "Grabación...", + "添加人脸失败": "Error al agregar cara", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Después de restablecer, se eliminarán las caras del bloqueo. ¿Está seguro de que desea restablecer?", + "人脸号": "Número de cara", + "虹膜详情": "Detalles del iris", + "虹膜号": "Número de iris", + "选择设备类型": "Seleccionar tipo de dispositivo", + "照明灯具": "Accesorios de iluminación", + "电动窗帘": "Cortinas eléctricas", + "门窗传感器": "Sensor de puerta y ventana", + "传感器": "Sensor", + "清除数据成功": "Los datos se borraron correctamente", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "La cerradura no está conectada a Internet, por lo que los registros de la contraseña, la tarjeta, la huella digital y otros métodos de apertura de puertas no se pueden cargar en tiempo real.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Si necesita mantener los registros históricos, puede exportarlos.", + "看不到操作记录,可能原因有": "No se pueden ver los registros de operación, posibles razones", + "操作记录详情": "Detalles del registro de operación", + "操作时间": "Tiempo de la operación", + "此模块功能需要锁联网后设置方可生效": "Esta función del módulo debe establecerse después de que el bloqueo esté conectado a Internet para que surte efecto", + "用户已存在": "El usuario ya existe", + "钥匙数量已到上限": "El número de claves ha alcanzado el límite superior", + "附近没有可用网关": "No hay puerta de enlace disponible cerca", + "正在创建安全连接...": "Crear una conexión segura...", + "监视状态下不能发送录音": "No se pueden enviar grabaciones en modo de supervisión", + "挂断": "Cuelgue", + "监视中暂不能开锁": "El desbloqueo no está disponible durante la supervisión", + "长按说话": "Presione y mantenga para hablar", + "松开发送": "Liberar para enviar", + "请输入6位数字开锁密码": "Introduzca una contraseña de desbloqueo de 6 dígitos", + "请输入开锁密码": "Introduzca la contraseña de desbloqueo", + "接收者在有效期内可以不限次数使用": "Los destinatarios pueden utilizar los ekeys durante un tiempo ilimitado dentro del período de validez.", + "接收者可以使用此App开关锁": "El destinatario puede bloquear/desbloquear mediante esta aplicación.", + "单次钥匙有效期为1小时,只能使用一次": "La clave de una sola vez es válida por una hora y solo se puede usar una vez.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Los destinatarios pueden usar las teclas durante tiempos ilimitados dentro del tiempo de ciclo fijo.", + "获取模板失败": "Error al obtener la plantilla", + "微信通知": "Notificación de WeChat", + "系统短信": "Sistema SMS", + "系统邮件": "Correo electrónico del sistema", + "模板": "Plantilla", + "新建模版": "Crear plantilla", + "您好,您的密码是": "Hola, su contraseña es", + "密码名字": "Nombre de la contraseña", + "请输入6-9位密码": "Introduzca una contraseña de 6-9 dígitos", + "设置密码": "Establecer contraseña", + "操作成功,密码为": "Se ha conseguido. El código es", + "类型:自定义-永久": "Tipo: Personalizado-Permanente", + "实时播放": "Reproducción en tiempo real", + "点击对讲": "Haga clic para intercomunicador", + "长按开锁": "Prensa larga para desbloquear", + "接听失败": "Falló en responder", + "请在锁设置中开启远程开锁": "Habilite el desbloqueo remoto en la configuración de bloqueo", + "接听": "Respuesta", + "截图已保存到相册": "Captura de pantalla guardada en el álbum", + "添加遥控": "Agregar control remoto", + "已连接到锁,请按遥控": "Conectado a la cerradura, por favor presione el control remoto", + "遥控号": "Número de control remoto", + "遥控详情": "Detalles del control remoto", + "照明": "Iluminación", + "退出演示模式": "Salir del modo demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Sugerencia: La interfaz actual es una interfaz de visualización. Después de agregar el dispositivo, puede continuar usándole", + "门已上锁": "La puerta está cerrada", + "您的账号在异地登录,如非本人,请尽快修改密码": "Su cuenta se ha utilizado para iniciar sesión desde un nuevo dispositivo", + "开门成功": "Abre la puerta con éxito", + "开门失败": "No se pudo abrir la puerta", + "呼叫提醒": "Recordatorio de llamada", + "收到来自": "Recibido de", + "锁的呼叫": "Bloqueo de llamada", + "加载数据中": "Carga de datos", + "搜索所有锁类型": "Buscar todos los tipos de cerradura", + "锁电量更新时间": "Tiempo de actualización de la batería de bloqueo", + "1月": "Por Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Abr", + "5月": "Mayo", + "6月": "Jun", + "7月": "Jul", + "8月": "Ago", + "9月": "Sep", + "10月": "Oct", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Ciudades calientes", + "导出锁数据": "Exportar datos de bloqueo", + "一键开锁": "Desbloqueo con un solo clic", + "已开通": "Abierto", + "编辑员工": "Editar personal", + "一": "Uno", + "二": "Dos", + "三": "Tres", + "四": "Cuatro", + "五": "Cinco", + "六": "Seis", + "日": "Sol", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?", + "在线": "En línea", + "离线": "Offline", + "购买记录": "Registro de compra", + "使用记录": "Registro de usuario", + "失效时间要大于当前时间": "El tiempo de expiración debe ser más largo que el tiempo actual", + "修改名字": "Editar nombre", + "时": "Hora", + "分": "Minuto", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Puede usar Alexa para desbloquear, bloquear y verificar el estado del bloqueo", + "支持的国家": "Países apoyados", + "支持的国家值": "Estados Unidos, Canadá, Reino Unido, Australia, India, Alemania, Francia, Italia, España, Japón", + "操作流程": "Proceso de operación", + "操作流程值": "1 Añadir una cerradura y puerta de enlace con la aplicación de bloqueo inteligente\n\n2 Habilite la función de desbloqueo remoto de la cerradura en la APP (esta función está desactivada por defecto). Si no tiene esta opción, el bloqueo no es compatible con Alexa\n\n3 Agregue habilidades a Alexa y autorícelas con la cuenta y contraseña de la aplicación de bloqueo inteligente. Después de que la autorización sea exitosa, puede descubrir dispositivos bajo la cuenta\n\n4 Localice el bloqueo en la aplicación Alexa, encienda la función de desbloqueo de voz y configure la contraseña del idioma\n\n5 La cerradura puede ser operada a través de Alexa", + "Google Home": "Inicio de Google", + "Action name": "Nombre de acción", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Idiomas soportados", + "英语": "Inglés", + "Google Home操作流程的值": "1. use la aplicación de bloqueo inteligente para agregar cerraduras y pasarelas\n\n2. habilitar la función de desbloqueo remoto de la cerradura en la aplicación (esta función está desactivada por defecto). Sin esta opción, el bloqueo no es compatible con Google Home\n\n3. instale la aplicación Google Home y haga clic en el botón \"\" en la esquina superior izquierda\n\n4. En la página Configuración, seleccione \"Trabajar con Google\"\n\n5. busque \"ScienerSmart\" y use la cuenta y la contraseña de la aplicación de bloqueo inteligente para autorizar", + "密码需至少包含数字/字母/字符中的2种组合": "La contraseña debe contener al menos 2 de los siguientes: números, letras y caracteres especiales", + "已开锁": "Desbloqueado", + "已闭锁": "Bloqueado", + "两次密码不一致哦": "Las contraseñas son inconsistentes", + "中功率": "Potencia media", + "常规使用": "Uso regular", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Después de encender la puerta de enlace, mantenga presionado el botón de reinicio durante 5 segundos y haga clic en Siguiente cuando la luz indicadora parpadee alternativamente", + "扫描设备": "Dispositivo de exploración", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Falló la eliminación. Es posible que la puerta de enlace se haya desconectado. ¿Desea forzar la eliminación de los datos?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_et.json b/lan/lan_et.json new file mode 100644 index 00000000..23cbb933 --- /dev/null +++ b/lan/lan_et.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Tähelukk", + "锁通通": "Lukustamine", + "点击开锁,长按闭锁": "Puudutamine lukustamiseks, hoidmine lukus", + "考勤": "Osalemine", + "考勤设置": "Osalemise seadistused", + "电子钥匙": "E-klahvid", + "添加卡": "Lisa kaart", + "卡号": "Kaardi number", + "添加指纹": "Lisa sõrmejälg", + "指纹号": "Sõrmejälge number", + "遥控": "Kaugu", + "添加人脸": "Lisa näo", + "门锁日志": "Ukse luku logi", + "密码号": "Parooli number", + "添加者": "Käitaja", + "添加时间": "Aeg", + "重置": "Lähtestamine", + "请输入手机号或者邮箱": "Telefoninumber/e-posti", + "工作时间": "Tööaeg", + "工作日设置": "Tööpäeva seadistus", + "星期一": "Esmaspäeva", + "星期二": "Teisipäev", + "星期三": "Kolmapäev:", + "星期四": "Neljapäeval", + "星期五": "Reede päev", + "星期六": "Laupäev", + "星期日": "Pühapäev", + "简写周一": "M", + "简写周二": "T.", + "简写周三": "W", + "简写周四": "T.", + "简写周五": "F.", + "简写周六": "S", + "简写周日": "S", + "周一": "En", + "周二": "TE", + "周三": "Vaka", + "周四": "Nt", + "周五": "R", + "周六": "LOO", + "周日": "Päikesel", + "群发钥匙": "Saada mitu ekeyst", + "锁": "Lukustamine", + "请添加": "Vastuvõtja", + "允许远程开锁": "Võrgu lukustamine", + "请输入验证码": "Kontrollikood", + "获取密码": "Parooli genereerimine", + "请给密码命名": "Sisesta selle parooli nimi", + "密码有限期为6个小时,只能使用一次": "See Passkood PEAB kasutada 6 tunni jooksul alates Praegusest aega või see on SUSPENDED turvalisuse põhjustel. Seda Passkoodi saab kasutada ainult üks kord.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Paroolina sisestage käsitsi 6-9 numbrit. Võib lisada telefoni Bluetooth luku kõrval või kaugjuhitav kaudu väravata", + "获取": "Mine minema.", + "添加": "Lisa", + "删除公司": "Kustuta ettevõte", + "密码详情": "Parooli infoComment", + "修改密码": "Parooli muutmine", + "添加虹膜": "Lisa Iiris", + "添加门磁": "UksessensorName", + "添加无线键盘": "Juhtmeta klaviatuuri", + "添加手掌": "Lisa palmi", + "请输入员工账号": "Sisesta töötaja konto", + "批量授权锁": "Mitu luku kinnitamine", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Volitatud administraatoril on enamus luba seda lukku käitamiseks.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "See funktsioon võimaldab teil avada nutika lukustamise kaudu. See funktsioon saab ainult sisse või välja lülitada Bluetooth kaudu.", + "排列方式": "Nimekirja tüüp", + "早到榜": "Varajane nimekiri", + "迟到榜": "Hiline nimekiri", + "当前模式": "Aktiivne režiim", + "勤奋榜": "Töö kõva nimekiri", + "延迟时间": "Viivitus aeg", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Lukk lukustab automaatselt pärast aega.Palun avage see ühe korra, et teha seade kättesaadavaks.", + "时间": "Aeg", + "开始时间": "Algusaeg", + "结束时间": "Lõpu aeg", + "工作时间设置": "Tööaja määramine", + "常开模式": "Passiivmood", + "常开时间": "Selles ajavahemikus.", + "常开日期": "Neil päevil", + "添加员工": "Lisa personalid", + "节假日": "Puhk", + "打卡方式": "Meetod", + "员工是否有钥匙": "Juba on ekey", + "上班时间": "Algusaeg", + "下班时间": "Sulgemise aeg", + "本周": "Sellel nädalal", + "单休": "Ühepäevane nädalala", + "双休": "Kahepäevane nädalala", + "单双休": "Üks kaks päeva nädalala", + "年": "Aasta", + "月": "Kuu", + "放假日期": "Puhk", + "补班日期": "Tööpäevad", + "添加假日": "Lisa puhkus", + "开始日期": "Alguskuupäev", + "必填": "Nõutav", + "结束日期": "Lõppkuupäev", + "日榜": "Päevas", + "月榜": "Kuupäev", + "考勤记录": "Registreerimine", + "假日信息": "Pühade info@ info: whatsthis", + "基本信息": "Põhimõtted", + "无线键盘": "Juhtmeta klaviatuuri", + "选择无线键盘": "Lisa klaviatuuri", + "门磁": "UksessensorName", + "自动闭锁": "Automaatne lukustamine", + "锁声音": "Heli lukustamine", + "防撬报警": "Häire Tamperi", + "重置键": "Lähtesta nupp", + "锁时间": "Lukusta kella", + "诊断": "Diagnostik", + "上传数据": "Üleslaadimine andmed", + "导入其他锁数据": "Impordi teisest lukustComment", + "锁升级": "Firmware uuendamine", + "标记房态": "Ruumi olek", + "开锁提醒": "Märguanne lukustamine", + "微信二维码": "Võtke QR kood", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Elektrooniliste võtmetega inimesed saavad avada ukse, skaneerides QR-koodi WeChati kaudu. Iga luku QR kood on erinev. Võid printida ja asetada selle vastava luku kõrvale", + "锁编号": "Luku number", + "电量": "Akud", + "锁分组": "Lukusta grupp", + "选择分组": "Vali grupp", + "创建新分组": "Loo rühma", + "管理员开锁密码": "Admin paroolid", + "更新": "Uuendamine", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Aku taset uuendatakse värava või telefoni bluetooth abil", + "当屏幕闪烁时,点击下一步": "Klõpsa järgmine klaviatuuri vilgub", + "输入*529#或按设置键": "Sisesta README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # või vajuta klahvi Seadistused", + "长按重置键2秒": "Vajuta ja hoida", + "附近的设备": "Lähedal asuvad varustused", + "暂无数据": "Andmed puuduvad", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Te saate ukse oleku saada koos väravaga. Ainult üks sensor on lubatud ühendada lukust.", + "开始": "Käivitamine", + "全天": "Kõik tundid", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Võid määrata mitu ajaperioodi läbipääsu režiimile.Seatud ajavahemiku jooksul jääb lukk avatud olekus", + "请选择锁音量": "Palun vali helitugevus", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Pöörades, kuulete heli lukust.", + "低": "Madal", + "较低": "Keskmine madal", + "中": "Keskmised", + "较高": "Keskmine kõrge", + "高": "Kõrge", + "开启后,锁被撬动时,会发出报警声": "Käivitades, võimaldad TAMPERi häire.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Lülitades on nupp RESET välja lülitatud.", + "校准时间": "Kalibreeri aeg", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnoos on lugeda konfiguratsiooni infot luku sees ja laadida see üles nii, et personal saab analüüsida rikke põhjust", + "上传": "Üleslaadimine", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Üleslaadida andmed lukust serverile.See võib võtta mitu minutit.", + "请选择要从哪把锁导入": "Vali lukk, millest importidast", + "有新版本": "Uus versioon", + "当前版本": "Aktiivne versioon", + "升级": "Uuendamine", + "空闲": "Vabanenud", + "已入住": "Hõivatud", + "多语言": "Keeled", + "添加锁": "Lisa lukus", + "锁地址": "Lukusta aadress", + "选择锁类型": "Vali luku tüüp", + "NFC无源锁": "NFC Passiivlukus", + "添加设备": "Lisa seade", + "网关": "Väravatee", + "客服": "Klienditeenindus", + "设置": "Seadistused", + "更多设置": "Rohkem seatud", + "消息推送": "Märkuse lükkamine", + "锁用户管理": "Lukusta kasutajated", + "拥有的钥匙": "Selle kasutajaga seotud eKeys", + "批量授权": "Asutuse juhtimine", + "关联设备": "Seotud seade", + "关联姓名": "Seotud nimi", + "转移智能锁": "Ülekandmise lukus", + "选择锁": "Ekraani lukus", + "接收人信息": "Vastuvõtja", + "转移网关": "ÜlekandevõrguComment", + "锁屏": "Ekraani lukus", + "已关闭": "Välja lülitatud", + "已开启": "Käivitus", + "开启": "Lülita siia", + "确定要开启重置键?": "Kas jätkata nupu Lähtestamise lubamist?", + "确定要关闭重置键?": "Kas jätkata nupu Lähtestamine?", + "隐藏无效开锁权限": "Vigane ligipääs peitmine", + "APP开锁时需手机连网的锁": "Lukud, mis nõuavad internetis telefoni", + "增值服务": "Teenused", + "关于": "Lõpetaja kohta", + "退出": "Logi väljas", + "删除账号": "Kustuta konto", + "个人信息": "Konto teave", + "头像": "Avatar", + "昵称": "NikNameName", + "请输入昵称": "Palun sisesta oma hüüdnimi.", + "修改昵称": "Nimeta ümber", + "修改账号": "Redigeeri konto", + "重置密码": "Lähtesta parooli", + "安全问题": "Turvalisuse küsimus", + "为了你的账号安全,修改账号前请先使用验证码验证": "Konto turvalisuse saamiseks kasutage enne konto muutmist konto parooli kontrollimist.", + "请输入新账号": "Palun sisesta uus konto", + "找回密码和登录新设备时,可通过绑定的手机验证": "Sideva telefoni number kasutatakse kontrollkoodi saamiseks.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Siduva e-posti kasutatakse kontrollikoodi saamiseks.", + "原密码": "Aktiivne parool", + "新密码": "Uus parol", + "确认密码": "Parool kinnitamine", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Kui telefon on kadunud, saate sisse logida uue telefoni, vastates turvalisuse küsimustele.", + "问题一": "Esimene küsimus", + "问题二": "Teine küsimus", + "问题三": "Kolmas küsimus", + "请输入你的答案": "Palun kirjuta oma vastus", + "即将到期": "Aegub peast", + "去授权": "Liigu autoriseerimine", + "修改名称": "Muuda nime", + "状态": "Olek", + "WiFi名称": "WiFi nimi", + "网络MAC": "Võrgu MAC", + "网关升级": "Väravate uuendamine", + "网关连接的锁": "Selle väravaga ühendatud lukud", + "信号强": "Tugev", + "选择网关类型": "Vali värava tüüp", + "添加网关": "Lisa väravi", + "重新通电": "Ühendage võimsust", + "指示灯": "Näitaja Valguse", + "选择网关": "Vali väravatee", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G ei ole toetatud, Palun valige WiFi 2.4G.", + "WiFi密码": "WiFi Passivorm", + "请输入WiFi密码": "Sisesta WiFi parooli", + "网关名称": "Värava nimi", + "请输入网关名称": "Sisesta värava nimi", + "IP地址": "IP- aadress", + "子网掩码": "Alamvõrgu mask", + "默认网关": "Vaikimisi väravatee", + "自动获取DNS服务器地址": "Automaatselt hangi DNS serveri aadress", + "首选DNS": "Eelistatud DNS", + "备选DNS": "Alternatiivne DNSS", + "不使用静态IP": "Staatilist IP-i ei kasutatud", + "使用静态IP": "Staatilise IP kasutamine", + "请输入IP地址": "Sisesta IP- aadress", + "请输入子网掩码": "Sisesta alamvõrgu mask", + "请输入默认网关": "Sisesta vaikimisi väravateas", + "所有锁": "Kõik lukud", + "搜索所有类型的锁": "Uuri igat tüüpi lukud", + "门锁": "Ukse lukus", + "挂锁": "Padüük", + "保险箱锁": "Ohutu lukus", + "智能门禁": "Intelligentne juurdepääsu kontroll", + "车位锁": "Parkimiskus", + "摸亮触摸屏": "Võtme puudutamine klaviatuuri aktiveerimisek", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Palun puudutage iga võtme aktiveerida luku ja pane see PAIRING Režiim.", + "附近的锁": "Lähedavad lukud", + "如需修改名字请重新命名,点击确定添加锁": "Kui soovite nime muuta, palun ümber nimetada, klõpsa luku lisamiseks OK", + "添加锁时,手机必须在锁旁边": "Luku lisamisel peab telefon olema luku kõrval.", + "登录": "Sisselogimine", + "注册": "Registrel", + "我已阅读并同意": "Olen lugenud ja nõustunud.", + "验证码": "Kood", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Sinu parool peab olema 8-20 märki ning sisaldama vähemalt kahte liiki numbreid, tähti ja sümboleid.", + "手机": "Telefonid", + "邮箱": "E- posti aadress", + "请输入邮箱": "Sisesta oma e- postil", + "国家/地区": "Riik/piirkond", + "你所在的国家/地区": "Teie riik/piirkond", + "选择国家/地区": "Vali oma riik või piirkond", + "获取验证码": "Hangi kood", + "商务合作": "Äri", + "电脑网页版": "Veebisüsteem", + "酒店系统": "Hotellisüsteemi", + "说明书网页版": "Kasutaja käsiraamat", + "高级功能": "Täiustatud funktsioon", + "记录保存": "Registri säilitamine", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS-i saab kasutada parooli ja ekey info saatmiseks saajale.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E- posti saab saata saajale parooli ja ekey info.", + "购买实名认证提示": "Pärast funktsioon on lubatud, peate kasutama oma sõrmejälje, nägu või konto parooli, et avada APP. Ei ole vaja kontrollida uuesti 3 minutit.", + "请选择你希望的实名认证频次": "Palun vali tegelik nimi autentimise sagedus, mida soovid.", + "仅首次": "Esimest korda.", + "每日一次": "Üks kord päevas", + "每周一次": "Üks kord nädalas", + "每月一次": "Üks kord kuus", + "当前状态": "Praegune olek", + "试用中": "Kohtuistusel", + "高级功能权益内容": "Täiustatud funktsioonid", + "短信模板": "SMS mall", + "邮件模板": "E- posti mall", + "发卡工具": "Kaardikodeer", + "购买高级功能须知": "Teade:", + "购买高级功能提示": "Rohkem arenenud funktsioone on arendamisel, ja kui te neid vajate, olete teretulnud avada teenuse arvu alusel lukud. Täiustatud funktsioonid on saadaval ainult oma lukud. Kui oled volitatud administraator, võta palun ühendust luku ülemise administraatoriga, et avada teenused", + "免费体验": "Tasuta uuring", + "立即开通": "Ava kohta", + "购买短信": "Osta SMS", + "购买邮件": "Osta E- posti", + "购买实名认证次数": "Osta tegelik nimi autentimise ajad", + "开通高级功能": "Muud funktsiooni lubamine", + "选择套餐": "Vali pakett", + "支付方式": "Makseviis", + "支付宝": "Alipay.", + "去支付": "Tasu", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Sul on lubatud sõnumi ise määratleda.See kasutatakse teabe saatmiseks parooli ja ekey teistele.", + "高级功能仅能用于你自己的锁": "Täiustatud funktsiooni saab rakendada ainult oma lukud.", + "新建模板": "Loo mall", + "类型": "Tüüp", + "模版内容": "Malli sisu", + "预览": "Eelvaatlus", + "房间名": "Tupa", + "预计产生短信条数": "Eeldatavad teate segmentid", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "See funktsioon võimaldab teil peita salakoode, keys, kaardid ja sõrmejäljed, mis on mõnda aja jooksul kehtivad.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Kasutaja telefon peab olema võrgus, et avada need valitud lukud APPga.", + "配置WiFi": "WiFi seadistamine", + "请输入WiFi名字": "Palun sisesta Wifi nimi", + "WiFi配网": "WiFi jaotusvõrk", + "胁迫卡": "Stressikaart", + "员工是否有密码": "Paroolil on juba olemas", + "员工是否有卡": "Kaart on juba olemas", + "员工是否有指纹": "Juba sõrmejälje määramine", + "获取钥匙": "Võtme hangimine", + "获取卡": "Hangi kaart", + "获取指纹": "Hangi sõrmejälg", + "安全验证": "Identiteedi tõendamine", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Kogu Teie konto teave eemaldatakse platvormilt PERMANENTILT ja seda ei saa taastada.Kas soovite kustutada?", + "监控": "Monitor", + "视频日志": "Video logi", + "开门器": "Ukseavaja", + "面容开锁": "Nägu lahti lukustus", + "开门方向设置": "Avava suuna komplektComment", + "电机功率设置": "MotorPoweri seadistus", + "开锁时是否需联网": "Kui Internet on vajalik lukustumise ajal", + "选择要加入分组的锁": "Vali sellesse grupi lisamiseks lockS", + "锁数量": "Lukustamine", + "小米IOT平台": "Xiaomi IOT platvorm", + "面容开锁设置": "Nägu lahti lukustamine", + "感应距离": "Tunde kaugus", + "防误开": "Vale avamise takistamine", + "防误开已关闭,关门后仍可使用面容开锁": "Vääravamise vältimiseks on suletud, pärast ukse sulgemist saab ikkagi kasutada näo lahti lukustud", + "添加和使用面容开锁时": "Avamisel nägu lisamine ja kasutamine", + "添加和使用面容开锁时提示": "\n1, püüdke ukse ees hoida üks isik;\n2, palun seiske ees ukse lukk umbes 0,5~0,8 meetrit, ukse lukk;\n3. Palun hoida oma näo takistamata ja paljastada oma näo omadused;\n4. Kui näotuvastus on ebanormaalne, saate puudutada iga võtit digitaalsel klaviatuuril, et taastada näotuvastus käsitsi.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Palun valige ettevaatlikult mootorivõimsus vastavalt ukse luku tegelikule olukorrale:", + "小功率:": "Miniwatt:", + "耗电少": "Väiksem energiatarbimine", + "大功率": "Suur võimsus:", + "大功率提示": "Kui luku keelt ei saa avamise ajal tavaliselt sisse tõmmata või on vaja juhtida.", + "开门方向设置提示": "Palun valige ettevaatlikult suund oma kodu ukse avamiseks (kui valite vale suuna, sa ei saa avada ja sulgeda ust korralikult):", + "左开": "Ava vasakult", + "右开": "Ava parelt", + "判断方法:": "Ã1⁄4le:", + "判断方法内容": "Mees seisis maja ees, sissepääsu ukse poole.", + "录像时段": "Videokoht", + "密码": "Paroolid", + "卡": "Kaardid", + "指纹": "Sõrmejälg", + "人脸": "Näo", + "配件商城": "Lukusta mall", + "公司名称": "Äriühingu nimi", + "请输入公司名字": "Sisesta ettevõte nimi", + "提示": "Vihjed", + "是否删除?": "Kas kustutada?", + "员工信息": "Töötajate teave", + "员工": "Töötajad", + "打卡方式无效": "Pole saadaval", + "中国": "Hiina", + "选择钥匙": "Vali ekey", + "编辑": "Redigeerimine", + "无": "Ei ole.", + "有": "Jah,", + "请输入姓名": "Palun sisesta nimi", + "获取人脸": "Nägude saamine", + "选择密码": "Parooli kood", + "选择卡": "Vali kaart", + "选择指纹": "Sõrmejälje valimine", + "选择人脸": "Vali näo", + "员工是否有人脸": "Kas töötajal on näo", + "同时删除员工钥匙": "Kustuta tema ekey", + "删除": "Kustuta", + "确定要删除员工吗?": "Kustuta see töötaja", + "月统计": "Kuuantatistika", + "迟到": "Hiljas", + "早退": "Vara lahkumine", + "未打卡": "Kirje puudub", + "钥匙将在": "See eeke", + "天后失效": "Päev( a)", + "电量更新时间:": "Aku uuendamise aeg:", + "新增配件": "Lisa", + "钥匙不可用": "Võti ei ole saadaval.", + "正在开锁中...": "Avada...", + "你的钥匙": "Sinu võti.", + "常开模式启动!长按闭锁": "Avatud režiim käivitatud! Pikk lukustamine", + "演示模式": "Demo režiim", + "请先同意用户协议及隐私政策": "Palun nõustuge kõigepealt kasutaja lepingu ja privaatsuse poliitikaga.", + "用户协议": "Kasutaja tingimused", + "隐私政策": "Eraelu puutumatus", + "注册成功": "Registreerimine edukas", + "你所在的": "Sa oled sees.", + "手机号": "Telefoninumber", + "忘记密码": "Unustasin parooli", + "重置成功": "Lähtesta edu", + "确定要退出吗?": "Väljapääsu?", + "功能暂未开放": "Funktsioon ei ole veel avani", + "设置成功": "Seadistamine edukalt", + "删除成功": "Kustuta edukalt", + "单次": "Ühekordne kord", + "永久": "Püsiv", + "限时": "Ajastud", + "自定义": "Kohandatud", + "清空码": "Kustuta", + "循环": "Korduv", + "工作日": "Tööpäev", + "每日": "Päevas", + "周末": "Nädalavahetus", + "确定要删除吗?": "Kustutada?", + "该锁的密码都将被删除": "Kõik selle Locki paroolid eemaldatud", + "已过期": "Vigane", + "该锁的电子钥匙都将被删除": "Kõik selle luku eKeyd saavad Lõpetada", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Kõik ekeys seostatud selle ekey.This Step ei saa olla UNDONE!", + "删除钥匙会在用户APP连网后生效": "Ekey eemaldatakse.", + "有效时间": "Tõhus aeg", + "接收者": "Vastuvõtja", + "仅管理自己创建的用户": "Oma kasutajate haldamine", + "远程开锁": "Võrgu lukustamine", + "请输入钥匙名称": "Palun sisesta võtme nimi", + "修改成功": "Edukuse muutmine", + "冻结": "Külmutamine", + "解除冻结": "Sulanda", + "授权": "Autoriseerimine", + "取消授权": "Tühista autoriseerimine", + "同时解冻其发送的钥匙": "Sulatakse kõik selle kasutaja väljastatud ekeys", + "会在用户APP连网后生效": "See ekey on THAWED, kui kasutaja APP ühendab võrga", + "同时冻结其发送的钥匙": "Külmuta kõik selle kasutaja poolt väljastatud ekeys", + "冻结会在用户APP连网后生效": "See ekey on FROZEN, kui kasutaja APP ühendub võrga", + "取消授权会在用户APP连网后生效": "Kasutaja LOOSE oma õigused, kui kasutaja APP ühendab võrguga", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Autoriseeritud kasutajal on peaaegu samad õigused kui LOCK Manager (eg. Võimalus saata ekeys ja paroolid)", + "失效时间需晚于生效时间": "Kehtivusaeg peab olema hilisem kui tegevusaeg", + "生效时间需晚于当前时间": "Kehtiv aeg peab olema hilisem kui praegune aeg", + "失效日期需晚于生效日期": "Kõlblikkusaeg peab olema hilisem kui jõustumiskuupäev.", + "修改有效期": "Muudatusperioodi", + "生效日期": "Alguskuupäev", + "失效日期": "Lõppkuupäev", + "开锁": "Tõmba lukusti", + "开锁成功": "Ava edukus", + "请选择锁": "Palun vali lukud", + "请选择接收者": "Palun vali vastuvõtja", + "请选择有效期": "Palun vali kehtivusaeg", + "请选择发送方式": "Palun vali saatmismeetod", + "请选择结束时间": "Palun vali lõpuaeg", + "完成": "Lõpetatud", + "有效日": "Tsükli käik", + "发送成功": "Edu saatmine", + "请选择开始时间": "Palun vali algusaeg", + "选择用户": "Vali saajad", + "已选中": "Valitud", + "确定": "Olgu.", + "请选择要发送的锁": "Palun vali lukud", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Nägu tegeliku nime autentimine viitab kasutaja vajadusele kontrollida oma nägu enne telefoni APP avamist, ja kontrolli saab avada.", + "分享": "Jaga", + "请输入接收者账号": "Palun sisesta vastuvõtja konto", + "接收者号码未注册,请重新发送": "Vastuvõtja number ei ole registreeritud.", + "是否发送电子钥匙给未注册账号": "Kas saata ekey uuele kontole", + "取消": "Katkesta", + "标记成功": "Märgi edukus", + "微信好友": "WeChati sõbrad", + "短信": "SMS", + "邮件": "E- posti aadress", + "更多": "Rohkem.", + "您好,您的电子钥匙生成成功": "Tere, sinu elektrooniline võti on edukalt genereeritud.", + "生效时间不能小于当前时间": "Efektiivne aeg ei saa olla lühem kui praegune aeg", + "结束时间不能小于当前时间": "Lõppa", + "是否为管理员": "Kas see on administraator?", + "已连接到锁,请将卡靠近门锁的读卡区": "Ühendatud.Punkta kaart kaardilugeja vastu.", + "尝试连接设备...": "Ühendamine Lock.Palun oota ....", + "地理位置": "Geograafiline asukoht", + "检查以确保以下地址是正确的": "Kontrolli, et järgmine aadress on õige.", + "地图加载中,请稍候。。": "Kaart laaditakse, palun oodake...", + "跳过": "Jätka", + "还未获取到位置信息哦,请耐心等待一下!": "Asukoha teavet pole veel hangitud, palun oota kannatlikult!", + "请填写信息": "Palun täitke teave.", + "有效期": "Kehtivusaeg", + "生效时间": "Algusaeg", + "失效时间": "Lõpu aeg", + "上传成功": "Üleslaaditud edukalt", + "未生效": "Mitteaktiivne", + "已生效": "Tõhusad", + "指纹详情": "Sõrmejäljeinfo", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Teil on vaja asetada oma sõrme sensor mitu korda.Palun järgige küsitlusi ....", + "开始添加": "Käivitamine", + "请将您的手指按下": "Aseta sõrm sensorile", + "根据提示,抬起手指后再进行下一次指纹采集": "Jälgige küsitlusi ...Sa peab olema eemaldada ja asetada oma sõrme sensor järgmine rekord.", + "添加成功": "Edu lisamine", + "更新成功": "Uuenda edu", + "搜索": "Otsimine", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku kaart. Kas soovid lähtestada?", + "已失效": "Vigane", + "卡详情": "Kaardi infoComment", + "请输入": "Palun sisesta siia", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Lülitades, jääb Lukk kogu päeva lukustamata, kuni see on käsitsi lukustatud", + "请输入小于或等于60的数字": "Palun sisesta arv alla 60.", + "操作成功": "Operatsioon edukas", + "管理员密码相同,无需修改": "Administraatori parool on sama ja seda pole vaja muuta", + "请输入6-9位数字": "6-9 numbrite pikkusel", + "请输入6-9位管理员密码": "Palun sisesta 6-9-kohaline administraatori parool.", + "请输入新的管理员密码": "Palun sisesta uus administraatori parool.", + "未分组": "Grupimata", + "请输入分组名称": "Loo rühma", + "创建成功": "Edu loomine", + "设置锁分组成功": "Luku grupi edukalt määramine", + "电池1电量": "Aku 1", + "电池2电量": "Aku 2", + "电量更新时间": "Aku uuendamise aeg", + "锁电量更新成功": "Lukustuse uuendamise edu", + "您的钥匙未生效": "Sinu võti ei ole tõhus.", + "您的钥匙已冻结": "Sinu võti on külmutatud", + "您的钥匙已过期": "Sinu võti aegus", + "常开模式开启": "Lukk on läbisõidurežiimis", + "超级管理员": "Super adminName", + "授权管理员": "Lubatud adminName", + "普通用户": "Tavaline kasutaja", + "余": "Saldos", + "天": "Päev", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Pärast luku kustutamist kustutatakse kogu info koos. Kas tõesti kustutada lukk?", + "请输入登录密码": "Palun sisesta rakenduse parool", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Seadme kustutamine nurjus, palun veenduge, et seade on seadme lähedal, seade ei ole ühendatud, ja seade on sisse lülitatud", + "用户无权限": "Kasutajal puudub õigus", + "创建公司后,考勤功能才能使用": "Palun luua ettevõte esmalt", + "是否删除钥匙?": "Kas kustutada see ekey?", + "邮箱绑定成功": "E- posti siduv edu", + "手机绑定成功": "Mobiiltelefoni siduv edu", + "网络访问失败,请检查网络是否正常": "Request Failed.Network puudub,Palun Kontrollige ja ühendage oma seade 3G/4G/WIFI", + "清空": "Puhasta", + "是否清空?": "On selge?", + "消息详情": "Kirjade info@ info: whatsthis", + "创建时间": "Loomise aeg", + "管理员详情": "Administraatori andmed", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Kui keegi sunnib sind ukse avama, võid seda kaarti kasutada. Häiresõnum saadetakse administraatoritele. Selle funktsiooni kasutamiseks veenduge, et teie lukk on võrgus.", + "请不要将胁迫卡用于日常开锁": "Palun ärge kasutage sundkaarti igapäevaseks kasutamiseks.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Kui keegi sunnib sind ust avama, võid kasutada seda sõrmejälgi. Häiresõnum saadetakse administraatoritele. Selle funktsiooni kasutamiseks veenduge, et teie lukk on võrgus.", + "请不要将胁迫指纹用于日常开锁": "Palun ärge kasutage sunnitud sõrmejälgi igapäevaseks kasutamiseks.", + "创建公司": "Firma loomine", + "公司名称不能超过30个字符": "Ettevõtte nimi ei tohi ületada 30 märki", + "公司名称不能小于6个字符": "Ettevõtte nimi ei saa olla väiksem kui 6 märki", + "WIFI列表": "WIFI nimekiri", + "刷新": "Värskendamine", + "手动配网": "Käsitsi jaotusvõrk", + "远距离": "Kaugvahemaa", + "中距离": "Keskmine vahemaa", + "近距离": "Lühike vahemaa", + "锁时间更新成功": "Lukustusaja uuendamise edu", + "锁用户": "Lukusta kasutajad", + "请选择常开日期": "Palun vali avatud kuupäev", + "结束时间不能小于开始时间哦": "Lõppa", + "介绍": "Meie lugu", + "个人信息收集清单": "Isikuandmete kogumise loetelu", + "应用权限说明": "Rakenduse õiguse kirjeldus", + "第三方信息共享清单": "Kolmandate isikute teabevahetuse nimekiri", + "请选择您的位置": "Palun vali asukoht", + "请先选择位置": "Palun vali kõigepealt asukoht.", + "管理员密码": "Admin paroolid", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Kui soovid muuta, siis sisesta uus administraatori parool (6 numbrit), klõpsa OK muutmiseks.", + "修改": "Muuda", + "网络摄像头": "Kaameras", + "重命名": "Nimeta ümber", + "分组下的锁将被移到未分组里": "Grupi alla kuuluvad lukud liigutatakse rühmitatud", + "编辑成功": "Edu muutmine", + "厂商": "Tootja", + "型号": "Näidis", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Pärast parooli loomist palun kasutage seda aktiveerimiseks enne 23:59 samal päeval, Muidu on see kehtetu pärast kella 0. Pärast parooli aktiveerimist saab seda kasutada piiramatult ajal kehtivusaja jooksul.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Pärast parooli loomist palun kasutage seda enne 23:59 samal päeval, vastasel juhul on see kehtetu pärast kella 0. Selge koodi kasutatakse kõigi loodud paroolide tühjendamiseks täna enne kella 0.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Pärast parooli loomist palun kasutage seda enne 23:59 samal päeval, vastasel juhul on see kehtetu pärast kella 0.", + "清空密码底部提示": "Parool kehtib kuni 23:59 tühjendamise päeval", + "相机": "KaameraName", + "相册": "Fotod", + "读写": "Säilitamine", + "定位": "Asukoht", + "需要访问相机权限才能拍照上传文件例如头像上传": "Fotode võtmiseks ja failide üleslaadimiseks on vaja juurdepääs kaamerale, näiteks profiili pildi üleslaadimine", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Ligipääs kaamerale on vaja failide ja avataride üleslaadimiseks albumi piltide abil", + "需要访问读写权限才能使用本地图片上传头像": "Juurdepääs lugemis- ja kirjutamisõigustele on vaja avataride üleslaadimiseks kohalike piltide abil", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Juurdepääs asukoha teabele on vajalik, et kasutada lisa võtmefunktsioone", + "申请": "Taotlus", + "权限": "Õigus", + "不允许": "Pole lubatud", + "允许": "Lubatud", + "权限被拒绝": "Õigus keelatud", + "请手动在系统设置中开启": "Palun luba see süsteemi seadistustes käsitsi", + "权限以继续使用应用": "Luba jätkata rakenduse kasutamist.", + "去设置": "Mine seade", + "当前网络": "Aktiivne võrk", + "位置信息": "Asukoha teave", + "请输入wifi名称": "Palun sisesta wifi nimi", + "虹膜": "Iiris", + "手掌": "Palmi", + "商城": "Kaubamaja", + "我的": "Minu", + "微信公众号推送": "Jutt avalik konto", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Et avada häiresõnumite vastuvõtmiseks, peate esmalt tähelepanu Skye Smart Locki avalikule kontole, palun salvesta QR koodi ja kasuta seadistuste skaneerimiseks", + "蓝牙": "BluetoothName", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Juurdepääs Bluetooth-i õigustele on vaja, et kasutada asukoha lisamise funktsiooni asukoha teavet", + "请输入Email": "Sisesta oma e- postil", + "请输入手机号": "Sisesta oma telefoninumber", + "家人到家": "Pereliige jõudis koju", + "添加家人": "Lisa pereliige", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Kui lukk ei ole internetiga ühendatud, meenutab salakoodi, kaardi, sõrmejälje, ja muid ukse avamise meetodeid ei saa õigeaegselt saata.", + "消息提醒": "Meeldetuletus", + "开门通知": "Algatusteade", + "N天未开门": "N päevad ilma ukseavata päevad", + "门未关好": "Uks ei ole suletud.", + "防拆报警": "Tamper häireComment", + "低电量提醒": "Väike akutus", + "胁迫开门": "Ukse avamine", + "有人按门铃": "Keegi helistab uksekella.", + "有人出现在门口": "Keegi ilmub ukse juurde.", + "提醒方式": "Meeldetuletusmeetod", + "开门方式": "Ukse avamise meetod", + "请选择": "Palun valimine", + "家人": "Pereliigem", + "保存": "Salvesta", + "APP推送": "APP lükkamine", + "管理员": "AdministraatorName", + "未启用": "Pole lubatud", + "已启用": "Lubatud", + "省电模式": "Energiasäästu režiim", + "逗留抓拍模式": "Püsimise režiim", + "实时监控模式": "Reaalajas seirerežiim", + "自定义模式": "Kohandatud režiim", + "猫眼设置": "Kassilmade seadmine", + "猫眼工作模式": "Kassilmade töörežiim", + "自动亮屏": "Automaatne erekraanName", + "亮屏持续时间": "Ekraan õigel ajal", + "逗留警告": "Hoiatus.", + "异常警告": "Ebatavaline hoiatus.", + "短信提醒": "SMS", + "邮件提醒": "E- posti aadress", + "N天未开门提醒": "N päevad ilma ukseavata päevad", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Kui keegi sunnib sind lukku avama, võid seda sõrmejälje kasutada. Häiresõnum saadetakse administraatoritele.TO kasutada seda funktsiooni, palun veenduge, et teie lukk on online.", + "胁迫指纹": "Sungitud sõrmejälg", + "指纹列表": "Sõrmejälgede nimekiri", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Pärast määratud aega, kui lukk ei avata, saadab süsteem märgitud saajale meeldetuletussõnumi. See funktsioon nõuab, et lukk oleks internetiga ühendatud.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Pärast võimaldamist meeldetuletuse , Kui lukustus aku on alla 20%, 10%, ja 5%, süsteem saadab määratud saajale meeldetuletussõnumi.", + "未开门时间": "Ukse avamata päevad", + "添加和使用面容开锁时:": "Lisa ja kasuta Face avamisel:", + "关锁": "Sulguks", + "功能": "Funktsioon", + "配件": "Osad", + "云存": "Pilvede säilitamine", + "本地": "See koht", + "3天滚动储存": "3 päeva veerev säilitamine", + "去升级": "Uuenda kohta", + "下载列表": "Allalaadimise nimekiri", + "已下载": "Allalaaditud", + "全部视频": "Kõik videod", + "已为本设备免费提供3大滚动视频储存服务": "Selle seadme jaoks on osutatud tasuta kolm keritavat videosalvestit", + "视频播放": "Video esitust", + "全选": "Kõik kokku", + "请选择要删除的视频": "Palun vali video, mida soovid kustutada.", + "请选择要下载的视频": "Palun vali video, mida soovid allalaadida.", + "欢迎使用": "Tere tulemast kasutama.", + "用户协议和隐私政策概要": "Kasutajalepingu ja privaatsuspoliitika kokkuvõte", + "协议概要": "Protokolli kokkuvõte", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Tänan, et kasutate seda taotlust. Omandame väga tähtsust teie isikuandmetele ja privaatsuse kaitsele. Enne ravimi kasutamist lugege seda hoolikalt", + "《用户协议》": "Kasutaja tingimused", + "和": "Ja", + "《隐私政策》": "Erandlikkuse poliitik", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Kogu sisu. Klõpsates \"Acee\", nõustute ja nõustute kõiki tingimusi. Kui te otsustate mitte nõustuda, ei saa te kasutada meie tooteid ja teenuseid ning lahkub rakendusest.", + "不同意": "Mitte nõus", + "同意": "Kokkulepe", + "该功能是高级功能,请开通后再使用": "See on arenenud funktsioon. Palun luba see kõigepealt.", + "常用程序": "Ühisprogrammid", + "该锁已被重置": "Lukk on lähtestatud", + "需要访问读写权限才能使用手动升级固件": "Juurdepääs lugemis- ja kirjutamisõigustele on vaja, et käsitsi uuendada firmavarat", + "错误D固件,请选择正确的文件": "Vale firmware, palun vali õige fail", + "非SYD固件,请选择正确的文件": "Mitte SYD firmavara, palun vali õige fail", + "文件校验失败 0x01": "Faili kontrollimine nurjus 0x1", + "解析元数据失败,请选择正确的文件": "Metaandmete parsimine nurjus, palun vali õige fail", + "文件校验失败 0x02": "Faili kontrollimine nurjus 0x02", + "文件校验失败 0x03": "Faili kontrollimine nurjus 0x03", + "固件升级完成": "Firmware uuendamine lõpetatud", + "记录": "Registreerimine", + "开通高级功能后才可以对锁进行管理": "Palun luba kõigepealt lukustuse halduseks.", + "去开通": "Luba", + "实名认证": "Realnime autentimine", + "当前剩余数量": "Ülejäänud", + "购买": "Osta", + "实名认证为付费功能,请购买后再使用": "Realnime autentimine on tasutud funktsioon, palun kasuta seda pärast ostut", + "密码不一致哦": "Paroolid ei ole järjekindlad", + "退出添加": "Lõpeta lisamine", + "管理员已满": "Täielik administratsion", + "用户已满": "Kasutaja on täis.", + "锁上面添加指纹已满": "Sõrmejälje lisamine lukku on täis.", + "指纹已存在": "Sõrmejälg on juba olemas.", + "锁上面添加人脸已满": "Lukustamine lisamise nägu on täis.", + "人脸已存在": "Nägu on juba olemas", + "锁上面添加卡已满": "Lukustamine kaardi lisamise kohale on täis.", + "卡已存在": "Kaart on juba olemas", + "锁上面添加密码已满": "Lukustamine ülal parool on täis parooli", + "密码已存在": "Identiline kood on juba olemas. Palun vali teine.", + "请输入密码": "Palun sisesta parol", + "暂无密码,无需重置": "Parool puudub, pole vajadust lähtestama", + "真实姓名": "Päris nimi", + "身份证号": "ID-number", + "请输入真实姓名": "Palun sisesta oma õige nimi", + "请输入身份证号": "Palun sisesta oma ID- number", + "请输入身份证号和真实姓名": "Palun sisesta ID- number ja õige nimi", + "点击返回设备配对": "Koputage seadme paarist", + "无法连接?尝试升级": "Ei saa ühendust?", + "固件升级提示": "Firmware uuendamise küsimus", + "请先获取固件文件到手机本地,再选择升级": "Palun hangi kõigepealt kohaliku telefoni firmware fail ja seejärel uuendamine", + "固件升级中": "Firmavara uuendatud", + "取消升级": "Uuendamise katkestamine", + "固件传输中": "Transiidil", + "关闭": "Välja lülitamine", + "传输中'": "Transiidil", + "操作记录": "Registreerimine", + "修改姓名": "Muuda nime", + "传输中": "Transiidil", + "发送人": "Välja andnud:", + "发送时间": "Välja antud aeg", + "钥匙详情": "Ekey infoComment", + "姓名": "Nimimi", + "发送": "Saada", + "请确认姓名全名和身份证号码是否正确": "Palun kinnitage, et täielik nimi ja ID number on õiged", + "传输期间请勿离开当前页面": "Ülekande ajal ei lahku aktiivsest leheküljest", + "机型": "Mudelid", + "硬件版本": "Riistvara versiooni", + "固件版本": "Firmware versioon", + "手动升级": "Käsitsi uuendamine", + "设备连接中...": "Seadme ühendamine...", + "未避免异常情况,请在门打开时升级": "Vältimatud", + "钥匙无效": "Võti on vigane", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Lukuga ühendamine nurjus.Palun käivita telefoni Blutooth uuesti ja proovi uuesti.", + "如果是全自动锁,请使屏幕变亮": "Kui see on täisautomaatne lukk, palun muuta ekraan eredamaks", + "正在尝试闭锁……": "Püüan lukustada. Palun oota...", + "清空记录": "Puhasta kirjed", + "是否要删除操作记录?": "Kas jätkata kirjete kustutamist?", + "被删除的记录不能恢复": "Pärast kustutamist ei saa registreerida.", + "全部事件": "Kõik sündmused", + "开锁事件": "Sündmus lukustamine", + "异常事件": "Ebanormaalne kõrvaltoime:", + "门铃事件": "Uksekell sündmused", + "视频事件": "Videosündmused", + "请开启蓝牙": "Palun keera bluetooth", + "请选择有效日": "Palun vali kehtiv päev", + "公司名字长度不能小于 6 ": "Äriühingu nime pikkus ei tohi olla väiksem kui 6", + "已是最新版本": "Uuendused puudub", + "新建短信模版": "SMS- malli loomine", + "新建邮件模版": "E- posti malli loomine", + "自定义短信模版": "SMS mall", + "自定义邮件模版": "E- posti mall", + "名称": "Nimimi", + "星星锁": "Tähelukk", + "无考勤记录": "Kirje puudub", + "大家干劲十足": "Kõik tulevad õigel ajal.", + "工作时长未出炉": "Tööaegu puudub", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Riigi/piirkonna valik mõjutab andmete turvalisust.Olete praegu valinud Albaania, palun kinnitage enne jätkamist.", + "确认国家或地区": "Kinnitada riik/piirkond", + "我知道了": "Sain aru.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Oluliste uuenduste saamiseks klõpsake \"OK\" ja lubage teated seaded.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Pärast sisselülitamist saad uuesti sisse vajutada klahvi lukk ja lisada see uuesti APP abil", + "已有": "Praegune", + "新增": "UusName", + "账号格式错误": "Halb vormingus", + "接收者信息为空": "Saaja teave on tühi", + "请输入时间(秒)": "Palun sisesta kellaaeg (sek)", + "加载数据失败": "Andmete laadimine nurjus", + "重试": "Proovi uuesti", + "升级中,是否退出": "Uuendamise ajal, kas väljuda seest", + "下一步": "Järgmine", + "公寓": "Korter", + "个人用户": "Isiklikud", + "星寓": "Tähe korter.", + "账号": "Konto", + "请输入手机号或email": "Telefoninumber või e- posti aadress", + "请输入星寓管理员的账号": "Palun sisesta tärnikorteri administraatori konto", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Kõik valitud luku(te) andmed edastatakse püsivalt vastuvõtjale.", + "暂不支持跨平台转移,敬请期待": "Platvormide ülekanne ei toeta praegu, palun oota seda.", + "移除坏锁": "Vigade/kahjustatud lukkud prügikasti liigutamine", + "转移确认": "Ülekande kinnitamine", + "本次共转移": "Seekord kokku kokku", + "把智能锁": "Nutikas lukus", + "确认": "Olgu.", + "移除成功": "Eemalda edukalt", + "转移成功": "Ülekandmine", + "该已锁被删除": "Lukustatud on kustutatud", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Volitatud admin saab hallata ainult salakoode,ekeys ja etccreated ise.", + "添加授权管理员": "Loo adminName", + "导出记录": "Eksporditeenused", + "选择时间段": "Vali ajavahemik", + "导出": "Eksport", + "批量导出": "Partii eksportimine", + "读取记录": "Värskenda salvestus", + "设备": "Seade", + "消息": "Teated", + "智能分析": "Intelligentne analüüs", + "精准识别设备事件,过滤无效信息": "Täpselt tuvastada seadme sündmused ja filtreerida vigane teavet", + "系统设置": "Süsteemi seadistused", + "系统的全局配置在此项内进行设置": "Süsteemi globaalne seadistus on seatud selles kirjes", + "导出操作记录": "Eksporditeenused", + "立即查看": "Vaade", + "导出成功": "Ekspordis edukalt", + "发送钥匙": "Saada ekey", + "进度": "Määrus", + "失败": "Nurjus", + "人脸详情": "Näo üksikasjad", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Kui keegi tajutakse umbes 1,5 meetrit ukse ees, käivitatakse näotuvastuse avamine automaatselt.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Kui keegi tajutakse ukse ees umbes 0,8 meetrit, alustatakse näotuvastuse avamist automaatselt.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Kui keegi tajutakse ukse ees umbes 0,5 meetrit, alustatakse näotuvastuse avamist automaatselt.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Tunnetuse kaugus on välja lülitatud, sa pead käsitsi puudutama iga klaviatuuri klaviatuuri klahvi, et sooritada näotuvastuse avamine.", + "防误开已打开,开锁后": "Vigavastane avamine on sisse lülitatud ja pärast lukustumist", + "秒内不可使用面容开锁": "Näo avamist ei saa kasutada mõne sekundi jooksul.", + "掌静脉": "Palmi veen", + "添加掌静脉": "Lisada palmi veen.", + "胁迫掌静脉": "Sunnitud palmi veen", + "请不要将胁迫掌静脉用于日常开锁": "Palun ärge kasutage sundi palmi veeni iga päev avamiseks", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Lukuga ühendatud, palun avage oma peopesa loomulikult.", + "掌静脉详情": "Palmi veeni üksikasjad", + "掌静脉号": "Palmi veeni arv", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth ei ole sisse lülitatud, palun lülita Bluetooth seadistustes sisse", + "删除用户时,会将用户拥有的钥匙一起删除。": "Kui Kasutaja on KASUTATUD, mis on seotud Kasutajaga seotud ekeys on samuti KASUTATUD.", + "配置网络": "Võrgu seadistamine", + "你好": "Tere.", + "成功": "Edukas", + "类型选择": "Tüübi valimine", + "请选择要使用哪种类型": "Palun vali, millist tüüpi kasutada", + "系统邮件(推荐)": "Süsteemi e- posti (soovitatav)", + "系统短信(推荐)": "Süsteemi SMS (soovitatav)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-mail saadetakse sellest rakendusest.Palun osta e-posti pakett.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS saadetakse sellest rakendusest.Palun osta e-posti pakett esmalt.", + "个人邮件": "Isiklik e- kirja", + "个人短信": "Isiklik SMS", + "邮件将从你的个人邮箱发给用户": "E-mail saadetakse sinu isiklikult e-posti kontolt.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS-sõnumi saadetakse teie isikliku telefoninumbri kaudu.Sa maksad oma telekommunikatsioonioperaatorile.", + "为了更好地应用体验,请确定权限": "Parema rakenduskogemuse saamiseks kinnitage õigused.", + "您第一次拒绝权限,请确定权限": "Sa keeldusid esimest korda luba, palun kinnita õigus", + "您第二次拒绝权限,请去应用设置开启权限": "Teist korda keeldusid õigusest. Palun minge õiguste lubamiseks rakenduse seadistustele", + "去应用市场": "Mine rakenduspoos", + "温馨提示": "Soe prompt", + "关闭应用": "Rakenduse sulgemine", + "开启微信接收报警消息需要先关注": "Häireteadete vastuvõtmiseks WeChati avamiseks tuleb järgida.", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat avalik konto, salvesta QR koodi ja kasuta WeChati seadistuste skaneerimiseks WeChat", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Realnime autentimine on tasutud funktsioon, palun võta ühendust luku administraatoriga, et osta ja kasutada", + "位置权限": "Asukoha õigus", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Palun lubage rakendus kasutada oma locatian.See kasutatakse BLE lukud ja väravad skaneerimiseks.", + "相机/相册权限": "Kaamera/Albumi õigus", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Palun lubage rakendusel lugeda ja kirjutada foto ja faile salvestamisest.", + "点击选择": "Klõpsa valimiseks", + "微信": "WeChat", + "朋友圈": "Hetked", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "WeiboComment", + "FaceBook": "FaceBook", + "链接": "Lingi", + "今天": "Täna:", + "密码错误": "Vigane parool", + "网络中断": "Võrgu katkestamine", + "钥匙不存在": "Võti pole olemas", + "钥匙过期": "Võti aegus", + "钥匙已存在": "Võti on juba olemas", + "密码失效": "Parool vigane", + "门锁时间异常": "Ukse lukustuse aeg ebanormaalne aeg", + "APP(手机)未联网": "APP (mobiiltelefon) ei ole internetiga ühendatud.", + "数据不存在": "Andmeid pole olemas", + "待接收": "Vastuvõttud", + "已冻结": "Külmutatud", + "已删除": "Kustutatud", + "未知": "Tundmatu", + "拖动下方滑块完成拼图": "Lohista liugur õigesse asendisse.", + "验证成功": "Kontrollimise edu", + "验证失败": "Kontroll nurjus", + "向右拖动滑块填充拼图": "Lohista liuguri paremale, et täita mõistatust", + "请先获取到位置信息哦": "Palun hangi kõigepealt asukoha teavet", + "请选择国家": "Palun vali riik", + "获取锁信息": "Lukustusteabe hankimine", + "锁数据异常,请重试": "Lukustusandmed on ebanormaalsed, palun proovi uuesti.", + "连接设备中...": "Ühenduse seade...", + "把锁": "Lukud", + "条": "Ribad", + "封": "Pitserid", + "次": "Korja", + "支付成功": "Edu tasu", + "查看详情": "Vaata üksikasju.", + "请输入模板名称": "Palun sisesta malli nimi", + "模版类型": "Tüüp", + "再返回一次退出": "Väljumine uuesti", + "请先添加锁": "Palun lisa lukk esmalt", + "可视对讲": "Visuaalne intercomi", + "详细日志": "Üksikasjalik logi", + "已复制到剪切板": "Kopeeritud", + "拍照": "Pilt", + "从相册选择": "Vali albumist", + "选择问题": "Palun vali küsimus", + "确认长度不足8位": "Pikkuse kinnitamine alla 8 numbrile", + "新密码长度不足8位": "Uus parooli pikkus on vähem kui 8 numbrit", + "两次密码不一致": "Parooli ei vasta. Palun proovi uuesti.", + "请点击获取验证码,验证码将发送到": "Palun hankige kontrollikood.Kood saadetakse", + "切换": "Lüliti", + "验证": "Kontrolli", + "验证成功,账号已删除": "Kontroll edukas, konto kustutud", + "该密码不是自定义密码,无法修改": "See parool ei ole kohandatud parool ja seda ei saa muuta", + "请选择设备要关联哪些姓名": "Palun vali, milliste nimedega seade peab olema seotud.", + "请选择姓名要关联哪些设备": "Palun vali seadmed, millega nimi peaks olema seotud.", + "确定要移除所选中的坏锁吗?": "Eemaldada rike lukk?", + "邮件通知": "Teavitamine e- posti teel", + "短信通知": "Teavitamine SMS teel", + "您好,您的授权管理员生成成功": "Hallo, sinu volitatud administraator on edukalt loodud", + "请输入接收者姓名": "Palun sisesta siia", + "版本更新": "Versiooni uuendamine", + "下次再说": "Järgmine kord", + "配网成功": "Võrgu jaotuse edu", + "配网失败": "Võrgujaotus nurjus", + "该锁的无线键盘都将被删除": "Kõik selle luku traadita klaviatuurid eemaldatakse", + "实时画面": "Reaalajas pilt", + "适合门口较为安全的环境。": "Sobib suhteliselt ohututesse keskkondadesse ukse juures.", + "仅发生特定事件才录像,并可查看实时画面。": "Registreeritakse ainult konkreetseid sündmusi ja reaalajas pilti saab vaadata.", + "一般情况下,满电可使用7-8个月": "Normaalsetel asjaoludel võib seda kasutada 7-8 kuud, kui täielikult laetud", + "有人逗留或发生特定事件才录像,可随时查看": "Keegi viibib või konkreetsed sündmused salvestatakse ja neid saab igal ajal vaadata.", + "实时画面。": "Reaalajas pilt.", + "一般情况下,满电可使用5~6个月。": "Normaalsetel asjaoludel, seda saab kasutada 5 ~ 6 kuud kui täielikult laetud.", + "适合门口人员复杂、较不安全的环境。": "Sobib keerukate ja suhteliselt ohtlike keskkondade jaoks ukse juures.", + "有人出现就录像,可随时查看实时画面。": "Salvesta, kui keegi ilmub ja vaata reaalajas pilti igal ajal.", + "一般情况下,满电可使用2~4个月。": "Normaalsetel asjaoludel, seda saab kasutada 2~4 kuud, kui täielikult laetud.", + "根据您家门口实际情况设置录像和实时画面功能。": "Sea video ja reaalajas pildi funktsioonid vastavalt ukse tegelikule olukorrale.", + "可使用时长由具体设置决定。": "Kasutamise kestus määratakse kindlaks spetsiifiliste seadistuste järgi.", + "查看": "Vaade", + "有人按门铃或发生": "Keegi helistab uksekella.", + "异常事件时": "Kõrvalekalded", + "不录像": "Video puudub", + "有人出现、按门铃": "Keegi ilmub, helistab uksekella.", + "或发生异常事件时": "Või tekib ebanormaalne kõrvaltoime.", + "逗留达到10秒": "Jää 10 sekundit.", + "约1.5米": "Umbes 1,5 meetrit", + "随时": "Iga kell.", + "立即录像": "Viivitamata salvestamine", + "录像时机": "Video ajastus", + "有人出现时录像": "Salvesta, kui keegi ilmub", + "人体侦测距离": "Inimeste avastamise kaugus", + "查看实时画面": "Reaalajas pildi vaade", + "自定义时间": "Kohandatud aeg", + "当日": "Täna:", + "次日": "Järgmine päev", + "自定义时段": "Kohandatud ajavahemik", + "发生事件时查看": "Vaade sündmuse esinemisel", + "实时查看": "Reaalajas vaade", + "有人在门口出现10秒后开始录像。": "Keegi ilmub ukse juurde 10 sekundit enne salvestamist.", + "有人按门铃时立即录像。": "Salvestage kohe, kui keegi uksekella helistab.", + "有人出现在门前1.5米范围时启动录像": "Alusta salvestamist, kui keegi ilmub 1,5 meetri kaugusel ukse ees.", + "约0.8米": "Umbes 0,8 meetrit", + "约3.0米": "Umbes 3,0 meetrit", + "添加指纹失败": "Operatsioon nurjus.", + "项": "Kirjed", + "播放中": "Mängimine", + "下载": "Allalaadimine", + "暂无下载内容": "Allalaadimine puudub", + "亮度": "Heledus", + "音量": "Maht", + "快进至": "Kiire edasi.", + "快退至": "Tagasi kerimisele", + "暂无视频信息": "Videoinfo puudub", + "加载出错": "Laadimisviga", + "请单人正对门锁,距离一个成年人手臂长度": "Palun seiske üksinda ukse ees, käepikkusel.", + "(约0.6米)。": "(Umbes 0,6 meetrit)", + "保持脸部无遮挡,露出五官。": "Hoia oma nägu kõrvale ja näita oma näod.", + "准备好了,开始添加": "Valmis, alusta lisamine", + "正在录入中...": "Salvestamine...", + "添加人脸失败": "Näo lisamine nurjus", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku näod. Kas tõesti soovid lähtestada?", + "人脸号": "Näo number", + "虹膜详情": "Iris üksikasjad", + "虹膜号": "Iris number", + "选择设备类型": "Vali seadme tüüp", + "照明灯具": "Valgustid", + "电动窗帘": "Elektrikardinad", + "门窗传感器": "Ukse- ja aknanensor", + "传感器": "Ander", + "清除数据成功": "Andmed on edukalt tühjendatud", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Lukk pole internetiga ühendatud, nii et salakoodi, kaardi, sõrmejälje, ja teisi ukse avamise meetodeid ei saa reaalajas üles laadida.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Kui teil on vaja säilitada ajaloolisi andmeid, võite neid eksportida.", + "看不到操作记录,可能原因有": "Operatsiooni kirjeid ei näe, võimalused põhjused", + "操作记录详情": "Operatsiooni andmed", + "操作时间": "Tööaeg", + "此模块功能需要锁联网后设置方可生效": "See mooduli funktsioon tuleb määrata pärast seda, kui lukk on internetiga ühendatud, et jõustuda.", + "用户已存在": "Kasutaja on juba olemas", + "钥匙数量已到上限": "Klahvide arv on jõudnud ülemmäära", + "附近没有可用网关": "Lähedal pole vaba väravat", + "正在创建安全连接...": "Turvalise ühenduse loomine...", + "监视状态下不能发送录音": "Kirjete saatmine seirerežiimis nurjus", + "挂断": "Pane toru ära.", + "监视中暂不能开锁": "Vabastamine ei ole seire ajal saadaval.", + "长按说话": "Vajuta ja hoida", + "松开发送": "Saatmiseks vabastamine", + "请输入6位数字开锁密码": "Palun sisesta 6-kohaline lahus parool.", + "请输入开锁密码": "Palun sisesta lukustatud parool", + "接收者在有效期内可以不限次数使用": "Saajad saavad kasutada ekeys piiramatul ajal kehtivusaja jooksul.", + "接收者可以使用此App开关锁": "Saaja on võimeline lukustama / avama selle rakendusega.", + "单次钥匙有效期为1小时,只能使用一次": "Ühekordne ekey kehtib ühe tunni jooksul ja seda saab kasutada ainult ÜKS.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Saajad on võimelised kasutama ekeys piiramatu aja jooksul fikseeritud tsükli aja jooksul.", + "获取模板失败": "Malli hankimine nurjus", + "微信通知": "WeChati märguanne", + "系统短信": "Süsteemi SMS", + "系统邮件": "Süsteemi e- kirje", + "模板": "Mall", + "新建模版": "Loo mall", + "您好,您的密码是": "Tere, su parool on.", + "密码名字": "Parooli nimi", + "请输入6-9位密码": "Palun sisesta 6-9-kohaline parool.", + "设置密码": "Parooli määramine", + "操作成功,密码为": "Suurepärane.", + "类型:自定义-永久": "Tüüp:Kohandatud-püsiv", + "实时播放": "Reaalajas taasesitus", + "点击对讲": "Vajuta sidumiseks", + "长按开锁": "Pikk vajutamine lukustamiseks", + "接听失败": "Vastamine nurjus", + "请在锁设置中开启远程开锁": "Palun luba luku seadistustes kauglukustamine", + "接听": "Vastus", + "截图已保存到相册": "Pilt salvestatud albumik", + "添加遥控": "Kaugjuhtimise lisamine", + "已连接到锁,请按遥控": "Lukuga ühendatud, vajuta palun kaugjuhtimispult", + "遥控号": "Kaugjuhtimise number", + "遥控详情": "Kaugjuhtimise üksikasjad", + "照明": "Valgustus", + "退出演示模式": "Väljumine demo režiim", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Näpunäide: Praegune liides on kuvaliides. Pärast seadme lisamist saab jätkata selle kasutamist.", + "门已上锁": "Uks on lukus.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Sinu kontot on kasutatud uue seadme sisselogimiseks.", + "开门成功": "Ava uks edukalt", + "开门失败": "Ukse avamine nurjus", + "呼叫提醒": "Kõne meeldetuletus", + "收到来自": "Saadetud", + "锁的呼叫": "Lukustamine kõne", + "加载数据中": "Andmete laadimine", + "搜索所有锁类型": "Otsi kõik lukustüübide", + "锁电量更新时间": "Aku uuendamise aeg lukustamine", + "1月": "Jani", + "2月": "Veeb", + "3月": "Märk", + "4月": "Aprill", + "5月": "Maii", + "6月": "Juuni", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Okt", + "11月": "Nov", + "12月": "Dets", + "热门城市": "Kuumad linnad", + "导出锁数据": "Ekspordi lukustusandmed", + "一键开锁": "Üheklõpsu lahti lukustumine", + "已开通": "Avatud", + "编辑员工": "Personali muutmine", + "一": "Üks", + "二": "Kaks", + "三": "Kolm", + "四": "Neli", + "五": "Viis.", + "六": "Kuus.", + "日": "Päikesel", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?", + "在线": "Võrgus", + "离线": "Mitte ühendust", + "购买记录": "Ostu kirjed", + "使用记录": "Kasutaja kirje", + "失效时间要大于当前时间": "Kehtivusaeg peab olema pikem kui praegune aeg", + "修改名字": "Muuda nime", + "时": "Tund", + "分": "Minut", + "Amazon Alexa": "Amazoni Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Võite kasutada Alexa, et avada, lukustada ja kontrollida oleku lukus", + "支持的国家": "Toetatud riigid", + "支持的国家值": "USA, Kanada, Ühendkuningriik, Austraalia, India, Saksamaa, Prantsusmaa, Itaalia, Hispaania, Jaapan", + "操作流程": "Käitamisprotsess", + "操作流程值": "1 Lisa lukk ja värava Smart lock APP-ga\n\n2 Lubage luku kauglukustumise funktsiooni APP (see funktsioon on vaikimisi välja lülitatud). Kui sul seda valikut pole, ei toeta lukk Alexa\n\n3 Lisa oskusi Alexa ja lubada neid Smart lukk APP konto ja parool. Kui luba on edukas, võite avastada seadmeid konto alla\n\n4 Leia lukk Alexa rakendus, lülitada hääl ava funktsiooni ja määrata keele parooli\n\n5 Lukk saab töötada läbi Alexa", + "Google Home": "Google kodu", + "Action name": "Toimingu nimi", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Toetatud keeled", + "英语": "Inglise keel", + "Google Home操作流程的值": "1. Kasutage Smart lock APP lukud ja väravad\n\n2. Lubage APP luku kauglukust avamise funktsiooni (see funktsioon on vaikimisi välja lülitatud). Ilma selle valikuteta ei toeta lukk Google Kodu.\n\n3. Paigalda Google Home APP ja klõpsake \" \" nuppu ülemine vasak nurk\n\n4. Seadistused lehel valige \"Töö Google'ga\"\n\n5. Otsige \"ScienerSmart\" ja kasutage nutikas lukustatud APP konto ja parooli, et autoriseerida.", + "密码需至少包含数字/字母/字符中的2种组合": "Parool peab sisaldama vähemalt kahte järgmistest: numbreid, tähti ja erimärkid", + "已开锁": "Lukustatud", + "已闭锁": "Lukustatud", + "两次密码不一致哦": "Paroolid ei ole järjekindlad", + "中功率": "Keskmine võimse", + "常规使用": "Regulaarne kasutamine", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Kui värav on sisse lülitatud, vajutage ja hoidke nuppu 5 sekundit, ja klõpsa Järgmine, kui indikaator valgus vilgub vaheldumisel", + "扫描设备": "Skaneerimisseade", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Kustutamine nurjus. Värav võis välja lülitada. Kas soovid kustutada andmed?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_fi.json b/lan/lan_fi.json new file mode 100644 index 00000000..9141b427 --- /dev/null +++ b/lan/lan_fi.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Tähtilukko", + "锁通通": "Lukitse läpi:", + "点击开锁,长按闭锁": "Avaa lukitus", + "考勤": "Osallistuminen", + "考勤设置": "Osallistumisasetukset", + "电子钥匙": "E- avaimet", + "添加卡": "Lisää kortti", + "卡号": "Kortin numero", + "添加指纹": "Lisää sormenjälki", + "指纹号": "Sormenjäljen numero", + "遥控": "Etä", + "添加人脸": "Lisää kasva", + "门锁日志": "Ovilukon loki", + "密码号": "Salasanan numero", + "添加者": "Toiminnanharjoittaja", + "添加时间": "Aika", + "重置": "Nollaa", + "请输入手机号或者邮箱": "Puhelinnumero/sähköposti", + "工作时间": "Työaika", + "工作日设置": "Työpäivän asetus", + "星期一": "Maanantai.", + "星期二": "Tiistai", + "星期三": "Keskiviikko.", + "星期四": "Torstai", + "星期五": "Perjantai", + "星期六": "Lauantai.", + "星期日": "Sunnunti", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S.", + "简写周日": "S.", + "周一": "Man", + "周二": "Tue", + "周三": "Nai", + "周四": "Ton", + "周五": "Pen", + "周六": "Sau", + "周日": "Aurinko", + "群发钥匙": "Lähetä useita ekeyssä", + "锁": "Lukita", + "请添加": "Vastaanottaja", + "允许远程开锁": "Avaa lukitus", + "请输入验证码": "Tarkastuskoodi", + "获取密码": "Luo salakoodi", + "请给密码命名": "Anna tämän salasanan nimi", + "密码有限期为6个小时,只能使用一次": "Tämä Passkoodi Täytyy käyttää 6 tunnin kuluessa nykyisestä ajasta tai se on SUSPENDEDT Turvallisuussyistä. Tämä Passkoodi voi käyttää vain yhden kerran.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Syötä salasanana 6-9 numeroa manuaalisesti. Voidaan lisätä puhelimitse Bluetooth lukon viereen, tai etäyttöä portin kautta", + "获取": "Mene pois.", + "添加": "Lisää", + "删除公司": "Poista yritys", + "密码详情": "Salasanatiedot", + "修改密码": "Vaihda koodia", + "添加虹膜": "Lisää iris", + "添加门磁": "Ovisensori", + "添加无线键盘": "Langaton näppäimild", + "添加手掌": "Lisää palmu", + "请输入员工账号": "Anna työntekijän tili", + "批量授权锁": "Lisää useita lukkoja", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Valtuutettu ylläpitäjä saa enemmistön luvan käyttää tätä lukkoa.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Tämän ominaisuuden avulla voit avata älykkään lukituksen etäportin kautta. Tämä ominaisuus voidaan vain kääntää päälle tai pois Bluetoothin kautta.", + "排列方式": "Luettelon tyyppi", + "早到榜": "Varhainen luettelo", + "迟到榜": "Myöhäinen luettelo", + "当前模式": "Nykyinen tila", + "勤奋榜": "Työskentelyluettelo", + "延迟时间": "Viive-aika", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Lukko lukitsee automaattisesti ajan jälkeen.Avaa se kerran ensin, jotta asetukset saatavilla.", + "时间": "Aika", + "开始时间": "Aloitusaika", + "结束时间": "Loppuaika", + "工作时间设置": "Työajan asettaminen", + "常开模式": "Välitysmalle", + "常开时间": "Tässä ajanjaksossa", + "常开日期": "Näinä päivinä.", + "添加员工": "Lisää henkilökunta", + "节假日": "Lomat", + "打卡方式": "Menetelmä", + "员工是否有钥匙": "On jo ekey", + "上班时间": "Aloitusaika", + "下班时间": "Sulkemisaika", + "本周": "Tällä viikolla", + "单休": "Yhden päivän viikonloppu", + "双休": "Kahden päivän viikonloppu", + "单双休": "Yhden kahden päivän viikonloppuna", + "年": "Vuosi:", + "月": "Kuukaus", + "放假日期": "Lomat", + "补班日期": "Työpäivät", + "添加假日": "Lisää lomat", + "开始日期": "Aloituspäivä", + "必填": "Vaadittava", + "结束日期": "Päättymispäivä", + "日榜": "Päivittäinen", + "月榜": "Kuukausittain.", + "考勤记录": "Kirjaa", + "假日信息": "Lomatiedot", + "基本信息": "Perusteet", + "无线键盘": "Langaton näppäimild", + "选择无线键盘": "Lisää näppäimille", + "门磁": "Ovisensori", + "自动闭锁": "Lukittu automaattisesti", + "锁声音": "Lukitse ääni", + "防撬报警": "Tamper-varuus", + "重置键": "Nollaa painike", + "锁时间": "Lukitse kello", + "诊断": "Diagnosoi", + "上传数据": "Lähetä tiedot", + "导入其他锁数据": "Tuo toisesta lukka", + "锁升级": "Firmware- päivitys", + "标记房态": "Huoneen tila", + "开锁提醒": "Avaa huomautus", + "微信二维码": "Avaa QR-koodi", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Sähköiset avaimet voivat avata oven skannaamalla tämän QR-koodin WeChatin kautta. Kunkin lukon QR-koodi on erilainen. Voit tulostaa sen ja liittää sen vastaavan lukon viereen", + "锁编号": "Lukonumero", + "电量": "Akkut", + "锁分组": "Lukitse ryhmä", + "选择分组": "Valitse ryhmä", + "创建新分组": "Luo ryhmä", + "管理员开锁密码": "Passinkoodi", + "更新": "Päivitä", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Akkutaso päivitetään gateway tai puhelimen bluetooth", + "当屏幕闪烁时,点击下一步": "Napsauta seuraavaa, kun näppäimistö vilkkuu", + "输入*529#或按设置键": "Syötä README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# tai paina Asetukset näppäintä", + "长按重置键2秒": "Paina ja pidä nollauspainiketta 2 sekuntia", + "附近的设备": "Lähistöllä olevat varusteet", + "暂无数据": "Ei tietoja", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Voit saada oven tilan oven anturilla yhdessä portin kanssa. Vain yksi anturi saa liittyä lukkoon.", + "开始": "Käynnistä", + "全天": "Kaikki tuntit", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Voit asettaa useita ajanjaksoja käyntitilalle.Sisällä asetettujen ajanjaksojen, lukko pysyy avoimessa tilassa sen jälkeen, kun se on avattu.", + "请选择锁音量": "Valitse lukitusvoimakkuus", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Kääntämällä päälle kuulet äänen lukosta.", + "低": "Vähän", + "较低": "Keskimääräinen alhainen", + "中": "Keskisuuri", + "较高": "Keskimääräinen korkea", + "高": "Korkea", + "开启后,锁被撬动时,会发出报警声": "Kääntämällä päälle, mahdollistat TAMPER-hälytyksen.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Sammuttamalla RESET-painikke ei ole käytössä.", + "校准时间": "Kalibroi aikaa", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnoosi on lukea konfigurointitiedot lukon sisällä ja lataa ne niin, että henkilökunta voi analysoida syy virheestä", + "上传": "Lähetä", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Lataa tiedot lukosta palvelimelle.Se voi kestää useita minuutteja.", + "请选择要从哪把锁导入": "Valitse lukko, jota tuodaan", + "有新版本": "On uusi versio", + "当前版本": "Nykyinen versio", + "升级": "Päivitä", + "空闲": "Tyhjät", + "已入住": "Hyväksytty", + "多语言": "Kielet", + "添加锁": "Lisää lukko", + "锁地址": "Lukitse osoite", + "选择锁类型": "Valitse lukitus", + "NFC无源锁": "NFC:n passiivinen lukko", + "添加设备": "Lisää laite", + "网关": "GatewayComment", + "客服": "Asiakaspalvelut", + "设置": "Asetukset", + "更多设置": "Lisää valmiita", + "消息推送": "Ilmoitusta", + "锁用户管理": "Lukitse käyttäjät", + "拥有的钥匙": "Tämän käyttäjän yhteydessä olevat eKeyt", + "批量授权": "Viranomaisen hallinta", + "关联设备": "Liitännäinen laite", + "关联姓名": "Liitännäinen nimi", + "转移智能锁": "Siirto lukittu", + "选择锁": "Näytön lukittu", + "接收人信息": "Vastaanottaja", + "转移网关": "Siirtokäyttö", + "锁屏": "Näytön lukittu", + "已关闭": "Poissa", + "已开启": "Käyttöpäivä", + "开启": "Käytä päällä", + "确定要开启重置键?": "Jatketaanko Nollauspainiketta?", + "确定要关闭重置键?": "Jatketaanko Nollausta-painiketta?", + "隐藏无效开锁权限": "Piilota virheellinen pääsy", + "APP开锁时需手机连网的锁": "Puhelinta vaativat lukot verkossa", + "增值服务": "Palvelut", + "关于": "Tietoa", + "退出": "Kirjaudu siirryttyä", + "删除账号": "Poista tili", + "个人信息": "Tilitiedot", + "头像": "Avatar", + "昵称": "NickNameName", + "请输入昵称": "Anna nimitysi", + "修改昵称": "Nimeä uudelleen", + "修改账号": "Muokkaa tiliä", + "重置密码": "Nollaa salasanaa", + "安全问题": "Turvallisuuskysymys", + "为了你的账号安全,修改账号前请先使用验证码验证": "Tilisi turvallisuutta varten käytä tilin salasanan todentamista ennen tilin muuttamista.", + "请输入新账号": "Anna uusi tili", + "找回密码和登录新设备时,可通过绑定的手机验证": "Liiton puhelinnumero käytetään vastaanottamaan todentamiskoodi.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Sidon sähköpostia käytetään vastaanottamaan todentamiskoodi.", + "原密码": "Nykyinen salasana:", + "新密码": "Uusi salasana:", + "确认密码": "Vahvista salasanaa", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Jos puhelimesi katoaa, voit kirjautua uuteen puhelimeen vastaamalla turvallisuuskysymyksiin.", + "问题一": "Kysymys 1", + "问题二": "Kysymys 2", + "问题三": "Kysymys 3", + "请输入你的答案": "Kirjoita vastauksesi", + "即将到期": "Vanhenee pian.", + "去授权": "Siirry valtuutukseen", + "修改名称": "Muokkaa nimi", + "状态": "Tilanne", + "WiFi名称": "Wifi- nimi", + "网络MAC": "Verkko MAC", + "网关升级": "Gateway päivitys", + "网关连接的锁": "Tähän porttiin", + "信号强": "Vahva", + "选择网关类型": "Valitse portotyyppi", + "添加网关": "Lisää porttiComment", + "重新通电": "Yhdistä teho", + "指示灯": "Indikaattori Valo", + "选择网关": "Valitse porttiName", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G ei ole tuettu, valitse 2.4G:n WiFi.", + "WiFi密码": "WiFi", + "请输入WiFi密码": "Syötä WiFi- salasana.", + "网关名称": "Gateway- nimi", + "请输入网关名称": "Anna portin nimi", + "IP地址": "IP- osoite", + "子网掩码": "Aliverkon naamio", + "默认网关": "OletusporttiComment", + "自动获取DNS服务器地址": "Hae DNS-palvelimen osoite", + "首选DNS": "Suositeltu DNS", + "备选DNS": "Vaihtoehtoinen DNS", + "不使用静态IP": "Staattista IP ei käytetä", + "使用静态IP": "Käytä staattista IP", + "请输入IP地址": "Anna IP- osoite", + "请输入子网掩码": "Syötä aliverkkomaa", + "请输入默认网关": "Siirry oletusporttiName", + "所有锁": "Kaikki lukot", + "搜索所有类型的锁": "Skannaa kaikenlaisia lukkoja", + "门锁": "Ovilukko", + "挂锁": "Riippulukoo", + "保险箱锁": "Turvallinen lukko", + "智能门禁": "Älykäs pääsyn valvonta", + "车位锁": "Pysäköintilukko", + "摸亮触摸屏": "Kosketa mitä tahansa näppäimistön aktivoimiseksi", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Kosketa mihin tahansa avaimeen Aktivoi lukko ja laita se PAIRING-tilaan.", + "附近的锁": "Lähellä olevat lukot", + "如需修改名字请重新命名,点击确定添加锁": "Jos haluat muuttaa nimen, nimeä nimi, klikkaa OK lisääksesi lukkoa", + "添加锁时,手机必须在锁旁边": "Lukon lisäämisessä puhelimen täytyy olla lukon vieressä", + "登录": "Kirjautuminen", + "注册": "Rekisteri", + "我已阅读并同意": "Olen lukenut ja suostunut.", + "验证码": "Koodi", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Salasanasi täytyy olla 8-20 merkkiä, ja siihen sisältyy vähintään kaksi tyyppiä numeroita, kirjaimia ja symboleja", + "手机": "Puhelin", + "邮箱": "Sähköposti", + "请输入邮箱": "Anna sähköposti", + "国家/地区": "Maa/alue", + "你所在的国家/地区": "Maasi/alue", + "选择国家/地区": "Valitse maa tai alue", + "获取验证码": "Hae koodi", + "商务合作": "Liiketoiminta", + "电脑网页版": "Verkkojärjestelmän", + "酒店系统": "Hotellin järjestelmät", + "说明书网页版": "Käyttöohjeet", + "高级功能": "Lisäfunktion", + "记录保存": "Asiakirjojen säilyttäminen", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Tekstijärjestelmää voidaan käyttää lähettämään salasanan ja ekey-tietoja vastaanottajalle.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Sähköpostia voidaan käyttää lähettämään salasanan ja ekey-tietoja vastaanottajalle.", + "购买实名认证提示": "Kun toiminto on käytössä, sinun täytyy käyttää sormenjälkiä, kasvoja tai tilin salasanaa avata APP. Ei ole tarpeen tarkistaa uudelleen 3 minuuttia.", + "请选择你希望的实名认证频次": "Valitse haluamasi oikean nimen tunnistustaajuus", + "仅首次": "Ensimmäistä kertaa.", + "每日一次": "Kerran päivässä", + "每周一次": "Kerran viikossa", + "每月一次": "Kerran kuukaudessa", + "当前状态": "Nykyinen tila", + "试用中": "Oikeudenkäynti", + "高级功能权益内容": "Kehittyneet toiminnot", + "短信模板": "SMS- malli", + "邮件模板": "Sähköpostipohja", + "发卡工具": "Kortin koodin", + "购买高级功能须知": "Huomautus", + "购买高级功能提示": "Kehittyneempiä ominaisuuksia kehitetään, ja jos tarvitset niitä, olet tervetullut avaamaan palvelun lukkojen määrän perusteella. Edistyneet ominaisuudet ovat saatavilla vain omia lukkoja. Jos olet valtuutettu ylläpitäjä, ota yhteyttä lukon ylin ylläpitäjään avata palvelun", + "免费体验": "Ilmainen kokeilu", + "立即开通": "Avaa nyt", + "购买短信": "Osta SMS", + "购买邮件": "Osta sähköposti", + "购买实名认证次数": "Osta oikea nimi tunnistusajat", + "开通高级功能": "Käytä Edistynyttä funktioita", + "选择套餐": "Valitse paketti", + "支付方式": "Maksutavat", + "支付宝": "Alipay.", + "去支付": "Maksa", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Voit määritellä viesti itse.Sitä käytetään lähettämään tietoja salasanasta ja ekeystä muille.", + "高级功能仅能用于你自己的锁": "Kehittynyttä toimintoa voidaan käyttää vain omia lukkoja.", + "新建模板": "Luo malli", + "类型": "Tyyppi", + "模版内容": "Mallin sisältö", + "预览": "Esikatselue", + "房间名": "Huoneet", + "预计产生短信条数": "Arvioidut viestisegmentit", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Tämän ominaisuuden avulla voit piilottaa salauskoodit, keys, kortit ja sormenjäljet, jotka ovat virheet jonkin aikaa.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Käyttäjän puhelin on oltava verkossa avata nämä valitut lukot APP.", + "配置WiFi": "Määritetään WiFiä", + "请输入WiFi名字": "Anna Wifi- nimi", + "WiFi配网": "WiFi-jakeluverkosto", + "胁迫卡": "Stressikortti", + "员工是否有密码": "Salakoodi", + "员工是否有卡": "Kortilla on jos", + "员工是否有指纹": "Aseta jo sormenjälkin", + "获取钥匙": "Hae avaimen", + "获取卡": "Hae kortti", + "获取指纹": "Hae sormenjälkiä", + "安全验证": "Tunnisteiden todentaminen", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Kaikki tilitiedot poistetaan alustalta PERMANENTTI eikä niitä voi palauttaa.Haluatko poistaa?", + "监控": "Monitori", + "视频日志": "Videoloki", + "开门器": "Oviaukko", + "面容开锁": "Kasvo avaa", + "开门方向设置": "Avaava suunta", + "电机功率设置": "MotorPowerin asetukset", + "开锁时是否需联网": "Jos Internet tarvitaan avattaessa lukitus", + "选择要加入分组的锁": "Valitse tähän ryhmään lisättävä lukkoS", + "锁数量": "Lukitus", + "小米IOT平台": "Xiaomi IOT-alusto", + "面容开锁设置": "Kasvot avautuvat asetukset", + "感应距离": "Tunnistusetäisyys", + "防误开": "Estä väärän avautumisen", + "防误开已关闭,关门后仍可使用面容开锁": "Ehkäistä virhe avaaminen on suljettu, oven sulkemisen jälkeen voi silti käyttää kasvojen avaamista lukkoon.", + "添加和使用面容开锁时": "Lisää ja käytä kasvojen avaamisessa", + "添加和使用面容开锁时提示": "\n1, yritä pitää yhden henkilön edessä oven toiminta;\n2, seiso edessä oven lukko noin 0,5~ 0,8 metriä, kohti oven lukkoa;\n3. Pidä kasvosi esteetön ja paljasta kasvojen ominaisuudet;\n4. Kun kasvojentunnistus on epänormaalia, voit koskettaa mitä tahansa näppäimistön avainta uudelleen kasvojentunnistus käsin.", + "秒": "S.", + "请根据门锁实际情况,请谨慎选择电机功率:": "Valitse moottorivoima huolellisesti oven lukon todellisen tilanteen mukaan:", + "小功率:": "Miniwatti:", + "耗电少": "Vähemmän tehonkulutus", + "大功率": "Suuri teho:", + "大功率提示": "Jos lukko kieltä ei voida siirtää normaalisti lukituksessa tai tarvitsee ajaa", + "开门方向设置提示": "Valitse huolellisesti suunta avata ovi kotiin (jos valitset väärän suunnan, et pysty avaamaan ja sulkemaan ovea oikein) :", + "左开": "Avaa vasemmalle", + "右开": "Avaa oikealle", + "判断方法:": "ö", + "判断方法内容": "Mies seisoi talon ulkopuolella, kohti sisäänkäynnin ovea.", + "录像时段": "Videopaikka", + "密码": "Salasanat", + "卡": "Kortit", + "指纹": "Sormenjälki", + "人脸": "Kasvot", + "配件商城": "Lukitse ostoskeskus", + "公司名称": "Yrityksen nimi", + "请输入公司名字": "Anna yrityksen nimi", + "提示": "Vihje:", + "是否删除?": "Poistetaanko?", + "员工信息": "Henkilöstötiedot", + "员工": "Henkilöstö", + "打卡方式无效": "Ei saatavilla", + "中国": "Kiina", + "选择钥匙": "Valitse ekey", + "编辑": "Muokkaa", + "无": "Ei ei", + "有": "Kyllä.", + "请输入姓名": "Anna nimi", + "获取人脸": "Kasvojen saaminen", + "选择密码": "Valitse salauskoodi", + "选择卡": "Valitse kortti", + "选择指纹": "Valitse sormenjälki", + "选择人脸": "Valitse puolet", + "员工是否有人脸": "Onko työntekijällä kasvot", + "同时删除员工钥匙": "Poista hänen eeke", + "删除": "Poista", + "确定要删除员工吗?": "Poista tämä työntekijä", + "月统计": "Kuukausitilastot", + "迟到": "Myöhään.", + "早退": "Lähde aikaisin.", + "未打卡": "Ei kirjaa", + "钥匙将在": "Tämä eeke", + "天后失效": "Päivä(t)", + "电量更新时间:": "Akun päivitysaika:", + "新增配件": "Lisää", + "钥匙不可用": "Avain ei ole saatavilla", + "正在开锁中...": "Avaan...", + "你的钥匙": "Avaimesi", + "常开模式启动!长按闭锁": "Avoin tila käynnistetty! Lukitaessa pitkä painaa", + "演示模式": "Demo-tilas", + "请先同意用户协议及隐私政策": "Hyväksy käyttäjäsopimus ja tietosuojakäytäntö ensin.", + "用户协议": "Käyttäjäehdot", + "隐私政策": "Yksityisyyspolitiikka", + "注册成功": "Rekisteröinti onnistuneet", + "你所在的": "Olet mukana.", + "手机号": "Puhelinnumero", + "忘记密码": "Unohtui salasanan", + "重置成功": "Nollaa menestys", + "确定要退出吗?": "Ulos?", + "功能暂未开放": "Funktio ei ole vielä avoin", + "设置成功": "Asetus onnistuneesti", + "删除成功": "Poista onnistuneesti", + "单次": "Kertakäsittely", + "永久": "Pysyvä", + "限时": "Ajoitettu", + "自定义": "Oma", + "清空码": "Tyhjennä", + "循环": "Toistuvat", + "工作日": "Työpäivä", + "每日": "Päivittäinen", + "周末": "Viikonloppu", + "确定要删除吗?": "Poistetaan?", + "该锁的密码都将被删除": "Kaikki tälle lukolle tarkoitetut salasanat", + "已过期": "Virheellinen", + "该锁的电子钥匙都将被删除": "Kaikki eKeyt tälle lukolle", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Kaikki ekeys liittyvät tämän ekey.This Step ei voi olla UNDONE!", + "删除钥匙会在用户APP连网后生效": "EKE", + "有效时间": "Voimassaoloaika", + "接收者": "Vastaanottaja", + "仅管理自己创建的用户": "Hallitse vain omia käyttäjiä", + "远程开锁": "Etälukko avaa", + "请输入钥匙名称": "Anna avaimen nimi", + "修改成功": "Muokkaa menestys", + "冻结": "Jäädyttää", + "解除冻结": "Sulaa", + "授权": "Valtuuta", + "取消授权": "Luvan poistaminen", + "同时解冻其发送的钥匙": "Sulaa kaikki tämän käyttäjän liikkeeseet", + "会在用户APP连网后生效": "Tämä ekey on THAWED, kun käyttäjän APP yhdistyy verkkoon.", + "同时冻结其发送的钥匙": "Jäädytä kaikki tämän käyttäjän liikkeeseet", + "冻结会在用户APP连网后生效": "Tämä ekey on FROZEN, kun käyttäjän APP yhdistyy verkkoon", + "取消授权会在用户APP连网后生效": "Käyttäjä menettää oikeutensa, kun käyttäjän APP yhdistyy verkkoon.", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Valtuutetulla käyttäjällä on lähes samat oikeudet kuin LOCK Manager (eg. Mahdollisuus lähettää ekeys ja salasanat)", + "失效时间需晚于生效时间": "Viimeisen päättymisajan on oltava myöhäistä kuin tehoaika.", + "生效时间需晚于当前时间": "Tehokas ajan on oltava myöhäistä nykyistä aikaa", + "失效日期需晚于生效日期": "Viimeisen käyttöpäivämäärän on oltava myöhempi kuin voimaantulopäivä.", + "修改有效期": "Muutosjakso", + "生效日期": "Aloituspäivä", + "失效日期": "Päättymispäivä", + "开锁": "Avaa lukitus", + "开锁成功": "Poista menestys", + "请选择锁": "Valitse lukot", + "请选择接收者": "Valitse vastaanottin", + "请选择有效期": "Valitse voimassaoloaika", + "请选择发送方式": "Valitse lähetysmenetelmä", + "请选择结束时间": "Valitse loppuaika", + "完成": "Valmistus", + "有效日": "Pyörä jatkaa", + "发送成功": "Lähetä menestys", + "请选择开始时间": "Valitse aloitusaika", + "选择用户": "Valitse vastaanottaja", + "已选中": "Valittu", + "确定": "Hyvä on.", + "请选择要发送的锁": "Valitse lukot", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Kasvot oikean nimen tunnistus tarkoittaa käyttäjän tarvetta tarkistaa kasvonsa ennen puhelimen avaamista APP, ja varmennus voidaan avata.", + "分享": "Jaa", + "请输入接收者账号": "Syötä vastaanottajan tili", + "接收者号码未注册,请重新发送": "Vastaanottonumero ei ole rekisteröity.", + "是否发送电子钥匙给未注册账号": "Haluatko lähettää ekeyn uudelle tilille?", + "取消": "Peruus", + "标记成功": "Merkitse menestys", + "微信好友": "WeChat-kaverit", + "短信": "SMS", + "邮件": "Sähköposti", + "更多": "Lisää.", + "您好,您的电子钥匙生成成功": "Hei, sähköinen avain on luotu onnistuneesti", + "生效时间不能小于当前时间": "Tehokas aika ei voi olla lyhyempi kuin nykyinen aika.", + "结束时间不能小于当前时间": "Loppuaika ei voi olla lyhyempi kuin nykyinen aika.", + "是否为管理员": "Onko se hallinnoija?", + "已连接到锁,请将卡靠近门锁的读卡区": "Aseta kortti kortin lukijaa vasten", + "尝试连接设备...": "Yhdistäminen Lockiin.Odota...", + "地理位置": "Maantieteellinen sijainti", + "检查以确保以下地址是正确的": "Tarkista, että seuraava osoite on oikea", + "地图加载中,请稍候。。": "Kartta lataa, odota...", + "跳过": "Ohita", + "还未获取到位置信息哦,请耐心等待一下!": "Sijaintitietoja ei ole vielä saatu, odota kärsivällisesti!", + "请填写信息": "Täyttäkää tiedot", + "有效期": "Voimassaoloaika", + "生效时间": "Aloitusaika", + "失效时间": "Loppuaika", + "上传成功": "Lähetetty onnistuneesti", + "未生效": "Epätoiminta", + "已生效": "Tehokkaa", + "指纹详情": "Sormenjälkitiedot", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Sinua vaaditaan asettaa sormi anturin useita kertoja.Seuraa ....", + "开始添加": "Käynnistä", + "请将您的手指按下": "Aseta sormesi anturin päälle.", + "根据提示,抬起手指后再进行下一次指纹采集": "Seuraa vaatimuksia ... Sinua vaaditaan poistaa ja asettaa sormi Sensorin Sext Record.", + "添加成功": "Lisää menestys", + "更新成功": "Päivitä menestys", + "搜索": "Etsi:", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Nollaamisen jälkeen lukon kortti poistetaan. Haluatko nollata?", + "已失效": "Virheellinen", + "卡详情": "Korttitiedot", + "请输入": "Syötä tähän.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Kääntämällä pois, Lock pysyy lukittuna koko päivän kunnes se on käsin lukittu", + "请输入小于或等于60的数字": "Anna numero alle 60.", + "操作成功": "Toiminta onnistui", + "管理员密码相同,无需修改": "Ylläpitäjän salasana on sama eikä sitä tarvitse muuttaa", + "请输入6-9位数字": "6-9 lukujen pituus", + "请输入6-9位管理员密码": "Anna 6-9-numeroinen ylläpitäjän salasana.", + "请输入新的管理员密码": "Anna uusi ylläpitäjän salasana.", + "未分组": "Ryhmittämätön", + "请输入分组名称": "Luo ryhmä", + "创建成功": "Luo menestys", + "设置锁分组成功": "Aseta lukitusryhmä onnistuneesti", + "电池1电量": "Akku 1", + "电池2电量": "Akku 2", + "电量更新时间": "Akun päivitysaika", + "锁电量更新成功": "Lukitustehon päivityksen onnistus", + "您的钥匙未生效": "Avaimesi ei ole tehokas", + "您的钥匙已冻结": "Avaimesi on jäädytetty", + "您的钥匙已过期": "Avaimesi on vanhentunut.", + "常开模式开启": "Lukko on lähistötilassa", + "超级管理员": "Superhallinta", + "授权管理员": "Valtuutettu hallinta", + "普通用户": "Tavallinen käyttäjä", + "余": "Saldo", + "天": "Päivä.", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Kun lukko on poistettu, kaikki tiedot poistetaan yhdessä. Haluatko varmasti poistaa lukon?", + "请输入登录密码": "Anna sovelluksen salasana.", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Laitteen poistaminen epäonnistui, varmista, että laite on lähellä laitetta, laite ei ole yhteydessä, ja laite on kytketty päälle.", + "用户无权限": "Käyttäjällä ei ole lupaa", + "创建公司后,考勤功能才能使用": "Luo yritys ensin.", + "是否删除钥匙?": "Poistetaanko tämä ekey?", + "邮箱绑定成功": "Sähköposti sitova menestys", + "手机绑定成功": "Matkapuhelimen sitova menestys", + "网络访问失败,请检查网络是否正常": "Pyyntö epäonnistui.Network ei ole saatavilla, Tarkista ja liitä laitteesi 3G/4G/WIFI", + "清空": "Tyhjennä", + "是否清空?": "Onko selvä?", + "消息详情": "Viestitiedot", + "创建时间": "Luomisaikaan", + "管理员详情": "Yksityiskohtaiset tiedot", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jos joku pakottaa sinut avaamaan oven, voit käyttää tätä korttia. Hälytysviesti lähetetään johtajille. Voit käyttää tätä ominaisuutta, varmista, että lukko on verkossa.", + "请不要将胁迫卡用于日常开锁": "Älä käytä pakkokorttia päivittäiseen käyttöön.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jos joku pakottaa sinut avaamaan oven, voit käyttää sormenjälkiä. Hälytysviesti lähetetään johtajille. Voit käyttää tätä ominaisuutta, varmista, että lukko on verkossa.", + "请不要将胁迫指纹用于日常开锁": "Älä käytä sormenjälkiä päivittäiseen käyttöön.", + "创建公司": "Luo yritys", + "公司名称不能超过30个字符": "Yrityksen nimi ei voi ylittää 30 merkkiä", + "公司名称不能小于6个字符": "Yrityksen nimi ei voi olla pienempi kuin 6 merkkiä", + "WIFI列表": "WIFI-luettelo", + "刷新": "Päivitä", + "手动配网": "Manuaalinen jakeluverkko", + "远距离": "Pitkät matkat", + "中距离": "Keskimääräinen etäisyys", + "近距离": "Lyhyt matka", + "锁时间更新成功": "Lukitusajan päivityksen onnistus", + "锁用户": "Lukitse käyttäjät", + "请选择常开日期": "Valitse avoin päivämäärä", + "结束时间不能小于开始时间哦": "Loppuaika ei voi olla lyhyempi kuin aloitusaika", + "介绍": "Kertomme", + "个人信息收集清单": "Henkilötietojen keräilyluettelo", + "应用权限说明": "Sovelluksen lupakuvaus", + "第三方信息共享清单": "Kolmannen osapuolen tietojen jakeluluettelo", + "请选择您的位置": "Valitse sijainti", + "请先选择位置": "Valitse sijainti", + "管理员密码": "Hallinnon salakoodi", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Jos haluat muuttaa, syötä uusi ylläpitäjän salasana (6 numeroa), klikkaa OK muuttaaksesi.", + "修改": "Muokkaa", + "网络摄像头": "Kamera", + "重命名": "Nimeä uudelleen", + "分组下的锁将被移到未分组里": "Ryhmän alla olevat lukot siirretään ryhmittymättömiksi.", + "编辑成功": "Muokkaa menestys", + "厂商": "Valmistaja", + "型号": "Malli:", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Kun salasana on luotu, käytä sitä kerran aktivointiin ennen 23:59 samana päivänä, Muuten se on mitätön kello 0 jälkeen. Kun salasana on aktivoitu, sitä voidaan käyttää rajoittamattomia ajanjaksoissa.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Kun salasana on luotu, käytä sitä ennen 23:59 samana päivänä, muuten se on virheellinen kello 0 jälkeen. Selvä koodi käytetään tyhjentämään kaikki salasanat ennen kello 0 tänään.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Kun salasana on luotu, käytä sitä ennen 23:59 samana päivänä, muuten se on virheellinen kello 0 jälkeen.", + "清空密码底部提示": "Salasana on voimassa 23:59 asti tyhjennyspäivänä.", + "相机": "Kamero", + "相册": "Valokuvat", + "读写": "Varastointi", + "定位": "Sijainti", + "需要访问相机权限才能拍照上传文件例如头像上传": "Valokuvien ottamiseen ja lataamiseen tarvitaan pääsy kameraan, kuten profiilikuvan lataamiseen.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Tiedostojen ja avatarien lataamiseen vaaditaan pääsy kameraan käyttämällä levykuvia.", + "需要访问读写权限才能使用本地图片上传头像": "Lue- ja kirjoitusoikeuksia tarvitaan käyttämällä paikallisia kuvia", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Pääsy sijaintitietoja tarvitaan lisäämään avaintoimintoiminto", + "申请": "Hakemus", + "权限": "Käyttölupa", + "不允许": "Ei sallittu", + "允许": "Sallittu", + "权限被拒绝": "Lupa evätty", + "请手动在系统设置中开启": "Ota se manuaalisesti järjestelmän asetuksissa", + "权限以继续使用应用": "Lupa jatkaa sovelluksen käyttämistä.", + "去设置": "Mene järjestämään se.", + "当前网络": "Nykyinen verkko", + "位置信息": "Sijaintitiedot", + "请输入wifi名称": "Anna wifi- nimi", + "虹膜": "Iiris", + "手掌": "Palmu", + "商城": "Ostoskeskus", + "我的": "Minun", + "微信公众号推送": "Keskustele julkinen tili", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Voidakseen avata keskustelua hälytysviestien vastaanottamiseksi sinun on kiinnitettävä huomiota Skye Smart Lockin julkiseen keskusteluun. Tallenna QR-koodi ja käytä keskustelua asetusten kartoittamiseen", + "蓝牙": "BluetoothName", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Pääsy Bluetooth-oikeuksiin vaaditaan käyttämään sijaintitietoja lisätä avaintoiminnon lisäämiseksi", + "请输入Email": "Anna sähköposti", + "请输入手机号": "Anna puhelinnumero", + "家人到家": "Perheenjäsen saapui kotiin.", + "添加家人": "Lisää perheenjäsenen", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Jos lukko ei ole yhteydessä Internetiin, muistutukset salasanasta, kortista, sormenjälkestä, eikä muita oven avaamismenetelmiä voida lähettää oikea-aikaisesti.", + "消息提醒": "Muistutus", + "开门通知": "Aloitusilmoitus", + "N天未开门": "N päivää ilman oviaukkoja", + "门未关好": "Ovi ei ole kiinni.", + "防拆报警": "Tamper-hälyttimä", + "低电量提醒": "Pieni akku", + "胁迫开门": "Pakotettu oviaukko", + "有人按门铃": "Joku soittaa ovikelloa.", + "有人出现在门口": "Joku ilmestyy ovelle.", + "提醒方式": "Muistutusmenetelmä", + "开门方式": "Oviaukosmenetelmä", + "请选择": "Valitse:", + "家人": "Perheenjäsenenä", + "保存": "Tallenna", + "APP推送": "APP työnnä", + "管理员": "Hallinnointi", + "未启用": "Ei käytössä", + "已启用": "Käytössä", + "省电模式": "Virransäästötila", + "逗留抓拍模式": "Pysäytä kaappaustila", + "实时监控模式": "Reaaliaikainen seurantatila", + "自定义模式": "Oma tila", + "猫眼设置": "Kissan silmien asetukset", + "猫眼工作模式": "Kissan silmätyötila", + "自动亮屏": "Automaattinen kirkas näyttö", + "亮屏持续时间": "Näyttö ajoissa:", + "逗留警告": "Pysy varoituksessa.", + "异常警告": "Epänormaali varoitus", + "短信提醒": "SMS", + "邮件提醒": "Sähköposti", + "N天未开门提醒": "N päivää ilman oviaukkoja", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Jos joku pakottaa sinut avaamaan lukon, voit käyttää tätä sormenjälkiä. Hälytysviestin lähetetään administs.TO käyttää tätä ominaisuutta, varmista, että lukko on verkossa.", + "胁迫指纹": "Pakotettu sormenjälki", + "指纹列表": "Sormenjälkiluettelo", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Määräajan jälkeen, jos lukkoa ei avata, järjestelmä lähettää muistutusviestin nimetylle vastaanottajalle. Tämä toiminto edellyttää, että lukko on kytketty internetiin.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Kun mahdollistaa muistutuksen , Kun lukko akku on alle 20%, 10%, ja 5%, järjestelmä lähettää muistutusviestin nimetylle vastaanottajalle.", + "未开门时间": "Päivät ilman oven avautumista", + "添加和使用面容开锁时:": "Lisää ja käytä Face avattaessa:", + "关锁": "Suljettu lukko", + "功能": "Toiminto", + "配件": "Osat", + "云存": "Pilvien varastointi", + "本地": "Tämä paikkakunta", + "3天滚动储存": "3 päivää liikkuvaa varastointia", + "去升级": "Päivitä nyt", + "下载列表": "Latausluettelo", + "已下载": "Noudettu", + "全部视频": "Kaikki videot", + "已为本设备免费提供3大滚动视频储存服务": "Tälle laitteelle on tarjottu kolme vierittävää videotallennuspalvelua maksutta.", + "视频播放": "Videosoitto", + "全选": "Kaikki", + "请选择要删除的视频": "Valitse video, jonka haluat poistaa", + "请选择要下载的视频": "Valitse video, jonka haluat ladata", + "欢迎使用": "Tervetuloa käytettäväksi.", + "用户协议和隐私政策概要": "Tiivistelmä", + "协议概要": "Protokollin yhteenveto", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Kiitos, että käytät tämän sovelluksen. Pidämme erittäin tärkeänä henkilökohtaisia tietojasi ja yksityisyyden suojaa. Ennen kuin käytät tätä tuotetta, lue se huolellisesti.", + "《用户协议》": "Käyttäjäehdot", + "和": "Ja", + "《隐私政策》": "Tietosuojakäytäntö", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Koko sisällön. Klikkaamalla \"Acee\", hyväksyt kaikki ehdot. Jos päätät olla suostumatta, et voi käyttää tuotteitamme ja palvelujamme ja poistu sovelluksesta.", + "不同意": "Eri mieltä.", + "同意": "Sopii", + "该功能是高级功能,请开通后再使用": "Tämä on kehittynyt toiminto. Ota se ensin käyttöön.", + "常用程序": "Yhteiset ohjelmat", + "该锁已被重置": "Lukko on nollattu.", + "需要访问读写权限才能使用手动升级固件": "Käyttöoikeuksia luku- ja kirjoitusoikeuksiin vaaditaan päivittämään manuaalisesti firmaohjelmistot", + "错误D固件,请选择正确的文件": "Väärä luokkaohjelmisto, valitse oikea tiedosto", + "非SYD固件,请选择正确的文件": "Ei SYD-valikkoohjelmisto, valitse oikea tiedosto", + "文件校验失败 0x01": "Tiedoston todentaminen epäonnistui 0x1", + "解析元数据失败,请选择正确的文件": "Metatietojen jäsentäminen epäonnistui, valitse oikea tiedosto", + "文件校验失败 0x02": "Tiedoston todentaminen epäonnistui 0x02.", + "文件校验失败 0x03": "Tiedoston todentaminen epäonnistui 0x03", + "固件升级完成": "Firmware- päivitys valmistui", + "记录": "Kirjaa", + "开通高级功能后才可以对锁进行管理": "Ota käyttöön kehittynyt toiminto ensin hallita lukkoja.", + "去开通": "Ota käyttöön", + "实名认证": "Oikean nimen tunnistaminen", + "当前剩余数量": "Jäljellä", + "购买": "Osta", + "实名认证为付费功能,请购买后再使用": "Todistus on maksettu funktio, käytä sitä oston jälkeen", + "密码不一致哦": "Salasanat ovat epäjohdonmukaiset.", + "退出添加": "Lopeta lisäys", + "管理员已满": "Hallinnointi kokosi", + "用户已满": "Käyttäjä on täynnä", + "锁上面添加指纹已满": "Lisää sormenjälki lukolle on täyssä", + "指纹已存在": "Sormenjälki on jo olemassa.", + "锁上面添加人脸已满": "Lukittu yläpuolelle lisäpinta on täynnä", + "人脸已存在": "Kasvo on jo olemassa", + "锁上面添加卡已满": "Lukitse lisäkortti on täynnä", + "卡已存在": "Kortti on jo olemassa", + "锁上面添加密码已满": "Lukitse lisää salasana on täynnä", + "密码已存在": "Identinen salakoodi on jo olemassa.", + "请输入密码": "Anna salasana.", + "暂无密码,无需重置": "Ei salasanaa, ei tarvetta nollataa", + "真实姓名": "Oikea nimi", + "身份证号": "Tunnistenumero", + "请输入真实姓名": "Anna oikea nimi", + "请输入身份证号": "Anna tunnusnumero", + "请输入身份证号和真实姓名": "Anna tunnusnumero ja oikea nimi", + "点击返回设备配对": "Napauta Takaisin laitteen parittamiseen", + "无法连接?尝试升级": "Ei voi yhdistää?", + "固件升级提示": "Firmware- päivityspyyntö", + "请先获取固件文件到手机本地,再选择升级": "Hanki ensin firmware-tiedosto paikalliseen puhelimeen ja valitse sitten päivitys Päivitys.", + "固件升级中": "Firmware päivitetään päivitettyä", + "取消升级": "Peru päivitys.", + "固件传输中": "Kauttakuljetusvälineet", + "关闭": "Sulje pois päälä", + "传输中'": "Kauttakuljetussa", + "操作记录": "Kirjaa", + "修改姓名": "Muokkaa nimi", + "传输中": "Kauttakuljetussa", + "发送人": "Myöntämät", + "发送时间": "Myönnetty aika", + "钥匙详情": "Ekey- tietoa", + "姓名": "Nimi", + "发送": "Lähetä", + "请确认姓名全名和身份证号码是否正确": "Vahvista, että koko nimi ja tunnusnumero ovat oikeita.", + "传输期间请勿离开当前页面": "Älä poistu nykyistä sivua siirron aikana", + "机型": "Mallit", + "硬件版本": "Laitteistoversio", + "固件版本": "Firmware-versio", + "手动升级": "Manuaalinen päivitys", + "设备连接中...": "Laitteen yhteys...", + "未避免异常情况,请在门打开时升级": "Väistämättömiä poikkeuksia, päivitä kun ovi on auki.", + "钥匙无效": "Avain on virheellinen", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Ei voitu yhdistää lukkoon.Käytä puhelimesi Blutooth-järjestelmää uudelleen ja yritä uudelleen.", + "如果是全自动锁,请使屏幕变亮": "Jos se on täysin automaattinen lukko, tee näytöstä kirkkaampi.", + "正在尝试闭锁……": "Yritän lukita.", + "清空记录": "Tyhjennä tietueet", + "是否要删除操作记录?": "Jatketaanko tietojen poistamista?", + "被删除的记录不能恢复": "Tietoja ei voida palauttaa poistamisen jälkeen.", + "全部事件": "Kaikki tapahtumat", + "开锁事件": "Avaa lukitus", + "异常事件": "Epänormaali tapahtuma", + "门铃事件": "Ovikello tapahtuma", + "视频事件": "Videotapahtumat", + "请开启蓝牙": "Käännä Bluetooth päälle.", + "请选择有效日": "Valitse vaikuttava päivä.", + "公司名字长度不能小于 6 ": "Yrityksen nimen pituus voi olla vähintään 6", + "已是最新版本": "Ei päivityksiä", + "新建短信模版": "Luo SMS- malli", + "新建邮件模版": "Luo sähköpostimali", + "自定义短信模版": "SMS-malli", + "自定义邮件模版": "Sähköpostimali", + "名称": "Nimi", + "星星锁": "Tähtilukko", + "无考勤记录": "Ei tietueita", + "大家干劲十足": "Kaikki tulevat ajoissa.", + "工作时长未出炉": "Ei työaikaa", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Maan/alueen valinta vaikuttaa tietoturvaan.Olet tällä hetkellä valinnut Albanian, vahvista ennen jatkamista.", + "确认国家或地区": "Vahvistetaan maa/alue", + "我知道了": "Sain sen.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Saadaksesi tärkeitä päivityksiä, napsauta 'OK' ja ota ilmoitukset asetuksissa.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Käynnistämisen jälkeen voit uudelleen virtaa painamalla pitkään asetusnäppäintä lukossa, ja lisätä se uudelleen APP:n kanssa.", + "已有": "Nykyinen", + "新增": "Uusi:", + "账号格式错误": "Virheellinen muotoilu", + "接收者信息为空": "Vastaanottajan tiedot ovat tyhjä", + "请输入时间(秒)": "Anna aika (sec)", + "加载数据失败": "Tietojen lataaminen epäonnistui", + "重试": "Yritä uudelleen", + "升级中,是否退出": "Päivityksen aikana lopetetaanko poistumisesta", + "下一步": "Seuraava", + "公寓": "Asunto", + "个人用户": "Henkilökohtainen", + "星寓": "Tähden asunto", + "账号": "Tili", + "请输入手机号或email": "Puhelinnumero tai sähköposti", + "请输入星寓管理员的账号": "Syötä tähtihuoneiston ylläpitäjän tili", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Kaikki valitun lukon tiedot siirretään pysyvästi vastaanottajalle.", + "暂不支持跨平台转移,敬请期待": "Alustan siirto ei ole tuettu toistaiseksi, odota innolla sitä.", + "移除坏锁": "Siirrä vialliset / vahingoittuneet lukot roskakoriin", + "转移确认": "Vahvista siirto", + "本次共转移": "Tällä kertaa yhteensä", + "把智能锁": "Älykäs lukko", + "确认": "Hyvä on.", + "移除成功": "Poista onnistuneesti", + "转移成功": "Siirto menestys", + "该已锁被删除": "Lukittu on poistettu.", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Hyväksytty admin voi hallita vain koodeja, Keys jaetun itse.", + "添加授权管理员": "Luo hallinta", + "导出记录": "Vientikirjat", + "选择时间段": "Valitse ajanjakso", + "导出": "Vienti", + "批量导出": "Erän vienti", + "读取记录": "Päivitä tiedostot", + "设备": "Laite", + "消息": "Viestit", + "智能分析": "Älykäs analytiikka", + "精准识别设备事件,过滤无效信息": "Tunnista tarkasti laitetapahtumat ja suodattaa virheelliset tiedot pois.", + "系统设置": "Järjestelmän asetukset", + "系统的全局配置在此项内进行设置": "Järjestelmän maailmanlaajuinen kokoonpano on asetettu tässä kohdassa", + "导出操作记录": "Vientikirjat", + "立即查看": "Näytä", + "导出成功": "Viesti onnistuneesti", + "发送钥匙": "Lähetä ekey", + "进度": "Osuus", + "失败": "Epäonnistui", + "人脸详情": "Kasvojen tiedot", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Kun joku aistitaan noin 1,5 metriä oven edessä, kasvontunnistus avautuu automaattisesti.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Kun joku aistitaan noin 0,8 metriä oven edessä, kasvontunnistus avautuu automaattisesti.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Kun joku aistitaan noin 0,5 metriä oven edessä, kasvontunnistus avautuu automaattisesti.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Tunnistusetäisyys on sammutettu, sinun täytyy koskettaa manuaalisesti mitä tahansa näppäimistön näppäimistön avaamiseksi.", + "防误开已打开,开锁后": "Anti-virheiden avaaminen on käynnistetty ja lukituksen jälkeen", + "秒内不可使用面容开锁": "Kasvojen lukitusta ei voida käyttää muutamassa sekunnissa", + "掌静脉": "Palmuus", + "添加掌静脉": "Lisää palmun suona", + "胁迫掌静脉": "Pakotettu palmun suona", + "请不要将胁迫掌静脉用于日常开锁": "Älä käytä pakottavaa palmun suonia päivittäiseen avaamiseen", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Lukkoon yhdistettynä.", + "掌静脉详情": "Palmun yksityiskohdat", + "掌静脉号": "Palmun lukumäärä", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth ei ole päällä, käynnistä Bluetooth-asetuksissa", + "删除用户时,会将用户拥有的钥匙一起删除。": "Jos Käyttäjä on KÄYTTÖ, kaikki käyttäjän yhteydessä olevat ekeys on myös PÄÄTTY.", + "配置网络": "Muokkaa verkkoa", + "你好": "Terve.", + "成功": "Onnistuneet", + "类型选择": "Valitse tyyppi", + "请选择要使用哪种类型": "Valitse, minkä tyypin käytetät", + "系统邮件(推荐)": "Järjestelmän sähköposti (suositeltu)", + "系统短信(推荐)": "Järjestelmä SMS (suositeltu)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Sähköposti lähetetään tästä sovelluksesta. Osta sähköpostipaketti ensin.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS lähetetään tästä sovelluksesta. Osta sähköpostipaketti ensin.", + "个人邮件": "Henkilökohtainen sähköposti", + "个人短信": "Henkilökohtainen SMS", + "邮件将从你的个人邮箱发给用户": "Sähköposti lähetetään omalta sähköpostitiltäsi.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS-viesti lähetetään henkilökohtaisesta puhelinnumerostasi.Saat maksaa teleoperaattorillesi.", + "为了更好地应用体验,请确定权限": "Parantaa sovelluskokemusta, vahvista oikeudet", + "您第一次拒绝权限,请确定权限": "Kieltäydyit ensimmäistä kertaa, vahvista lupa.", + "您第二次拒绝权限,请去应用设置开启权限": "Kieltäydyit toisen kerran, mene sovelluksen asetuksiin, jotta voit käyttää oikeudenkäyntiä", + "去应用市场": "Siirry sovelluskauppaan", + "温馨提示": "Lämpimättömyys", + "关闭应用": "Sulje sovellus", + "开启微信接收报警消息需要先关注": "Avataksesi WeChatin hälytysviestien vastaanottamiseksi sinun täytyy seurata.", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat julkinen tili, tallenna QR-koodi ja käytä WeChat-asetusten skannaamiseen", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Todellisen nimen tunnistus on maksettu funktio, ota yhteyttä lukkojen ylläpitäjään ostaa ja käyttää", + "位置权限": "Sijaintilupa", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Suunnittele sovellus käyttää paikallisia.Sitä käytetään BLE-lukkoja ja portteja skannaamaan.", + "相机/相册权限": "Kamera/Album-lupa", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Anna sovellus lukea ja kirjoittaa valokuvia ja tiedostoja varastosta.", + "点击选择": "Napsauta valitak", + "微信": "Wechat", + "朋友圈": "Hetket", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "Weibo", + "FaceBook": "FaceBook", + "链接": "Linkkiä", + "今天": "Tänään", + "密码错误": "Virheellinen salasana:", + "网络中断": "Verkon keskeytys", + "钥匙不存在": "Avainta ei ole olemassa", + "钥匙过期": "Avain vanheni", + "钥匙已存在": "Avain on jo olemassa", + "密码失效": "Salasana virheellinen", + "门锁时间异常": "Oven lukitusaika epänormaali", + "APP(手机)未联网": "APP (mobiilipuhelin) ei ole yhteydessä internetiin", + "数据不存在": "Tietoja ei ole olemassa", + "待接收": "Vastaanotettu", + "已冻结": "Jäädytetyt", + "已删除": "Poistettu", + "未知": "Tuntematon", + "拖动下方滑块完成拼图": "Vedä liukusäädin oikeaan asennukseen", + "验证成功": "Tarkastusmenestys", + "验证失败": "Tarkastus epäonnistui", + "向右拖动滑块填充拼图": "Vedä liukusäädintä oikealle täyttääkseen palapeli", + "请先获取到位置信息哦": "Hae sijaintitiedot ensin.", + "请选择国家": "Valitse maa", + "获取锁信息": "Hae lukitustiedot", + "锁数据异常,请重试": "Lukitustiedot ovat epänormaaleja, yritä uudelleen", + "连接设备中...": "Yhdistäminen...", + "把锁": "Lukot", + "条": "Nauhat", + "封": "Sineti", + "次": "Kertaa", + "支付成功": "Maksu menestys", + "查看详情": "Näytä yksityiskohdat", + "请输入模板名称": "Anna mallin nimi", + "模版类型": "Tyyppi", + "再返回一次退出": "Poistu uudestaan", + "请先添加锁": "Lisää lukko ensin.", + "可视对讲": "Näköyhteys", + "详细日志": "Yksityiskohtainen loki", + "已复制到剪切板": "Kopioitu", + "拍照": "Valokuva", + "从相册选择": "Valitse albumista", + "选择问题": "Valitse kysymys", + "确认长度不足8位": "Varmista pituuden alle 8 numeroa", + "新密码长度不足8位": "Uusi salasana pituus alle 8 numeroa", + "两次密码不一致": "Salasana Virheellinen.Yritä uudelleen", + "请点击获取验证码,验证码将发送到": "Hae varmennuskoodi.Koodi lähetetään osoitteeseen.", + "切换": "Vaihda", + "验证": "Tarkista", + "验证成功,账号已删除": "Tarkastus onnistunut, tili poistettu", + "该密码不是自定义密码,无法修改": "Tämä salasana ei ole mukautettu salasana, eikä sitä voi muuttaa", + "请选择设备要关联哪些姓名": "Valitse nimet, joihin laitteen pitäisi liittää", + "请选择姓名要关联哪些设备": "Valitse laitteet, joihin nimi liitetään.", + "确定要移除所选中的坏锁吗?": "Poistatko toimintahäiriön lukon?", + "邮件通知": "Ilmoita sähköpostitse.", + "短信通知": "Ilmoita tekstiviestillä.", + "您好,您的授权管理员生成成功": "Hei, valtuutettu ylläpitäjäsi on luotu onnistuneesti", + "请输入接收者姓名": "Syötä tähän.", + "版本更新": "Versio päivitys", + "下次再说": "Ensi kerralla.", + "配网成功": "Verkkojakelu menestys", + "配网失败": "Verkon jakelu epäonnistui", + "该锁的无线键盘都将被删除": "Kaikki langattomat näppäimistöt tälle lukolle", + "实时画面": "Reaaliaikainen kuva.", + "适合门口较为安全的环境。": "Sopii suhteellisen turvallisiin ympäristöihin ovella.", + "仅发生特定事件才录像,并可查看实时画面。": "Tallennetaan vain tiettyjä tapahtumia ja reaaliaikaista kuvaa voidaan katsella.", + "一般情况下,满电可使用7-8个月": "Tavanomaisissa olosuhteissa sitä voidaan käyttää 7-8 kuukauden ajan, kun täysi ladatus", + "有人逗留或发生特定事件才录像,可随时查看": "Joku jää tai tiettyjä tapahtumia kirjataan, ja niitä voidaan nähdä milloin tahansa.", + "实时画面。": "Reaaliaikainen kuva.", + "一般情况下,满电可使用5~6个月。": "Normaalissa", + "适合门口人员复杂、较不安全的环境。": "Sopii monimutkaisiin ja suhteellisen vaarallisiin ympäristöihin ovella.", + "有人出现就录像,可随时查看实时画面。": "Nauhoita, kun joku ilmestyy, ja katso reaaliaikaista kuvaa milloin tahansa.", + "一般情况下,满电可使用2~4个月。": "Normaalissa olosuhteissa, sitä voidaan käyttää 2 ~ 4 kuukautta, kun täysin ladattu.", + "根据您家门口实际情况设置录像和实时画面功能。": "Aseta video ja reaaliaikaiset kuvatoiminnot oven varsinaisen tilanteen mukaan.", + "可使用时长由具体设置决定。": "Käytön kesto määräytyy erityisten asetusten perusteella.", + "查看": "Näytä", + "有人按门铃或发生": "Joku soittaa ovikelloa.", + "异常事件时": "Epänormaali tapahtuma", + "不录像": "Ei videoa", + "有人出现、按门铃": "Joku ilmestyy, soittaa ovikelloa.", + "或发生异常事件时": "Tai epänormaali tapahtuma", + "逗留达到10秒": "Viivy 10 sekuntia.", + "约1.5米": "Noin 1,5 metriä", + "随时": "Milloin vain.", + "立即录像": "Nauhoita välittömästi", + "录像时机": "Videon ajoitus", + "有人出现时录像": "Nauhoita, kun joku ilmestyy", + "人体侦测距离": "Ihmisen havaitsemisetäisyys", + "查看实时画面": "Näytä reaaliaikainen kuva.", + "自定义时间": "Omaa aikaa", + "当日": "Tänään", + "次日": "Seuraava päivä.", + "自定义时段": "Määräaika", + "发生事件时查看": "Näytä, milloin tapahtuma tapahtuu", + "实时查看": "Reaaliaikainen näkymä", + "有人在门口出现10秒后开始录像。": "Joku ilmestyy ovelle 10 sekuntia ennen nauhoitusta.", + "有人按门铃时立即录像。": "Nauhoita heti, kun joku soittaa ovikelloa.", + "有人出现在门前1.5米范围时启动录像": "Aloita tallentaminen, kun joku ilmestyy 1,5 metrin päässä oven eteen.", + "约0.8米": "Noin 0,8 metriä", + "约3.0米": "Noin 3,0 metriä", + "添加指纹失败": "Toiminta epäonnistui.", + "项": "Erät", + "播放中": "Soitaan", + "下载": "Lataus", + "暂无下载内容": "Ei latausta sisältöä", + "亮度": "Kirkkaus", + "音量": "Määrä", + "快进至": "Kelaa eteenpäin.", + "快退至": "Kelaa taaksepäin", + "暂无视频信息": "Ei videotietoja", + "加载出错": "Latausvirhe", + "请单人正对门锁,距离一个成年人手臂长度": "Seiso oven lukon edessä, käsivarren pituudelta.", + "(约0.6米)。": "(Noin 0,6 metriä)", + "保持脸部无遮挡,露出五官。": "Pidä kasvosi esteetönä ja näytä kasvojen ominaisuudet.", + "准备好了,开始添加": "Valmiina, aloita lisätty", + "正在录入中...": "Nauhoitan...", + "添加人脸失败": "Kasvua ei voitu lisätä", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Nollaamisen jälkeen lukon kasvot poistetaan. Haluatko varmasti palauttaa?", + "人脸号": "Kasvonumero", + "虹膜详情": "Iris yksityiskohdat", + "虹膜号": "Iris-numero", + "选择设备类型": "Valitse laitetyyppi", + "照明灯具": "Valaistuslaitteet", + "电动窗帘": "Sähköverhot", + "门窗传感器": "Ovi- ja ikkuna-anturi", + "传感器": "Sensori", + "清除数据成功": "Tiedot onnistuneesti", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Lukko ei ole yhteydessä internetiin. ja muita oven avaamismenetelmiä ei voi ladata reaaliajassa.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Jos tarvitset historialliset tiedot, voit viedä ne.", + "看不到操作记录,可能原因有": "En näe toimintatietoja, mahdollisia syitä.", + "操作记录详情": "Toimintatietojen tiedot", + "操作时间": "Toimintaaika:", + "此模块功能需要锁联网后设置方可生效": "Tämä moduulin toiminto täytyy asettaa sen jälkeen, kun lukko on kytketty Internetiin tulee voimaan.", + "用户已存在": "Käyttäjä on jo olemassa", + "钥匙数量已到上限": "Näppäimien määrä on saavuttanut ylärajan", + "附近没有可用网关": "Lähistöllä ei ole käytettävissä.", + "正在创建安全连接...": "Luodaan turvallinen yhteys...", + "监视状态下不能发送录音": "Ei voida lähettää tallenteita tarkkailustilassa", + "挂断": "Lopeta puhelu.", + "监视中暂不能开锁": "Avautumista ei ole saatavilla seurannan aikana", + "长按说话": "Paina ja pidä puhetta.", + "松开发送": "Lähetettävä julkaisu", + "请输入6位数字开锁密码": "Anna 6-numeroinen avaamaan salasana.", + "请输入开锁密码": "Syötä lukituksen uudelleen salasana.", + "接收者在有效期内可以不限次数使用": "Vastaanottajat voivat käyttää ekeys rajoittamattomaksi ajaksi voimassaoloajan kuluessa.", + "接收者可以使用此App开关锁": "Vastaanottaja pystyy lukitsemaan / avaamaan tämän sovelluksen avulla.", + "单次钥匙有效期为1小时,只能使用一次": "Yhden kerran ekey on voimassa yhden tunnin ajan ja sitä voidaan käyttää vain yhden kerran.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Vastaanottajat voivat käyttää ekeys rajoittamattoman ajan sisällä kiinteän syklin aikana.", + "获取模板失败": "Mallin hakeminen epäonnistui", + "微信通知": "WeChat-ilmoitus", + "系统短信": "Järjestelmä SMS", + "系统邮件": "Järjestelmän sähköposti", + "模板": "Malli", + "新建模版": "Luo malli", + "您好,您的密码是": "Salasanasi on.", + "密码名字": "Salasanan nimi", + "请输入6-9位密码": "Anna 6-9-numeroinen salasana.", + "设置密码": "Aseta salasanan", + "操作成功,密码为": "Onnistui.", + "类型:自定义-永久": "Tyyppi:Tyypillinen", + "实时播放": "Reaaliaikainen soittos", + "点击对讲": "Klikkaa sisäpuhelinta", + "长按开锁": "Pitkä paina avata lukkoa", + "接听失败": "Vastaus epäonnistui", + "请在锁设置中开启远程开锁": "Ota käyttöön etälukutus lukitusasetuksissa", + "接听": "Vastaa", + "截图已保存到相册": "Kuvakaappa tallennettu albumiin", + "添加遥控": "Lisää kaukosääte", + "已连接到锁,请按遥控": "Lukkoon kytkettynä, paina kaukosäädintä.", + "遥控号": "Kaukosäädin numero", + "遥控详情": "Kaukosäädin tiedot", + "照明": "Valaistus", + "退出演示模式": "Poistu demo-tilasta", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Vihje: Nykyinen käyttöliittymä on näyttöliittymä. Laitteen lisäämisen jälkeen voit jatkaa sen käyttämistä", + "门已上锁": "Ovi on lukossa", + "您的账号在异地登录,如非本人,请尽快修改密码": "Tiliäsi on käytetty kirjautumiseen uudesta laitteesta", + "开门成功": "Avaa ovi onnistuneesti", + "开门失败": "Oven avaaminen epäonnistui", + "呼叫提醒": "Puhelun muistutus", + "收到来自": "Vastaanotettu lähtöltä", + "锁的呼叫": "Lukituspuhelu", + "加载数据中": "Ladataan tietoa", + "搜索所有锁类型": "Etsi kaikki lukitutyypit", + "锁电量更新时间": "Lukitse akun päivitysaika", + "1月": "Jani", + "2月": "Helmikuu", + "3月": "Maro", + "4月": "Huhtikuu", + "5月": "Toukokuu", + "6月": "June", + "7月": "Jul.", + "8月": "Aug", + "9月": "Syys", + "10月": "Lokti", + "11月": "Marraskuu", + "12月": "Dec", + "热门城市": "Kuumat kaupunget", + "导出锁数据": "Vie lukitustiedot", + "一键开锁": "Avaa yksi napsaus", + "已开通": "Avattu", + "编辑员工": "Muokkaa henkilökuntaa", + "一": "Yksi.", + "二": "Kaksi.", + "三": "Kolme.", + "四": "Neli", + "五": "Viisi.", + "六": "Kuusi.", + "日": "Aurinko", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?", + "在线": "Verkossa", + "离线": "Offline-verkosto", + "购买记录": "Hankintamenettely", + "使用记录": "Käyttäjätiedot", + "失效时间要大于当前时间": "Päättymisajan on oltava pidempi kuin nykyinen aika.", + "修改名字": "Muokkaa nimi", + "时": "Tunti", + "分": "Minuutti", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Voit käyttää Alexa avata, lukitse ja tarkistaa lukon tila", + "支持的国家": "Tuetut maat", + "支持的国家值": "Yhdysvallat, Kanada, Yhdistynyt kuningaskunta, Australia, Intia, Saksa, Ranska, Italia, Espanja, Japani", + "操作流程": "Toimintaprosessi.", + "操作流程值": "1 Lisää lukko ja portti Smart-lukko APP:n avulla\n\n2 Ota APP-lukon etälukutustoiminto (tämä toiminto on oletuksena pois päältä). Jos sinulla ei ole tätä vaihtoehtoa, lukko ei tue Alexa\n\n3 Lisää taitoja Alexa ja valtuuttaa ne Smart lukko APP tili ja salasana. Kun valtuutus on onnistunut, voit löytää laitteet tililä\n\n4 Etsi lukko Alexa-sovelluksessa, käynnistä ääni avautuminen ja asettaa kieli salasanan\n\n5 Lukko voidaan käyttää Alexan kautta", + "Google Home": "Google-koti", + "Action name": "Toiminnan nimi", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Tuetut kielet", + "英语": "Englanti", + "Google Home操作流程的值": "1. Käytä Smart-lukko APP lisää lukkoja ja portteja\n\n2. Ota APP-lukon etälukutustoiminto (tämä toiminto on oletuksena sammutettu). Ilman tätä vaihtoehtoa lukko ei tue Google Homes\n\n3. Asenna Google Home APP ja klikkaa \" \" painiketta vasemmassa yläkulmassa.\n\n4. Valitse Asetukset sivulla \"Työ Googlen kanssa\"\n\n5. Etsi \"ScienerSmart\" ja käyttää älykkää lukko APP-tiliä ja salasanaa valtuuttaakseen", + "密码需至少包含数字/字母/字符中的2种组合": "Salasanassa on oltava vähintään kaksi seuraavista: numeroita, kirjaimia ja erityismerkkejä", + "已开锁": "Avaa lukitus", + "已闭锁": "Lukittu", + "两次密码不一致哦": "Salasanat ovat epäjohdonmukaiset.", + "中功率": "Keskimääräinen teho", + "常规使用": "Säännöllinen käyttö", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Kun portti on käytössä, paina ja pidä painiketta nollauspainiketta 5 sekunnin ajan, ja klikkaa Seuraava kun ilmaisin valo vilkkuu vuorotellensa", + "扫描设备": "Skannauslaite", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Poisto epäonnistui. Portti on ehkä pois päältä. Haluatko pakottaa poistamaan tiedot?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_fr.json b/lan/lan_fr.json new file mode 100644 index 00000000..43debbe2 --- /dev/null +++ b/lan/lan_fr.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Serrure d'étoile", + "锁通通": "Verrouiller à travers", + "点击开锁,长按闭锁": "Touchez pour déverrouiller, maintenez pour verrouiller", + "考勤": "Présence", + "考勤设置": "Réglages de fréquentation", + "电子钥匙": "EKeys", + "添加卡": "Ajouter une carte", + "卡号": "Numéro de carte", + "添加指纹": "Ajouter une empreinte digitale", + "指纹号": "Numéro d'empreinte digitale", + "遥控": "Télécommande", + "添加人脸": "Ajouter un visage", + "门锁日志": "Journal de serrure de porte", + "密码号": "Numéro de mot de passe", + "添加者": "Opérateur", + "添加时间": "Temps", + "重置": "Réinitialiser", + "请输入手机号或者邮箱": "Tel/E-mail", + "工作时间": "Temps de travail", + "工作日设置": "Réglage de Workday", + "星期一": "Lundi", + "星期二": "Mardi", + "星期三": "Mercredi", + "星期四": "Jeudi", + "星期五": "Vendredi", + "星期六": "Samedi", + "星期日": "Dimanche", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Ven", + "周六": "Sat", + "周日": "Soleil", + "群发钥匙": "Envoyer plusieurs ekeys", + "锁": "Serrure", + "请添加": "Bénéficiaire", + "允许远程开锁": "Déverrouillage à distance", + "请输入验证码": "Code de vérification", + "获取密码": "Générer un code d'accès", + "请给密码命名": "Entrez un nom pour ce code", + "密码有限期为6个小时,只能使用一次": "Ce mot de passe DOIT ÊTRE utilisé dans les 6 heures suivant l'heure actuelle ou il sera SUSPENDU pour des raisons de sécurité.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Entrez manuellement 6-9 chiffres comme mot de passe. Peut être ajouté par téléphone Bluetooth à côté de la serrure, ou ajouté à distance via la passerelle", + "获取": "Obtenez", + "添加": "Ajouter", + "删除公司": "Société Supprimer", + "密码详情": "Info code d'accès", + "修改密码": "Changer le mot de passe", + "添加虹膜": "Ajouter Iris", + "添加门磁": "Capteur de porte", + "添加无线键盘": "Clavier numérique sans fil", + "添加手掌": "Ajouter Palm", + "请输入员工账号": "Entrer le compte de l'employé", + "批量授权锁": "Accorder plusieurs serrures", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "L'administrateur autorisé aura l'autorisation de la majorité pour faire fonctionner ce verrou.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Cette fonction vous permet de déverrouiller le Smart Lock à distance via une passerelle. Cette fonction ne peut être activée ou désactivée que via Bluetooth.", + "排列方式": "Type de liste", + "早到榜": "Liste précoce", + "迟到榜": "Liste en retard", + "当前模式": "Mode actuel", + "勤奋榜": "Travailler dur Liste", + "延迟时间": "Temps de retard", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Le verrou se verrouillera automatiquement après le temps. Veuillez d'abord le déverrouiller pour une fois pour rendre le réglage disponible.", + "时间": "Temps", + "开始时间": "Heure de début", + "结束时间": "Heure de fin", + "工作时间设置": "Réglage du temps de travail", + "常开模式": "MODE Passage", + "常开时间": "Dans cette période", + "常开日期": "Sur ces jours", + "添加员工": "Ajouter du personnel", + "节假日": "Vacances", + "打卡方式": "Méthode", + "员工是否有钥匙": "A déjà ekey", + "上班时间": "Heure de départ", + "下班时间": "Heure de fermeture", + "本周": "Cette semaine", + "单休": "Week-end d'une journée", + "双休": "Week-end de deux jours", + "单双休": "Week-end de deux jours", + "年": "Année", + "月": "Mois", + "放假日期": "Vacances", + "补班日期": "Jours de travail", + "添加假日": "Ajouter des vacances", + "开始日期": "Date de début", + "必填": "Nécessaire", + "结束日期": "Date de fin", + "日榜": "Quotidien", + "月榜": "Mensuel", + "考勤记录": "Dossiers", + "假日信息": "Vacances Info", + "基本信息": "Bases", + "无线键盘": "Clavier numérique sans fil", + "选择无线键盘": "Ajouter un clavier", + "门磁": "Capteur de porte", + "自动闭锁": "Verrouillage automatique", + "锁声音": "Verrouiller le son", + "防撬报警": "Alerte de sabotage", + "重置键": "Bouton de réinitialisation", + "锁时间": "Horloge de verrouillage", + "诊断": "Diagnostiquer", + "上传数据": "Télécharger des données", + "导入其他锁数据": "Frome d'importation une autre serrure", + "锁升级": "Mise à jour du firmware", + "标记房态": "Statut de la chambre", + "开锁提醒": "Déverrouiller la notification", + "微信二维码": "Déverrouiller le code QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Les personnes possédant des clés électroniques peuvent ouvrir la porte en scannant ce code QR via WeChat. Le code QR de chaque serrure est différent. Vous pouvez l'imprimer et le coller à côté du verrou correspondant", + "锁编号": "Numéro de verrouillage", + "电量": "Batterie", + "锁分组": "Groupe de verrouillage", + "选择分组": "Sélectionner un groupe", + "创建新分组": "Créer un groupe", + "管理员开锁密码": "Admin Passcode", + "更新": "Mise à jour", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Le niveau de la batterie sera mis à jour par passerelle ou téléphone bluetooth", + "当屏幕闪烁时,点击下一步": "Cliquez sur suivant lorsque le clavier clignote", + "输入*529#或按设置键": "Entrez README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # ou appuyez sur la touche Paramètres", + "长按重置键2秒": "Appuyez et maintenez enfoncé le bouton de réinitialisation 2 secondes", + "附近的设备": "Équipement à proximité", + "暂无数据": "Pas de données", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Vous serez en mesure d'obtenir le statut de la porte avec un capteur de porte avec une passerelle. Un seul capteur est autorisé à associer à une serrure.", + "开始": "Début", + "全天": "Toutes les heures", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Vous pouvez définir plusieurs périodes de temps pour le mode de passage. Dans les périodes de temps définies, le verrou restera dans un état ouvert après avoir été déverrouillé.", + "请选择锁音量": "Veuillez sélectionner le volume de verrouillage", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "En allumant, vous entendrez le son de la serrure", + "低": "Faible", + "较低": "Moyen faible", + "中": "Moyen", + "较高": "Moyen élevé", + "高": "Élevé", + "开启后,锁被撬动时,会发出报警声": "En allumant, vous activez l'alerte TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "En éteignant, le bouton RESET est désactivé.", + "校准时间": "Calibrer le temps", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Le diagnostic consiste à lire les informations de configuration à l'intérieur de la serrure et à les télécharger afin que le personnel puisse analyser la cause de la défaillance", + "上传": "Télécharger", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Télécharger des données de la serrure au serveur. Cela peut prendre plusieurs minutes", + "请选择要从哪把锁导入": "Sélectionnez un verrou à importer", + "有新版本": "Avoir une nouvelle version", + "当前版本": "Version actuelle", + "升级": "Mise à jour", + "空闲": "Vacant", + "已入住": "Occupé", + "多语言": "Langues", + "添加锁": "Ajouter un verrou", + "锁地址": "Adresse de verrouillage", + "选择锁类型": "Sélectionnez le type de verrouillage", + "NFC无源锁": "Serrure passive NFC", + "添加设备": "Ajouter un appareil", + "网关": "Passerelle", + "客服": "Service à la clientèle", + "设置": "Réglages", + "更多设置": "Plus d'ensemble", + "消息推送": "Notification push", + "锁用户管理": "Verrouiller les utilisateurs", + "拥有的钥匙": "EKeys associé à cet utilisateur", + "批量授权": "Gestion de l'autorité", + "关联设备": "Appareil associé", + "关联姓名": "Nom associé", + "转移智能锁": "Verrouillage du transfert", + "选择锁": "Verrouillage de l'écran", + "接收人信息": "Bénéficiaire", + "转移网关": "Passerelle de transfert", + "锁屏": "Verrouillage de l'écran", + "已关闭": "Off", + "已开启": "Sur", + "开启": "Allumer", + "确定要开启重置键?": "Continuer à activer le bouton Réinitialiser?", + "确定要关闭重置键?": "Continuer à désactiver le bouton Réinitialiser?", + "隐藏无效开锁权限": "Masquer l'accès non valide", + "APP开锁时需手机连网的锁": "Serrures nécessitant un téléphone en ligne", + "增值服务": "Services", + "关于": "À propos de", + "退出": "Déconnexion", + "删除账号": "Supprimer le compte", + "个人信息": "Info compte", + "头像": "Avatar", + "昵称": "NickName", + "请输入昵称": "Veuillez entrer votre surnom", + "修改昵称": "Renommer", + "修改账号": "Modifier le compte", + "重置密码": "Réinitialiser le mot de passe", + "安全问题": "Question sécurité", + "为了你的账号安全,修改账号前请先使用验证码验证": "Pour la sécurité de votre compte, veuillez utiliser la vérification du mot de passe du compte avant de modifier le compte", + "请输入新账号": "Veuillez entrer le nouveau compte", + "找回密码和登录新设备时,可通过绑定的手机验证": "Le numéro de téléphone de la reliure sera utilisé pour recevoir le code de vérification.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "L'e-mail de liaison sera utilisé pour recevoir le code de vérification.", + "原密码": "Mot de passe actuel", + "新密码": "Nouveau mot de passe", + "确认密码": "Confirmer le mot de passe", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "En cas de perte de votre téléphone, vous pouvez vous connecter au nouveau téléphone en répondant aux questions de sécurité.", + "问题一": "Question 1", + "问题二": "Question 2", + "问题三": "Question 3", + "请输入你的答案": "Veuillez taper votre réponse", + "即将到期": "Expire bientôt", + "去授权": "Aller à autoriser", + "修改名称": "Modifier le nom", + "状态": "Statut", + "WiFi名称": "Wifi Nom", + "网络MAC": "Réseau MAC", + "网关升级": "Mise à jour de la passerelle", + "网关连接的锁": "Serrure (s) connectée (s) à cette passerelle", + "信号强": "Fort", + "选择网关类型": "Choisissez le type de passerelle", + "添加网关": "Ajouter une passerelle", + "重新通电": "Re reliez la puissance", + "指示灯": "Indicateur de lumière", + "选择网关": "Choisissez la passerelle", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G n'est pas pris en charge,. Veuillez sélectionner un WiFi de 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "Entrez le mot de passe WiFi", + "网关名称": "Nom de la passerelle", + "请输入网关名称": "Entrez le nom de la passerelle", + "IP地址": "Adresse IP", + "子网掩码": "Masque de sous-réseau", + "默认网关": "Passerelle par défaut", + "自动获取DNS服务器地址": "Obtenir automatiquement l'adresse du serveur DNS", + "首选DNS": "DNS préféré", + "备选DNS": "DNS alternatif", + "不使用静态IP": "Aucune IP statique n'est utilisée", + "使用静态IP": "Utiliser une adresse IP statique", + "请输入IP地址": "Entrez l'adresse IP", + "请输入子网掩码": "Entrer dans le masque de sous-réseau", + "请输入默认网关": "Entrez la passerelle par défaut", + "所有锁": "Toutes les serrures", + "搜索所有类型的锁": "Scannez tous les types de serrures", + "门锁": "Serrure de porte", + "挂锁": "Cadenas", + "保险箱锁": "Serrure de sécurité", + "智能门禁": "Contrôle d'accès intelligent", + "车位锁": "Serrure de stationnement", + "摸亮触摸屏": "Touchez n'importe quelle touche pour activer le clavier", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Appuyez sur n'importe quelle touche pour activer le verrouillage et mettez-le en mode PAIRING. Appuyez sur Next", + "附近的锁": "Écluses à proximité", + "如需修改名字请重新命名,点击确定添加锁": "Si vous voulez changer le nom, s'il vous plaît renommer, cliquez sur OK pour ajouter serrure", + "添加锁时,手机必须在锁旁边": "Lors de l'ajout d'un verrou, le téléphone doit être à côté du verrou", + "登录": "Login", + "注册": "S'inscrire", + "我已阅读并同意": "J'ai lu et accepté", + "验证码": "Code", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Votre mot de passe doit comporter de 8 à 20 caractères et comprendre au moins deux types de chiffres, de lettres et de symboles.", + "手机": "Téléphone", + "邮箱": "Courriel", + "请输入邮箱": "Entrez votre email", + "国家/地区": "Pays/Région", + "你所在的国家/地区": "Votre pays/région", + "选择国家/地区": "Choisissez votre pays ou région", + "获取验证码": "Obtenir le code", + "商务合作": "Entreprise", + "电脑网页版": "Système Web", + "酒店系统": "Système d'hôtel", + "说明书网页版": "Manuel de l'utilisateur", + "高级功能": "Fonction avancée", + "记录保存": "Conservation des dossiers", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Le SMS peut être utilisé pour envoyer un mot de passe et des informations ekey au destinataire.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "L'e-mail peut être utilisé pour envoyer un mot de passe et des informations ekey au destinataire.", + "购买实名认证提示": "Une fois la fonction activée, vous devez utiliser votre empreinte digitale, votre visage ou votre mot de passe de compte pour ouvrir l'application. Il n'est pas nécessaire de vérifier à nouveau pendant 3 minutes", + "请选择你希望的实名认证频次": "Veuillez sélectionner la fréquence d'authentification par nom réel que vous souhaitez", + "仅首次": "Pour la première fois", + "每日一次": "Une fois par jour", + "每周一次": "Une fois par semaine", + "每月一次": "Une fois par mois", + "当前状态": "Statut actuel", + "试用中": "En procès", + "高级功能权益内容": "Fonctions avancées", + "短信模板": "Modèle SMS", + "邮件模板": "Modèle de courriel", + "发卡工具": "Encodeur de carte", + "购买高级功能须知": "Avis", + "购买高级功能提示": "Des fonctionnalités plus avancées sont en cours de développement, et si vous en avez besoin, vous pouvez ouvrir le service en fonction du nombre de verrous. Les fonctionnalités avancées ne sont disponibles que pour vos propres serrures. Si vous êtes un administrateur autorisé, veuillez contacter l'administrateur supérieur du verrou pour ouvrir le service", + "免费体验": "Essai gratuit", + "立即开通": "Ouvert maintenant", + "购买短信": "Acheter SMS", + "购买邮件": "Acheter EMail", + "购买实名认证次数": "Acheter des temps d'authentification par nom réel", + "开通高级功能": "Activer la fonction avancée", + "选择套餐": "Choisissez le forfait", + "支付方式": "Mode de paiement", + "支付宝": "Alipay", + "去支付": "Payer", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Vous êtes autorisé à définir le message par vous-même. Il est utilisé pour envoyer des informations de mot de passe et ekey à d'autres.", + "高级功能仅能用于你自己的锁": "La fonction avancée ne peut être appliquée que vos propres verrous.", + "新建模板": "Modèle Creat", + "类型": "Type", + "模版内容": "Contenu du modèle", + "预览": "Prévisualisation", + "房间名": "Chambre", + "预计产生短信条数": "Segments de message estimés", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Cette fonctionnalité vous permet de masquer les mots de passe, les clés, les cartes et les empreintes digitales qui sont invalides pendant un certain temps.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Le téléphone de l'utilisateur doit être en ligne pour déverrouiller ces verrous sélectionnés avec APP.", + "配置WiFi": "Configuration WiFi", + "请输入WiFi名字": "Entrez le nom Wifi", + "WiFi配网": "Réseau de distribution WiFi", + "胁迫卡": "Carte de stress", + "员工是否有密码": "Il a déjà Passcode", + "员工是否有卡": "A déjà la carte", + "员工是否有指纹": "Définissez déjà l'empreinte digitale", + "获取钥匙": "Obtenez la clé", + "获取卡": "Obtenir Carte", + "获取指纹": "Obtenir Empreinte digitale", + "安全验证": "Vérification d'identité", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toutes les informations de votre compte seront supprimées de la plate-forme de manière PERMANENTE et ne pourront pas être récupérées. Voulez-vous supprimer?", + "监控": "Moniteur", + "视频日志": "Journal vidéo", + "开门器": "Ouvre-porte", + "面容开锁": "Le visage se déverrouille", + "开门方向设置": "Ensemble de direction d'ouverture", + "电机功率设置": "Réglage MotorPower", + "开锁时是否需联网": "Si Internet est requis lors du déverrouillage", + "选择要加入分组的锁": "Sélectionnez les écluses à ajouter à ce groupe", + "锁数量": "Compte de serrure", + "小米IOT平台": "Plateforme Xiaomi IOT", + "面容开锁设置": "Visage déverrouille l'ensemble", + "感应距离": "Distance de détection", + "防误开": "Empêcher une mauvaise ouverture", + "防误开已关闭,关门后仍可使用面容开锁": "Empêcher la misopening a été fermé, après la fermeture de la porte peut encore utiliser le visage déverrouiller", + "添加和使用面容开锁时": "Ajouter et utiliser le visage lors du déverrouillage", + "添加和使用面容开锁时提示": "\n1, s'il vous plaît essayer de garder une seule personne devant l'opération de la porte;\n2, s'il vous plaît se tenir devant la serrure de porte environ 0,5 ~ 0,8 mètres, face à la serrure de porte;\n3. s'il vous plaît garder votre visage sans obstruction et exposer vos traits du visage;\n4. lorsque la reconnaissance des visages est anormale, vous pouvez toucher n'importe quelle touche du clavier numérique pour redémarrer manuellement la reconnaissance des visages.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Veuillez choisir la puissance de moteur soigneusement selon la situation réelle de la serrure de porte:", + "小功率:": "Miniwatt:", + "耗电少": "Moins de consommation d'énergie", + "大功率": "Haute-puissance:", + "大功率提示": "Si la languette de verrouillage ne peut pas être rétractée normalement lors du déverrouillage, ou doit être entraînée", + "开门方向设置提示": "Veuillez choisir soigneusement la direction pour ouvrir la porte de votre maison (si vous choisissez la mauvaise direction, vous ne pourrez pas ouvrir et fermer la porte correctement):", + "左开": "Ouvert à gauche", + "右开": "Ouvert à droite", + "判断方法:": "Produits connexes: 判断方法:", + "判断方法内容": "L'homme se tenait devant la maison, face à la porte d'entrée.", + "录像时段": "Fente vidéo", + "密码": "Passcodes", + "卡": "Cartes", + "指纹": "Empreinte digitale", + "人脸": "Visage", + "配件商城": "Verrouiller le centre commercial", + "公司名称": "Nom de l'entreprise", + "请输入公司名字": "Entrez le nom de l'entreprise", + "提示": "Astuce", + "是否删除?": "Que ce soit pour supprimer?", + "员工信息": "Personnel Info", + "员工": "Personnel", + "打卡方式无效": "Indisponible", + "中国": "Chine", + "选择钥匙": "Choisissez ekey", + "编辑": "Éditer", + "无": "Non", + "有": "Oui", + "请输入姓名": "Veuillez entrer un nom", + "获取人脸": "Obtenir des visages", + "选择密码": "Choisissez Passcode", + "选择卡": "Choisissez la carte", + "选择指纹": "Choisissez l'empreinte digitale", + "选择人脸": "Sélectionnez visage", + "员工是否有人脸": "Si le salarié a un visage", + "同时删除员工钥匙": "Supprimer son ekey", + "删除": "Delet", + "确定要删除员工吗?": "Supprimer cet employé", + "月统计": "Statistiques mensuelles", + "迟到": "En retard", + "早退": "Partez tôt", + "未打卡": "Aucun enregistrement", + "钥匙将在": "Cet ekey expirera dans", + "天后失效": "Jour (s)", + "电量更新时间:": "Temps de mise à jour de batterie:", + "新增配件": "Ajouter", + "钥匙不可用": "La clé n'est pas disponible", + "正在开锁中...": "Déverrouillage...", + "你的钥匙": "Votre clé", + "常开模式启动!长按闭锁": "Mode ouvert a commencé! Appuyez longuement pour verrouiller", + "演示模式": "Mode démo", + "请先同意用户协议及隐私政策": "S'il vous plaît accepter l'accord de l'utilisateur et la politique de confidentialité d'abord", + "用户协议": "Termes de l'utilisateur", + "隐私政策": "Politique de confidentialité", + "注册成功": "Enregistrement réussi", + "你所在的": "Vous êtes dans", + "手机号": "Numéro de téléphone", + "忘记密码": "Mot de passe oublié", + "重置成功": "Réinitialiser le succès", + "确定要退出吗?": "Sortie?", + "功能暂未开放": "La fonction n'est pas encore ouverte", + "设置成功": "Mettre en place avec succès", + "删除成功": "Supprimer avec succès", + "单次": "Une fois", + "永久": "Permanent", + "限时": "Chronométré", + "自定义": "Coutume", + "清空码": "Effacer", + "循环": "Récurrent", + "工作日": "Journée de travail", + "每日": "Quotidien", + "周末": "Week-end", + "确定要删除吗?": "Supprimer?", + "该锁的密码都将被删除": "Tous les mots de passe pour ce verrou seront SUPPRIMÉS", + "已过期": "Invalide", + "该锁的电子钥匙都将被删除": "Toutes les eKeys pour ce verrou seront SUPPRIMÉES", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "SUPPRIMER tous les ekeys associés à cet ekey. Cette étape ne peut pas être défait!", + "删除钥匙会在用户APP连网后生效": "L'ekey sera SUPPRIMÉ", + "有效时间": "Temps efficace", + "接收者": "Bénéficiaire", + "仅管理自己创建的用户": "Gérer ses propres utilisateurs uniquement", + "远程开锁": "Déverrouillage à distance", + "请输入钥匙名称": "Veuillez entrer le nom de la clé", + "修改成功": "Modifier le succès", + "冻结": "Congeler", + "解除冻结": "Dégel", + "授权": "Autoriser", + "取消授权": "Désautoriser", + "同时解冻其发送的钥匙": "Dégeler tous les ekeys émis par cet utilisateur", + "会在用户APP连网后生效": "Cette ekey sera débranchée lorsque l'application de l'utilisateur se connecte à un réseau", + "同时冻结其发送的钥匙": "Geler tous les ekeys émis par cet utilisateur", + "冻结会在用户APP连网后生效": "Cet ekey sera CONGELÉ lorsque l'application de l'utilisateur se connecte à un réseau", + "取消授权会在用户APP连网后生效": "L'utilisateur perdra ses autorisations lorsque l'application de l'utilisateur se connecte à un réseau", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "L'utilisateur autorisé a presque les mêmes autorisations que le gestionnaire de verrouillage (par exemple, possibilité d'envoyer des ekeys et des codes d'accès)", + "失效时间需晚于生效时间": "L'heure d'expiration doit être postérieure à l'heure effective", + "生效时间需晚于当前时间": "Le temps effectif doit être postérieur à l'heure actuelle", + "失效日期需晚于生效日期": "La date d'expiration doit être postérieure à la date effective", + "修改有效期": "Période de changement", + "生效日期": "Date de début", + "失效日期": "Date de fin", + "开锁": "Déverrouiller", + "开锁成功": "Débloquer le succès", + "请选择锁": "Veuillez sélectionner les serrures", + "请选择接收者": "Veuillez sélectionner le récepteur", + "请选择有效期": "Veuillez sélectionner la période de validité", + "请选择发送方式": "Veuillez sélectionner la méthode d'envoi", + "请选择结束时间": "Veuillez sélectionner l'heure de fin", + "完成": "Complet", + "有效日": "Cycle sur", + "发送成功": "Envoyer le succès", + "请选择开始时间": "Veuillez sélectionner l'heure de début", + "选择用户": "Sélectionner les destinataires", + "已选中": "Sélectionné", + "确定": "OK", + "请选择要发送的锁": "Veuillez sélectionner les serrures", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "L'authentification par nom réel du visage fait référence au besoin de l'utilisateur de vérifier son visage avant de déverrouiller l'application du téléphone, et la vérification peut être déverrouillée.", + "分享": "Partager", + "请输入接收者账号": "Veuillez entrer le compte du destinataire", + "接收者号码未注册,请重新发送": "Le numéro du récepteur n'est pas enregistré, veuillez renvoyer", + "是否发送电子钥匙给未注册账号": "Voulez-vous envoyer un ekey à un nouveau compte", + "取消": "Annuler", + "标记成功": "Mark succès", + "微信好友": "Les amis de WeChat", + "短信": "SMS", + "邮件": "Courriel", + "更多": "Plus", + "您好,您的电子钥匙生成成功": "Bonjour, votre clé électronique est générée avec succès", + "生效时间不能小于当前时间": "Le temps effectif ne peut pas être inférieur au temps actuel", + "结束时间不能小于当前时间": "L'heure de fin ne peut pas être inférieure à l'heure actuelle", + "是否为管理员": "Est-ce un administrateur", + "已连接到锁,请将卡靠近门锁的读卡区": "Connecté. Placez la carte contre le lecteur de carte", + "尝试连接设备...": "Connexion avec Lock. Veuillez patienter...", + "地理位置": "Localisation géographique", + "检查以确保以下地址是正确的": "Vérifiez que l'adresse suivante est correcte", + "地图加载中,请稍候。。": "La carte est en cours de chargement, veuillez patienter...", + "跳过": "Skip", + "还未获取到位置信息哦,请耐心等待一下!": "Les informations de localisation n'ont pas encore été obtenues, veuillez patienter!", + "请填写信息": "Veuillez remplir les informations", + "有效期": "Période de validité", + "生效时间": "Heure de début", + "失效时间": "Heure de fin", + "上传成功": "Téléchargé avec succès", + "未生效": "Inactif", + "已生效": "Efficace", + "指纹详情": "Info Empreinte digitale", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Vous devrez placer votre doigt sur le capteur plusieurs fois. Veuillez suivre les instructions...", + "开始添加": "Début", + "请将您的手指按下": "Placez votre doigt sur le capteur", + "根据提示,抬起手指后再进行下一次指纹采集": "Suivez les instructions... Vous devrez retirer et placer votre doigt sur le capteur pour le prochain enregistrement", + "添加成功": "Ajouter succès", + "更新成功": "Mise à jour du succès", + "搜索": "Recherche", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Après la réinitialisation, la carte de la serrure sera supprimée, voulez-vous réinitialiser?", + "已失效": "Invalide", + "卡详情": "Info carte", + "请输入": "Veuillez entrer ici", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "En désactivant, la serrure restera déverrouillée toute la journée jusqu'à ce qu'elle soit verrouillée manuellement", + "请输入小于或等于60的数字": "Veuillez entrer un nombre inférieur à 60", + "操作成功": "Opération réussie", + "管理员密码相同,无需修改": "Le mot de passe de l'administrateur est le même et n'a pas besoin d'être modifié.", + "请输入6-9位数字": "6-9 Chiffres de longueur", + "请输入6-9位管理员密码": "Veuillez entrer un mot de passe administrateur de 6 à 9 chiffres", + "请输入新的管理员密码": "Entrez un nouveau mot de passe administrateur", + "未分组": "Non groupé", + "请输入分组名称": "Créer un groupe", + "创建成功": "Créer le succès", + "设置锁分组成功": "Définir le groupe de verrouillage avec succès", + "电池1电量": "Batterie 1", + "电池2电量": "Batterie 2", + "电量更新时间": "Temps de mise à jour de la batterie", + "锁电量更新成功": "Verrouiller le succès de la mise à jour de puissance", + "您的钥匙未生效": "Votre clé n'est pas efficace", + "您的钥匙已冻结": "Votre clé a été gelée", + "您的钥匙已过期": "Votre clé a expiré", + "常开模式开启": "La serrure est en mode Passage", + "超级管理员": "Super admin", + "授权管理员": "Admin autorisé", + "普通用户": "Utilisateur ordinaire", + "余": "Équilibre", + "天": "Journée", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Après avoir supprimé le verrou, toutes les informations seront supprimées ensemble, êtes-vous sûr de vouloir supprimer le verrou?", + "请输入登录密码": "Veuillez entrer le mot de passe de l'application", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Impossible de supprimer l'appareil, veuillez vous assurer que l'appareil est à proximité de l'appareil, l'appareil n'est pas connecté et l'appareil est allumé", + "用户无权限": "L'utilisateur n'a pas d'autorisation", + "创建公司后,考勤功能才能使用": "Créez d'abord une entreprise", + "是否删除钥匙?": "Supprimer cet ekey?", + "邮箱绑定成功": "Succès de la liaison par courriel", + "手机绑定成功": "Succès de liaison de téléphone portable", + "网络访问失败,请检查网络是否正常": "Réseau indisponible, s'il vous plaît vérifier et connecter votre appareil à 3G/4G/WIFI", + "清空": "Clair", + "是否清空?": "Clair?", + "消息详情": "Info Message", + "创建时间": "Temps de création", + "管理员详情": "Détails de l'administrateur", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Si quelqu'un vous force à ouvrir la porte, vous pouvez utiliser cette carte. Le message d'alarme sera envoyé aux advisors. Pour utiliser cette fonction, veuillez vous assurer que votre serrure est en ligne.", + "请不要将胁迫卡用于日常开锁": "Veuillez ne pas utiliser la carte forcée pour un usage quotidien.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Si quelqu'un vous force à ouvrir la porte, vous pouvez utiliser cette empreinte. Le message d'alarme sera envoyé aux administers. Pour utiliser cette fonction, assurez-vous que votre serrure est en ligne.", + "请不要将胁迫指纹用于日常开锁": "Veuillez ne pas utiliser l'empreinte digitale forcée pour un usage quotidien.", + "创建公司": "Créer une entreprise", + "公司名称不能超过30个字符": "Le nom de l'entreprise ne peut pas dépasser 30 caractères", + "公司名称不能小于6个字符": "Le nom de l'entreprise ne peut pas être inférieur à 6 caractères", + "WIFI列表": "Liste WIFI", + "刷新": "Rafraîchir", + "手动配网": "Réseau de distribution manuel", + "远距离": "Longue distance", + "中距离": "Distance moyenne", + "近距离": "Courte distance", + "锁时间更新成功": "Verrouiller le succès de la mise à jour du temps", + "锁用户": "Verrouiller les utilisateurs", + "请选择常开日期": "Veuillez sélectionner la date d'ouverture", + "结束时间不能小于开始时间哦": "L'heure de fin ne peut pas être inférieure à l'heure de début", + "介绍": "Notre histoire", + "个人信息收集清单": "Liste de collecte de renseignements personnels", + "应用权限说明": "Description d'autorisation de l'application", + "第三方信息共享清单": "Liste de partage d'informations tierces", + "请选择您的位置": "Veuillez sélectionner votre emplacement", + "请先选择位置": "Veuillez d'abord sélectionner l'emplacement", + "管理员密码": "Admin mot de passe", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Si vous devez modifier, veuillez entrer un nouveau mot de passe administrateur (6 chiffres), cliquez sur OK pour modifier", + "修改": "Modifier", + "网络摄像头": "Caméra", + "重命名": "Renommer", + "分组下的锁将被移到未分组里": "Les verrous sous le groupe seront déplacés vers non groupés", + "编辑成功": "Modifier le succès", + "厂商": "Fabricant", + "型号": "Modèle", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Une fois le mot de passe généré, veuillez l'utiliser une fois pour l'activation avant 23h59 le même jour, sinon il sera invalide après 0 heures. Une fois le mot de passe activé, il peut être utilisé un nombre illimité de fois dans la période de validité.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Une fois le mot de passe généré, veuillez l'utiliser avant 23h59 le même jour, sinon il sera invalide après 0 heures. Le code clair est utilisé pour effacer tous les mots de passe générés avant 0 heures aujourd'hui.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Une fois le mot de passe généré, veuillez l'utiliser avant 23h59 le même jour, sinon il sera invalide après 0 heures.", + "清空密码底部提示": "Le mot de passe est valable jusqu'à 23:59 le jour de la vidange", + "相机": "Caméra", + "相册": "Photos", + "读写": "Stockage", + "定位": "Emplacement", + "需要访问相机权限才能拍照上传文件例如头像上传": "L'accès à l'appareil photo est requis pour prendre des photos et télécharger des fichiers, tels que le téléchargement d'une photo de profil", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Un accès à la caméra est nécessaire pour télécharger des fichiers et des avatars à l'aide d'images d'album", + "需要访问读写权限才能使用本地图片上传头像": "L'accès aux autorisations de lecture et d'écriture est requis pour télécharger des avatars utilisant des images locales", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "L'accès aux informations de localisation est requis pour utiliser la fonction de touche d'ajout", + "申请": "Application", + "权限": "Permission", + "不允许": "Non autorisé", + "允许": "Autorisé", + "权限被拒绝": "Permission refusée", + "请手动在系统设置中开启": "Veuillez l'activer manuellement dans les paramètres système", + "权限以继续使用应用": "Permission de continuer à utiliser l'application.", + "去设置": "Allez le mettre en place", + "当前网络": "Réseau actuel", + "位置信息": "Information sur l'emplacement", + "请输入wifi名称": "Veuillez entrer le nom wifi", + "虹膜": "Iris", + "手掌": "Paume", + "商城": "Centre commercial", + "我的": "Mon", + "微信公众号推送": "Compte public Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Pour ouvrir wechat pour recevoir des messages d'alarme, vous devez faire attention à Skye Smart Lock compte public wechat d'abord, s'il vous plaît enregistrer le code QR et utiliser wechat pour scanner les paramètres", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "L'accès aux autorisations Bluetooth est nécessaire pour utiliser les informations de localisation de la fonction de touche d'ajout", + "请输入Email": "Entrez votre email", + "请输入手机号": "Entrez votre numéro de téléphone", + "家人到家": "Un membre de la famille est arrivé à la maison", + "添加家人": "Ajouter un membre de la famille", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Si la serrure n'est pas connectée à Internet, les rappels pour le code d'accès, la carte, l'empreinte digitale et d'autres méthodes d'ouverture de porte ne peuvent pas être envoyés en temps opportun.", + "消息提醒": "Rappel", + "开门通知": "Avis d'ouverture", + "N天未开门": "N jours sans ouverture de porte", + "门未关好": "La porte n'est pas fermée", + "防拆报警": "Alarme de bourreur", + "低电量提醒": "Batterie faible", + "胁迫开门": "Ouverture forcée de la porte", + "有人按门铃": "Quelqu'un sonne à la porte", + "有人出现在门口": "Quelqu'un apparaît à la porte", + "提醒方式": "Méthode de rappel", + "开门方式": "Méthode d'ouverture de porte", + "请选择": "Veuillez sélectionner", + "家人": "Membre de la famille", + "保存": "Économisez", + "APP推送": "APP pousser", + "管理员": "Admin", + "未启用": "Non activé", + "已启用": "Permis", + "省电模式": "Mode d'économie de puissance", + "逗留抓拍模式": "Restez en mode capture", + "实时监控模式": "Mode de surveillance en temps réel", + "自定义模式": "Mode personnalisé", + "猫眼设置": "Réglage des yeux de chat", + "猫眼工作模式": "Mode de travail oeil de chat", + "自动亮屏": "Écran lumineux automatique", + "亮屏持续时间": "Écran à l'heure", + "逗留警告": "Restez avertissement", + "异常警告": "Avertissement anormal", + "短信提醒": "SMS", + "邮件提醒": "Courriel", + "N天未开门提醒": "N jours sans ouverture de porte", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Si quelqu'un vous force à ouvrir le verrou, vous pouvez utiliser cette empreinte digitale. Le message d'alarme sera envoyé aux advisors. Pour utiliser cette fonction, assurez-vous que votre serrure est en ligne.", + "胁迫指纹": "Empreinte digitale forcée", + "指纹列表": "Liste d'empreintes digitales", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Après l'heure définie, si le verrou n'est pas ouvert, le système enverra un message de rappel au destinataire désigné. Cette fonction nécessite que le verrou soit connecté à Internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Après l'activation du rappel, lorsque la batterie de verrouillage est inférieure à 20%, 10% et 5%, le système enverra un message de rappel au destinataire désigné.", + "未开门时间": "Jours sans ouverture de porte", + "添加和使用面容开锁时:": "Ajouter et utiliser Face lors du déverrouillage:", + "关锁": "Fermer la serrure", + "功能": "Fonction", + "配件": "Pièces", + "云存": "Stockage cloud", + "本地": "Cette localité", + "3天滚动储存": "3 jours stockage de roulement", + "去升级": "Mise à niveau maintenant", + "下载列表": "Télécharger la liste", + "已下载": "Téléchargé", + "全部视频": "Toutes les vidéos", + "已为本设备免费提供3大滚动视频储存服务": "Trois services de stockage vidéo à défilement ont été fournis gratuitement pour cet appareil", + "视频播放": "Lecture vidéo", + "全选": "Tous", + "请选择要删除的视频": "Veuillez sélectionner la vidéo que vous souhaitez supprimer", + "请选择要下载的视频": "Veuillez sélectionner la vidéo que vous souhaitez télécharger", + "欢迎使用": "Bienvenue à utiliser", + "用户协议和隐私政策概要": "Résumé de l'accord d'utilisateur et de la politique de confidentialité", + "协议概要": "Résumé du protocole", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Merci d'utiliser cette application. Nous accordons une grande importance à la protection de vos renseignements personnels et de votre vie privée. Avant d'utiliser ce produit, veuillez le lire attentivement", + "《用户协议》": "Termes de l'utilisateur", + "和": "Et", + "《隐私政策》": "《 Politique de confidentialité 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Tout le contenu de. En cliquant sur «Accepter», vous acceptez et acceptez tous les termes. Si vous choisissez de ne pas accepter, vous ne pourrez pas utiliser nos produits et services et quitterez l'application.", + "不同意": "En désaccord", + "同意": "D'accord", + "该功能是高级功能,请开通后再使用": "C'est la fonction avancée. Veuillez l'activer en premier.", + "常用程序": "Programmes communs", + "该锁已被重置": "Le verrou a été réinitialisé", + "需要访问读写权限才能使用手动升级固件": "L'accès aux autorisations de lecture et d'écriture est requis pour mettre à niveau manuellement le micrologiciel", + "错误D固件,请选择正确的文件": "Mauvais firmware, veuillez sélectionner le bon fichier", + "非SYD固件,请选择正确的文件": "Non SYD firmware, veuillez sélectionner le fichier correct", + "文件校验失败 0x01": "La vérification du fichier a échoué 0x01", + "解析元数据失败,请选择正确的文件": "Échec de parser les métadonnées, veuillez sélectionner le fichier correct", + "文件校验失败 0x02": "La vérification du fichier a échoué 0x02", + "文件校验失败 0x03": "La vérification du fichier a échoué 0x03", + "固件升级完成": "Mise à niveau du micrologiciel terminée", + "记录": "Dossiers", + "开通高级功能后才可以对锁进行管理": "Veuillez d'abord activer la fonction avancée pour gérer les verrous.", + "去开通": "Permettre", + "实名认证": "Authentification par nom réel", + "当前剩余数量": "Restant", + "购买": "Acheter", + "实名认证为付费功能,请购买后再使用": "Authentification par nom réel est une fonction payante, veuillez l'utiliser après l'achat", + "密码不一致哦": "Les mots de passe sont incohérents", + "退出添加": "Quitter l'ajout", + "管理员已满": "Admin complet", + "用户已满": "L'utilisateur est plein", + "锁上面添加指纹已满": "Ajouter une empreinte digitale sur la serrure est pleine", + "指纹已存在": "L'empreinte existe déjà.", + "锁上面添加人脸已满": "Verrouiller ci-dessus ajouter le visage est plein", + "人脸已存在": "Le visage existe déjà", + "锁上面添加卡已满": "Verrouiller ci-dessus ajouter la carte est pleine", + "卡已存在": "La carte existe déjà", + "锁上面添加密码已满": "Verrouiller ci-dessus ajouter mot de passe est plein", + "密码已存在": "Un code identique existe déjà. Veuillez en choisir un autre", + "请输入密码": "Veuillez entrer le mot de passe", + "暂无密码,无需重置": "Pas de mot de passe, pas besoin de réinitialiser", + "真实姓名": "Nom réel", + "身份证号": "Numéro d'identification", + "请输入真实姓名": "Veuillez entrer votre vrai nom", + "请输入身份证号": "Veuillez entrer votre numéro d'identification", + "请输入身份证号和真实姓名": "Veuillez entrer votre numéro d'identification et votre vrai nom", + "点击返回设备配对": "Appuyez sur Retour à l'appariement des appareils", + "无法连接?尝试升级": "Impossible de se connecter? Tenté de mise à niveau", + "固件升级提示": "Firmware mise à niveau rapide", + "请先获取固件文件到手机本地,再选择升级": "Veuillez d'abord obtenir le fichier du micrologiciel sur le téléphone local, puis sélectionnez Mettre à niveau", + "固件升级中": "Le firmware est en cours de mise à niveau", + "取消升级": "Annuler la mise à niveau", + "固件传输中": "Firmware en transit", + "关闭": "Éteindre", + "传输中'": "En transit", + "操作记录": "Dossiers", + "修改姓名": "Modifier le nom", + "传输中": "En transit", + "发送人": "Délivré par", + "发送时间": "Heure émise", + "钥匙详情": "Infos ekey", + "姓名": "Nom", + "发送": "Envoyer", + "请确认姓名全名和身份证号码是否正确": "Veuillez confirmer que le nom complet et le numéro d'identification sont corrects", + "传输期间请勿离开当前页面": "Ne quittez pas la page actuelle pendant le transfert", + "机型": "Modèles", + "硬件版本": "Version hardware", + "固件版本": "Version du firmware", + "手动升级": "Mise à niveau manuelle", + "设备连接中...": "Dispositif de connexion...", + "未避免异常情况,请在门打开时升级": "Exceptions inévitables, veuillez mettre à niveau lorsque la porte est ouverte", + "钥匙无效": "La clé est invalide", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Impossible de se connecter au verrou. Veuillez redémarrer le blutooth de votre téléphone et réessayer.", + "如果是全自动锁,请使屏幕变亮": "S'il s'agit d'un verrouillage entièrement automatique, veuillez rendre l'écran plus lumineux", + "正在尝试闭锁……": "Essayer de verrouiller. S'il vous plaît attendez...", + "清空记录": "Effacer les enregistrements", + "是否要删除操作记录?": "Continuer à supprimer des enregistrements?", + "被删除的记录不能恢复": "Les enregistrements ne peuvent pas être récupérés après suppression.", + "全部事件": "Tous les événements", + "开锁事件": "Déverrouiller l'événement", + "异常事件": "Événement anormal", + "门铃事件": "Événement Sonnette", + "视频事件": "Événement vidéo", + "请开启蓝牙": "Veuillez allumer Bluetooth", + "请选择有效日": "Veuillez sélectionner le jour effectif", + "公司名字长度不能小于 6 ": "La longueur du nom de la société ne peut pas être inférieure à 6", + "已是最新版本": "Pas de mises à jour", + "新建短信模版": "Modèle de Creat SMS", + "新建邮件模版": "Modèle de courriel Creat", + "自定义短信模版": "Modèle de SMS", + "自定义邮件模版": "Modèle de courriel", + "名称": "Nom", + "星星锁": "Serrure étoile", + "无考勤记录": "Aucun dossier", + "大家干劲十足": "Tout le monde vient à temps", + "工作时长未出炉": "Pas d'heures de travail", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Le choix du pays/de la région aura une incidence sur la sécurité des données. Vous avez actuellement sélectionné l'Albanie, veuillez confirmer avant de continuer.", + "确认国家或地区": "Confirmer le pays/région", + "我知道了": "Je l'ai eu", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Pour recevoir des mises à jour importantes, cliquez sur «OK» et activez les notifications dans les paramètres.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Après avoir allumé, vous pouvez re-puissance en appuyant longuement sur la touche de réglage sur la serrure, et ré-ajouter avec l'APP", + "已有": "Actuel", + "新增": "Nouveau", + "账号格式错误": "Mauvais format", + "接收者信息为空": "Les informations du destinataire sont vides", + "请输入时间(秒)": "Veuillez entrer l'heure (sec)", + "加载数据失败": "Échec du chargement des données", + "重试": "Essayez à nouveau", + "升级中,是否退出": "Pendant la mise à niveau, s'il faut quitter", + "下一步": "Suivant", + "公寓": "Appartement", + "个人用户": "Personnel", + "星寓": "Appartement Star", + "账号": "Compte", + "请输入手机号或email": "Numéro de téléphone ou courriel", + "请输入星寓管理员的账号": "Veuillez entrer le compte de l'administrateur de l'appartement star", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Toutes les données du (des) verrou (s) sélectionné (s) seront transférées de manière permanente au destinataire.", + "暂不支持跨平台转移,敬请期待": "Le transfert multiplateforme n'est pas pris en charge pour le moment, veuillez l'attendre avec impatience", + "移除坏锁": "Déplacer les serrures défectueuses/endommagées vers la corbeille", + "转移确认": "Confirmer le transfert", + "本次共转移": "Cette fois, un total de", + "把智能锁": "Serrure intelligente", + "确认": "OK", + "移除成功": "Supprimer avec succès", + "转移成功": "Succès du transfert", + "该已锁被删除": "Le verrouillé est supprimé", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "L'administrateur autorisé ne peut gérer que les mots de passe, les ekeys et etccreated par lui-même.", + "添加授权管理员": "Créer un admin", + "导出记录": "Exporter des enregistrements", + "选择时间段": "Sélectionnez la période de temps", + "导出": "Exportation", + "批量导出": "Exportation par lots", + "读取记录": "Rafraîchir les enregistrements", + "设备": "Appareil", + "消息": "Messages", + "智能分析": "Analyse intelligente", + "精准识别设备事件,过滤无效信息": "Identifiez avec précision les événements de l'appareil et filtrez les informations non valides", + "系统设置": "Réglages système", + "系统的全局配置在此项内进行设置": "La configuration globale du système est définie dans cet élément", + "导出操作记录": "Exporter des enregistrements", + "立即查看": "Vue", + "导出成功": "Exporté avec succès", + "发送钥匙": "Envoyer ekey", + "进度": "Taux", + "失败": "Échec", + "人脸详情": "Détails du visage", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Lorsqu'une personne est détectée à environ 1,5 mètre devant la porte, le déverrouillage de la reconnaissance faciale est automatiquement démarré.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Lorsqu'une personne est détectée à environ 0,8 mètre devant la porte, le déverrouillage de la reconnaissance faciale démarre automatiquement.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Lorsqu'une personne est détectée à environ 0,5 mètre devant la porte, le déverrouillage de la reconnaissance faciale démarre automatiquement.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "La distance de détection a été désactivée, vous devez toucher manuellement n'importe quelle touche du clavier pour effectuer le déverrouillage de reconnaissance faciale.", + "防误开已打开,开锁后": "L'ouverture anti-erreur a été activée, et après le déverrouillage", + "秒内不可使用面容开锁": "Le déverrouillage du visage ne peut pas être utilisé en quelques secondes", + "掌静脉": "Veine de palmier", + "添加掌静脉": "Ajouter la veine de palme", + "胁迫掌静脉": "Veine de paume forcée", + "请不要将胁迫掌静脉用于日常开锁": "Veuillez ne pas utiliser les veines de coercition pour le déverrouillage quotidien", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Connecté à la serrure, s'il vous plaît ouvrir naturellement votre paume, la paume est face à la caméra", + "掌静脉详情": "Détails de veine de paume", + "掌静脉号": "Numéro de veine de palmier", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth n'est pas activé, veuillez activer Bluetooth dans les paramètres", + "删除用户时,会将用户拥有的钥匙一起删除。": "Si un utilisateur est SUPPRIMÉ, toutes les clés associées à l'utilisateur seront également SUPPRIMÉES.", + "配置网络": "Configurer le réseau", + "你好": "Bonjour", + "成功": "Succès", + "类型选择": "Type sélectionner", + "请选择要使用哪种类型": "Veuillez sélectionner le type à utiliser", + "系统邮件(推荐)": "Email système (recommandé)", + "系统短信(推荐)": "Système SMS (recommandé)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "L'e-mail sera envoyé à partir de cette application. s'il vous plaît acheter paquet de courrier électronique d'abord.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Le sms sera envoyé à partir de cette application. s'il vous plaît acheter le paquet email d'abord.", + "个人邮件": "Courriel personnel", + "个人短信": "SMS personnels", + "邮件将从你的个人邮箱发给用户": "Le courriel sera envoyé à partir de votre compte de courriel personnel.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Le SMS sera envoyé à partir de votre numéro de téléphone personnel. Vous payez à votre opérateur télécom.", + "为了更好地应用体验,请确定权限": "Pour une meilleure expérience d'application, veuillez confirmer les autorisations", + "您第一次拒绝权限,请确定权限": "Vous avez refusé l'autorisation pour la première fois, veuillez confirmer l'autorisation", + "您第二次拒绝权限,请去应用设置开启权限": "Vous avez refusé l'autorisation pour la deuxième fois, s'il vous plaît aller dans les paramètres de l'application pour activer l'autorisation", + "去应用市场": "Aller à l'App Store", + "温馨提示": "Chaud rapide", + "关闭应用": "Fermer l'application", + "开启微信接收报警消息需要先关注": "Pour ouvrir WeChat pour recevoir des messages d'alarme, vous devez suivre", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Compte public WeChat, enregistrez le code QR et utilisez WeChat pour scanner les paramètres", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "L'authentification par nom réel est une fonction payante, veuillez contacter l'administrateur du verrou pour acheter et utiliser", + "位置权限": "Autorisation de localisation", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "S'il vous plaît accorder à l'application d'utiliser votre locatian. il est utilisé pour scanner les verrous et les passerelles BLE.", + "相机/相册权限": "Autorisation de l'appareil photo/album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Veuillez accorder l'application pour lire et écrire des photos et des fichiers à partir du stockage.", + "点击选择": "Cliquez pour sélectionner", + "微信": "WeChat", + "朋友圈": "Moments", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Lien", + "今天": "Aujourd'hui", + "密码错误": "Mot de passe invalide", + "网络中断": "Interruption du réseau", + "钥匙不存在": "La clé n'existe pas", + "钥匙过期": "Clé expirée", + "钥匙已存在": "La clé existe déjà", + "密码失效": "Mot de passe invalide", + "门锁时间异常": "Temps de verrouillage de porte anormal", + "APP(手机)未联网": "APP (téléphone mobile) n'est pas connecté à Internet", + "数据不存在": "Les données n'existent pas", + "待接收": "BeReceived", + "已冻结": "Congelé", + "已删除": "Supprimé", + "未知": "Inconnu", + "拖动下方滑块完成拼图": "Faites glisser le curseur vers la postion correcte", + "验证成功": "Succès de la vérification", + "验证失败": "La vérification a échoué", + "向右拖动滑块填充拼图": "Faites glisser le curseur vers la droite pour remplir le puzzle", + "请先获取到位置信息哦": "S'il vous plaît obtenir les informations de localisation d'abord", + "请选择国家": "Veuillez sélectionner un pays", + "获取锁信息": "Obtenir des informations de verrouillage", + "锁数据异常,请重试": "Les données de verrouillage sont anormales, veuillez réessayer", + "连接设备中...": "Dispositif de connexion...", + "把锁": "Serrures", + "条": "Bande", + "封": "Sceau", + "次": "Fois", + "支付成功": "Payer le succès", + "查看详情": "Voir les détails", + "请输入模板名称": "Veuillez entrer le nom du modèle", + "模版类型": "Type", + "再返回一次退出": "Sortie à nouveau", + "请先添加锁": "S'il vous plaît ajouter le verrou en premier", + "可视对讲": "Intercom visuel", + "详细日志": "Journal détaillé", + "已复制到剪切板": "Copié", + "拍照": "Photo", + "从相册选择": "Choisissez de l'album", + "选择问题": "Veuillez sélectionner une question", + "确认长度不足8位": "Confirmer la longueur inférieure à 8 chiffres", + "新密码长度不足8位": "Nouvelle longueur de mot de passe inférieure à 8 chiffres", + "两次密码不一致": "Mismatch de mot de passe. Veuillez réessayer", + "请点击获取验证码,验证码将发送到": "Veuillez obtenir un code de vérification. Le code sera envoyé à", + "切换": "Interrupteur", + "验证": "Vérifier", + "验证成功,账号已删除": "Vérification réussie, compte supprimé", + "该密码不是自定义密码,无法修改": "Ce mot de passe n'est pas un mot de passe personnalisé et ne peut pas être modifié.", + "请选择设备要关联哪些姓名": "Veuillez sélectionner les noms auxquels l'appareil doit être associé", + "请选择姓名要关联哪些设备": "Veuillez sélectionner les appareils auxquels le nom doit être associé", + "确定要移除所选中的坏锁吗?": "Enlever le verrou défectueux?", + "邮件通知": "Notifier par e-mail", + "短信通知": "Notifier par SMS", + "您好,您的授权管理员生成成功": "Bonjour, votre administrateur autorisé a été généré avec succès", + "请输入接收者姓名": "Veuillez entrer ici", + "版本更新": "Mise à jour de la version", + "下次再说": "La prochaine fois", + "配网成功": "Réussite de la distribution réseau", + "配网失败": "La distribution du réseau a échoué", + "该锁的无线键盘都将被删除": "Tous les claviers sans fil pour cette serrure seront SUPPRIMÉS", + "实时画面": "Image en temps réel", + "适合门口较为安全的环境。": "Convient aux environnements relativement sûrs à la porte.", + "仅发生特定事件才录像,并可查看实时画面。": "Seuls des événements spécifiques sont enregistrés et l'image en temps réel peut être visualisée.", + "一般情况下,满电可使用7-8个月": "Dans des circonstances normales, il peut être utilisé pendant 7-8 mois lorsqu'il est complètement chargé", + "有人逗留或发生特定事件才录像,可随时查看": "Quelqu'un reste ou des événements spécifiques sont enregistrés et peuvent être consultés à tout moment", + "实时画面。": "Image en temps réel.", + "一般情况下,满电可使用5~6个月。": "Dans des circonstances normales, il peut être utilisé pendant 5 ~ 6 mois lorsqu'il est complètement chargé.", + "适合门口人员复杂、较不安全的环境。": "Convient aux environnements complexes et relativement dangereux à la porte.", + "有人出现就录像,可随时查看实时画面。": "Enregistrez quand quelqu'un apparaît et visualisez l'image en temps réel à tout moment.", + "一般情况下,满电可使用2~4个月。": "Dans des circonstances normales, il peut être utilisé pendant 2 ~ 4 mois lorsqu'il est complètement chargé.", + "根据您家门口实际情况设置录像和实时画面功能。": "Réglez les fonctions vidéo et d'image en temps réel en fonction de la situation réelle à votre porte.", + "可使用时长由具体设置决定。": "La durée d'utilisation est déterminée par les paramètres spécifiques.", + "查看": "Vue", + "有人按门铃或发生": "Quelqu'un sonne à la porte ou", + "异常事件时": "Événement anormal", + "不录像": "Pas de vidéo", + "有人出现、按门铃": "Quelqu'un apparaît, sonne à la porte", + "或发生异常事件时": "Ou un événement anormal se produit", + "逗留达到10秒": "Restez pendant 10 secondes", + "约1.5米": "Environ 1,5 mètres", + "随时": "À tout moment", + "立即录像": "Enregistrer immédiatement", + "录像时机": "Vidéo timing", + "有人出现时录像": "Enregistrer quand quelqu'un apparaît", + "人体侦测距离": "Distance de détection humaine", + "查看实时画面": "Voir l'image en temps réel", + "自定义时间": "Temps personnalisé", + "当日": "Aujourd'hui", + "次日": "Le lendemain", + "自定义时段": "Période de temps personnalisée", + "发生事件时查看": "Voir quand un événement se produit", + "实时查看": "Vue en temps réel", + "有人在门口出现10秒后开始录像。": "Quelqu'un apparaît à la porte pendant 10 secondes avant l'enregistrement.", + "有人按门铃时立即录像。": "Enregistrez immédiatement lorsque quelqu'un sonne à la porte.", + "有人出现在门前1.5米范围时启动录像": "Démarrer l'enregistrement lorsqu'une personne apparaît à moins de 1,5 mètre devant la porte", + "约0.8米": "Environ 0,8 mètres", + "约3.0米": "Environ 3,0 mètres", + "添加指纹失败": "L'opération a échoué.", + "项": "Articles", + "播放中": "Jouer", + "下载": "Télécharger", + "暂无下载内容": "Aucun contenu de téléchargement", + "亮度": "Luminosité", + "音量": "Volume", + "快进至": "Avance rapide vers", + "快退至": "Rembobiner à", + "暂无视频信息": "Aucune information vidéo", + "加载出错": "Erreur de chargement", + "请单人正对门锁,距离一个成年人手臂长度": "Veuillez vous tenir seul devant la serrure de la porte, à bout de bras", + "(约0.6米)。": "(Environ 0,6 mètres).", + "保持脸部无遮挡,露出五官。": "Gardez votre visage non obstrué et montrez vos traits du visage.", + "准备好了,开始添加": "Prêt, commencez à ajouter", + "正在录入中...": "Enregistrement...", + "添加人脸失败": "Échec de l'ajout du visage", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Après la réinitialisation, les faces du verrou seront supprimées. Êtes-vous sûr de vouloir réinitialiser?", + "人脸号": "Numéro de visage", + "虹膜详情": "Détails de l'iris", + "虹膜号": "Nombre d'iris", + "选择设备类型": "Sélectionnez le type d'appareil", + "照明灯具": "Appareils d'éclairage", + "电动窗帘": "Rideaux électriques", + "门窗传感器": "Capteur de porte et de fenêtre", + "传感器": "Capteur", + "清除数据成功": "Données effacées avec succès", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "La serrure n'est pas connectée à Internet, de sorte que les recods de code d'accès, de carte, d'empreinte digitale et d'autres méthodes d'ouverture de porte ne peuvent pas être téléchargés en temps réel.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Si vous devez conserver les enregistrements historiques, vous pouvez les exporter.", + "看不到操作记录,可能原因有": "Impossible de voir les enregistrements d'opération, raisons possibles", + "操作记录详情": "Détails du dossier de l'opération", + "操作时间": "Temps d'opération", + "此模块功能需要锁联网后设置方可生效": "Cette fonction de module doit être réglée après que le verrou est connecté à Internet pour prendre effet", + "用户已存在": "L'utilisateur existe déjà", + "钥匙数量已到上限": "Le nombre de clés a atteint la limite supérieure", + "附近没有可用网关": "Il n'y a pas de passerelle disponible à proximité", + "正在创建安全连接...": "Créer une connexion sécurisée...", + "监视状态下不能发送录音": "Impossible d'envoyer des enregistrements en mode de surveillance", + "挂断": "Raccrochez", + "监视中暂不能开锁": "Le déverrouillage n'est pas disponible pendant la surveillance", + "长按说话": "Appuyez et maintenez pour parler", + "松开发送": "Libérer pour envoyer", + "请输入6位数字开锁密码": "Veuillez entrer un mot de passe de déverrouillage à 6 chiffres", + "请输入开锁密码": "Veuillez entrer le mot de passe de déverrouillage", + "接收者在有效期内可以不限次数使用": "Les destinataires peuvent utiliser les ekeys pour un nombre illimité de fois pendant la période de validité.", + "接收者可以使用此App开关锁": "Le destinataire peut verrouiller/déverrouiller par cette application.", + "单次钥匙有效期为1小时,只能使用一次": "L'ekey unique est valide pour UNE heure et ne peut être utilisé qu'une seule fois.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Les destinataires peuvent utiliser les ekeys pour des durées illimitées dans le temps de cycle fixe.", + "获取模板失败": "Échec pour obtenir le modèle", + "微信通知": "Notification WeChat", + "系统短信": "Système SMS", + "系统邮件": "Courriel système", + "模板": "Modèle", + "新建模版": "Créer un modèle", + "您好,您的密码是": "Bonjour, votre mot de passe est", + "密码名字": "Nom du mot de passe", + "请输入6-9位密码": "Veuillez entrer un mot de passe de 6 à 9 chiffres", + "设置密码": "Définir le mot de passe", + "操作成功,密码为": "Réussi. Le mot de passe est", + "类型:自定义-永久": "Type: Coutume-Permanent", + "实时播放": "Playback en temps réel", + "点击对讲": "Cliquez pour intercom", + "长按开锁": "Appuyez longuement pour déverrouiller", + "接听失败": "A échoué à répondre", + "请在锁设置中开启远程开锁": "Veuillez activer le déverrouillage à distance dans les paramètres de verrouillage", + "接听": "Réponse", + "截图已保存到相册": "Capture d'écran sauvegardée dans l'album", + "添加遥控": "Ajouter télécommande", + "已连接到锁,请按遥控": "Connecté à la serrure, s'il vous plaît appuyez sur la télécommande", + "遥控号": "Numéro de télécommande", + "遥控详情": "Détails de la télécommande", + "照明": "Éclairage", + "退出演示模式": "Quittez le mode démo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Astuce: L'interface actuelle est une interface d'affichage. Après avoir ajouté l'appareil, vous pouvez continuer à l'utiliser", + "门已上锁": "La porte est verrouillée", + "您的账号在异地登录,如非本人,请尽快修改密码": "Votre compte a été utilisé pour vous connecter à partir d'un nouvel appareil", + "开门成功": "Ouvrir la porte avec succès", + "开门失败": "N'a pas ouvert la porte", + "呼叫提醒": "Rappel d'appel", + "收到来自": "Reçu de", + "锁的呼叫": "Verrouiller l'appel", + "加载数据中": "Chargement des données", + "搜索所有锁类型": "Rechercher tous les types de serrures", + "锁电量更新时间": "Verrouiller l'heure de mise à jour de la batterie", + "1月": "Jan", + "2月": "Fév", + "3月": "Mar", + "4月": "Apr", + "5月": "Mai", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Oct", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Les villes chaudes", + "导出锁数据": "Exporter les données de verrouillage", + "一键开锁": "Déverrouillage en un clic", + "已开通": "Ouvert", + "编辑员工": "Modifier le personnel", + "一": "Un", + "二": "Deux", + "三": "Trois", + "四": "Quatre", + "五": "Cinq", + "六": "Six", + "日": "Soleil", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?", + "在线": "En ligne", + "离线": "Hors ligne", + "购买记录": "Dossier d'achat", + "使用记录": "Enregistrement de l'utilisateur", + "失效时间要大于当前时间": "Le délai d'expiration doit être plus long que l'heure actuelle", + "修改名字": "Modifier le nom", + "时": "Heure", + "分": "Minute", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Vous pouvez utiliser Alexa pour déverrouiller, verrouiller et vérifier l'état du verrouillage", + "支持的国家": "Pays soutenus", + "支持的国家值": "États-Unis, Canada, Royaume-Uni, Australie, Inde, Allemagne, France, Italie, Espagne, Japon", + "操作流程": "Processus d'opération", + "操作流程值": "1 Ajoutez un verrou et une passerelle avec l'application Smart Lock\n\n2 Activez la fonction de déverrouillage à distance du verrou dans l'APP (cette fonction est désactivée par défaut). Si vous n'avez pas cette option, le verrou ne prend pas en charge Alexa\n\n3 Ajoutez des compétences à Alexa et autorisez-les avec le compte et le mot de passe de l'application Smart Lock. Une fois l'autorisation réussie, vous pouvez découvrir les appareils sous le compte\n\n4 Localisez le verrou dans l'application Alexa, activez la fonction de déverrouillage vocal et définissez le mot de passe linguistique\n\n5 La serrure peut être actionnée par Alexa", + "Google Home": "Accueil Google", + "Action name": "Nom de l'action", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Langues prises en charge", + "英语": "Anglais", + "Google Home操作流程的值": "1. Utilisez l'application Smart Lock pour ajouter des verrous et des passerelles\n\n2. activer la fonction de déverrouillage à distance de la serrure dans l'application (cette fonction est désactivée par défaut). Sans cette option, le verrou ne prend pas en charge Google Home\n\n3. Installez l'application Google Home et cliquez sur le bouton \"\" dans le coin supérieur gauche\n\n4. Sur la page Paramètres, sélectionnez \"Travailler avec Google\"\n\n5. recherchez \"ScienerSmart\" et utilisez le compte APP de verrouillage intelligent et le mot de passe pour autoriser", + "密码需至少包含数字/字母/字符中的2种组合": "Le mot de passe doit contenir au moins deux des éléments suivants: chiffres, lettres et caractères spéciaux", + "已开锁": "Déverrouillé", + "已闭锁": "Verrouillé", + "两次密码不一致哦": "Les mots de passe sont incohérents", + "中功率": "Puissance moyenne", + "常规使用": "Utilisation régulière", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Une fois la passerelle allumée, appuyez et maintenez enfoncé le bouton de réinitialisation pendant 5 secondes, puis cliquez sur Suivant lorsque le voyant clignote alternativement", + "扫描设备": "Appareil de numérisation", + "删除失败,网关可能已经离线,是否强制删除该数据?": "La suppression a échoué. La passerelle est peut-être hors ligne. Voulez-vous forcer la suppression des données?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_he.json b/lan/lan_he.json new file mode 100644 index 00000000..c0bd0c01 --- /dev/null +++ b/lan/lan_he.json @@ -0,0 +1,1122 @@ +{ + "星锁": "מנעול כוכבים", + "锁通通": "נעילה דרך", + "点击开锁,长按闭锁": "מגע כדי לפתוח, להחזיק לנעול לנעול", + "考勤": "נוכחות", + "考勤设置": "הגדרות נוכחות", + "电子钥匙": "אקיס", + "添加卡": "הוסף כרטיס", + "卡号": "מספר כרטיס", + "添加指纹": "הוספת טביעת אצבע", + "指纹号": "מספר טביעת אצבע", + "遥控": "מרחוק", + "添加人脸": "הוסף פנים", + "门锁日志": "יומן נעילה דלת", + "密码号": "מספר סיסמה", + "添加者": "המפעיל", + "添加时间": "זמן", + "重置": "איפוס", + "请输入手机号或者邮箱": "מספר טלפון או דוא \"ל", + "工作时间": "זמן עבודה", + "工作日设置": "הגדרת יום עבודה", + "星期一": "מונדיי", + "星期二": "ציוץ", + "星期三": "בידנסדיי", + "星期四": "סודדיי", + "星期五": "פרידיי", + "星期六": "יום הרוויה", + "星期日": "יום", + "简写周一": "מטר", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "מון", + "周二": "הסגולה", + "周三": "נישא", + "周四": "יא", + "周五": "ופרי", + "周六": "ישב", + "周日": "שמש", + "群发钥匙": "לשלוח מפתחות מרובים", + "锁": "מנעול", + "请添加": "נמען", + "允许远程开锁": "נעילה מרחוק", + "请输入验证码": "קוד אימות", + "获取密码": "ליצור קוד", + "请给密码命名": "הזן שם עבור סיסמה זו", + "密码有限期为6个小时,只能使用一次": "קוד זה חייב להיות בשימוש תוך 6 שעות מרגע הנוכחי או שהוא יושעה מטעמי אבטחה.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "הזן באופן ידני 6-9 ספרות כמו הסיסמה. ניתן להוסיף על ידי טלפון Bluetooth ליד המנעול, או להוסיף מרחוק דרך השער", + "获取": "קבל", + "添加": "הוסף", + "删除公司": "למחוק חברה", + "密码详情": "פרטי קוד סיסמה", + "修改密码": "שינוי קוד", + "添加虹膜": "להוסיף איריס", + "添加门磁": "חיישן דלת", + "添加无线键盘": "מקלדת אלחוטית", + "添加手掌": "להוסיף כף", + "请输入员工账号": "כניסה לחשבון של העובד", + "批量授权锁": "לתת מנעולים מרובים", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "למנהל המורשה יהיה רוב רשות להפעיל את המנעול הזה.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "תכונה זו מאפשרת לך לפתוח את המנעול החכם מרחוק באמצעות שער. תכונה זו יכולה להיות מופעלת רק או כבוי באמצעות bluetooth.", + "排列方式": "סוג רשימה", + "早到榜": "רשימה מוקדמת", + "迟到榜": "רשימה מאוחרת", + "当前模式": "מצב נוכחי", + "勤奋榜": "עבודה רשימה קשה", + "延迟时间": "זמן עיכוב", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "המנעול ינעל אוטומטית לאחר הזמן. אנא פתח את זה בפעם הראשונה כדי להפוך את ההגדרה זמינה.", + "时间": "זמן", + "开始时间": "זמן התחלה", + "结束时间": "זמן סיום", + "工作时间设置": "הגדרת זמן עבודה", + "常开模式": "מצב מעבר", + "常开时间": "בתקופה זו", + "常开日期": "בימים אלה", + "添加员工": "הוספת צוות", + "节假日": "חג", + "打卡方式": "שיטה", + "员工是否有钥匙": "כבר יש לי ekey", + "上班时间": "זמן התחלה", + "下班时间": "שעת סגירה", + "本周": "השבוע", + "单休": "סוף שבוע אחד", + "双休": "סופשבוע יומיים", + "单双休": "סופשבוע בן יומיים", + "年": "שנה", + "月": "חודש", + "放假日期": "חג", + "补班日期": "ימי עבודה", + "添加假日": "להוסיף חג", + "开始日期": "תאריך התחלה", + "必填": "חובה", + "结束日期": "תאריך סיום", + "日榜": "יומי", + "月榜": "חודשי", + "考勤记录": "רשומות", + "假日信息": "פרטי החג", + "基本信息": "יסודות", + "无线键盘": "מקלדת אלחוטית", + "选择无线键盘": "הוספת מקלדת", + "门磁": "חיישן דלת", + "自动闭锁": "נעילה אוטומטית", + "锁声音": "קול נעילה", + "防撬报警": "התראה", + "重置键": "לחצן איפוס", + "锁时间": "שעון נעילה", + "诊断": "לאבחן", + "上传数据": "העלאת נתונים", + "导入其他锁数据": "לייבא עוד מנעול", + "锁升级": "עדכון קושחה", + "标记房态": "מצב החדר", + "开锁提醒": "פתיחת הודעה", + "微信二维码": "לפתוח קוד qr", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "אנשים עם מפתחות אלקטרוניים יכולים לפתוח את הדלת על ידי סריקת קוד qr זה דרך wechat. קוד qr של כל מנעול הוא שונה. אתה יכול להדפיס את זה ולהדביק אותו ליד המנעול המתאים", + "锁编号": "נעילת מספר", + "电量": "סוללה", + "锁分组": "קבוצת נעילה", + "选择分组": "בחר קבוצה", + "创建新分组": "ליצור קבוצה", + "管理员开锁密码": "קוד סיסמה", + "更新": "עדכון", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "רמת הסוללה תעודכן על ידי שער או טלפון Bluetooth", + "当屏幕闪烁时,点击下一步": "לחץ הבא כאשר הבזקים מקלדת", + "输入*529#或按设置键": "הזן README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # או לחץ על מפתח ההגדרות", + "长按重置键2秒": "לחץ והחזק כפתור איפוס 2 שניות", + "附近的设备": "ציוד קרוב", + "暂无数据": "אין נתונים", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "תוכל לקבל מצב דלת עם חיישן דלת עם שער. רק חיישן אחד מותר לשייך עם מנעול.", + "开始": "התחלה", + "全天": "כל שעות", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "ניתן להגדיר תקופות זמן מרובות עבור מצב מעבר. בתוך פרק זמן שנקבע, המנעול יישאר במצב פתוח לאחר שהוא לא נעול.", + "请选择锁音量": "נא לבחור נפח נעילה", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "על ידי הפעלת, תוכל לשמוע את הצליל מן המנעול", + "低": "נמוך", + "较低": "נמוך בינוני", + "中": "בינוני", + "较高": "בינוני גבוה", + "高": "גבוה", + "开启后,锁被撬动时,会发出报警声": "על ידי הפעלת, אתה מאפשר את התראת הפנק.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "על ידי כיבוי, כפתור איפוס.", + "校准时间": "זמן כיול", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "אבחון הוא לקרוא את פרטי התצורה בתוך המנעול ולהעלות אותו כך שהצוות יוכל לנתח את סיבת הכישלון", + "上传": "העלאה", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "להעלות נתונים מנעילה לשרת. זה עשוי לקחת מספר דקות", + "请选择要从哪把锁导入": "בחר מנעול לייבוא מ", + "有新版本": "יש גרסה חדשה", + "当前版本": "גירסה נוכחית", + "升级": "עדכון", + "空闲": "ריק", + "已入住": "הכבושה", + "多语言": "שפות", + "添加锁": "הוסף מנעול", + "锁地址": "כתובת נעילה", + "选择锁类型": "בחר סוג מנעול", + "NFC无源锁": "Nfc מנעול פסיבי", + "添加设备": "הוספת התקן", + "网关": "שער", + "客服": "שירות לקוחות", + "设置": "הגדרות", + "更多设置": "קבוצה נוספת", + "消息推送": "דחיפת הודעה", + "锁用户管理": "נעילת משתמשים", + "拥有的钥匙": "מפתחות הקשורים למשתמש זה", + "批量授权": "ניהול רשות", + "关联设备": "מכשיר המשויך", + "关联姓名": "שם קשור", + "转移智能锁": "נעילת העברה", + "选择锁": "נעילת מסך", + "接收人信息": "נמען", + "转移网关": "שער העברה", + "锁屏": "נעילת מסך", + "已关闭": "הנחה", + "已开启": "ב", + "开启": "להדליק", + "确定要开启重置键?": "המשך להפעיל את כפתור האיפוס?", + "确定要关闭重置键?": "להמשיך לבטל את כפתור האיפוס?", + "隐藏无效开锁权限": "הסתר גישה לא חוקית", + "APP开锁时需手机连网的锁": "מנעולים הדורשים טלפון באינטרנט", + "增值服务": "שירותים", + "关于": "אודות", + "退出": "ביציאה", + "删除账号": "מחיקת חשבון", + "个人信息": "פרטי חשבון", + "头像": "אווטאר", + "昵称": "כינוי", + "请输入昵称": "אנא הזן את הכינוי שלך", + "修改昵称": "שינוי שם", + "修改账号": "עריכת חשבון", + "重置密码": "איפוס סיסמה", + "安全问题": "שאלת אבטחה", + "为了你的账号安全,修改账号前请先使用验证码验证": "עבור אבטחת החשבון שלך, אנא השתמש באימות סיסמת החשבון לפני שינוי החשבון", + "请输入新账号": "נא להזין את החשבון החדש", + "找回密码和登录新设备时,可通过绑定的手机验证": "מספר הטלפון המחייב ישמש לקבלת קוד האימות.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "הדוא \"ל המחייבת ישמש לקבלת קוד האימות.", + "原密码": "סיסמה נוכחית", + "新密码": "סיסמה חדשה", + "确认密码": "לאשר סיסמה", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "במקרה שהטלפון שלך אבד, אתה יכול להתחבר לטלפון חדש על ידי מענה לשאלות אבטחה.", + "问题一": "שאלה 1", + "问题二": "שאלה 2", + "问题三": "שאלה 3", + "请输入你的答案": "אנא הקלד את התשובה שלך", + "即将到期": "פג 'י בקרוב", + "去授权": "ללכת לאשר", + "修改名称": "שם עריכה", + "状态": "סטטוס", + "WiFi名称": "שם wifi", + "网络MAC": "רשת מק", + "网关升级": "עדכון שער", + "网关连接的锁": "מנעול (ים) מחובר לשער זה", + "信号强": "חזק", + "选择网关类型": "בחר סוג שער", + "添加网关": "הוספת שער", + "重新通电": "לחבר מחדש את הכוח", + "指示灯": "אור מחוון", + "选择网关": "בחר שער", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g אינו נתמך,. בחר WiFi של 2.4g.", + "WiFi密码": "הפסח", + "请输入WiFi密码": "הזן סיסמה", + "网关名称": "שם השער", + "请输入网关名称": "הזן שם שער", + "IP地址": "כתובת IP", + "子网掩码": "מסיכת משנה", + "默认网关": "שער ברירת המחדל", + "自动获取DNS服务器地址": "לקבל אוטומטית את כתובת שרת dns", + "首选DNS": "דים מועדפים", + "备选DNS": "אלטרנטיבי", + "不使用静态IP": "אין IP סטטי", + "使用静态IP": "השתמש ip סטטי", + "请输入IP地址": "הזן כתובת IP", + "请输入子网掩码": "הזן מסיכת רשת", + "请输入默认网关": "הזן שער ברירת המחדל", + "所有锁": "כל המנעולים", + "搜索所有类型的锁": "לסרוק את כל סוגי המנעולים", + "门锁": "מנעול דלת", + "挂锁": "דלוק", + "保险箱锁": "מנעול בטוח", + "智能门禁": "בקרת גישה חכמה", + "车位锁": "מנעול חניה", + "摸亮触摸屏": "לגעת בכל מפתח כדי להפעיל את המקלדת", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "נא לגעת בכל מפתח כדי להפעיל את המנעול ולשים אותו במצב זיווג. לחץ הבא", + "附近的锁": "מנעולים סמוכים", + "如需修改名字请重新命名,点击确定添加锁": "אם אתה רוצה לשנות את השם, אנא שינוי שם, לחץ על אישור כדי להוסיף מנעול", + "添加锁时,手机必须在锁旁边": "בעת הוספת מנעול, הטלפון חייב להיות ליד המנעול", + "登录": "התחברות", + "注册": "הרשמה", + "我已阅读并同意": "קראתי והסכמתי", + "验证码": "קוד", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "הסיסמה שלך חייבת להיות 8-20 תווים, ולכלול מינימום של שני סוגים של מספרים, אותיות וסמלים", + "手机": "טלפון", + "邮箱": "אימייל", + "请输入邮箱": "הזן את כתובת הדוא \"ל שלך", + "国家/地区": "מדינה/אזור", + "你所在的国家/地区": "שלך/אזור", + "选择国家/地区": "בחר את המדינה או האזור שלך", + "获取验证码": "לקבל קוד", + "商务合作": "עסקים", + "电脑网页版": "מערכת אינטרנט", + "酒店系统": "מערכת המלון", + "说明书网页版": "הוראות שימוש", + "高级功能": "פונקציה מתקדמת", + "记录保存": "שימור רשומות", + "您可通过短信将密码、电子钥匙信息发给接收人。": "ניתן להשתמש בסים כדי לשלוח את קוד המידע ופרטי ekey למקבל.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "ניתן להשתמש בדוא \"ל כדי לשלוח קוד מידע אלקטרוני לנמען.", + "购买实名认证提示": "לאחר שהפונקציה מופעלת, אתה צריך להשתמש בטביעת טביעת אצבע, פנים או סיסמא חשבון כדי לפתוח את האפליקציה. אין צורך לוודא שוב 3 דקות", + "请选择你希望的实名认证频次": "בחר את תדירות האימות שם האמיתי שאתה רוצה", + "仅首次": "בפעם הראשונה", + "每日一次": "פעם ביום", + "每周一次": "פעם בשבוע", + "每月一次": "פעם בחודש", + "当前状态": "סטטוס נוכחי", + "试用中": "משפט", + "高级功能权益内容": "פונקציות מתקדמות", + "短信模板": "תבנית sms", + "邮件模板": "תבנית דוא \"ל", + "发卡工具": "מקודד כרטיסים", + "购买高级功能须知": "הודעה", + "购买高级功能提示": "תכונות מתקדמות יותר נמצאות בפיתוח, ואם אתה צריך אותם, אתה מוזמן לפתוח את השירות בהתבסס על מספר המנעולים. תכונות מתקדמות זמינות רק עבור מנעולים משלך. אם אתה מנהל מורשה, אנא פנה למנהל העליון של המנעול כדי לפתוח את השירות", + "免费体验": "ניסיון חינם", + "立即开通": "פתוח עכשיו", + "购买短信": "לקנות SMS", + "购买邮件": "לקנות דואר אלקטרוני", + "购买实名认证次数": "לרכוש שם אמיתי פעמים אימות", + "开通高级功能": "הפעלת פונקציה מתקדמת", + "选择套餐": "בחר חבילה", + "支付方式": "מצב תשלום", + "支付宝": "אליפי", + "去支付": "תשלום", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "אתה רשאי להגדיר את ההודעה בעצמך. הוא משמש כדי לשלוח מידע על קוד passcode ו ekey לאחרים.", + "高级功能仅能用于你自己的锁": "הפונקציה המתקדמת יכולה להיות מיושמת רק מנעולים משלך.", + "新建模板": "תבנית קריאט", + "类型": "סוג", + "模版内容": "תוכן תבנית", + "预览": "תצוגה מקדימה", + "房间名": "חדר", + "预计产生短信条数": "מקטעי הודעה מוערכת", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "תכונה זו מאפשרת לך להסתיר את קוד הפסים, מפתחות, קלפים וטביעת אצבעות שאינם תקפים לפרק זמן.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "הטלפון של המשתמש נדרש להיות מקוון כדי לפתוח מנעולים נבחרים אלה עם אפליקציה.", + "配置WiFi": "הגדרת wifi", + "请输入WiFi名字": "נא להזין שם wifi", + "WiFi配网": "רשת הפצה wifi", + "胁迫卡": "כרטיס מתח", + "员工是否有密码": "כבר יש קוד סיסמה", + "员工是否有卡": "כבר יש כרטיס", + "员工是否有指纹": "כבר להגדיר את טביעת האצבע", + "获取钥匙": "קבל מפתח", + "获取卡": "קבל כרטיס", + "获取指纹": "לקבל טביעת אצבע", + "安全验证": "אימות זהות", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "כל פרטי החשבון שלך יוסר מהפלטפורמה לצמיתות ולא ניתן לשחזר. האם ברצונך למחוק?", + "监控": "מוניטור", + "视频日志": "יומן וידאו", + "开门器": "פותחן דלת", + "面容开锁": "פותח פנים", + "开门方向设置": "פתיחת כיוון", + "电机功率设置": "הגדרת כוח מנוע", + "开锁时是否需联网": "אם האינטרנט נדרש כאשר נפרק", + "选择要加入分组的锁": "בחר מנעולים כדי להוסיף לקבוצה זו", + "锁数量": "ספירת נעילה", + "小米IOT平台": "פלטפורמת xiaomi", + "面容开锁设置": "סט פותח מנעולים", + "感应距离": "מרחק חישה", + "防误开": "למנוע פתיחה שגויה", + "防误开已关闭,关门后仍可使用面容开锁": "למנוע הפתיחות נסגרה, לאחר סגירת הדלת עדיין יכולה להשתמש בפנים לפתוח", + "添加和使用面容开锁时": "להוסיף ולהשתמש בפנים כאשר פותח נעילת", + "添加和使用面容开锁时提示": "\n1, אנא נסה לשמור על אדם אחד מול מבצע הדלת;\n2, בבקשה לעמוד מול הדלת מנעול כ-0.5 ~ 0.8 מטר, מול מנעול הדלת;\n3. נא לשמור על הפנים שלך ללא הפרעה ולחשוף את תכונות הפנים שלך;\n4. כאשר זיהוי פנים הוא נורמלי, אתה יכול לגעת בכל מפתח על המקלדת הדיגיטלי כדי להפעיל מחדש את הפנים זיהוי באופן ידני.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "אנא בחר את הכוח המוטורי בקפידה על פי המצב בפועל של מנעול הדלת:", + "小功率:": "מינואט:", + "耗电少": "צריכת חשמל פחות", + "大功率": "כוח גבוה:", + "大功率提示": "אם לשון המנעול לא ניתן לסגת בדרך כלל כאשר unlocking, או צריך להיות מונע", + "开门方向设置提示": "אנא בחר בקפידה את הכיוון לפתיחת הדלת של הבית שלך (אם תבחר בכיוון הלא נכון, לא תוכל לפתוח ולסגור את הדלת כראוי):", + "左开": "פתוח שמאלה", + "右开": "פתח ימין", + "判断方法:": "בהורדה", + "判断方法内容": "האיש עמד מחוץ לבית, מול דלת הכניסה.", + "录像时段": "חריץ וידאו", + "密码": "הפסקונים", + "卡": "כרטיסים", + "指纹": "טביעת אצבע", + "人脸": "פנים", + "配件商城": "נעילת קניון", + "公司名称": "שם החברה", + "请输入公司名字": "הזן שם החברה", + "提示": "רמז", + "是否删除?": "האם למחוק?", + "员工信息": "מידע צוות", + "员工": "צוות", + "打卡方式无效": "לא זמין", + "中国": "סין", + "选择钥匙": "בחר איקי", + "编辑": "עריכה", + "无": "לא", + "有": "כן", + "请输入姓名": "נא להזין שם", + "获取人脸": "מקבל פרצופים", + "选择密码": "בחר קוד סיסמה", + "选择卡": "בחר כרטיס", + "选择指纹": "בחר טביעת אצבע", + "选择人脸": "בחר פנים", + "员工是否有人脸": "אם לעובד יש פנים", + "同时删除员工钥匙": "למחוק את המפתח שלו/שלה", + "删除": "מעקה", + "确定要删除员工吗?": "למחוק עובד זה", + "月统计": "סטטיסטיקה חודשית", + "迟到": "מאוחר", + "早退": "לעזוב מוקדם", + "未打卡": "אין שיא", + "钥匙将在": "Ekey זה יפוג ב", + "天后失效": "יום (ים)", + "电量更新时间:": "זמן עדכון סוללה:", + "新增配件": "הוסף", + "钥匙不可用": "המפתח אינו זמין", + "正在开锁中...": "פותח...", + "你的钥匙": "המפתח שלך", + "常开模式启动!长按闭锁": "מצב פתוח התחיל! לחץ ארוך לנעילה", + "演示模式": "מצב הדגמה", + "请先同意用户协议及隐私政策": "נא להסכים על הסכם המשתמש ומדיניות הפרטיות קודם", + "用户协议": "תנאי שימוש", + "隐私政策": "מדיניות פרטיות", + "注册成功": "רישום מוצלח", + "你所在的": "אתה נמצא", + "手机号": "מספר טלפון", + "忘记密码": "שכחתי סיסמה", + "重置成功": "איפוס הצלחה", + "确定要退出吗?": "יציאה?", + "功能暂未开放": "הפונקציה עדיין לא פתוחה", + "设置成功": "להגדיר בהצלחה", + "删除成功": "למחוק בהצלחה", + "单次": "חד פעמי", + "永久": "קבוע", + "限时": "מתוזמן", + "自定义": "מותאם אישית", + "清空码": "מחק", + "循环": "חוזר", + "工作日": "יום עבודה", + "每日": "יומי", + "周末": "סוף השבוע", + "确定要删除吗?": "למחוק?", + "该锁的密码都将被删除": "כל הקודים עבור המנעול הזה יימחקו", + "已过期": "תוקף", + "该锁的电子钥匙都将被删除": "כל המקשים עבור המנעול הזה יימחקו", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "למחוק את כל המקשים המקושרים עם ekey זה. לא ניתן לבטל את הצעד הזה!", + "删除钥匙会在用户APP连网后生效": "את האקי יימחק", + "有效时间": "זמן יעיל", + "接收者": "נמען", + "仅管理自己创建的用户": "לנהל את המשתמשים שלו בלבד", + "远程开锁": "נעילה מרחוק", + "请输入钥匙名称": "נא להזין את שם המפתח", + "修改成功": "לשנות הצלחה", + "冻结": "הקפאה", + "解除冻结": "הפשרת", + "授权": "אישור", + "取消授权": "אישור", + "同时解冻其发送的钥匙": "הפגם את כל ekeys שהונפקו על ידי משתמש זה", + "会在用户APP连网后生效": "זה יהיה פגום כאשר האפליקציה של המשתמש מתחבר לרשת", + "同时冻结其发送的钥匙": "להקפיא את כל המקשים שהונפקו על ידי משתמש זה", + "冻结会在用户APP连网后生效": "זה יהיה קפוא כאשר האפליקציה של המשתמש מתחבר לרשת", + "取消授权会在用户APP连网后生效": "המשתמש ישחרר את ההרשאות שלו כאשר האפליקציה של המשתמש מתחבר לרשת", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "למשתמש המורשה יש כמעט את אותן הרשאות כמו מנהל המנעול (למשל. היכולת לשלוח ekeys ו-passcodes)", + "失效时间需晚于生效时间": "זמן התפוגה חייב להיות מאוחר יותר מאשר הזמן היעיל", + "生效时间需晚于当前时间": "הזמן היעיל חייב להיות מאוחר יותר מאשר הזמן הנוכחי", + "失效日期需晚于生效日期": "תאריך התפוגה חייב להיות מאוחר יותר מאשר התאריך היעיל", + "修改有效期": "תקופת שינוי", + "生效日期": "תאריך התחלה", + "失效日期": "תאריך סיום", + "开锁": "לפתוח", + "开锁成功": "לפתוח הצלחה", + "请选择锁": "נא לבחור מנעולים", + "请选择接收者": "נא לבחור את המקלט", + "请选择有效期": "נא לבחור את תקופת תוקף", + "请选择发送方式": "נא לבחור את שיטת השליחה", + "请选择结束时间": "נא לבחור את שעת הסיום", + "完成": "מלא", + "有效日": "מחזור על", + "发送成功": "שלח הצלחה", + "请选择开始时间": "אנא בחר את זמן ההתחלה", + "选择用户": "בחר נמענים", + "已选中": "נבחר", + "确定": "בסדר", + "请选择要发送的锁": "נא לבחור מנעולים", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "אימות שמות פנים-אמת מתייחס הצורך של המשתמש לאמת את פניו לפני פתיחת אפליקציית הטלפון, ואת האימות יכולה להיות נעולה.", + "分享": "שיתוף", + "请输入接收者账号": "נא להזין את חשבון המקלט", + "接收者号码未注册,请重新发送": "מספר המקלט אינו רשום, אנא מחדש", + "是否发送电子钥匙给未注册账号": "האם ברצונך לשלוח ekey לחשבון חדש", + "取消": "ביטול", + "标记成功": "הצלחה", + "微信好友": "חברים ווצ 'ט", + "短信": "סמואים", + "邮件": "אימייל", + "更多": "עוד", + "您好,您的电子钥匙生成成功": "שלום, המפתח האלקטרוני שלך נוצר בהצלחה", + "生效时间不能小于当前时间": "הזמן היעיל לא יכול להיות פחות מהזמן הנוכחי", + "结束时间不能小于当前时间": "זמן הסיום לא יכול להיות פחות מהזמן הנוכחי", + "是否为管理员": "האם זה מנהל", + "已连接到锁,请将卡靠近门锁的读卡区": "מחובר. שים את הכרטיס נגד קורא הכרטיסים", + "尝试连接设备...": "מתחבר עם מנעול. אנא המתן...", + "地理位置": "מיקום גיאוגרפי", + "检查以确保以下地址是正确的": "בדוק כדי לוודא שהכתובת הבאה נכונה", + "地图加载中,请稍候。。": "המפה טעינת, אנא המתן...", + "跳过": "לדלג", + "还未获取到位置信息哦,请耐心等待一下!": "מידע המיקום עדיין לא התקבל, אנא המתן בסבלנות!", + "请填写信息": "נא למלא את המידע", + "有效期": "תקופת תוקף", + "生效时间": "זמן התחלה", + "失效时间": "זמן סיום", + "上传成功": "הועלה בהצלחה", + "未生效": "פעיל", + "已生效": "יעיל", + "指纹详情": "מידע טביעת אצבע", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "אתה תידרש לשים את האצבע שלך לחיישן מספר פעמים. אנא בצע את ההנחיות...", + "开始添加": "התחלה", + "请将您的手指按下": "שים את האצבע על החיישן", + "根据提示,抬起手指后再进行下一次指纹采集": "בצע את ההנחיות... אתה תידרש להסיר ולמקם את האצבע לחיישן עבור הרשומה הבאה", + "添加成功": "להוסיף הצלחה", + "更新成功": "עדכון הצלחה", + "搜索": "חיפוש", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "לאחר איפוס כרטיס המנעול יימחק, האם ברצונך לאפס?", + "已失效": "תוקף", + "卡详情": "פרטי כרטיס", + "请输入": "אנא הכנס כאן", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "על ידי כיבוי, המנעול יישאר פתוח כל היום עד שהוא נעול באופן ידני", + "请输入小于或等于60的数字": "נא להזין מספר פחות מ-60", + "操作成功": "מבצע מוצלח", + "管理员密码相同,无需修改": "סיסמת מנהל היא זהה ולא צריך להיות שונה", + "请输入6-9位数字": "6-9 ספרות באורך", + "请输入6-9位管理员密码": "אנא הכנס סיסמת מנהל 6-9 ספרות", + "请输入新的管理员密码": "אנא הכנס סיסמת מנהל חדש", + "未分组": "ללא מקובצים", + "请输入分组名称": "ליצור קבוצה", + "创建成功": "ליצור הצלחה", + "设置锁分组成功": "להגדיר את קבוצת המנעול בהצלחה", + "电池1电量": "סוללה 1", + "电池2电量": "סוללה 2", + "电量更新时间": "זמן עדכון סוללה", + "锁电量更新成功": "נעילת עדכון כוח הצלחה", + "您的钥匙未生效": "המפתח שלך אינו יעיל", + "您的钥匙已冻结": "המפתח שלך כבר קפוא", + "您的钥匙已过期": "המפתח שלך פג תוקף", + "常开模式开启": "המנעול הוא במצב מעבר", + "超级管理员": "סופר מנהל", + "授权管理员": "מנהל מורשה", + "普通用户": "משתמש רגיל", + "余": "איזון", + "天": "יום", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "לאחר מחיקת המנעול, כל המידע יימחק יחד, האם אתה בטוח שברצונך למחוק את המנעול?", + "请输入登录密码": "אנא הכנס את סיסמת היישום", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "לא ניתן למחוק את המכשיר, אנא ודא שהמכשיר נמצא ליד המכשיר, המכשיר לא מחובר, והמכשיר מופעל", + "用户无权限": "למשתמש אין הרשאה", + "创建公司后,考勤功能才能使用": "אנא צרו חברה ראשונה", + "是否删除钥匙?": "למחוק את ה-ekey הזה?", + "邮箱绑定成功": "דוא \"ל מחייב הצלחה", + "手机绑定成功": "הצלחה מחייבת טלפון נייד", + "网络访问失败,请检查网络是否正常": "הבקשה נכשלה. רשת לא זמינה, אנא בדוק ולחבר את המכשיר שלך ל 3g/4g/wifi", + "清空": "ברור", + "是否清空?": "ברור?", + "消息详情": "מידע", + "创建时间": "זמן יצירה", + "管理员详情": "פרטי מנהל", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "אם מישהו מכריח אותך לפתוח את הדלת, אתה יכול להשתמש בכרטיס זה. הודעת האזעקה תישלח אל המנהל. כדי להשתמש בתכונה זו, אנא ודא המנעול שלך באינטרנט.", + "请不要将胁迫卡用于日常开锁": "בבקשה אל תשתמש בכרטיס הכפוי לשימוש יומיומי.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "אם מישהו מכריח אותך לפתוח את הדלת, אתה יכול להשתמש טביעת האצבע הזאת. הודעת האזעקה תישלח למפקדים. כדי להשתמש בתכונה זו, אנא ודא המנעול שלך באינטרנט.", + "请不要将胁迫指纹用于日常开锁": "בבקשה אל תשתמש טביעת האצבע הכפוי לשימוש יומיומי.", + "创建公司": "יצירת חברה", + "公司名称不能超过30个字符": "שם החברה לא יכול לעלות 30 תווים", + "公司名称不能小于6个字符": "שם החברה לא יכול להיות פחות מ 6 תווים", + "WIFI列表": "רשימת wifi", + "刷新": "רענון", + "手动配网": "רשת הפצה ידנית", + "远距离": "מרחק ארוך", + "中距离": "מרחק בינוני", + "近距离": "מרחק קצר", + "锁时间更新成功": "הצלחת עדכון זמן נעילה", + "锁用户": "נעילת משתמשים", + "请选择常开日期": "נא לבחור את התאריך הפתוח", + "结束时间不能小于开始时间哦": "זמן הסיום לא יכול להיות פחות מאשר זמן ההתחלה", + "介绍": "הסיפור שלנו", + "个人信息收集清单": "רשימת איסוף מידע אישי", + "应用权限说明": "תיאור אישור יישום", + "第三方信息共享清单": "רשימת שיתוף מידע של צד שלישי", + "请选择您的位置": "נא לבחור את המיקום שלך", + "请先选择位置": "אנא בחר את המיקום הראשון", + "管理员密码": "קוד סיסמה", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "אם אתה צריך לשנות, אנא הזן סיסמת מנהל חדש (6 ספרות), לחץ על בסדר כדי לשנות", + "修改": "שינוי", + "网络摄像头": "מצלמה", + "重命名": "שינוי שם", + "分组下的锁将被移到未分组里": "מנעולים תחת הקבוצה יועברו ללא מקובצים", + "编辑成功": "עריכת הצלחה", + "厂商": "יצרן", + "型号": "דגם", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "לאחר יצירת הסיסמה, אנא השתמש בה פעם אחת עבור ההפעלה לפני 23:59 באותו היום, אחרת היא תהיה תקפה לאחר השעה 0. לאחר הפעלת הסיסמה, ניתן להשתמש בה פעמים בלתי מוגבלים במהלך תקופת תוקפו.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "לאחר יצירת הסיסמה, אנא השתמש בה לפני 23:59 באותו יום, אחרת זה יהיה לא חוקי לאחר השעה 0. הקוד הברור משמש כדי לנקות את כל הסיסמאות שנוצרו לפני השעה 0 היום.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "לאחר יצירת הסיסמה, אנא השתמש בה לפני 23:59 באותו יום, אחרת זה יהיה לא חוקי לאחר השעה 0.", + "清空密码底部提示": "הסיסמה תקפה עד 23:59 ביום הריקון", + "相机": "מצלמה", + "相册": "תמונות", + "读写": "אחסון", + "定位": "מיקום", + "需要访问相机权限才能拍照上传文件例如头像上传": "גישה למצלמה נדרש לצלם ולהעלות קבצים, כגון העלאת תמונת פרופיל", + "需要访问相机权限才能使用相册图片上传文件上传头像": "גישה למצלמה נדרש להעלות קבצים ואווטארים באמצעות תמונות אלבום", + "需要访问读写权限才能使用本地图片上传头像": "גישה לקריאה וכתיבה נדרשת להעלות אווטרים באמצעות תמונות מקומיות", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "גישה למידע מיקום נדרשת כדי להשתמש בפונקציית הוספת מפתח", + "申请": "יישום", + "权限": "אישור", + "不允许": "אסור", + "允许": "מותר", + "权限被拒绝": "אישור נדחתה", + "请手动在系统设置中开启": "נא להפעיל אותו באופן ידני בהגדרות המערכת", + "权限以继续使用应用": "הרשאה להמשיך להשתמש ביישום.", + "去设置": "לך להגדיר את זה", + "当前网络": "הרשת הנוכחית", + "位置信息": "פרטי מיקום", + "请输入wifi名称": "נא להזין את שם ה-wifi", + "虹膜": "איריס", + "手掌": "כף", + "商城": "קניון", + "我的": "שלי", + "微信公众号推送": "חשבון הציבור", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "כדי לפתוח wechat כדי לקבל הודעות אזעקה, עליך לשים לב כדי skye חכם מנעול wechat code, אנא שמור את קוד qr ולהשתמש wechat כדי לסרוק את ההגדרות", + "蓝牙": "בלוץ", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "גישה הרשאות Bluetooth נדרש להשתמש במידע המיקום של פונקציית מפתח הוספת", + "请输入Email": "הזן את כתובת הדוא \"ל שלך", + "请输入手机号": "הזן את מספר הטלפון שלך", + "家人到家": "בן המשפחה הגיע הביתה", + "添加家人": "להוסיף בן משפחה", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "אם המנעול אינו מחובר לאינטרנט, תזכורות עבור כרטיס, כרטיס, טביעת אצבע ושיטות פתיחת דלת אחרות לא ניתן לשלוח בזמן.", + "消息提醒": "תזכורת", + "开门通知": "פתיחת הודעה", + "N天未开门": "N ימים ללא פתיחת דלת", + "门未关好": "הדלת אינה סגורה", + "防拆报警": "אזעקה", + "低电量提醒": "סוללה נמוכה", + "胁迫开门": "פתיחת דלת כפויה", + "有人按门铃": "מישהו מצלצל בפעמון הדלת", + "有人出现在门口": "מישהו מופיע בדלת", + "提醒方式": "שיטת תזכורת", + "开门方式": "שיטת פתיחת דלת", + "请选择": "נא לבחור", + "家人": "בן משפחה", + "保存": "חסכו", + "APP推送": "לדחוף אפליקציה", + "管理员": "מנהל", + "未启用": "לא מאופשר", + "已启用": "מופעל", + "省电模式": "מצב חיסכון בחשמל", + "逗留抓拍模式": "מצב ללכוד מצב", + "实时监控模式": "מצב ניטור בזמן אמת", + "自定义模式": "מצב מותאם אישית", + "猫眼设置": "עין החתול", + "猫眼工作模式": "חתול מצב עבודה עין", + "自动亮屏": "מסך בהיר אוטומטי", + "亮屏持续时间": "מסך הזמן", + "逗留警告": "להישאר אזהרה", + "异常警告": "אזהרה חריגה", + "短信提醒": "סמואים", + "邮件提醒": "אימייל", + "N天未开门提醒": "N ימים ללא פתיחת דלת", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "אם מישהו מכריח אותך לפתוח מנעול, אתה יכול להשתמש טביעת האצבע הזאת. הודעת האזעקה תישלח למפקדים. כדי להשתמש בתכונה זו, אנא וודאו המנעול שלך באינטרנט.", + "胁迫指纹": "טביעת אצבע כפויה", + "指纹列表": "רשימת טביעות אצבע", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "לאחר הזמן שנקבע, אם המנעול לא נפתח, המערכת תשלח הודעת תזכורת לנמען המיועד. פונקציה זו דורשת את המנעול להיות מחובר לאינטרנט.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "לאחר הפעלת התזכורת, כאשר סוללת המנעול נמצאת מתחת 20%, 10% 5%, המערכת תשלח הודעת תזכורת לנמען המיועד.", + "未开门时间": "ימים ללא פתיחת דלת", + "添加和使用面容开锁时:": "להוסיף ולהשתמש בפנים כאשר פותח:", + "关锁": "סגור נעילה", + "功能": "פונקציה", + "配件": "חלקים", + "云存": "אחסון ענן", + "本地": "המקום הזה", + "3天滚动储存": "3 ימים מתגלגל אחסון", + "去升级": "שדרוג עכשיו", + "下载列表": "רשימת הורדות", + "已下载": "הורדה", + "全部视频": "כל הסרטונים", + "已为本设备免费提供3大滚动视频储存服务": "שלושה שירותי אחסון וידאו גלילה ניתנים למכשיר זה ללא תשלום", + "视频播放": "הפעלת וידאו", + "全选": "הכל", + "请选择要删除的视频": "אנא בחר את הסרטון שברצונך למחוק", + "请选择要下载的视频": "אנא בחר את הסרטון שברצונך להוריד", + "欢迎使用": "ברוכים הבאים לשימוש", + "用户协议和隐私政策概要": "סיכום הסכם משתמש ומדיניות הפרטיות", + "协议概要": "סיכום פרוטוקול", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "תודה לך על השימוש ביישום זה. אנו מחברים חשיבות רבה למידע האישי ולהגנת הפרטיות שלך. לפני השימוש במוצר זה, אנא קרא אותו בזהירות", + "《用户协议》": "תנאי שימוש", + "和": "ו", + "《隐私政策》": "• • מדיניות פרטיות", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "כל התוכן של. על ידי לחיצה על \"מסכים\", אתה מסכים ואתה מקבל את כל התנאים. אם תבחר לא להסכים, לא תוכל להשתמש במוצרים ובשירותים שלנו ויצא את הבקשה.", + "不同意": "הסכמה", + "同意": "מסכים", + "该功能是高级功能,请开通后再使用": "זוהי הפונקציה המתקדמת. אנא אפשר את זה קודם.", + "常用程序": "תוכניות נפוצות", + "该锁已被重置": "המנעול כבר איפוס", + "需要访问读写权限才能使用手动升级固件": "גישה לקריאה וכתיבה הרשאות נדרשת שדרוג ידני", + "错误D固件,请选择正确的文件": "קושחה לא נכונה, אנא בחר את הקובץ הנכון", + "非SYD固件,请选择正确的文件": "לא הקושחה syd, אנא בחר את הקובץ הנכון", + "文件校验失败 0x01": "אימות קובץ נכשל 0 x01", + "解析元数据失败,请选择正确的文件": "לא לפרוס metadata, אנא בחר את הקובץ הנכון", + "文件校验失败 0x02": "אימות קובץ נכשל 0 x02", + "文件校验失败 0x03": "אימות קובץ נכשל 0x03", + "固件升级完成": "שדרוג קושחה הושלם", + "记录": "רשומות", + "开通高级功能后才可以对锁进行管理": "נא להפעיל פונקציה מתקדמת תחילה לניהול מנעולים.", + "去开通": "לאפשר", + "实名认证": "אימות שם אמיתי", + "当前剩余数量": "נותר", + "购买": "לקנות", + "实名认证为付费功能,请购买后再使用": "אימות שם אמיתי היא פונקציה בתשלום, אנא השתמש בה לאחר הרכישה", + "密码不一致哦": "הסיסמאות אינן עקביות", + "退出添加": "להפסיק להוסיף", + "管理员已满": "מנהל מלא", + "用户已满": "המשתמש מלא", + "锁上面添加指纹已满": "להוסיף טביעת אצבע על מנעול מלאה", + "指纹已存在": "טביעת האצבע כבר קיימת.", + "锁上面添加人脸已满": "מנעול מעל להוסיף פנים מלא", + "人脸已存在": "הפנים כבר קיים", + "锁上面添加卡已满": "נעילה מעל כרטיס הוספה מלא", + "卡已存在": "כרטיס כבר קיים", + "锁上面添加密码已满": "נעילה מעל הוספת סיסמה מלאה", + "密码已存在": "קוד סיסמה זהה כבר קיים. אנא בחר אחד אחר", + "请输入密码": "אנא הכנס סיסמה", + "暂无密码,无需重置": "אין סיסמא, אין צורך לאפס", + "真实姓名": "שם אמיתי", + "身份证号": "מספר זיהוי", + "请输入真实姓名": "נא להזין את שמך האמיתי", + "请输入身份证号": "נא להזין את מספר זיהוי", + "请输入身份证号和真实姓名": "נא להזין את מספר זיהוי ושם אמיתי", + "点击返回设备配对": "הקש בחזרה למכשיר", + "无法连接?尝试升级": "לא יכול להתחבר? שדרוג", + "固件升级提示": "שורת שדרוג קושחה", + "请先获取固件文件到手机本地,再选择升级": "נא לקבל את קובץ הקושחה לטלפון המקומי קודם, ולאחר מכן בחר לשדרג", + "固件升级中": "הקושחה משודרגת", + "取消升级": "לבטל את השדרוג", + "固件传输中": "קושחה במעבר", + "关闭": "כבה", + "传输中'": "במעבר", + "操作记录": "רשומות", + "修改姓名": "שם עריכה", + "传输中": "במעבר", + "发送人": "הונפקו על ידי", + "发送时间": "זמן שהונפק", + "钥匙详情": "מידע אלקטרוני", + "姓名": "שם", + "发送": "שלח", + "请确认姓名全名和身份证号码是否正确": "נא לאשר כי השם המלא ומספר האיד נכונים", + "传输期间请勿离开当前页面": "אל תשאיר את הדף הנוכחי במהלך העברה", + "机型": "דוגמניות", + "硬件版本": "גרסת חומרה", + "固件版本": "גרסת קושחה", + "手动升级": "שדרוג ידני", + "设备连接中...": "חיבור המכשיר...", + "未避免异常情况,请在门打开时升级": "חריגים בלתי נמנעים, נא לשדרג כאשר הדלת פתוחה", + "钥匙无效": "המפתח אינו חוקי", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "אין אפשרות להתחבר למנעול. אנא הפעל מחדש את הבלוטות של הטלפון שלך ולנסות שוב.", + "如果是全自动锁,请使屏幕变亮": "אם זה מנעול אוטומטי לחלוטין, נא להפוך את המסך בהיר", + "正在尝试闭锁……": "מנסה לנעול. בבקשה לחכות...", + "清空记录": "רשומות ברורות", + "是否要删除操作记录?": "ממשיכים למחוק רשומות?", + "被删除的记录不能恢复": "לא ניתן לשחזר את הרשומות לאחר מחיקה.", + "全部事件": "כל האירועים", + "开锁事件": "פתיחת אירוע", + "异常事件": "אירוע חריג", + "门铃事件": "אירוע פעמון הדלת", + "视频事件": "אירוע וידאו", + "请开启蓝牙": "נא להפעיל את bluet' ב", + "请选择有效日": "נא לבחור את היום היעיל", + "公司名字长度不能小于 6 ": "אורך שם החברה לא יכול להיות פחות מ 6", + "已是最新版本": "אין עדכונים", + "新建短信模版": "תבנית creat sms", + "新建邮件模版": "תבנית דוא \"ל creat", + "自定义短信模版": "תבנית sms", + "自定义邮件模版": "תבנית דוא \"ל", + "名称": "שם", + "星星锁": "מנעול כוכבים", + "无考勤记录": "אין רשומות", + "大家干劲十足": "כולם מגיעים בזמן", + "工作时长未出炉": "ללא שעות עבודה", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "הבחירה של מדינה/אזור תשפיע על אבטחת המידע. כרגע בחרת באלבוניה, נא לאשר לפני שתמשיך.", + "确认国家或地区": "לאשר מדינה/אזור", + "我知道了": "זה", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "כדי לקבל עדכונים חשובים, אנא לחץ על 'ok' ולאפשר הודעות בהגדרות.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "לאחר הפעלת, אתה יכול מחדש כוח על ידי לחיצה ארוכה על מקש ההגדרה על המנעול, ולהוסיף אותו מחדש עם האפליקציה", + "已有": "נוכחי", + "新增": "חדש", + "账号格式错误": "פורמט רע", + "接收者信息为空": "המידע הנמען ריק", + "请输入时间(秒)": "נא להזין את השעה (שניות)", + "加载数据失败": "לא טען נתונים", + "重试": "נסה שוב", + "升级中,是否退出": "במהלך השדרוג, אם לצאת", + "下一步": "הבא", + "公寓": "דירה", + "个人用户": "אישי", + "星寓": "דירת כוכבים", + "账号": "חשבון", + "请输入手机号或email": "מספר טלפון או דוא \"ל", + "请输入星寓管理员的账号": "נא להזין את החשבון של מנהל הדירות", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "כל הנתונים של המנעול הנבחר יועברו באופן קבוע לנמען.", + "暂不支持跨平台转移,敬请期待": "מעבר לפלטפורמות אינה נתמכת לעת עתה, אנא מצפה לזה", + "移除坏锁": "לעבור מנעולים פגומים/פגום לאשפה", + "转移确认": "לאשר העברה", + "本次共转移": "הפעם סך הכל", + "把智能锁": "מנעול חכם", + "确认": "בסדר", + "移除成功": "הסר בהצלחה", + "转移成功": "הצלחה העברה", + "该已锁被删除": "הנעול נמחק", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "המנהלן המורשה יכול לנהל רק את passcodes,ekeys ו etcwrats בעצמו.", + "添加授权管理员": "יצירת מנהל", + "导出记录": "רישומי יצוא", + "选择时间段": "בחר תקופת זמן", + "导出": "יצוא", + "批量导出": "יצוא אצווה", + "读取记录": "ריענון רשומות", + "设备": "מכשיר", + "消息": "הודעות", + "智能分析": "ניתוח חכם", + "精准识别设备事件,过滤无效信息": "לזהות במדויק אירועי התקן ולסנן מידע לא חוקי", + "系统设置": "הגדרות מערכת", + "系统的全局配置在此项内进行设置": "התצורה הגלובלית של המערכת מוגדרת בפריט זה", + "导出操作记录": "רישומי יצוא", + "立即查看": "נוף", + "导出成功": "מיוצא בהצלחה", + "发送钥匙": "שלח איקי", + "进度": "קצב", + "失败": "נכשל", + "人脸详情": "פרטי פנים", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "כאשר מישהו חש כ-1.5 מטר לפני הדלת, פתיחת פתיחת פתיחת הפלת זיהוי הפנים.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "כאשר מישהו חש כ-0.8 מטר לפני הדלת, פתיחת פתיחת פתיחת הפלת זיהוי הפנים.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "כאשר מישהו חש כ-0.5 מטר לפני הדלת, פתיחת פתיחת פתיחת הפלת זיהוי הפנים.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "מרחק החישה היה כבוי, אתה צריך לגעת באופן ידני כל מפתח על המקלדת לבצע זיהוי פנים.", + "防误开已打开,开锁后": "הפתח נגד הטעות הופעל, ואחרי נפרצת", + "秒内不可使用面容开锁": "לא ניתן להשתמש בפתיחת פנים תוך שניות", + "掌静脉": "וריד דקל", + "添加掌静脉": "להוסיף וריד דקל", + "胁迫掌静脉": "וריד כף יד", + "请不要将胁迫掌静脉用于日常开锁": "נא לא להשתמש בכפיה דקלים עבור unlocking יומי unlocking", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "מחובר למנעול, בבקשה לפתוח את כף היד, כף היד פונה למצלמה", + "掌静脉详情": "פרטי וריד דקל", + "掌静脉号": "מספר וריד דקל", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth לא מופעל, בבקשה להפעיל bluetooth בהגדרות", + "删除用户时,会将用户拥有的钥匙一起删除。": "אם משתמש נמחק כל המקשים המקושרים עם המשתמש ימחק גם.", + "配置网络": "הגדרת רשת", + "你好": "שלום", + "成功": "מוצלח", + "类型选择": "בחר סוג", + "请选择要使用哪种类型": "נא לבחור באיזה סוג להשתמש", + "系统邮件(推荐)": "מערכת דואר אלקטרוני (מומלץ)", + "系统短信(推荐)": "Sms מערכת (מומלץ)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "הדוא \"ל יישלח מאפליקציה זו. בבקשה לקנות את חבילת הדוא\" ל קודם.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "הסמס יישלחו מאפליקציה זו. בבקשה לקנות את החבילה הראשונה.", + "个人邮件": "דואר אלקטרוני אישי", + "个人短信": "SMS אישי", + "邮件将从你的个人邮箱发给用户": "האימייל יישלח מחשבון הדואר האלקטרוני האישי שלך.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "הודעת SMS תישלח ממספר הטלפון האישי שלך. אתה משלם למפעיל הטלקום שלך.", + "为了更好地应用体验,请确定权限": "לחוויית יישום טובה יותר, נא לאשר את ההרשאות", + "您第一次拒绝权限,请确定权限": "סרבת רשות בפעם הראשונה, אנא לאשר את האישור", + "您第二次拒绝权限,请去应用设置开启权限": "סרבת רשות בפעם השנייה, נא לגשת להגדרות היישום כדי לאפשר הרשאה", + "去应用市场": "ללכת לחנות האפליקציות", + "温馨提示": "מיידית חמה", + "关闭应用": "סגור את היישום", + "开启微信接收报警消息需要先关注": "כדי לפתוח weat כדי לקבל הודעות אזעקה, עליך לעקוב", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat חשבון, שמור את קוד qr ולהשתמש wechat כדי לסרוק את ההגדרות", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "אימות שם אמיתי היא פונקציה בתשלום, אנא צור קשר עם מנהל המנעול כדי לרכוש ולהשתמש", + "位置权限": "אישור מיקום", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "בבקשה להעניק את האפליקציה לשימוש locatian שלך. הוא משמש כדי לסרוק מנעולים ושערים.", + "相机/相册权限": "אישור מצלמה/אלבום", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "נא להעניק את האפליקציה לקרוא ולכתוב תמונה וקבצים מהאחסון.", + "点击选择": "לחץ כדי לבחור", + "微信": "ווצ 'ט", + "朋友圈": "רגעים", + "QQ": "ק", + "QQ空间": "אקזון", + "微博": "וייבו", + "FaceBook": "פייסבוק", + "链接": "קישור", + "今天": "היום", + "密码错误": "סיסמה לא חוקית", + "网络中断": "הפרעות רשת", + "钥匙不存在": "המפתח אינו קיים", + "钥匙过期": "מפתח פג תוקף", + "钥匙已存在": "מפתח כבר קיים", + "密码失效": "סיסמה", + "门锁时间异常": "זמן נעילה דלת חריג", + "APP(手机)未联网": "האפליקציה (טלפון נייד) אינה מחוברת לאינטרנט", + "数据不存在": "נתונים לא קיימים", + "待接收": "מרומם", + "已冻结": "קפוא", + "已删除": "נמחק", + "未知": "לא ידוע", + "拖动下方滑块完成拼图": "גרור את המחוון אל הפוזיציה הנכונה", + "验证成功": "תוצאות אימות", + "验证失败": "אימות נכשל", + "向右拖动滑块填充拼图": "גרור את המחוון ימינה כדי למלא את הפאזל", + "请先获取到位置信息哦": "בבקשה לקבל את פרטי המיקום קודם", + "请选择国家": "נא לבחור מדינה", + "获取锁信息": "לקבל מידע נעילה", + "锁数据异常,请重试": "נתוני נעילה הם חריגים, אנא נסה שוב", + "连接设备中...": "חיבור התקן...", + "把锁": "מנעולים", + "条": "רצועה", + "封": "חותם", + "次": "פעמים", + "支付成功": "הצלחה בשכר", + "查看详情": "פרטים", + "请输入模板名称": "אנא הזן שם תבנית", + "模版类型": "סוג", + "再返回一次退出": "לצאת שוב", + "请先添加锁": "אנא הוסף את המנעול הראשון", + "可视对讲": "אינטרקום חזותי", + "详细日志": "יומן מפורט", + "已复制到剪切板": "שהועתקו", + "拍照": "תמונות", + "从相册选择": "בחר מתוך אלבום", + "选择问题": "נא לבחור שאלה", + "确认长度不足8位": "אורכם פחות מ-8 ספרות", + "新密码长度不足8位": "אורך סיסמא חדש פחות מ-8 ספרות", + "两次密码不一致": "התאמה של סיסמא. אנא נסה שנית", + "请点击获取验证码,验证码将发送到": "נא לקבל קוד אימות. הקוד יישלח", + "切换": "מתג", + "验证": "אימות", + "验证成功,账号已删除": "אימות מוצלח, חשבון נמחק", + "该密码不是自定义密码,无法修改": "סיסמה זו אינה סיסמה מותאמת אישית ולא ניתן לשנות", + "请选择设备要关联哪些姓名": "נא לבחור באיזה שמות המכשיר יש לשייך", + "请选择姓名要关联哪些设备": "נא לבחור אילו מכשירים את השם צריך להיות קשור", + "确定要移除所选中的坏锁吗?": "להסיר את המנעול התקלה?", + "邮件通知": "הודעה בדוא \"ל", + "短信通知": "הודעה באמצעות sms", + "您好,您的授权管理员生成成功": "שלום, המנהל המורשה שלך נוצר בהצלחה", + "请输入接收者姓名": "אנא הכנס כאן", + "版本更新": "עדכון גרסה", + "下次再说": "בפעם הבאה", + "配网成功": "הצלחת הפצת רשת", + "配网失败": "הפצת הרשת נכשלה", + "该锁的无线键盘都将被删除": "כל keypads אלחוטיים עבור המנעול הזה יימחקו", + "实时画面": "תמונה בזמן אמת", + "适合门口较为安全的环境。": "מתאים לסביבה בטוחה יחסית בדלת.", + "仅发生特定事件才录像,并可查看实时画面。": "רק אירועים ספציפיים מוקלטים, וניתן לראות את התמונה בזמן אמת.", + "一般情况下,满电可使用7-8个月": "בנסיבות רגילות, ניתן להשתמש בו במשך 7-8 חודשים כאשר טעונה מלאה", + "有人逗留或发生特定事件才录像,可随时查看": "מישהו נשאר או אירועים ספציפיים מוקלטים, וניתן לצפות בהם בכל עת", + "实时画面。": "תמונה בזמן אמת.", + "一般情况下,满电可使用5~6个月。": "בנסיבות רגילות, הוא יכול לשמש כ-5 ~ 6 חודשים כאשר טעון באופן מלא.", + "适合门口人员复杂、较不安全的环境。": "מתאים לסביבות מורכבות ולא בטוחות יחסית בדלת.", + "有人出现就录像,可随时查看实时画面。": "להקליט כאשר מישהו מופיע, ותראה את התמונה בזמן אמת בכל עת.", + "一般情况下,满电可使用2~4个月。": "בנסיבות רגילות, ניתן להשתמש בו במשך 2 ~ 4 חודשים כאשר טעונה מלאה.", + "根据您家门口实际情况设置录像和实时画面功能。": "להגדיר את וידאו ואת התמונה בזמן אמת פונקציות בהתאם למצב בפועל בדלת שלך.", + "可使用时长由具体设置决定。": "משך השימוש נקבע על ידי ההגדרות הספציפיות.", + "查看": "נוף", + "有人按门铃或发生": "מישהו מצלצל בפעמון הדלת או", + "异常事件时": "אירוע חריג", + "不录像": "אין וידאו", + "有人出现、按门铃": "מישהו מופיע, מצלצל בפעמון הדלת", + "或发生异常事件时": "או אירוע חריג", + "逗留达到10秒": "להישאר 10 שניות", + "约1.5米": "כ-1.5 מטרים", + "随时": "בכל זמן", + "立即录像": "להקליט מיד", + "录像时机": "תזמון וידאו", + "有人出现时录像": "שיא כאשר מישהו מופיע", + "人体侦测距离": "מרחק זיהוי אנושי", + "查看实时画面": "תמונה בזמן אמת", + "自定义时间": "זמן מותאם אישית", + "当日": "היום", + "次日": "למחרת", + "自定义时段": "תקופת זמן מותאמת אישית", + "发生事件时查看": "תצוגה כאשר מתרחש אירוע", + "实时查看": "מבט בזמן אמת", + "有人在门口出现10秒后开始录像。": "מישהו מופיע בדלת במשך 10 שניות לפני ההקלטה.", + "有人按门铃时立即录像。": "להקליט מיד כשמישהו מצלצל בפעמון הדלת.", + "有人出现在门前1.5米范围时启动录像": "להתחיל להקליט כאשר מישהו מופיע בתוך 1.5 מטרים מול הדלת", + "约0.8米": "כ-0.8 מטרים", + "约3.0米": "כ-3.0 מטרים", + "添加指纹失败": "המבצע נכשל.", + "项": "פריטים", + "播放中": "משחק", + "下载": "הורדה", + "暂无下载内容": "אין תוכן להורדה", + "亮度": "בהירות", + "音量": "נפח", + "快进至": "מהר קדימה ל", + "快退至": "רוח מחדש", + "暂无视频信息": "אין מידע וידאו", + "加载出错": "שגיאת טעינת הטעינה", + "请单人正对门锁,距离一个成年人手臂长度": "בבקשה לעמוד מול מנעול הדלת לבד, באורך זרוע", + "(约0.6米)。": "(כ-0.6 מטר).", + "保持脸部无遮挡,露出五官。": "לשמור על הפנים שלך ללא הפרעה ותראה את תכונות הפנים שלך.", + "准备好了,开始添加": "מוכן, התחל להוסיף", + "正在录入中...": "הקלטה...", + "添加人脸失败": "לא להוסיף פנים", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "לאחר איפוס, הפנים של המנעול יימחקו. אתה בטוח שברצונך לאפס?", + "人脸号": "מספר פנים", + "虹膜详情": "איריס פרטים", + "虹膜号": "מספר איריס", + "选择设备类型": "בחר סוג התקן", + "照明灯具": "גופי תאורה", + "电动窗帘": "וילונות חשמליים", + "门窗传感器": "חיישן דלת וחלון", + "传感器": "חיישן", + "清除数据成功": "נתונים שונו בהצלחה", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "המנעול אינו מחובר לאינטרנט, כך שלא ניתן להעלות את הנעילה של קוד, כרטיס, טביעת אצבע, ושיטות פתיחת דלת אחרות לא ניתן להעלות בזמן אמת.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "אם אתה צריך לשמור את הרשומות ההיסטוריות, אתה יכול לייצא אותם.", + "看不到操作记录,可能原因有": "לא יכול לראות את רשומות הפעולה, סיבות אפשריות", + "操作记录详情": "פרטי שיא המבצע", + "操作时间": "זמן פעולה", + "此模块功能需要锁联网后设置方可生效": "פונקציה מודול זה צריך להיות מוגדר לאחר המנעול מחובר לאינטרנט כדי לקחת את האפקט", + "用户已存在": "משתמש כבר קיים", + "钥匙数量已到上限": "מספר המפתחות הגיע לגבול העליון", + "附近没有可用网关": "אין שער זמין בקרבת מקום", + "正在创建安全连接...": "יצירת חיבור מאובטח...", + "监视状态下不能发送录音": "לא יכול לשלוח הקלטות במצב ניטור", + "挂断": "נתק", + "监视中暂不能开锁": "פריקה אינה זמינה במהלך ניטור", + "长按说话": "ללחוץ ולתחזק לדבר", + "松开发送": "שחרור לשליחה", + "请输入6位数字开锁密码": "אנא הכנס סיסמא נעילה בת 6 ספרות", + "请输入开锁密码": "אנא הכנס את הסיסמה לפתיחה", + "接收者在有效期内可以不限次数使用": "ניתן להשתמש במקשי ekeys עבור זמן בלתי מוגבל במהלך תקופת תוקפו.", + "接收者可以使用此App开关锁": "הנמען מסוגל לנעול/לפתוח על ידי יישום זה.", + "单次钥匙有效期为1小时,只能使用一次": "האקי חד פעמי תקף למשך שעה אחת וניתן להשתמש בו פעם אחת בלבד.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "נמענים יכולים להשתמש במקשי הקילי של זמן בלתי מוגבל בזמן המחזור הקבוע.", + "获取模板失败": "לא הצליח לקבל את התבנית", + "微信通知": "הודעת ווצ 'ט", + "系统短信": "Sms מערכת", + "系统邮件": "מערכת דואר אלקטרוני", + "模板": "תבנית", + "新建模版": "ליצור תבנית", + "您好,您的密码是": "שלום, הסיסמה שלך היא", + "密码名字": "שם סיסמה", + "请输入6-9位密码": "אנא הכנס סיסמה בת 6-9 ספרות", + "设置密码": "להגדיר סיסמה", + "操作成功,密码为": "הצליח. הקוד הוא", + "类型:自定义-永久": "סוג: מותאם אישית-קבוע", + "实时播放": "פלייבק בזמן אמת", + "点击对讲": "לחץ על אינטרקום", + "长按开锁": "לחץ ארוך כדי לפתוח", + "接听失败": "לא הצליח לענות", + "请在锁设置中开启远程开锁": "נא להפעיל נעילה מרחוק בהגדרות נעילה", + "接听": "תשובה", + "截图已保存到相册": "צילום מסך נשמר לאלבום", + "添加遥控": "הוספת שלט רחוק", + "已连接到锁,请按遥控": "מחובר למנעול, אנא לחץ על שלט רחוק", + "遥控号": "מספר שלט רחוק", + "遥控详情": "פרטי שלט רחוק", + "照明": "תאורה", + "退出演示模式": "מצב הדגמה יציאה", + "提示:当前界面为展示界面,添加设备后才能继续使用": "טיפ: הממשק הנוכחי הוא ממשק תצוגה. לאחר הוספת המכשיר, אתה יכול להמשיך להשתמש בו", + "门已上锁": "הדלת נעולה", + "您的账号在异地登录,如非本人,请尽快修改密码": "החשבון שלך שימש כדי להיכנס ממכשיר חדש", + "开门成功": "לפתוח את הדלת בהצלחה", + "开门失败": "נכשל לפתוח את הדלת", + "呼叫提醒": "תזכורת להתקשר", + "收到来自": "התקבלו", + "锁的呼叫": "קריאת נעילה", + "加载数据中": "נתוני טעינה", + "搜索所有锁类型": "חיפוש בכל סוגי המנעול", + "锁电量更新时间": "נעילת זמן עדכון סוללה", + "1月": "ג 'אן", + "2月": "פברואר", + "3月": "מאר", + "4月": "באפר", + "5月": "מאי", + "6月": "ג 'ון", + "7月": "ג 'ול", + "8月": "אוג", + "9月": "סיפ", + "10月": "שורט", + "11月": "נוב", + "12月": "דביט", + "热门城市": "ערים חמות", + "导出锁数据": "ייצוא נתוני נעילה", + "一键开锁": "בלחיצה אחת על פתיחת", + "已开通": "נפתח", + "编辑员工": "עריכת צוות", + "一": "אחד", + "二": "שתיים", + "三": "3", + "四": "4", + "五": "חמש", + "六": "6", + "日": "שמש", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?", + "在线": "באינטרנט", + "离线": "מנותק", + "购买记录": "רישום רכישה", + "使用记录": "רשומות משתמש", + "失效时间要大于当前时间": "זמן המימוש חייב להיות ארוך יותר מאשר הזמן הנוכחי", + "修改名字": "שם עריכה", + "时": "שעה", + "分": "דקה", + "Amazon Alexa": "אלכס", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "אתה יכול להשתמש alexa כדי לפתוח, לנעול ולבדוק את מצב המנעול", + "支持的国家": "מדינות נתמכות", + "支持的国家值": "Usa, canada, uk, אוסטרליה, הודו, germany, צרפת, איטליה, ספרד, ספרד, יפן", + "操作流程": "תהליך פעולה", + "操作流程值": "1 להוסיף מנעול ושער עם אפליקציית נעילה חכמה\n\n2 הפעל את הפונקציה unlocking מרחוק של המנעול באפליקציה (פונקציה זו מכבה כברירת מחדל). אם אין לך אפשרות זו, המנעול לא תומך באלכסנa\n\n3 להוסיף מיומנויות כדי alexa ולאשר להם את החשבון ואת הסיסמה של האפליקציה המנעול החכם. לאחר האישור מוצלח, אתה יכול לגלות התקנים תחת החשבון\n\n4 לאתר את המנעול באפליקציית alexa, הפעל את פונקצית נעילת הקול, ולהגדיר את הסיסמה השפה\n\n5 המנעול יכול להיות מופעל באמצעות alexa", + "Google Home": "בית גוגל", + "Action name": "שם פעולה", + "ScienerSmart": "נדוש", + "支持的语言": "שפות נתמכות", + "英语": "אנגלית", + "Google Home操作流程的值": "1. השתמש ביישום מנעול חכם כדי להוסיף מנעולים ושערים\n\n2. הפעל את הפונקציה unlocking מרחוק של הנעילה באפליקציה (פונקציה זו מכבה כברירת מחדל). ללא אפשרות זו, המנעול אינו תומך בבית גוגל\n\n3. להתקין את אפליקציית הבית של גוגל ולחץ על כפתור \"בפינה השמאלית העליונה\n\n4. בדף ההגדרות, בחר \"עבודה עם Google\"\n\n5. חיפוש אחר \"scienersmart\" ולהשתמש חשבון יישום נעילה חכם וסיסמה כדי לאשר", + "密码需至少包含数字/字母/字符中的2种组合": "הסיסמה חייבת להכיל לפחות 2 מאלה: מספרים, אותיות ותווים מיוחדים", + "已开锁": "נעול", + "已闭锁": "נעול", + "两次密码不一致哦": "הסיסמאות אינן עקביות", + "中功率": "כוח בינוני", + "常规使用": "שימוש קבוע", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "לאחר השער מופעל, לחץ והחזק את כפתור איפוס עבור 5 שניות, ולחץ על הבא כאשר מחוון אור מהבהב לסירוגין", + "扫描设备": "התקן סריקה", + "删除失败,网关可能已经离线,是否强制删除该数据?": "מחיקה נכשלה. ייתכן שהשער נעלם מהרשת. האם ברצונך לאלץ למחוק את הנתונים?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json new file mode 100644 index 00000000..977e1f37 --- /dev/null +++ b/lan/lan_hk.json @@ -0,0 +1,1122 @@ +{ + "星锁": "星锁", + "锁通通": "锁在", + "点击开锁,长按闭锁": "触摸解锁,长按锁定", + "考勤": "出席", + "考勤设置": "考勤设置", + "电子钥匙": "eKeys", + "添加卡": "添加卡", + "卡号": "卡号", + "添加指纹": "添加指纹", + "指纹号": "指纹数量", + "遥控": "远程", + "添加人脸": "添加的脸", + "门锁日志": "门锁日志", + "密码号": "密码数字", + "添加者": "操作符", + "添加时间": "时间", + "重置": "重置", + "请输入手机号或者邮箱": "电话号码或电邮地址", + "工作时间": "工作时间", + "工作日设置": "工作时间设置", + "星期一": "周一", + "星期二": "周二", + "星期三": "周三", + "星期四": "周四", + "星期五": "星期五", + "星期六": "周六", + "星期日": "周日", + "简写周一": "米", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "年代", + "简写周日": "年代", + "周一": "我的", + "周二": "星期二", + "周三": "结婚", + "周四": "星期四", + "周五": "星期五", + "周六": "坐", + "周日": "太阳", + "群发钥匙": "发送多个ekey", + "锁": "锁", + "请添加": "收件人", + "允许远程开锁": "远程解锁", + "请输入验证码": "验证码", + "获取密码": "生成密码", + "请给密码命名": "为这个密码输入一个名称", + "密码有限期为6个小时,只能使用一次": "此密码必须在当前时间起6小时内使用,否则将因安全原因暂停使用。此密码只可使用一次。", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "手动输入6 ~ 9位数字作为密码。可以通过手机蓝牙添加旁边的锁,还是通过网关远程添加", + "获取": "得到", + "添加": "添加", + "删除公司": "删除公司", + "密码详情": "密码信息", + "修改密码": "改变密码", + "添加虹膜": "添加虹膜", + "添加门磁": "门传感器", + "添加无线键盘": "无线键盘", + "添加手掌": "添加棕榈", + "请输入员工账号": "输入员工账号", + "批量授权锁": "授予多个锁", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "授权的管理员将拥有操作此锁的多数权限。", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "此功能允许您通过网关远程解锁智能锁。此功能只能通过蓝牙开启或关闭。", + "排列方式": "列表类型", + "早到榜": "早期的列表", + "迟到榜": "晚列表", + "当前模式": "当前模式", + "勤奋榜": "努力工作清单", + "延迟时间": "延迟时间", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "时间过后,锁会自动锁上。请先解锁一次,以使设置可用。", + "时间": "时间", + "开始时间": "开始时间", + "结束时间": "结束时间", + "工作时间设置": "工作时间设置", + "常开模式": "通道模式", + "常开时间": "在这段时间里", + "常开日期": "在这些日子里", + "添加员工": "添加员工", + "编辑员工": "编辑人员", + "节假日": "假期", + "打卡方式": "方法", + "员工是否有钥匙": "已经有了钥匙", + "上班时间": "起始时间", + "下班时间": "结束营业的时间", + "本周": "本周", + "单休": "一天周末", + "双休": "为期两天的周末", + "单双休": "One-two-day周末", + "年": "一年", + "月": "月", + "放假日期": "假期", + "补班日期": "工作日", + "添加假日": "添加假日", + "开始日期": "开始日期", + "必填": "要求", + "结束日期": "结束日期", + "日榜": "每天", + "月榜": "每月", + "考勤记录": "记录", + "假日信息": "假期的信息", + "基本信息": "基础知识", + "无线键盘": "无线键盘", + "选择无线键盘": "添加键盘", + "门磁": "门传感器", + "自动闭锁": "汽车锁", + "锁声音": "锁的声音", + "防撬报警": "夯警报", + "重置键": "重置按钮", + "锁时间": "锁定时钟", + "诊断": "诊断", + "上传数据": "上传数据", + "导入其他锁数据": "从另一个锁导入", + "锁升级": "固件更新", + "标记房态": "房间状态", + "开锁提醒": "解锁的通知", + "微信二维码": "解锁二维码", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "持电子钥匙的人可以通过微信扫描二维码开门。每个锁的二维码都不一样。您可以打印出来并粘贴到相应的锁旁边", + "锁编号": "锁的数量", + "电量": "电池", + "锁分组": "锁定组", + "选择分组": "选择组", + "创建新分组": "创建组", + "管理员开锁密码": "管理员密码", + "更新": "更新", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "电池电量将通过网关或手机蓝牙更新", + "当屏幕闪烁时,点击下一步": "当键盘闪烁时,单击next", + "输入*529#或按设置键": "输入*529#或按Settings键", + "长按重置键2秒": "按住复位键2秒", + "附近的设备": "附近的设备", + "暂无数据": "没有数据", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "您将能够获得门的状态与门传感器与网关在一起。只允许一个传感器与锁相关联。", + "开始": "开始", + "全天": "所有的时间", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "您可以为通行模式设置多个时间段。在设定的时间段内,锁被解锁后将保持打开状态。", + "请选择锁音量": "请选择锁定音量", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "按“ON”键,你会听到锁发出的声音", + "低": "低", + "较低": "介质低", + "中": "媒介", + "较高": "中等高", + "高": "高", + "开启后,锁被撬动时,会发出报警声": "通过打开,您启用了TAMPER警报。", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "通过关闭,RESET按钮被禁用。", + "校准时间": "校准时间", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "诊断是读取锁内部的配置信息并上传,以便工作人员分析故障原因", + "上传": "上传", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "从锁上传数据到服务器。这可能需要几分钟", + "请选择要从哪把锁导入": "选择要导入的锁", + "有新版本": "有新版本", + "当前版本": "当前版本", + "升级": "更新", + "空闲": "空", + "已入住": "被占领的", + "多语言": "语言", + "添加锁": "加锁", + "锁地址": "锁的地址", + "选择锁类型": "选择锁类型", + "NFC无源锁": "NFC无源锁", + "添加设备": "添加设备", + "网关": "网关", + "客服": "客户服务", + "设置": "设置", + "更多设置": "更多的设置", + "消息推送": "通知推", + "锁用户管理": "锁定用户", + "拥有的钥匙": "与此用户关联的eKeys", + "批量授权": "权限管理", + "关联设备": "相关的设备", + "关联姓名": "相关的名字", + "转移智能锁": "把锁", + "选择锁": "屏幕锁", + "接收人信息": "收件人", + "转移网关": "传输网关", + "锁屏": "屏幕锁", + "已关闭": "从", + "已开启": "在", + "开启": "打开", + "确定要开启重置键?": "继续启用重置按钮?", + "确定要关闭重置键?": "继续禁用重置按钮?", + "隐藏无效开锁权限": "隐藏无效访问", + "APP开锁时需手机连网的锁": "锁需要手机在线", + "增值服务": "服务", + "关于": "关于", + "退出": "注销", + "删除账号": "删除账户", + "个人信息": "账户信息", + "头像": "《阿凡达》", + "昵称": "昵称", + "请输入昵称": "请输入您的昵称", + "修改昵称": "重命名", + "修改账号": "编辑帐户", + "重置密码": "重置密码", + "安全问题": "安全问题", + "为了你的账号安全,修改账号前请先使用验证码验证": "为保证您的帐户安全,请在修改帐户前进行帐户密码验证", + "请输入新账号": "请输入新帐户", + "找回密码和登录新设备时,可通过绑定的手机验证": "绑定电话号码将用于接收验证码。", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "绑定电子邮件将用于接收验证码。", + "原密码": "当前的密码", + "新密码": "新密码", + "确认密码": "确认密码", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "如果您的手机丢失,您可以通过回答安全问题登录新手机。", + "问题一": "问题1", + "问题二": "问题2", + "问题三": "问题3", + "请输入你的答案": "请输入答案", + "即将到期": "很快到期", + "去授权": "点击授权", + "修改名称": "编辑的名字", + "状态": "状态", + "WiFi名称": "无线网络名称", + "网络MAC": "网络MAC", + "网关升级": "网关更新", + "网关连接的锁": "连接到此网关的锁", + "信号强": "强大的", + "选择网关类型": "选择网关类型", + "添加网关": "添加网关", + "重新通电": "重新连接电源", + "指示灯": "指示灯", + "选择网关": "选择网关", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "不支持5G。请选择2.4G WiFi。", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "输入WiFi密码", + "网关名称": "网关的名字", + "请输入网关名称": "输入网关名称", + "IP地址": "IP地址", + "子网掩码": "子网掩码", + "默认网关": "默认网关", + "自动获取DNS服务器地址": "自动获取DNS服务器地址", + "首选DNS": "首选DNS", + "备选DNS": "选择域名", + "不使用静态IP": "没有使用静态IP", + "使用静态IP": "使用静态IP", + "请输入IP地址": "输入IP地址", + "请输入子网掩码": "输入子网掩码", + "请输入默认网关": "输入默认网关", + "所有锁": "所有的锁", + "搜索所有类型的锁": "扫描所有类型的锁", + "门锁": "门锁", + "挂锁": "挂锁", + "保险箱锁": "安全锁", + "智能门禁": "智能访问控制", + "车位锁": "停车锁", + "摸亮触摸屏": "触摸任何键激活键盘", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "请触摸任意键激活锁并将其置于配对模式。按下一个", + "附近的锁": "附近的锁", + "如需修改名字请重新命名,点击确定添加锁": "如果要更改名称,请重命名,单击“确定”添加锁定", + "添加锁时,手机必须在锁旁边": "添加锁时,手机必须在锁旁边", + "登录": "登录", + "注册": "注册", + "我已阅读并同意": "我读过并同意了", + "验证码": "代码", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "您的密码必须有8-20个字符,并包括至少两种类型的数字,字母和符号", + "手机": "电话", + "邮箱": "电子邮件", + "请输入邮箱": "输入你的电子邮箱", + "国家/地区": "国家/地区", + "你所在的国家/地区": "你的国家/地区", + "选择国家/地区": "选择您的国家或地区", + "获取验证码": "获取代码", + "商务合作": "业务", + "电脑网页版": "网络系统", + "酒店系统": "酒店系统", + "说明书网页版": "用户手册", + "高级功能": "先进的功能", + "记录保存": "记录保留", + "您可通过短信将密码、电子钥匙信息发给接收人。": "短信可用于向接收方发送密码和密钥信息。", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "该电子邮件可用于发送密码和ekey信息给收件人。", + "购买实名认证提示": "开启该功能后,您需要使用指纹、人脸或账号密码打开APP, 3分钟内无需再次验证", + "请选择你希望的实名认证频次": "请选择您需要的实名认证频率", + "仅首次": "第一次", + "每日一次": "一天一次", + "每周一次": "一周一次", + "每月一次": "每月一次", + "当前状态": "当前的状态", + "试用中": "受审", + "高级功能权益内容": "先进的功能", + "短信模板": "短信模板", + "邮件模板": "电子邮件模板", + "发卡工具": "卡编码器", + "购买高级功能须知": "请注意", + "购买高级功能提示": "更高级的功能正在开发中,如果您需要,欢迎您根据锁的数量打开服务。高级功能只适用于您自己的锁。如果您是授权管理员,请联系该锁的顶级管理员开启该服务", + "免费体验": "免费试用", + "立即开通": "打开现在", + "购买短信": "买手机", + "购买邮件": "购买电子邮件", + "购买实名认证次数": "购买实名认证次数", + "开通高级功能": "启用高级功能", + "选择套餐": "选择包", + "支付方式": "付款方式", + "支付宝": "支付宝", + "去支付": "支付", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "您可以自己定义消息。它用于向他人发送密码和密钥信息。", + "高级功能仅能用于你自己的锁": "高级功能只能应用于您自己的锁。", + "新建模板": "创造模板", + "类型": "类型", + "模版内容": "模板内容", + "预览": "预览", + "房间名": "房间", + "预计产生短信条数": "估计的消息段", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "此功能允许您隐藏一段时间内无效的密码、密钥、卡片和指纹。", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "用户的手机需要在线才能通过APP解锁这些选定的锁。", + "配置WiFi": "配置无线网络", + "请输入WiFi名字": "请输入Wifi名称", + "WiFi配网": "WiFi分布网络", + "胁迫卡": "压力卡片", + "员工是否有密码": "已经有了密码", + "员工是否有卡": "已经有卡了", + "员工是否有指纹": "已经设置指纹", + "获取钥匙": "得到关键", + "获取卡": "让卡", + "获取指纹": "得到指纹", + "安全验证": "身份验证", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "您的所有账户信息将从平台上永久删除,且无法恢复。要删除吗?", + "监控": "监控", + "视频日志": "视频日志", + "开门器": "开门器", + "面容开锁": "脸解锁", + "开门方向设置": "开启方向集", + "电机功率设置": "MotorPower设置", + "开锁时是否需联网": "如果解锁时需要上网", + "选择要加入分组的锁": "选择要添加到该组的lockS", + "锁数量": "锁的数量", + "小米IOT平台": "小米物联网平台", + "面容开锁设置": "面部解锁设置", + "感应距离": "感应距离", + "防误开": "防止开错", + "防误开已关闭,关门后仍可使用面容开锁": "防止误开已关闭,关闭后仍可使用面锁", + "添加和使用面容开锁时": "解锁时添加并使用人脸", + "添加和使用面容开锁时提示": "\n1、请尽量保持单人在门前操作;\n2、请站在门锁前约0.5~0.8米,面向门锁;\n3. 请保持面部畅通,露出五官;\n4. 当人脸识别异常时,可以手动触摸数字键盘上的任意键重新启动人脸识别。", + "秒": "年代", + "请根据门锁实际情况,请谨慎选择电机功率:": "请根据门锁的实际情况仔细选择电机功率:", + "小功率:": "小功率:", + "耗电少": "更少的电力消耗", + "大功率": "高功率:", + "大功率提示": "如果锁舌在开锁时不能正常缩回,或需要驱动\n天地挂钩,建议选用大功率的。此时,功耗将为\n增加。", + "开门方向设置提示": "请慎重选择你家的开门方向(如果选错方向,将无法正常开门和关门):", + "左开": "打开了", + "右开": "开放的权利", + "判断方法:": "判断方法:", + "判断方法内容": "那人站在房子外面,面向大门。\n如果门的铰链或轴在左边,则门是开着的;\n如果门的铰链或轴在右边,则门是右开的。\n如果设置错误,将不能正常开门和关门。\n建议由安装或维护人员操作。", + "录像时段": "视频插槽", + "密码": "密码", + "卡": "卡片", + "指纹": "指纹", + "人脸": "脸", + "配件商城": "锁购物中心", + "公司名称": "公司名称", + "请输入公司名字": "输入公司名称", + "提示": "提示", + "是否删除?": "是否删除?", + "员工信息": "员工信息", + "员工": "工作人员", + "打卡方式无效": "不可用", + "中国": "中国", + "选择钥匙": "选择ekey", + "编辑": "编辑", + "无": "没有", + "有": "是的", + "请输入姓名": "请输入名称", + "获取人脸": "让脸", + "选择密码": "选择密码", + "选择卡": "选择卡", + "选择指纹": "选择指纹", + "选择人脸": "选择面对", + "员工是否有人脸": "员工是否有脸", + "同时删除员工钥匙": "删除他/她的密钥", + "删除": "删除", + "确定要删除员工吗?": "删除该员工", + "月统计": "每月统计数据", + "迟到": "晚些时候", + "早退": "早走", + "未打卡": "没有记录", + "钥匙将在": "此密钥将在", + "天后失效": "天(s)", + "电量更新时间:": "电池更新时间:", + "新增配件": "添加", + "钥匙不可用": "密钥不可用", + "正在开锁中...": "解锁……", + "你的钥匙": "你的关键", + "常开模式启动!长按闭锁": "开启模式启动!长按锁定", + "演示模式": "演示模式", + "请先同意用户协议及隐私政策": "请先同意本用户协议及隐私政策", + "用户协议": "用户条款", + "隐私政策": "隐私政策", + "注册成功": "注册成功", + "你所在的": "你入选了", + "手机号": "电话号码", + "忘记密码": "忘记了密码", + "重置成功": "重置成功", + "确定要退出吗?": "退出吗?", + "功能暂未开放": "功能尚未打开", + "设置成功": "设置成功", + "删除成功": "删除成功", + "单次": "一次性", + "永久": "永久", + "限时": "定时", + "自定义": "自定义", + "清空码": "擦除", + "循环": "反复出现的", + "工作日": "工作日", + "每日": "每天", + "周末": "周末", + "确定要删除吗?": "删除吗?", + "该锁的密码都将被删除": "此锁的所有密码将被删除", + "已过期": "无效的", + "该锁的电子钥匙都将被删除": "此锁的所有ekey都将被删除", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "删除与此ekey关联的所有ekey。此步骤不可撤消!", + "删除钥匙会在用户APP连网后生效": "当用户的APP连接到网络时,eKey将被删除", + "有效时间": "有效的时间", + "接收者": "收件人", + "仅管理自己创建的用户": "只管理自己的用户", + "远程开锁": "远程解锁", + "请输入钥匙名称": "请输入密钥名称", + "修改成功": "修改成功", + "冻结": "冻结", + "解除冻结": "解冻", + "授权": "授权", + "取消授权": "取消授权", + "同时解冻其发送的钥匙": "解冻该用户发出的所有密钥", + "会在用户APP连网后生效": "当用户的APP连接到网络时,此密钥将被解冻", + "同时冻结其发送的钥匙": "冻结该用户颁发的所有密钥", + "冻结会在用户APP连网后生效": "当用户的APP连接到网络时,此ekey将被冻结", + "取消授权会在用户APP连网后生效": "当用户的APP连接到网络时,用户将失去其权限", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "授权用户具有与锁管理器几乎相同的权限(例如:发送密钥和密码的能力)", + "失效时间需晚于生效时间": "过期时间必须晚于有效时间", + "生效时间需晚于当前时间": "生效时间必须晚于当前时间", + "失效日期需晚于生效日期": "有效期必须晚于生效日期", + "修改有效期": "改变时间", + "生效日期": "开始日期", + "失效日期": "结束日期", + "开锁": "解锁", + "开锁成功": "解锁成功", + "请选择锁": "请选择锁", + "请选择接收者": "请选择接收方", + "请选择有效期": "请选择有效期限", + "请选择发送方式": "请选择发送方式", + "请选择结束时间": "请选择结束时间", + "完成": "完整的", + "有效日": "周期", + "发送成功": "发送成功", + "请选择开始时间": "请选择开始时间", + "选择用户": "选择收件人", + "已选中": "选择", + "确定": "确定", + "请选择要发送的锁": "请选择锁", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "人脸实名认证是指用户在解锁手机APP前需要对自己的脸部进行验证,验证后即可解锁。", + "分享": "分享", + "请输入接收者账号": "请输入接收人账户", + "接收者号码未注册,请重新发送": "收件人号码未注册,请重新发送", + "是否发送电子钥匙给未注册账号": "您要发送密钥到新帐户吗", + "取消": "取消", + "标记成功": "标志着成功", + "微信好友": "微信的朋友", + "短信": "短信", + "邮件": "电子邮件", + "更多": "更多的", + "您好,您的电子钥匙生成成功": "您好,您的电子密钥生成成功", + "生效时间不能小于当前时间": "有效时间不能小于当前时间", + "结束时间不能小于当前时间": "结束时间不能小于当前时间", + "是否为管理员": "是管理员吗?", + "已连接到锁,请将卡靠近门锁的读卡区": "连接。将卡片贴在读卡器上", + "尝试连接设备...": "连接与锁。请稍等…", + "地理位置": "地理位置", + "检查以确保以下地址是正确的": "请检查以下地址是否正确", + "地图加载中,请稍候。。": "地图正在加载中,请稍等…", + "跳过": "跳过", + "还未获取到位置信息哦,请耐心等待一下!": "位置信息尚未获取,请耐心等待!", + "请填写信息": "请填写这些信息", + "有效期": "有效期", + "生效时间": "开始时间", + "失效时间": "结束时间", + "上传成功": "上传成功", + "未生效": "不活跃的", + "已生效": "有效的", + "指纹详情": "指纹信息", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "您将被要求将您的手指放在传感器几次。请按照提示……", + "开始添加": "开始", + "请将您的手指按下": "将手指放在传感器上", + "根据提示,抬起手指后再进行下一次指纹采集": "按照提示去做……您将需要将手指移到传感器上以进行下一个记录", + "添加成功": "添加成功", + "更新成功": "更新成功", + "搜索": "搜索", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "重置后,锁上的卡会被删除,您要重置吗?", + "已失效": "无效的", + "卡详情": "卡信息", + "请输入": "请在这里输入", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "通过关闭,锁将保持解锁一整天,直到它被手动锁定", + "请输入小于或等于60的数字": "请输入一个小于60的数字", + "操作成功": "操作成功", + "管理员密码相同,无需修改": "管理员密码保持一致,无需修改", + "请输入6-9位数字": "长度为6 ~ 9位", + "请输入6-9位管理员密码": "请输入6-9位的管理员密码", + "请输入新的管理员密码": "请输入新的管理员密码", + "未分组": "未分组的", + "请输入分组名称": "创建组", + "创建成功": "创建成功", + "设置锁分组成功": "设置锁组成功", + "电池1电量": "电池1", + "电池2电量": "电池2", + "电量更新时间": "电池更新时间", + "锁电量更新成功": "锁定电源更新成功", + "您的钥匙未生效": "你的钥匙没用", + "您的钥匙已冻结": "你的钥匙被冻住了", + "您的钥匙已过期": "您的钥匙过期了", + "常开模式开启": "锁处于通道模式", + "超级管理员": "超级管理员", + "授权管理员": "使管理", + "普通用户": "普通用户", + "余": "平衡", + "天": "一天", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "删除锁后,所有信息将被一并删除,您确定要删除锁吗?", + "请输入登录密码": "请输入应用程式密码", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "删除设备失败,请确保设备在设备附近,设备未连接,设备已打开", + "用户无权限": "用户没有权限", + "创建公司后,考勤功能才能使用": "请先创建一个公司", + "是否删除钥匙?": "删除这个密钥?", + "邮箱绑定成功": "邮件绑定成功", + "手机绑定成功": "手机绑定成功", + "网络访问失败,请检查网络是否正常": "请求失败。网络不可用,请检查并连接到3G/4G/WIFI", + "清空": "清晰的", + "是否清空?": "清楚了吗?", + "消息详情": "消息信息", + "创建时间": "创建时间", + "管理员详情": "管理员详细信息", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "如果有人强迫你开门,你可以用这张卡。告警信息将被发送给管理员。要使用此功能,请确保您的锁处于在线状态。", + "请不要将胁迫卡用于日常开锁": "请不要在日常使用中使用强制卡。", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "如果有人强迫你开门,你可以用这个指纹。告警信息将被发送给管理员。要使用此功能,请确保您的锁处于在线状态。", + "请不要将胁迫指纹用于日常开锁": "请不要日常使用强制指纹。", + "创建公司": "创建一家公司", + "公司名称不能超过30个字符": "公司名称不能超过30个字符", + "公司名称不能小于6个字符": "公司名称不能少于6个字符", + "WIFI列表": "无线网络列表", + "刷新": "刷新", + "手动配网": "人工配电网", + "远距离": "长途", + "中距离": "中等距离", + "近距离": "短的距离", + "锁时间更新成功": "锁定时间更新成功", + "锁用户": "锁定用户", + "请选择常开日期": "请选择开放日期", + "结束时间不能小于开始时间哦": "结束时间不能小于开始时间", + "介绍": "我们的故事", + "个人信息收集清单": "个人信息收集清单", + "应用权限说明": "应用权限说明", + "第三方信息共享清单": "第三方信息共享列表", + "请选择您的位置": "请选择您的位置", + "请先选择位置": "请先选择位置", + "管理员密码": "管理员密码", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "如果需要修改,请输入新的管理员密码(6位数字),单击“确定”进行修改", + "修改": "修改", + "网络摄像头": "相机", + "重命名": "重命名", + "分组下的锁将被移到未分组里": "组下的锁将移至未分组状态", + "编辑成功": "编辑成功", + "厂商": "制造商", + "型号": "模型", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "密码生成后,请在当天23:59之前使用一次激活,否则0点后无效。密码激活后,在有效期内可以无限次使用。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "密码生成后,请在当天23:59前使用,否则0点后无效。清除码用于清除今天0点之前产生的所有密码。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "密码生成后,请在当天23:59前使用,否则0点后无效。", + "清空密码底部提示": "密码有效期到清空当天23:59\n空内容1:当天0:00之前生成的所有密码(0:00之后生成的密码不受清除密码影响,可继续使用)\n空内容2:清空密码所有自定义密码(已使用和未使用)在使用后立即清空\n要完全清除所有密码,请使用“重置所有密码”功能", + "相机": "相机", + "相册": "照片", + "读写": "存储", + "定位": "位置", + "需要访问相机权限才能拍照上传文件例如头像上传": "需要使用摄像头拍照和上传文件,例如上传头像", + "需要访问相机权限才能使用相册图片上传文件上传头像": "使用相册图片上传文件和头像需要访问摄像头", + "需要访问读写权限才能使用本地图片上传头像": "使用本地映像上传头像需要具有读写权限", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "使用add键功能需要访问位置信息", + "申请": "应用程序", + "权限": "许可", + "不允许": "不允许", + "允许": "允许", + "权限被拒绝": "没有权限", + "请手动在系统设置中开启": "请在系统设置中手动启用", + "权限以继续使用应用": "继续使用应用程序的权限。", + "去设置": "把它设置好", + "当前网络": "当前网络", + "位置信息": "位置信息", + "请输入wifi名称": "请输入wifi名称", + "虹膜": "虹膜", + "手掌": "棕榈", + "商城": "购物中心", + "我的": "我的", + "微信公众号推送": "微信公众账号", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "打开微信接收报警信息,需先关注天凯智能锁微信公众账号,保存二维码后使用微信扫描设置", + "蓝牙": "蓝牙", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "使用add key功能的位置信息需要有蓝牙权限", + "请输入Email": "输入你的电子邮箱", + "请输入手机号": "输入您的电话号码", + "家人到家": "家人到家了", + "添加家人": "添加家庭成员", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "如果锁具未联网,则无法及时发送密码、刷卡、指纹等开门方式的提醒。", + "消息提醒": "提醒", + "开门通知": "开始注意到", + "N天未开门": "N天没有开门", + "门未关好": "门没关", + "防拆报警": "防拆报警", + "低电量提醒": "电池电量过低", + "胁迫开门": "强行开门", + "有人按门铃": "有人按了门铃", + "有人出现在门口": "有人出现在门口", + "提醒方式": "提醒方法", + "开门方式": "开门法", + "请选择": "请选择", + "家人": "家庭成员", + "保存": "保存", + "APP推送": "应用推", + "管理员": "管理", + "未启用": "未启用", + "已启用": "启用", + "省电模式": "省电模式", + "逗留抓拍模式": "停留捕获模式", + "实时监控模式": "实时监控模式", + "自定义模式": "自定义模式", + "猫眼设置": "猫眼设置", + "猫眼工作模式": "猫眼工作方式", + "自动亮屏": "自动亮屏", + "亮屏持续时间": "屏幕准时", + "逗留警告": "保持警告", + "异常警告": "异常的警告", + "短信提醒": "短信", + "邮件提醒": "电子邮件", + "N天未开门提醒": "N天没有开门", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "如果有人强迫你开锁,你可以用这个指纹。告警信息将被发送给管理员。要使用此功能,请确保您的锁处于在线状态。", + "胁迫指纹": "迫使指纹", + "指纹列表": "指纹列表", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "在设定时间后,如果锁未打开,系统将发送提醒信息给指定的收件人。此功能要求锁连接到互联网。", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "开启提醒功能后,当锁定电池电量低于20%、10%和5%时,系统会向指定的接收人发送提醒信息。", + "未开门时间": "不开门的日子", + "添加和使用面容开锁时:": "解锁时添加和使用Face:", + "关锁": "关闭锁", + "功能": "函数", + "配件": "部分", + "云存": "云存储", + "本地": "本地", + "3天滚动储存": "3天滚动存储", + "去升级": "现在升级", + "下载列表": "下载列表", + "已下载": "下载", + "全部视频": "所有的视频", + "已为本设备免费提供3大滚动视频储存服务": "该设备已免费提供三次滚动视频存储服务", + "视频播放": "视频播放", + "全选": "所有", + "请选择要删除的视频": "请选择要删除的视频", + "请选择要下载的视频": "请选择您要下载的影片", + "欢迎使用": "欢迎使用", + "用户协议和隐私政策概要": "用户协议和隐私政策摘要", + "协议概要": "协议总结", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "感谢您使用此应用程序。我们非常重视您的个人信息和隐私保护。使用本产品前,请仔细阅读", + "《用户协议》": "用户条款", + "和": "和", + "《隐私政策》": "“私隐政策”", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”,即表示您同意并接受所有条款。如果您选择不同意,您将不能使用我们的产品和服务,并将退出应用程序。", + "不同意": "不同意", + "同意": "同意", + "该功能是高级功能,请开通后再使用": "这是高级功能。请先启用它。", + "常用程序": "常见的项目", + "该锁已被重置": "锁已重置", + "需要访问读写权限才能使用手动升级固件": "手动升级固件需要具有读写权限", + "错误D固件,请选择正确的文件": "固件错误,请选择正确的文件", + "非SYD固件,请选择正确的文件": "非SYD固件,请选择正确的文件", + "文件校验失败 0x01": "文件验证失败0x01", + "解析元数据失败,请选择正确的文件": "解析元数据失败,请选择正确的文件", + "文件校验失败 0x02": "文件校验失败0x02", + "文件校验失败 0x03": "文件验证失败0x03", + "固件升级完成": "固件升级完成", + "记录": "记录", + "开通高级功能后才可以对锁进行管理": "请先开启高级功能对锁进行管理。", + "去开通": "启用", + "实名认证": "实名认证", + "当前剩余数量": "剩下的", + "购买": "买", + "实名认证为付费功能,请购买后再使用": "实名认证为付费功能,请购买后使用", + "密码不一致哦": "密码不一致", + "退出添加": "退出添加", + "管理员已满": "管理全", + "用户已满": "用户已满", + "锁上面添加指纹已满": "添加指纹锁已满", + "指纹已存在": "指纹已经存在。", + "锁上面添加人脸已满": "上面加脸锁满了", + "人脸已存在": "脸已经存在了", + "锁上面添加卡已满": "以上加卡锁定已满", + "卡已存在": "卡已存在", + "锁上面添加密码已满": "上面的锁添加密码已满", + "密码已存在": "已经存在相同的密码。请选择一个不同的", + "请输入密码": "请输入密码", + "暂无密码,无需重置": "无需密码,无需重置", + "真实姓名": "的真实姓名", + "身份证号": "身份证号码", + "请输入真实姓名": "请输入您的真实姓名", + "请输入身份证号": "请输入您的身份证号", + "请输入身份证号和真实姓名": "请输入您的身份证号和真实姓名", + "点击返回设备配对": "轻按“返回设备配对”", + "无法连接?尝试升级": "不能连接?尝试升级", + "固件升级提示": "固件升级提示", + "请先获取固件文件到手机本地,再选择升级": "请先获取固件文件到本地,然后选择“升级”", + "固件升级中": "固件正在升级", + "取消升级": "取消升级", + "固件传输中": "传输中的固件", + "关闭": "关掉", + "传输中'": "在运输过程中", + "操作记录": "记录", + "修改姓名": "编辑的名字", + "传输中": "在运输过程中", + "发送人": "发行的", + "发送时间": "一次发布", + "钥匙详情": "ekey信息", + "姓名": "名字", + "发送": "发送", + "请确认姓名全名和身份证号码是否正确": "请确认全名和身份证号是否正确", + "传输期间请勿离开当前页面": "在传输过程中不离开当前页面", + "机型": "模型", + "硬件版本": "硬件版本", + "固件版本": "固件版本", + "手动升级": "手动升级", + "设备连接中...": "设备连接…", + "未避免异常情况,请在门打开时升级": "不可避免的例外,请在门打开时升级", + "钥匙无效": "密钥无效", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "无法连接到锁。请重新启动您的手机蓝牙,然后再试一次。", + "如果是全自动锁,请使屏幕变亮": "如果是全自动锁,请将屏幕调亮", + "正在尝试闭锁……": "试图锁定。请稍等…", + "清空记录": "清晰的记录", + "是否要删除操作记录?": "继续删除记录?", + "被删除的记录不能恢复": "记录删除后将无法恢复。", + "全部事件": "所有事件", + "开锁事件": "打开事件", + "异常事件": "异常事件", + "门铃事件": "门铃事件", + "视频事件": "视频事件", + "请开启蓝牙": "请打开蓝牙", + "请选择有效日": "请选择生效日期", + "公司名字长度不能小于 6 ": "公司名称的长度不能小于6", + "已是最新版本": "没有更新", + "一": "一个", + "二": "两个", + "三": "三个", + "四": "四个", + "五": "五个", + "六": "六个", + "日": "太阳", + "新建短信模版": "伟大的短信模板", + "新建邮件模版": "创建电子邮件模板", + "自定义短信模版": "短信模板", + "自定义邮件模版": "电子邮件模板", + "名称": "名字", + "星星锁": "星锁", + "无考勤记录": "没有记录", + "大家干劲十足": "每个人都及时到来", + "工作时长未出炉": "无工作时间", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "国家/地区的选择会影响数据安全。您目前已选择阿尔巴尼亚,请确认后再继续。", + "确认国家或地区": "确认国家/地区", + "我知道了": "明白了吗", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "要接收重要的更新,请点击“确定”并在设置中启用通知。", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "开机后,可以长按锁上的设置键重新开机,用APP重新添加", + "已有": "当前的", + "新增": "新", + "账号格式错误": "坏的格式", + "接收者信息为空": "收件人信息为空", + "请输入时间(秒)": "请输入时间(秒)", + "加载数据失败": "加载数据失败", + "重试": "再试一次", + "升级中,是否退出": "升级过程中,是否退出", + "下一步": "下一个", + "公寓": "公寓", + "个人用户": "个人", + "星寓": "明星的公寓", + "账号": "账户", + "请输入手机号或email": "电话号码或电邮地址", + "请输入星寓管理员的账号": "请输入星级公寓管理员账号", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "所选锁的所有数据将永久传输给接收方。", + "暂不支持跨平台转移,敬请期待": "跨平台传输暂时不支持,敬请期待", + "移除坏锁": "移动故障/损坏的锁到垃圾桶", + "转移确认": "确认转让", + "本次共转移": "这次共", + "把智能锁": "智能锁", + "确认": "好吧", + "移除成功": "删除成功", + "转移成功": "转移成功", + "该已锁被删除": "被锁的被删除", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "被授权的管理员只能管理自己创建的密码、密钥等。", + "添加授权管理员": "创建管理", + "导出记录": "出口记录", + "选择时间段": "选择时间段", + "导出": "出口", + "批量导出": "批量出口", + "读取记录": "刷新记录", + "设备": "设备", + "消息": "消息", + "智能分析": "智能分析", + "精准识别设备事件,过滤无效信息": "准确识别设备事件,过滤掉无效信息", + "系统设置": "系统设置", + "系统的全局配置在此项内进行设置": "在此设置系统的全局配置", + "导出操作记录": "出口记录", + "立即查看": "视图", + "导出成功": "导出成功", + "发送钥匙": "发送ekey", + "进度": "率", + "失败": "失败的", + "人脸详情": "面对细节", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "当感应到门前1.5米左右有人时,人脸识别解锁会自动启动。", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "当感应到门前0.8米左右有人时,人脸识别解锁会自动启动。", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "当感应到门前0.5米左右有人时,人脸识别解锁会自动启动。", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,您需要手动触摸键盘上的任意键进行人脸识别解锁。", + "防误开已打开,开锁后": "防误开启已开启,解锁后", + "秒内不可使用面容开锁": "面部解锁不能在几秒钟内使用", + "掌静脉": "手掌静脉", + "添加掌静脉": "添加掌脉", + "胁迫掌静脉": "强迫掌静脉", + "请不要将胁迫掌静脉用于日常开锁": "请不要使用强制掌纹进行日常解锁", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "接通锁后,请自然张开手掌,掌心正对摄像头", + "掌静脉详情": "手掌静脉细节", + "掌静脉号": "掌脉数", + "蓝牙未打开,请到设置里面打开蓝牙": "蓝牙未开启,请在设置中开启蓝牙", + "删除用户时,会将用户拥有的钥匙一起删除。": "如果用户被删除,与该用户关联的所有ekey也将被删除。", + "配置网络": "配置网络", + "你好": "你好", + "成功": "成功的", + "类型选择": "类型选择", + "请选择要使用哪种类型": "请选择要使用的类型", + "系统邮件(推荐)": "系统邮件(推荐)", + "系统短信(推荐)": "系统短信(推荐)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "邮件将从这个应用程序发送。请先购买邮件包。", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "短信将从这个应用程序发送。请先购买电子邮件包。", + "个人邮件": "个人电子邮件", + "个人短信": "个人短信", + "邮件将从你的个人邮箱发给用户": "电子邮件将从您的个人电子邮件帐户发送。", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "短信将从您的个人电话号码发送。你付钱给你的电信运营商。", + "为了更好地应用体验,请确定权限": "为了获得更好的应用体验,请确认权限", + "您第一次拒绝权限,请确定权限": "您是第一次拒绝权限,请确认权限", + "您第二次拒绝权限,请去应用设置开启权限": "您第二次拒绝了权限,请转到应用程序设置中启用权限", + "去应用市场": "去应用商店", + "温馨提示": "温馨提示", + "关闭应用": "关闭应用程序", + "开启微信接收报警消息需要先关注": "打开微信接收告警信息,需要执行以下操作", + "微信公众号,请保存二维码并使用微信扫一扫设置": "微信公众号,保存二维码,使用微信扫描设置", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "实名认证为付费功能,请联系锁具管理员购买和使用", + "位置权限": "位置的许可", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "请允许应用程序使用您的位置。用于扫描BLE锁和网关。", + "相机/相册权限": "相机/相册权限", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "请允许应用程序从存储中读取和写入照片和文件。", + "点击选择": "按此选择", + "微信": "微信", + "朋友圈": "时刻", + "QQ": "QQ", + "QQ空间": "时不时神光", + "微博": "微博", + "FaceBook": "脸谱网", + "链接": "链接", + "今天": "今天", + "密码错误": "无效的密码", + "网络中断": "网络中断", + "钥匙不存在": "键不存在", + "钥匙过期": "关键过期", + "钥匙已存在": "密钥已存在", + "密码失效": "密码无效", + "门锁时间异常": "门锁时间异常", + "APP(手机)未联网": "APP(手机)未连接互联网", + "数据不存在": "数据不存在", + "待接收": "BeReceived", + "已冻结": "冻", + "已删除": "删除", + "未知": "未知的", + "拖动下方滑块完成拼图": "将滑块拖动到正确的位置", + "验证成功": "验证成功", + "验证失败": "验证失败", + "向右拖动滑块填充拼图": "向右拖动滑块来填充拼图", + "请先获取到位置信息哦": "请先获取位置信息", + "请选择国家": "请选择国家", + "获取锁信息": "获取锁信息", + "锁数据异常,请重试": "锁数据异常,请重试", + "连接设备中...": "连接设备……", + "把锁": "锁", + "条": "带", + "封": "密封", + "次": "次", + "支付成功": "支付成功", + "查看详情": "查看详细信息", + "请输入模板名称": "请输入模板名称", + "模版类型": "类型", + "再返回一次退出": "再退出", + "请先添加锁": "请先加锁", + "可视对讲": "可视对讲系统", + "详细日志": "详细的日志", + "已复制到剪切板": "复制", + "拍照": "照片", + "从相册选择": "从相册中选择", + "选择问题": "请选择问题", + "确认长度不足8位": "确认长度小于8位", + "新密码长度不足8位": "新密码长度小于8位", + "两次密码不一致": "密码不匹配。请再试一次", + "请点击获取验证码,验证码将发送到": "请获取验证码。代码将被发送到", + "切换": "开关", + "验证": "验证", + "验证成功,账号已删除": "验证成功,帐户已删除", + "该密码不是自定义密码,无法修改": "该密码不是自定义密码,不能修改", + "请选择设备要关联哪些姓名": "请选择该设备应关联的名称", + "请选择姓名要关联哪些设备": "请选择该名称应关联的设备", + "确定要移除所选中的坏锁吗?": "拆下故障锁?", + "邮件通知": "通过电子邮件通知", + "短信通知": "短信通知", + "您好,您的授权管理员生成成功": "您好,您的授权管理员已成功生成", + "请输入接收者姓名": "请在这里输入", + "版本更新": "版本更新", + "下次再说": "下次", + "配网成功": "网络分销成功", + "配网失败": "网络分发失败", + "该锁的无线键盘都将被删除": "此锁的所有无线键盘将被删除", + "实时画面": "实时图片", + "适合门口较为安全的环境。": "适用于相对安全的门口环境。", + "仅发生特定事件才录像,并可查看实时画面。": "只记录特定的事件,可以查看实时画面。", + "一般情况下,满电可使用7-8个月": "正常情况下,充满电后可使用7-8个月", + "有人逗留或发生特定事件才录像,可随时查看": "有人停留或特定事件被记录下来,可以随时查看", + "实时画面。": "实时画面。", + "一般情况下,满电可使用5~6个月。": "正常情况下,充满电后可使用5~6个月。", + "适合门口人员复杂、较不安全的环境。": "适用于复杂且相对不安全的门口环境。", + "有人出现就录像,可随时查看实时画面。": "有人出现时进行记录,随时查看实时画面。", + "一般情况下,满电可使用2~4个月。": "正常情况下,充满电后可使用2~4个月。", + "根据您家门口实际情况设置录像和实时画面功能。": "根据门口的实际情况设置视频和实时图片功能。", + "可使用时长由具体设置决定。": "使用时间由具体设置决定。", + "查看": "视图", + "有人按门铃或发生": "有人按门铃或者", + "异常事件时": "异常事件", + "不录像": "没有视频", + "有人出现、按门铃": "有人出现,按了门铃", + "或发生异常事件时": "或者发生异常事件", + "逗留达到10秒": "停留10秒", + "约1.5米": "约1.5米", + "随时": "任何时候", + "立即录像": "立即记录", + "录像时机": "视频时间", + "有人出现时录像": "记录某人出现的时间", + "人体侦测距离": "人体探测距离", + "查看实时画面": "查看实时图片", + "自定义时间": "自定义时间", + "当日": "今天", + "次日": "第二天", + "自定义时段": "自定义时间段", + "发生事件时查看": "查看事件发生的时间", + "实时查看": "实时视图", + "有人在门口出现10秒后开始录像。": "有人在门口出现了10秒钟才开始录音。", + "有人按门铃时立即录像。": "当有人按门铃时,立即记录。", + "有人出现在门前1.5米范围时启动录像": "当有人出现在门前1.5米范围内时开始录制", + "约0.8米": "约0.8米", + "约3.0米": "约3.0米", + "添加指纹失败": "操作失败。", + "项": "项目", + "播放中": "玩", + "下载": "下载", + "暂无下载内容": "无下载内容", + "亮度": "亮度", + "音量": "体积", + "快进至": "快进到", + "快退至": "倒带,", + "暂无视频信息": "无视频信息", + "加载出错": "加载错误", + "请单人正对门锁,距离一个成年人手臂长度": "请独自站在门锁前,与门锁保持一臂的距离", + "(约0.6米)。": "(约0.6米)。", + "保持脸部无遮挡,露出五官。": "保持面部畅通,展示面部特征。", + "准备好了,开始添加": "准备好,开始添加", + "正在录入中...": "记录……", + "添加人脸失败": "添加脸失败", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "重置后,锁的面将被删除。你确定要重置吗?", + "人脸号": "面对数量", + "虹膜详情": "虹膜的细节", + "虹膜号": "虹膜数量", + "选择设备类型": "选择设备类型", + "照明灯具": "照明灯具", + "电动窗帘": "电动窗帘", + "门窗传感器": "门窗传感器", + "传感器": "传感器", + "清除数据成功": "数据清除成功", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "锁具没有联网,无法实时上传密码、刷卡、指纹等开门方式的记录。", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "如果需要保留历史记录,可以将历史记录导出。", + "看不到操作记录,可能原因有": "无法看到操作记录,可能原因", + "操作记录详情": "操作记录明细", + "操作时间": "操作时间", + "此模块功能需要锁联网后设置方可生效": "此模块功能需要在锁连接到互联网后进行设置才能生效", + "用户已存在": "用户已存在", + "钥匙数量已到上限": "键数已达到上限", + "附近没有可用网关": "附近没有可用的网关", + "正在创建安全连接...": "创建安全连接…", + "监视状态下不能发送录音": "监控模式下无法发送录音", + "挂断": "挂断电话", + "监视中暂不能开锁": "在监控期间不可解锁", + "长按说话": "长按说话", + "松开发送": "释放发送", + "请输入6位数字开锁密码": "请输入6位数的解锁密码", + "请输入开锁密码": "请输入解锁密码", + "接收者在有效期内可以不限次数使用": "收件人可在有效期内无限次使用电子密钥。", + "接收者可以使用此App开关锁": "收件人可以通过此应用程序锁定/解锁。", + "单次钥匙有效期为1小时,只能使用一次": "“一次性钥匙”有效期为一小时,只能使用一次。", + "接收者可以在有效期内的固定时间段里,不限次数使用": "收件人可以在固定的周期内无限次地使用密钥。", + "获取模板失败": "日志含义获取模板失败", + "微信通知": "微信通知", + "系统短信": "系统短信", + "系统邮件": "系统邮件", + "模板": "模板", + "新建模版": "创建模板", + "您好,您的密码是": "你好,你的密码是", + "密码名字": "密码的名字", + "请输入6-9位密码": "请输入6-9位的密码", + "设置密码": "设置密码", + "操作成功,密码为": "成功了。密码是", + "类型:自定义-永久": "类型:Custom-Permanent", + "实时播放": "实时播放", + "点击对讲": "点击对讲机", + "长按开锁": "长按解锁", + "接听失败": "没能回答", + "请在锁设置中开启远程开锁": "请在锁定设置中开启远程解锁", + "接听": "回答", + "截图已保存到相册": "截图保存到相册", + "添加遥控": "添加远程控制", + "已连接到锁,请按遥控": "连接上锁后,请按下遥控器", + "遥控号": "遥控号码", + "遥控详情": "遥控细节", + "照明": "照明", + "退出演示模式": "退出演示模式", + "提示:当前界面为展示界面,添加设备后才能继续使用": "提示:当前接口是显示接口。添加设备后,您可以继续使用设备", + "门已上锁": "门是锁着的", + "您的账号在异地登录,如非本人,请尽快修改密码": "您的帐户已用于从新设备登录", + "开门成功": "成功开门", + "开门失败": "没能打开门", + "呼叫提醒": "电话提醒", + "收到来自": "收到", + "锁的呼叫": "锁调用", + "加载数据中": "加载数据", + "搜索所有锁类型": "搜索所有锁类型", + "锁电量更新时间": "锁定电池更新时间", + "1月": "1月", + "2月": "2月", + "3月": "3月", + "4月": "4月", + "5月": "可以", + "6月": "小君", + "7月": "7月", + "8月": "8月", + "9月": "9月", + "10月": "10月", + "11月": "11月", + "12月": "12月", + "热门城市": "炎热的城市", + "导出锁数据": "导出锁数据", + "一键开锁": "一键解锁", + "已开通": "打开", + "英文": "英语", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "法语", + "俄语": "Русский", + "德语": "多伊奇", + "日语": "日本語", + "韩语": "嘻嘻哈哈", + "意大利语": "意大利语", + "乌克兰语": "Українська", + "葡萄牙语": "葡萄牙商业银行", + "西班牙语": "西班牙语", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "马来语", + "荷兰语": "荷兰语", + "罗马尼亚语": "罗马ă", + "立陶宛语": "Lietuvių", + "瑞典语": "瑞典语", + "爱沙尼亚语": "Eesti", + "波兰语": "波兰语", + "斯洛伐克语": "懒散的人č艾娜", + "捷克语": "Češ蒂娜", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Turkce", + "匈牙利语": "马札尔人的", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "印度尼西亚语", + "芬兰语": "芬兰语", + "丹麦语": "丹麦语", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,锁上的掌骨静脉会被删除。你确定要重置吗?", + "在线": "在线", + "离线": "离线", + "购买记录": "购买记录", + "使用记录": "用户记录", + "失效时间要大于当前时间": "过期时间必须大于当前时间", + "修改名字": "编辑的名字", + "时": "小时", + "分": "一分钟", + "Amazon Alexa": "亚马逊Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa解锁,锁定和检查锁定状态", + "支持的国家": "支持国家", + "支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本", + "操作流程": "操作过程", + "操作流程值": "1通过智能锁APP添加锁和网关\n\n2在APP中开启该锁的远程开锁功能(默认关闭)。如果你没有这个选项,锁不支持Alexa\n\n3向Alexa添加技能,并使用智能锁APP的账号和密码进行授权。授权成功后,可以发现该帐号下的设备\n\n4在Alexa app中找到需要解锁的锁,打开语音解锁功能,设置语言密码\n\n5锁可通过Alexa操作", + "Google Home": "谷歌的家", + "Action name": "动作名称", + "ScienerSmart": "ScienerSmart", + "支持的语言": "支持的语言", + "英语": "英语", + "Google Home操作流程的值": "1. 通过智能锁APP添加锁和网关\n\n2. 在APP中开启锁的远程开锁功能(默认关闭)。如果没有这个选项,锁不支持谷歌Home\n\n3. 安装谷歌Home APP,点击左上角的“+”按钮\n\n4. 在“设置”页面,选择“使用谷歌”。\n\n5. 搜索“ScienerSmart”,使用智能锁APP账号和密码进行授权", + "密码需至少包含数字/字母/字符中的2种组合": "密码必须包含数字、字母和特殊字符中的至少2种", + "已开锁": "解锁", + "已闭锁": "锁着的", + "两次密码不一致哦": "密码不一致", + "中功率": "媒介权力", + "常规使用": "经常使用", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "待设备上电后,长按复位键5秒,指示灯交替闪烁后,单击“下一步”", + "扫描设备": "扫描设备", + "删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败。网关可能已经脱机。是否要强制删除数据?", + "超级管理员英文": "超级管理员", + "授权管理员英文": "使管理", + "普通管理员英文": "普通用户", + "网关设备英文": "网关设备", + "手机需联网英文": "手机需联网", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json new file mode 100644 index 00000000..d4dd8fd3 --- /dev/null +++ b/lan/lan_hr.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Zvjezdana brava", + "锁通通": "Zaključaj kroz", + "点击开锁,长按闭锁": "Dodir za otključavanje, drži na zaključanje", + "考勤": "Prisustvo", + "考勤设置": "Postavke prisustve", + "电子钥匙": "EKeys", + "添加卡": "Dodaj kartu", + "卡号": "Broj karte", + "添加指纹": "Dodaj otisak prsta", + "指纹号": "Broj otiska prsta", + "遥控": "Udaljena", + "添加人脸": "Dodaj lice", + "门锁日志": "Dnevnik zaključavanja vrata", + "密码号": "Broj lozinke", + "添加者": "Operator:", + "添加时间": "Vrijem", + "重置": "Resetuj", + "请输入手机号或者邮箱": "Telefonski broj ili email", + "工作时间": "Radno vrijeme:", + "工作日设置": "Postavka radnog dan", + "星期一": "Ponedjeljak.", + "星期二": "Utorak", + "星期三": "Srijeda", + "星期四": "Četvrtak", + "星期五": "Petak.", + "星期六": "Subota.", + "星期日": "Nedjelja", + "简写周一": "M", + "简写周二": "T.", + "简写周三": "W", + "简写周四": "T.", + "简写周五": "F.", + "简写周六": "S", + "简写周日": "S", + "周一": "Man", + "周二": "Tv", + "周三": "Venèanje", + "周四": "T.", + "周五": "Pec", + "周六": "Sat", + "周日": "Sunce", + "群发钥匙": "Pošalji višestruke eeke", + "锁": "Zaključaj", + "请添加": "Korisnik", + "允许远程开锁": "Udaljeni otključan", + "请输入验证码": "Oznaka provjere", + "获取密码": "Generiraj lozinku", + "请给密码命名": "Unesite ime za ovaj lozinka", + "密码有限期为6个小时,只能使用一次": "Ovaj šifra mora biti korištena u roku od 6 sati od trenutnog vremena ili će biti SUSPENDEN iz sigurnosnih razloga. Ovaj šifra može se koristiti samo jednom.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Ručno unesite 6-9 znamenke kao lozinku. Može se dodati putem telefona Bluetooth pored brave ili daljinsko dodavanje kroz prolaz", + "获取": "Uzmi.", + "添加": "Dodaj", + "删除公司": "Obriši kompaniju", + "密码详情": "Info lozinka", + "修改密码": "Promijeni lozinku", + "添加虹膜": "Dodaj Iris", + "添加门磁": "Senzor vrata", + "添加无线键盘": "Bežične tastature", + "添加手掌": "Dodaj palme", + "请输入员工账号": "Unesite račun zaposlenika", + "批量授权锁": "Odobri višestruke brave", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Ovlašteni administrator će imati većinsku dozvolu da upravlja ovu bravu.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ova značajka vam omogućuje otključavanje Pametne Zaključanja daljinski putem Gatewaya. Ova Feature se može samo uključiti ili isključiti putem Bluetooth.", + "排列方式": "Tip liste", + "早到榜": "Rana lista", + "迟到榜": "Lista", + "当前模式": "Trenutni način", + "勤奋榜": "Radna popisa", + "延迟时间": "Vrijeme kašnjenja", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Brava će se automatski zaključati nakon vremena.Molim vas otključajte ga prvi put kako bi postavljanje na raspolaganje.", + "时间": "Vrijem", + "开始时间": "Početno vrijeme:", + "结束时间": "Završni vrijeme", + "工作时间设置": "Postavljanje radnog vremena", + "常开模式": "MODA", + "常开时间": "U ovom vremenskom razdoblju.", + "常开日期": "Na ovih dana", + "添加员工": "Dodaj osoble", + "节假日": "Odmor.", + "打卡方式": "Metoda", + "员工是否有钥匙": "Već ima ekey", + "上班时间": "Početno vrijeme:", + "下班时间": "Vrijeme zatvaranja", + "本周": "Ovaj tjedan.", + "单休": "Jednogadnevnog vikenda", + "双休": "Dvodnevni vikend.", + "单双休": "Jedan-dva dana vikend.", + "年": "Godina", + "月": "Mjesec", + "放假日期": "Odmor.", + "补班日期": "Radni dani", + "添加假日": "Dodaj odmor.", + "开始日期": "Početni datum", + "必填": "Potrebno", + "结束日期": "Završni datum", + "日榜": "Dnevno", + "月榜": "Mjesečno", + "考勤记录": "Snimi snimku", + "假日信息": "Informacije o odmoru", + "基本信息": "Osnovno", + "无线键盘": "Bežične tastature", + "选择无线键盘": "Dodaj tastaturu", + "门磁": "Senzor vrata", + "自动闭锁": "Automatski zaključanje", + "锁声音": "Zaključaj zvuk", + "防撬报警": "Upozorenje", + "重置键": "Vrati dugme", + "锁时间": "Zaključaj sat", + "诊断": "Dijagnostik", + "上传数据": "Pošalji podatke", + "导入其他锁数据": "Uvezi iz druge brave", + "锁升级": "Ažuriranje", + "标记房态": "Stanje sobe", + "开锁提醒": "Obavijesti", + "微信二维码": "Otključaj QR kod.", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Ljudi sa elektronskim ključevima mogu otvoriti vrata skenirajući ovaj QR kod kroz WeChat. QR kod svake brave je drugaèiji. Možete ga odštampati i zalijepiti pored odgovarajuće brave", + "锁编号": "Broj zaključanja", + "电量": "Baterija", + "锁分组": "Zaključaj Grupu", + "选择分组": "Izaberite grupu", + "创建新分组": "Napravi Grupu", + "管理员开锁密码": "Admin lozinka", + "更新": "Ažuriraj", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Razina baterije će biti ažurirana putem gatewaya ili telefona bluetooth", + "当屏幕闪烁时,点击下一步": "Kliknite sljedeći kada se tastatura bliska", + "输入*529#或按设置键": "Unesite README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# ili pritisnite tipku podešavanja", + "长按重置键2秒": "Pritisnite i držite dugme za reset 2 sekundi", + "附近的设备": "U blizini oprema", + "暂无数据": "Nema podataka", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Moći ćete dobiti stanje vrata s vrat senzorom zajedno s prolazom. Samo jedan senzor može povezati s bravom.", + "开始": "Pokreni", + "全天": "Svi sati", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Možete postaviti više vremenskih razdoblja za prolazne načine.U postavljenim vremenskim razdobljima, brava će ostati u otvorenom stanju nakon otključavanja.", + "请选择锁音量": "Odaberite disk zaključanje", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Ukljuèujuæi, èuæeš zvuk iz brave.", + "低": "Nisko", + "较低": "Srednje nizke", + "中": "Srednjeg", + "较高": "Srednje visoko", + "高": "Visok", + "开启后,锁被撬动时,会发出报警声": "Uključujući, omogućujete TAMPER uzbunu.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Isključivanjem, dugme RESET je isključeno.", + "校准时间": "Kalibriraj vrijeme.", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Dijagnoza je pročitati konfiguracijske informacije unutar brave i učitati ih tako da osoblje može analizirati uzrok neuspeha.", + "上传": "Slaz", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Preuzmite podatke iz brave na poslužitelj.To može potrajati nekoliko minuta.", + "请选择要从哪把锁导入": "Izaberite zaključavanje iz koje će se uvozi", + "有新版本": "Imam novu verziju", + "当前版本": "Trenutna verzija:", + "升级": "Ažuriraj", + "空闲": "Prazno", + "已入住": "Zauzeto", + "多语言": "Jezici", + "添加锁": "Dodaj zaključanje", + "锁地址": "Zaključaj adresu", + "选择锁类型": "Odaberite tip zaključanja", + "NFC无源锁": "NFC pasivna zaključanja", + "添加设备": "Dodaj uređaj", + "网关": "Prolaz", + "客服": "Usluga korisnika", + "设置": "Postavke", + "更多设置": "Više postavljeno", + "消息推送": "Potisni obavijesti", + "锁用户管理": "Zaključaj korisnike", + "拥有的钥匙": "EKeys povezani s ovim korisnikom", + "批量授权": "Upravljanje nadležnim tijelima", + "关联设备": "Pridruženi uređaj", + "关联姓名": "Pridruženo ime", + "转移智能锁": "Zaključavanje prijenosa", + "选择锁": "Zaključavanje ekrana", + "接收人信息": "Korisnik", + "转移网关": "Prijevoz", + "锁屏": "Zaključavanje ekrana", + "已关闭": "Isključeno", + "已开启": "_Poslušaj", + "开启": "Укључи", + "确定要开启重置键?": "Nastavite omogućiti dugme Reset?", + "确定要关闭重置键?": "Nastaviti isključivati dugme Reset?", + "隐藏无效开锁权限": "Sakrij nevažeći pristup.", + "APP开锁时需手机连网的锁": "Brave koje zahtijevaju telefon na internetu", + "增值服务": "Usluge", + "关于": "O tome", + "退出": "Odjavi", + "删除账号": "Obriši korisnički račun.", + "个人信息": "Informacije o računu", + "头像": "Avatar", + "昵称": "NickNameName", + "请输入昵称": "Molim, unesite svoj nadimak", + "修改昵称": "Preimenuj", + "修改账号": "Uredi korisnički račun.", + "重置密码": "Postavi lozinku", + "安全问题": "Sigurnosno pitanje", + "为了你的账号安全,修改账号前请先使用验证码验证": "Za sigurnost vašeg računa, molimo, koristite verifikaciju lozinke računa prije izmjene računa", + "请输入新账号": "Unesite novi korisnički račun.", + "找回密码和登录新设备时,可通过绑定的手机验证": "Broj vezivanja telefona će se koristiti za primanje Koda provjere.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Povezivanje e-pošte će se koristiti za primanje Provjere Koda.", + "原密码": "Trenutna lozinka", + "新密码": "Nova lozinka", + "确认密码": "Potvrdi lozinku", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "U slučaju da vaš telefon izgubi, možete se prijaviti na novi telefon odgovarajući na sigurnosna pitanja.", + "问题一": "Pitanje 1.", + "问题二": "Drugo pitanje", + "问题三": "Pitanje 3.", + "请输入你的答案": "Molim Vas upišite svoj odgovor.", + "即将到期": "Uskoro ističe.", + "去授权": "Idi na ovlaštenje", + "修改名称": "Ime", + "状态": "Status", + "WiFi名称": "WiFi ime", + "网络MAC": "Mrežni MAC", + "网关升级": "Ažuriranje", + "网关连接的锁": "Zaključavanje spojene na ovaj Gateway-u", + "信号强": "Snažno", + "选择网关类型": "Izaberi vrstu prolaza", + "添加网关": "Dodaj prolaz", + "重新通电": "Poveži moć", + "指示灯": "Svjetlo pokazatelja", + "选择网关": "Izaberite prolaz", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G nije podržan, molimo odaberite WiFi od 2.4G.", + "WiFi密码": "WiFi prolaz", + "请输入WiFi密码": "Unesite šifru WiFi", + "网关名称": "Ime prolaza", + "请输入网关名称": "Unesite ime Gateway-a", + "IP地址": "IP adresa", + "子网掩码": "Podmrežna maska", + "默认网关": "Uobičajeni prolaz", + "自动获取DNS服务器地址": "Automatski dobavi adresu DNS servera", + "首选DNS": "Željeni DNS", + "备选DNS": "Alternativni DNS", + "不使用静态IP": "Nema statičkog IP-a", + "使用静态IP": "Koristi statički IP", + "请输入IP地址": "Unesite IP adresu", + "请输入子网掩码": "Unesite podmrežnu masku", + "请输入默认网关": "Unesite uobičajeni prolaz", + "所有锁": "Sve brave", + "搜索所有类型的锁": "Skeniraj sve vrste brava", + "门锁": "Zaključavanje vrata", + "挂锁": "Zatvorenik", + "保险箱锁": "Sigurno zaključanje", + "智能门禁": "Inteligentna kontrola pristupa", + "车位锁": "Parkirna brava", + "摸亮触摸屏": "Dodirnite bilo koji tipku da biste aktivirali tastaturu", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Molimo dodirnite bilo koji ključ za aktiviranje brave i stavite ga u PAIRING Mode.Pritisnite sljedeći", + "附近的锁": "U blizini brave", + "如需修改名字请重新命名,点击确定添加锁": "Ako želite promijeniti ime, molimo preimenovati, kliknite OK da dodate zaključanje", + "添加锁时,手机必须在锁旁边": "Pri dodavanju brave, telefon mora biti uz brave", + "登录": "Prijavljivak", + "注册": "Prijavi", + "我已阅读并同意": "Èitao sam i pristao", + "验证码": "Kod", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Vaša lozinka mora imati 8-20 znakova i sadržavati najmanje dvije vrste brojeva, slova i simbola", + "手机": "Telefon:", + "邮箱": "Emal", + "请输入邮箱": "Unesite svoj email", + "国家/地区": "Država/Regija", + "你所在的国家/地区": "Vaša zemlja/regija", + "选择国家/地区": "Odaberite svoju zemlju ili regiju.", + "获取验证码": "Dobavi kodu", + "商务合作": "Posao", + "电脑网页版": "Web sistem", + "酒店系统": "Hotel sistem:", + "说明书网页版": "Korisnički priručnik", + "高级功能": "Napredna funkcija", + "记录保存": "Čuvanje zapisa", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS se može koristiti za slanje lozinke i ekey informacije primatelju.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mail se može koristiti za slanje lozinke i ekey informacije primatelju.", + "购买实名认证提示": "Nakon što je funkcija omogućena, morate koristiti svoj otisak prsta, lice ili lozinku na računu za otvaranje APP. Nema potrebe za potvrđivanje opet za 3 minute", + "请选择你希望的实名认证频次": "Molim izaberite frekvenciju pravog autentifikacije koju želite", + "仅首次": "Po prvi put.", + "每日一次": "Jednom dnevno.", + "每周一次": "Jednom tjedno.", + "每月一次": "Jednom svakog mjeseca", + "当前状态": "Trenutno stanje", + "试用中": "Na suđenju", + "高级功能权益内容": "Napredne funkcije", + "短信模板": "SMS predložak", + "邮件模板": "Predložak e- pošte", + "发卡工具": "Kodirač kartice", + "购买高级功能须知": "Obavijesti", + "购买高级功能提示": "Naprednije značajke su u razvoju, a ako ih trebate, dobrodošli ste otvoriti uslugu na temelju broja brava. Napredne značajke su dostupne samo za vaše brave. Ako ste ovlašteni administrator, kontaktirajte glavnog administratora brave kako biste otvorili uslugu", + "免费体验": "Besplatno ispitivanje", + "立即开通": "Otvori sad", + "购买短信": "Kupi SMS", + "购买邮件": "Kupi email", + "购买实名认证次数": "Kupnja Prava imena Vremena za autentifikaciju", + "开通高级功能": "Omogući naprednu funkciju", + "选择套餐": "Izaberi paket...", + "支付方式": "Način plaćanja", + "支付宝": "Alipah", + "去支付": "Isplati", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Možete sami definirati poruku.Koristi se za slanje informacija o lozinci i ekey drugima.", + "高级功能仅能用于你自己的锁": "Napredna funkcija može se primijeniti samo vlastite brave.", + "新建模板": "Napravi šablon", + "类型": "Tip", + "模版内容": "Sadržaj predložka", + "预览": "Pregled", + "房间名": "Soba", + "预计产生短信条数": "Procijenjeni segmenti poruka", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ova osobina omogućuje da sakrijete lozinke, keys, kartice i otiske prstiju koji su nevažeći za neko vrijeme.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Korisnički telefon mora biti online za otključavanje ovih odabranih brava pomoću APP.", + "配置WiFi": "Podešavanje WiFi", + "请输入WiFi名字": "Unesite WiFi", + "WiFi配网": "WiFi mreža distribucije", + "胁迫卡": "Stres kartica", + "员工是否有密码": "Već ima šifra...", + "员工是否有卡": "Već ima Kart", + "员工是否有指纹": "Već postavi otisak prsta", + "获取钥匙": "Dobi ključ", + "获取卡": "Dobavi kartu", + "获取指纹": "Dobavi otisak prsta", + "安全验证": "Provjera identiteta", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Sve informacije vašeg računa će biti uklonjene s platforme i neće se moći vratiti.Želite li izbrisati?", + "监控": "Monitor", + "视频日志": "Video dnevnik", + "开门器": "Otvarač vrata", + "面容开锁": "Otključa lice", + "开门方向设置": "Smjer otvaranja", + "电机功率设置": "Postavljanje MotorPowerName", + "开锁时是否需联网": "Ako je internet potreban prilikom otključavanja", + "选择要加入分组的锁": "Odaberite zaključavanje za dodavanje ovoj grupi", + "锁数量": "Broj zaključanje", + "小米IOT平台": "Xiaomi IOT platforma", + "面容开锁设置": "Postavljeno otključavanje lica.", + "感应距离": "Osjetljiva udaljenost", + "防误开": "Spriječi pogrešno otvaranje", + "防误开已关闭,关门后仍可使用面容开锁": "Sprečavanje otvaranja zatvoreno je, nakon zatvaranja vrata još uvijek može koristiti otključavanje lica.", + "添加和使用面容开锁时": "Dodaj i koristi lice pri otključanju", + "添加和使用面容开锁时提示": "\n1, molim vas, pokušajte držati jednu osobu ispred operacije vrata;\n2, molim vas stanite ispred vrata zaključavanje oko 0,5 ~ 0,8 metara, okrenuti na vrata;\n3. Molim vas držati svoje lice neprekidno i razotkriti svoje značajke lica;\n4. Kada je prepoznavanje lica nenormalno, možete dodirnuti bilo koje ključeve na digitalnoj tastaturi da bi ručno pokrenuti prepoznavanje lica.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Molim vas, odaberite motornu snagu pažljivo prema stvarnoj situaciji brave vrata:", + "小功率:": "Miniwatt:", + "耗电少": "Manja potrošnja energije", + "大功率": "Velika snaga:", + "大功率提示": "Ako se zaključavanje jezika ne može normalno uvlačiti prilikom otključanja ili se mora voziti.", + "开门方向设置提示": "Molimo pažljivo odaberite smjer za otvaranje vrata kuće (ako izaberete pogrešan smjer, Nećete moći otvoriti i zatvoriti vrata pravilno):", + "左开": "Otvori lijevo", + "右开": "Otvori desno", + "判断方法:": "...", + "判断方法内容": "Čovjek je stajao ispred kuće, okrenuo se prema ulaznim vratima.", + "录像时段": "Video polje", + "密码": "Lozina", + "卡": "Karte", + "指纹": "Otisak prsta", + "人脸": "Lice", + "配件商城": "Zaključaj centar", + "公司名称": "Naziv poduzeća", + "请输入公司名字": "Unesite ime", + "提示": "Savjeti", + "是否删除?": "Da li izbrisati?", + "员工信息": "Informacije o osoblju", + "员工": "Članak 2.", + "打卡方式无效": "Nedostupan", + "中国": "Kina", + "选择钥匙": "Izaberi ekey", + "编辑": "Uredi", + "无": "Ne", + "有": "Da. Da.", + "请输入姓名": "Unesite Ime", + "获取人脸": "Dobivanje lica", + "选择密码": "Odaberite lozinku", + "选择卡": "Izaberite kartu", + "选择指纹": "Odaberite otiske prsta", + "选择人脸": "Izaberi lice", + "员工是否有人脸": "Da li zaposlenik ima lice", + "同时删除员工钥匙": "Obriši njegovo eeke", + "删除": "Obriši", + "确定要删除员工吗?": "Obriši ovaj zaposlenik", + "月统计": "Mjesečna statistika", + "迟到": "Kasno.", + "早退": "Odlazi rano", + "未打卡": "Nema zapisa", + "钥匙将在": "Ovaj ekey će isteći u", + "天后失效": "Dan(a)", + "电量更新时间:": "Vrijeme ažuriranja baterije:", + "新增配件": "Dodaj", + "钥匙不可用": "Ključ nije dostupan.", + "正在开锁中...": "Otključavam...", + "你的钥匙": "Tvoj ključ.", + "常开模式启动!长按闭锁": "Otvoreni naèin pokrenut! Duga pritiska za zaključanje", + "演示模式": "Demo način rada", + "请先同意用户协议及隐私政策": "Prihvatite prvo korisnički ugovor i pravila privatnosti.", + "用户协议": "Korisnički uvjeti", + "隐私政策": "Politika privatnosti", + "注册成功": "Registracija uspješna", + "你所在的": "Ti si unutra.", + "手机号": "Broj telefona", + "忘记密码": "_Šifra:", + "重置成功": "Vrati uspjeh", + "确定要退出吗?": "Izlaz?", + "功能暂未开放": "Funkcija još nije otvorena", + "设置成功": "Uspješno podešavanje", + "删除成功": "Obriši uspješno", + "单次": "Jednom putu", + "永久": "Trajnik", + "限时": "Vrijemen", + "自定义": "Prilagođeno", + "清空码": "Obriši", + "循环": "Ponavljanje", + "工作日": "Radni dan", + "每日": "Dnevno", + "周末": "Vikend.", + "确定要删除吗?": "Izbrisati?", + "该锁的密码都将被删除": "Sve lozinke za ovu bravu će biti otvoreno", + "已过期": "Neispravno", + "该锁的电子钥匙都将被删除": "Svi eKeys za ovu bravu će biti oštećeni", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Sve ekeys povezane s ovom ekey.This Step ne može biti UNDONE!", + "删除钥匙会在用户APP连网后生效": "Eki æe biti otvoreno", + "有效时间": "DONIJELA JE OVU UREDBU:", + "接收者": "Korisnik", + "仅管理自己创建的用户": "Upravljajte samo svojim korisnicima", + "远程开锁": "Udaljeni otključanje", + "请输入钥匙名称": "Molim unesite ime ključa", + "修改成功": "Promijeni uspjeh", + "冻结": "Zamrznuti", + "解除冻结": "Otmjena", + "授权": "Autoriziraj", + "取消授权": "Odozvoni.", + "同时解冻其发送的钥匙": "Otkloni sve ekeys koje je izdao ovaj korisnik", + "会在用户APP连网后生效": "Ovaj ekey će biti THAWED kada se korisnikov APP poveže na mrežu", + "同时冻结其发送的钥匙": "Zamrzni sve ekeys koje je izdao ovaj korisnik", + "冻结会在用户APP连网后生效": "Ovaj ekey će biti FROZEN kada se korisnikov APP poveže na mrežu", + "取消授权会在用户APP连网后生效": "Korisnik će izgubiti svoje dopuštenje kada se korisnikov APP poveže na mrežu", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Autorizirani korisnik ima gotovo iste dozvole kao LOCK Manager (npr. Mogućnost slanja ekeys i lozinke)", + "失效时间需晚于生效时间": "Vrijeme trajanja mora biti kasnije", + "生效时间需晚于当前时间": "Učinkovito vrijeme mora biti kasnije", + "失效日期需晚于生效日期": "Datum valjanosti mora biti kasniji od datuma stupanja", + "修改有效期": "Razdoblje promjene", + "生效日期": "Početni datum", + "失效日期": "Završni datum", + "开锁": "Otključaj", + "开锁成功": "Otključaj uspjeh", + "请选择锁": "Odaberite brave", + "请选择接收者": "Odaberite prijemnik", + "请选择有效期": "Izaberite period valjanost", + "请选择发送方式": "Molim izaberite način slanja", + "请选择结束时间": "Izaberite završno vrijeme:", + "完成": "Završeno", + "有效日": "Kruži dalje", + "发送成功": "Pošalji uspjeh", + "请选择开始时间": "Molim izaberite početno vrijeme.", + "选择用户": "Izaberite primatelje", + "已选中": "Izabrano", + "确定": "U redu.", + "请选择要发送的锁": "Odaberite brave", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Lice pravo ime autentifikacija odnosi se na potrebu korisnika da provjeri njegovo lice prije otključavanja telefona APP, i provjera može biti otključana.", + "分享": "Dijeli", + "请输入接收者账号": "Molim, unesite račun za primač", + "接收者号码未注册,请重新发送": "Broj prijemnika nije registriran.", + "是否发送电子钥匙给未注册账号": "Želite li poslati EEKey na novi korisnički račun?", + "取消": "Odustani", + "标记成功": "Označi uspjeh", + "微信好友": "WeChat prijatelji", + "短信": "SMS", + "邮件": "Emal", + "更多": "Više.", + "您好,您的电子钥匙生成成功": "Halo, vaš elektronski ključ je uspješno generiran.", + "生效时间不能小于当前时间": "Učinkovito vrijeme ne može biti manje nego trenutno vrijeme.", + "结束时间不能小于当前时间": "Krajnje vrijeme ne može biti manje nego trenutno vrijeme.", + "是否为管理员": "Je li to administrator?", + "已连接到锁,请将卡靠近门锁的读卡区": "Povezano.Postavi karticu protiv čitača kartica", + "尝试连接设备...": "Povezivanje sa Lock.Molim pričekajte...", + "地理位置": "Geografska lokacija", + "检查以确保以下地址是正确的": "Provjerite da li je sljedeća adresa ispravna.", + "地图加载中,请稍候。。": "Mapa se učitava, molim sačekajte...", + "跳过": "Preskoči", + "还未获取到位置信息哦,请耐心等待一下!": "Podaci o lokaciji nisu još dobili, molim pričekajte strpljivo!", + "请填写信息": "Ispunite podatke", + "有效期": "Razdoblje valjanja", + "生效时间": "Početno vrijeme:", + "失效时间": "Završni vrijeme", + "上传成功": "Uspješno poslato", + "未生效": "Neaktivno", + "已生效": "Učinkovit", + "指纹详情": "Informacije o otiscima", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Vi ćete biti zahtijevati da stavite svoj prst na senzor nekoliko puta.Platite slijediti ....", + "开始添加": "Pokreni", + "请将您的手指按下": "Stavite prst na senzoru", + "根据提示,抬起手指后再进行下一次指纹采集": "Slijedite upute ... Vi ćete biti potrebni da uklonite i stavite svoj prst na senzor za sljedeći zapis.", + "添加成功": "Dodaj uspjeh", + "更新成功": "Ažuriraj uspjeh", + "搜索": "_Traži", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Nakon resetovanja, karta brave će biti izbrisana, želite li resetirati?", + "已失效": "Neispravno", + "卡详情": "Podaci o karti", + "请输入": "Molim, unesite ovde.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Okrenući se, brava će ostati Otključana cijeli dan dok ne bude ručno zaključan.", + "请输入小于或等于60的数字": "Unesite broj manji od 60.", + "操作成功": "Operacija uspješna", + "管理员密码相同,无需修改": "šifra administrator je ista i ne mora biti izmijenjena", + "请输入6-9位数字": "6-9 brojeva u dužini", + "请输入6-9位管理员密码": "Unesite 6-9 znameniku administratora", + "请输入新的管理员密码": "Unesite novu administratoru šifru", + "未分组": "Negrupisano", + "请输入分组名称": "Napravi Grupu", + "创建成功": "Napravi uspjeh", + "设置锁分组成功": "Uspješno podesi zaključavanje grupe", + "电池1电量": "Baterija 1", + "电池2电量": "Baterija 2", + "电量更新时间": "Vrijeme ažuriranja baterije", + "锁电量更新成功": "Uspjeh ažuriranja energije zaključanje", + "您的钥匙未生效": "Tvoj ključ nije djelotvoran.", + "您的钥匙已冻结": "Ključ ti je smrznut.", + "您的钥匙已过期": "Vaš ključ je istekao", + "常开模式开启": "Brava je u prijelaznom načinu", + "超级管理员": "Super admin.", + "授权管理员": "Autorizirani admin:", + "普通用户": "Običan korisnik", + "余": "Bilantno", + "天": "Dan", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Nakon brisanja brave, sve informacije će biti izbrisane zajedno, jeste li sigurni da želite obrisati bravu?", + "请输入登录密码": "Unesite šifru aplikacije", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Neuspješno obrisanje uređaja, provjerite je li uređaj blizu uređaja, uređaj nije spojen, i uređaj je uključen.", + "用户无权限": "Korisnik nema dozvolu", + "创建公司后,考勤功能才能使用": "Molim Vas kreirajte tvrtku prvo.", + "是否删除钥匙?": "Obriši ovaj ekey?", + "邮箱绑定成功": "Uspeh koji se obavezuju e- pošta", + "手机绑定成功": "Uspeh vezivanja mobilnih telefona", + "网络访问失败,请检查网络是否正常": "Zahtjev Neuspješno.Network nedostupna,Molim provjerite i spojite vaš uređaj na 3G/4G/WIFI", + "清空": "_Očisti", + "是否清空?": "Jasno?", + "消息详情": "Informacije o poruku", + "创建时间": "Vrijeme stvaranja", + "管理员详情": "Detalji administratora", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ako te netko natjera da otvoriš vrata, možeš koristiti ovu karticu. Alarmna poruka će biti poslana adminirima. Da bi koristili ovu značajku, molimo provjerite da je vaša brava online.", + "请不要将胁迫卡用于日常开锁": "Molim vas, nemojte koristiti prisilnu karticu za svakodnevnu upotrebu.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ako te netko prisiljava da otvoriš vrata, možeš koristiti ovaj otisak. Alarmna poruka će biti poslana adminirima. Da bi koristili ovu značajku, molimo provjerite da je vaša brava online.", + "请不要将胁迫指纹用于日常开锁": "Molim vas, nemojte koristiti nasilni otisak prsta za svakodnevnu upotrebu.", + "创建公司": "Kreiraj tvrtku", + "公司名称不能超过30个字符": "Ime tvrtke ne može preko 30 znakova.", + "公司名称不能小于6个字符": "Ime tvrtke ne može biti manje od 6 znakova", + "WIFI列表": "Lista WIFI", + "刷新": "Osvježi", + "手动配网": "Ručna distribucijska mreža", + "远距离": "Udaljenost", + "中距离": "Srednja udaljenost", + "近距离": "Kratka udaljenost", + "锁时间更新成功": "Uspjeh ažuriranja vremena zaključanja", + "锁用户": "Zaključaj korisnike", + "请选择常开日期": "Odaberite otvoreni datum", + "结束时间不能小于开始时间哦": "Krajnje vrijeme ne može biti manje od početnog vremena", + "介绍": "Naša priča", + "个人信息收集清单": "Popis prikupljanja osobnih podataka", + "应用权限说明": "Opis ovlasti", + "第三方信息共享清单": "Popis razmjene informacija trećih osoba", + "请选择您的位置": "Molim izaberite lokaciju", + "请先选择位置": "Odaberite prvo lokaciju", + "管理员密码": "Admin lozina", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Ukoliko trebate promijeniti, unesite novu administrator šifru (6 znamenitosti), kliknite OK da biste promijenili.", + "修改": "Izmijeni", + "网络摄像头": "Kamera", + "重命名": "Preimenuj", + "分组下的锁将被移到未分组里": "Brave ispod grupe će biti pomjerene u degrupirane", + "编辑成功": "Uredi uspjeh", + "厂商": "Proizvođač", + "型号": "Model:", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Nakon što je lozinka generirana, molimo da je koristite jednom za aktivaciju prije 23:59 na isti dan, Inače će biti nevažeća nakon 0 sati. Nakon aktiviranja lozinke, može se koristiti neograničena vremena unutar perioda valjanosti.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Nakon što je lozinka generirana, molimo da je koristite prije 23:59 na isti dan, inače će biti nevažeća nakon 0 sati. Jasni kod se koristi za očistiti sve lozinke generirane prije 0 sati danas.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Nakon što je lozinka generirana, molimo da je koristite prije 23:59 na isti dan, inače će biti nevažeća nakon 0 sati.", + "清空密码底部提示": "Lozinka je važeća do 23:59 na dan prazne", + "相机": "Kamera", + "相册": "Fotografije", + "读写": "Pohrana", + "定位": "Lokacija", + "需要访问相机权限才能拍照上传文件例如头像上传": "Pristup kameri je potreban za fotografiranje i učitavanje datoteka, kao što je učitavanje slike profila", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Pristup kamerima je potreban za učitavanje datoteka i avatara koristeći slike albuma", + "需要访问读写权限才能使用本地图片上传头像": "Pristup dozvolama za čitanje i pisanje je potreban za učitavanje avatara koristeći lokalne slike", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Potreban je pristup informacijama o lokaciji za korištenje funkcije dodavanja ključa", + "申请": "Primjena", + "权限": "Dozvola", + "不允许": "Nije dozvoljeno", + "允许": "Dozvoljeno", + "权限被拒绝": "Pristup odbijeno", + "请手动在系统设置中开启": "Ručno uključite u sistemskim postavkama.", + "权限以继续使用应用": "Dozvola za nastavak korištenja aplikacije.", + "去设置": "Idi postaviti to.", + "当前网络": "Trenutna mreža", + "位置信息": "Informacije o lokaciji", + "请输入wifi名称": "Molim, unesite WiFi", + "虹膜": "Zvenika", + "手掌": "Palma", + "商城": "Centar.", + "我的": "Moj moj", + "微信公众号推送": "Razgovaraj o javnom računu", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Da biste otvorili razgovor i primali alarmne poruke, morate obratiti pažnju na Skye Smart Lock čavrlja javni račun prvo, Molim spremite QR kod i koristite we chat za skeniranje postavke", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Pristup Bluetooth dozvolama je potreban za korištenje informacija o lokaciji funkcije dodavanja ključeva", + "请输入Email": "Unesite svoj email", + "请输入手机号": "Unesite svoj broj telefona", + "家人到家": "Èlan porodice je stigao kuæi.", + "添加家人": "Dodaj član obitelja", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Ako brava nije spojena na internet, podsjetnik na lozinku, karticu, otisak prsta, i druge metode otvaranja vrata ne mogu se pravovremeno poslati.", + "消息提醒": "Podsjetnik", + "开门通知": "Obavijest za otvaranje", + "N天未开门": "N dani bez otvaranja vrata", + "门未关好": "Vrata nisu zatvorena.", + "防拆报警": "Upozorenje alarma", + "低电量提醒": "Niska baterija", + "胁迫开门": "Otvaranje prisilnih vrata", + "有人按门铃": "Neko pozvoni na vrata.", + "有人出现在门口": "Netko se pojavio na vratima.", + "提醒方式": "Metoda podsjetnika", + "开门方式": "Metoda otvaranja vrata", + "请选择": "Molim izaberi", + "家人": "Član obitelja", + "保存": "Spremi", + "APP推送": "APP pritisni", + "管理员": "Admin:", + "未启用": "Nije uključeno", + "已启用": "Omogućeno", + "省电模式": "Način štednje energije", + "逗留抓拍模式": "Ostani režim snimanja", + "实时监控模式": "Način praćenja u realnom vremenu", + "自定义模式": "Vlastiti način", + "猫眼设置": "Postavljanje očima mačja", + "猫眼工作模式": "Način rada očima mačja", + "自动亮屏": "Automatski svijetli ekran", + "亮屏持续时间": "Ekran na vrijeme:", + "逗留警告": "Ostani upozoren.", + "异常警告": "Abnormalno upozorenje", + "短信提醒": "SMS", + "邮件提醒": "Emal", + "N天未开门提醒": "N dani bez otvaranja vrata", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Ako te netko prisiljava da otvoriš bravu, možeš koristiti ovaj otisak prsta. Alarm poruka će se poslati adminitorima.to koristite ovu značajku, molimo provjerite da je vaša brava online.", + "胁迫指纹": "Prisilni otisak prsta", + "指纹列表": "Lista otisaka prsta", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Nakon postavljenog vremena, ako brava nije otvorena, sustav će poslati poruku za podsjetnik imenovanom primatelju. Ova funkcija zahtijeva da brava bude spojena na internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Nakon omogućavanja podsjetnika, kada je baterija brava ispod 20%, 10% i 5%, sustav će poslati poruku o podsjetniku određenom primatelju.", + "未开门时间": "Dani bez otvaranja vrata", + "添加和使用面容开锁时:": "Dodaj i koristi lice pri otključanju:", + "关锁": "Zatvori", + "功能": "Funkcija", + "配件": "Dijelovi", + "云存": "Skladište oblaka", + "本地": "Ovaj lokalt", + "3天滚动储存": "3 dana valjanje pohrane", + "去升级": "Nadogradi", + "下载列表": "Lista preuzimanja", + "已下载": "Preuzeto", + "全部视频": "Svi videa", + "已为本设备免费提供3大滚动视频储存服务": "Za ovaj uređaj je besplatno osigurano tri usluge usluge za pohranu videoa", + "视频播放": "Video reprodukcija", + "全选": "Sve.", + "请选择要删除的视频": "Odaberite video koji želite izbrisati", + "请选择要下载的视频": "Molim izaberite video koji želite preuzeti", + "欢迎使用": "Dobrodošli u korištenje.", + "用户协议和隐私政策概要": "Sažetak ugovora o korisniku i pravila o privatnosti", + "协议概要": "Sažetak protokola", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Hvala vam što ste koristili ovu aplikaciju. Pridajemo veliku važnost vašim osobnim podacima i zaštiti privatnosti. Prije uporabe ovog proizvoda, molimo pažljivo pročitajte ga.", + "《用户协议》": "Korisnički uvjeti", + "和": "I", + "《隐私政策》": "Pravila privatnosti", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Cijeli sadržaj. Klikom na \"Sgovori\", slažete se i prihvaćate sve uvjete. Ako se odlučite ne složiti, nećete moći koristiti naše proizvode i usluge te ćete izaći iz aplikacije.", + "不同意": "Ne slažem se.", + "同意": "Dogovoreno", + "该功能是高级功能,请开通后再使用": "Ovo je napredna funkcija. Molim vas, uključite prvo.", + "常用程序": "Zajednički programi", + "该锁已被重置": "Brava je resetovana", + "需要访问读写权限才能使用手动升级固件": "Pristup dozvolama za čitanje i pisanje je potreban za ručno nadogradnju firmware-a", + "错误D固件,请选择正确的文件": "Pogrešan firmware, molim izaberite ispravnu datoteku", + "非SYD固件,请选择正确的文件": "Ne SYD firmware, molim izaberite točanu datoteku", + "文件校验失败 0x01": "Neuspješna verzija datoteke 0x1", + "解析元数据失败,请选择正确的文件": "Nisam mogao analizirati metapodatke, molim izaberite točnu datoteku", + "文件校验失败 0x02": "Neuspješna verzija datoteke 0x02", + "文件校验失败 0x03": "Neuspješna verzija datoteke 0x03.", + "固件升级完成": "Dovršena nadogradnja firme", + "记录": "Snimi snimku", + "开通高级功能后才可以对锁进行管理": "Molim uključite naprednu funkciju prvo za upravljanje bravama.", + "去开通": "Uključi", + "实名认证": "Autentifikacija realnog imena", + "当前剩余数量": "Preostalo", + "购买": "Kupi", + "实名认证为付费功能,请购买后再使用": "Autentikacija stvarnih imena je plaćena funkcija, molim vas, koristite je nakon kupnje.", + "密码不一致哦": "Šifre nisu dosljedne", + "退出添加": "Prekini dodavanjem", + "管理员已满": "Admin cijeli", + "用户已满": "Korisnik je pun.", + "锁上面添加指纹已满": "Dodaj otisak prsta na bravi je pun.", + "指纹已存在": "Otisak prsta već postoji.", + "锁上面添加人脸已满": "Zaključavanje iznad dodavanje lica je puno", + "人脸已存在": "Lice već postoji", + "锁上面添加卡已满": "Zaključavanje iznad dodavanja je puna", + "卡已存在": "Karta već postoji", + "锁上面添加密码已满": "Zaključaj iznad dodavanje šifra je puna", + "密码已存在": "Identični šifra već postoji.", + "请输入密码": "Unesite šifru.", + "暂无密码,无需重置": "Nema šifre, nema potrebe za resetovanje", + "真实姓名": "Pravo ime", + "身份证号": "Identifikacijski broj:", + "请输入真实姓名": "Molim, unesite svoje pravo ime.", + "请输入身份证号": "Unesite vaš ID broj.", + "请输入身份证号和真实姓名": "Molim, unesite svoj ID broj i pravo ime.", + "点击返回设备配对": "Dotaknite Nazad na paring uređaja", + "无法连接?尝试升级": "Ne mogu se spojiti?", + "固件升级提示": "Prompt nadogradnje firme", + "请先获取固件文件到手机本地,再选择升级": "Dobavite prvo firmware datoteku u lokalni telefon, a zatim odaberite Nadograduje", + "固件升级中": "Firmware se nadogran", + "取消升级": "Otkaži nadogradnju.", + "固件传输中": "Članak 2.", + "关闭": "Укључи", + "传输中'": "U provozu", + "操作记录": "Snimi snimku", + "修改姓名": "Ime", + "传输中": "U provozu", + "发送人": "Izdaja", + "发送时间": "Izdano vrijeme:", + "钥匙详情": "EKEY InfoName", + "姓名": "Ime", + "发送": "Pošalji", + "请确认姓名全名和身份证号码是否正确": "Potvrdite da su puno ime i identifikacijski broj ispravni.", + "传输期间请勿离开当前页面": "Ne napuštaj trenutnu stranicu tokom prijenosa", + "机型": "Modeli", + "硬件版本": "Hardverova", + "固件版本": "Firmware verzije", + "手动升级": "Ručno nadogradnje", + "设备连接中...": "Povezivanje uređaja...", + "未避免异常情况,请在门打开时升级": "Neizbježne izuzetke, nadogradite kada su vrata otvorena.", + "钥匙无效": "Ključ je nevažeći", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Ne mogu se povezati na bravu.Molim ponovo pokrenite Blutooth telefona i pokušajte ponovo.", + "如果是全自动锁,请使屏幕变亮": "Ako je u potpunosti automatski zaključavanje, molim vas, učinite zaslon svjetliji.", + "正在尝试闭锁……": "Pokušavam da zakljuèam.", + "清空记录": "Očisti zapise", + "是否要删除操作记录?": "Nastaviti brisati zapise?", + "被删除的记录不能恢复": "Evidencije se ne mogu vratiti nakon brisanja.", + "全部事件": "Svi događaji", + "开锁事件": "Otključaj događaja", + "异常事件": "Abnormalni događaji", + "门铃事件": "Događaj", + "视频事件": "Video događaji", + "请开启蓝牙": "Ukljuèite Bluetooth.", + "请选择有效日": "Odaberite efektivni dan", + "公司名字长度不能小于 6 ": "Duljina imena tvrtke ne može biti manje od 6.", + "已是最新版本": "Nema ažuriranja", + "新建短信模版": "Napravi SMS šablon", + "新建邮件模版": "Napravi predložak e-pošta", + "自定义短信模版": "SMS šablon", + "自定义邮件模版": "Predložak e-pošta", + "名称": "Ime", + "星星锁": "Zvjezdana brava", + "无考勤记录": "Nema zapisa", + "大家干劲十足": "Svi dolaze na vrijeme.", + "工作时长未出炉": "Nema radnog vremena", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Izbor zemlje/regije će utjecati na sigurnost podataka.Trenutno ste odabrali Albaniju, molimo potvrdite prije nastavka.", + "确认国家或地区": "Potvrdi državu/regiju", + "我知道了": "Imam ga.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Za primanje važnih ažuriranja, molimo kliknite 'OK' i omogućite obavijesti u postavkama.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Nakon uključenja, možete ponovno uključiti pritisnuti tipku za postavljanje na bravi, i ponovno dodati s APP-om.", + "已有": "Trenutno", + "新增": "Novij", + "账号格式错误": "Neispravni format:", + "接收者信息为空": "Podaci primatelja su prazne", + "请输入时间(秒)": "Unesite vrijeme (sek)", + "加载数据失败": "Neuspješno učitavanje podataka", + "重试": "Pokušaj ponovo", + "升级中,是否退出": "Tijekom nadogradnje, da li zatvoriti datoteku", + "下一步": "Sljeće", + "公寓": "Aparta", + "个人用户": "Osobno", + "星寓": "Star apartman.", + "账号": "Račun", + "请输入手机号或email": "Telefonski broj ili email", + "请输入星寓管理员的账号": "Molimo unesite račun upravitelja zvjezdanog stana", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Svi podaci odabranih brava bit će trajno preneseni primatelju.", + "暂不支持跨平台转移,敬请期待": "Transfer preko platforme nije podržan za sada, molim vas da se radujete tome", + "移除坏锁": "Pomjeri neispravne/oštećene brave u smeće", + "转移确认": "Potvrdi prijenos.", + "本次共转移": "Ovaj put ukupno.", + "把智能锁": "Pametna brava", + "确认": "U redu.", + "移除成功": "Ukloni uspješno", + "转移成功": "Uspjeh prijenosa", + "该已锁被删除": "Zaključano je obrisano", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Ovlašteni admin može upravljati samo lozinke, Keys i ustvario ga sam.", + "添加授权管理员": "Napravi administratoru", + "导出记录": "Izvozna evidenca", + "选择时间段": "Izaberite period:", + "导出": "Izvozi", + "批量导出": "Izvoz serije", + "读取记录": "Osvježi zapise", + "设备": "Uređaj", + "消息": "Poruka servera:", + "智能分析": "Inteligentna analiza", + "精准识别设备事件,过滤无效信息": "Točno prepoznaj događaje uređaja i filtriraj neispravne informacije", + "系统设置": "Sistemske postavke", + "系统的全局配置在此项内进行设置": "Globalna konfiguracija sistema je postavljena u ovoj stavki", + "导出操作记录": "Izvozna evidenca", + "立即查看": "Pogled", + "导出成功": "Uspješno izvozno", + "发送钥匙": "Pošalji ekey", + "进度": "Stopa", + "失败": "Neuspješno", + "人脸详情": "Detalji lica", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Kada je netko osjetio oko 1,5 metara ispred vrata, otključavanje lica će se automatski pokrenuti.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Kada je netko osjetio oko 0,8 metara ispred vrata, otključavanje lica će se automatski pokrenuti.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Kada je netko osjetio oko 0,5 metara ispred vrata, otključavanje lica će se automatski pokrenuti.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Udaljenost osjećaja je isključena, morate ručno dodirnuti bilo koje tipke na tastaturi da biste izvršili otključavanje lica.", + "防误开已打开,开锁后": "Otvaranje protiv greške je uključeno, i nakon otključavanja.", + "秒内不可使用面容开锁": "Otključavanje lica se ne može koristiti unutar sekunda", + "掌静脉": "Palmovna vena", + "添加掌静脉": "Dodajte palmnu venu", + "胁迫掌静脉": "Nasilna palma vena", + "请不要将胁迫掌静脉用于日常开锁": "Molim vas, ne koristite prisilne palme vene za svakodnevno otključavanje.", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Povezan na bravu, molim vas, prirodno otvorite dlan.", + "掌静脉详情": "Detalji Palm vene", + "掌静脉号": "Broj palme vene", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth nije uključen, uključite Bluetooth u postavki", + "删除用户时,会将用户拥有的钥匙一起删除。": "Ukoliko je korisnik PROTIV, svaka ekeys povezana s Korisnikom također će biti OPET.", + "配置网络": "Podesi mrežu", + "你好": "Zdravo.", + "成功": "Uspješno", + "类型选择": "Tip izabrani", + "请选择要使用哪种类型": "Odaberite koji tip ćete koristiti", + "系统邮件(推荐)": "Sistemska email (preporučeno)", + "系统短信(推荐)": "Sistemski SMS (preporučeno)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Email će biti poslan iz ove aplikacije.Molim kupiti e-mail paket prvo.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS će biti poslan iz ove aplikacije.Molim kupiti e-mail paket prvo.", + "个人邮件": "Osobna email", + "个人短信": "Osobni SMS", + "邮件将从你的个人邮箱发给用户": "E-mail će biti poslan sa vašeg osobnog e-mail računa.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS poruka će biti poslana sa vašeg osobnog telefonskog broja.Platite vašem telekomunikacijskom operateru.", + "为了更好地应用体验,请确定权限": "Za bolje iskustvo s primjenom, molimo potvrdite dozvole", + "您第一次拒绝权限,请确定权限": "Prvi put ste odbili dozvolu, molim potvrdite dozvolu.", + "您第二次拒绝权限,请去应用设置开启权限": "Odbili ste dozvolu po drugi put, molim vas idite na postavke aplikacije kako biste omogućili ovlasti", + "去应用市场": "Idi u programu aplikacije", + "温馨提示": "Topla prompta", + "关闭应用": "Zatvori aplikaciju", + "开启微信接收报警消息需要先关注": "Da biste otvorili WeChat za primanje alarmnih poruka, morate pratiti", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat javni račun, spremite QR kod i koristite WeChat za skeniranje postavke", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Autentifikacija stvarnih imena je plaćena funkcija, molimo kontaktirajte administratora za kupnju i korištenje.", + "位置权限": "Dozvola za lokaciju", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Molimo odobrite aplikaciju za korištenje vašeg locacijana.Koristi se za skeniranje BLE brave i prolazi.", + "相机/相册权限": "Dozvola kamere/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Molimo da odobrite aplikaciju za čitanje i pisanje fotografije i datoteke iz Skladišta.", + "点击选择": "Kliknite za odabir", + "微信": "WeChat", + "朋友圈": "Trenutaci", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "Weibo", + "FaceBook": "FacebookName", + "链接": "Vez", + "今天": "Danas", + "密码错误": "Nevažeća lozinka", + "网络中断": "Prekid mreže", + "钥匙不存在": "Ključ ne postoji", + "钥匙过期": "Tipka je prestala dati", + "钥匙已存在": "Ključ već postoji", + "密码失效": "Lozinka neispravna", + "门锁时间异常": "Nenormalno vrijeme zaključavanja vrata", + "APP(手机)未联网": "APP (mobilni telefon) nije spojen na internetu", + "数据不存在": "Podaci ne postoji", + "待接收": "Primljeno", + "已冻结": "Smrznuti", + "已删除": "Obrišteno", + "未知": "Nepoznato", + "拖动下方滑块完成拼图": "Povucite klizač u odgovarajuću poziciju", + "验证成功": "Uspjeh provjere", + "验证失败": "Neuspješna provjera", + "向右拖动滑块填充拼图": "Povucite klizač desno da ispunite slagalicu", + "请先获取到位置信息哦": "Molim vas da prvo dobijete informacije o lokaciji.", + "请选择国家": "Odaberite državu", + "获取锁信息": "Dobiti informacije o zaključanju", + "锁数据异常,请重试": "Podaci zaključavanja su nenormalni, molim pokušajte ponovo.", + "连接设备中...": "Povezivanje uređaja...", + "把锁": "Brave", + "条": "Trakač", + "封": "Zatvarač", + "次": "Dvaputa", + "支付成功": "Uspjeh isplate", + "查看详情": "Pogledaj detalje", + "请输入模板名称": "Unesite ime predložka", + "模版类型": "Tip", + "再返回一次退出": "Izađi ponovo", + "请先添加锁": "Molim vas dodajte bravu prvo.", + "可视对讲": "Vizualni interkomi", + "详细日志": "Detaljni dnevnik", + "已复制到剪切板": "Kopirano", + "拍照": "Fotografija", + "从相册选择": "Izaberite iz albuma", + "选择问题": "Odaberite pitanje", + "确认长度不足8位": "Potvrdi dužinu manju od 8 znamenka", + "新密码长度不足8位": "Nova šifra dužina manje od 8 znamenka", + "两次密码不一致": "Lozinka neispravna.Molim pokušajte ponovo.", + "请点击获取验证码,验证码将发送到": "Molim vas da dobijete verifikacijski kod.", + "切换": "Prebaciji", + "验证": "Provjeri", + "验证成功,账号已删除": "Verifikacija je uspješna, račun obrišen", + "该密码不是自定义密码,无法修改": "Ova šifra nije korisnička šifra i ne može biti izmjenjena", + "请选择设备要关联哪些姓名": "Odaberite koja imena uređaja", + "请选择姓名要关联哪些设备": "Molim izaberite koji uređaj koji će ime biti povezano", + "确定要移除所选中的坏锁吗?": "Da uklonimo kvar?", + "邮件通知": "Obavijesti putem email", + "短信通知": "Obavesti preko SMS-a", + "您好,您的授权管理员生成成功": "Halo, vaš autorizirani administrator je uspješno generiran.", + "请输入接收者姓名": "Molim, unesite ovde.", + "版本更新": "Ažuriranje", + "下次再说": "Sledeæi put.", + "配网成功": "Uspjeh distribucije mreže", + "配网失败": "Distribucija mreže nije uspjela", + "该锁的无线键盘都将被删除": "Sve bežične tastature za ovu bravu će biti OPREMENE", + "实时画面": "Slika u realnom vremenu", + "适合门口较为安全的环境。": "Pogodno za relativno sigurna okruženja na vratima.", + "仅发生特定事件才录像,并可查看实时画面。": "Snimaju se samo specifični događaji i slika u realnom vremenu može se pogledati.", + "一般情况下,满电可使用7-8个月": "Pod normalnim okolnostima, može se koristiti 7-8 mjeseci kada je potpuno napunjena", + "有人逗留或发生特定事件才录像,可随时查看": "Netko ostaje ili se zabilježe određeni događaji, i može se pogledati u bilo kojem trenutku.", + "实时画面。": "Slika u stvarnom vremenu.", + "一般情况下,满电可使用5~6个月。": "Pod normalnim okolnostima, može se koristiti za 5 ~ 6 mjeseci kada je u potpunosti napunjen.", + "适合门口人员复杂、较不安全的环境。": "Pogodno za složena i relativno nesigurna okruženja na vratima.", + "有人出现就录像,可随时查看实时画面。": "Snimajte kad se netko pojavi, i pogledajte sliku u stvarnom vremenu u bilo kojem trenutku.", + "一般情况下,满电可使用2~4个月。": "Pod normalnim okolnostima, može se koristiti za 2 ~ 4 mjeseca kada je u potpunosti napunjen.", + "根据您家门口实际情况设置录像和实时画面功能。": "Postavite funkcije video i slike u realnom vremenu prema stvarnoj situaciji na vratima.", + "可使用时长由具体设置决定。": "Trajanje uporabe određuje se posebnim postavkama.", + "查看": "Pogled", + "有人按门铃或发生": "Neko pozvoni na vrata.", + "异常事件时": "Abnormalni događaji", + "不录像": "Nema videa", + "有人出现、按门铃": "Neko se pojavi, pozvoni na vrata.", + "或发生异常事件时": "Ili nenormalni događaji", + "逗留达到10秒": "Ostani 10 sekundi.", + "约1.5米": "Oko 1,5 metara.", + "随时": "Bilo kada.", + "立即录像": "Snimaj odmah.", + "录像时机": "Vrijeme za videa", + "有人出现时录像": "Snimaj kada se netko pojavi", + "人体侦测距离": "Udaljenost za otkrivanje ljudi", + "查看实时画面": "Pogledaj sliku u stvarnom vremenu", + "自定义时间": "Vlastito vrijeme", + "当日": "Danas", + "次日": "Sledeæi dan.", + "自定义时段": "Vlastito vremensko razdoblo", + "发生事件时查看": "Pogledaj kada se događaj pojavi", + "实时查看": "Pogled u realnom vremenu", + "有人在门口出现10秒后开始录像。": "Neko se pojavljuje na vratima 10 sekundi prije snimanja.", + "有人按门铃时立即录像。": "Snimajte odmah kad neko pozvoni na vrata.", + "有人出现在门前1.5米范围时启动录像": "Počnite snimati kada se netko pojavi unutar 1,5 metara ispred vrata.", + "约0.8米": "Oko 0,8 metara.", + "约3.0米": "Oko 3,0 metara.", + "添加指纹失败": "Operacija nije uspjela.", + "项": "Stavke", + "播放中": "Igraj", + "下载": "Preuzimanje", + "暂无下载内容": "Bez sadržaja preuzimanja", + "亮度": "Svjetlitića", + "音量": "Zvuk", + "快进至": "Brzo naprijed.", + "快退至": "Premotaj za vrata", + "暂无视频信息": "Nema informacija o videu", + "加载出错": "Greška učitavanja", + "请单人正对门锁,距离一个成年人手臂长度": "Molim vas stanite ispred vrata sami, na dužini ruke.", + "(约0.6米)。": "(Otprilike 0,6 metara)", + "保持脸部无遮挡,露出五官。": "Držite lice neprekidno i pokažite lice.", + "准备好了,开始添加": "Spremni, počni dodavati.", + "正在录入中...": "Snimanje...", + "添加人脸失败": "Nisam uspio dodavati licu", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Nakon resetiranja, lica brave će biti izbrisana. Jeste li sigurni da želite resetiranje?", + "人脸号": "Broj lica", + "虹膜详情": "Iris detalji", + "虹膜号": "Iris broj.", + "选择设备类型": "Odaberite tip uređaja", + "照明灯具": "S masenim udjelom cijevi", + "电动窗帘": "Električne zavese", + "门窗传感器": "Senzor vrata i prozora", + "传感器": "Senzoror", + "清除数据成功": "Podaci uspješno očišćeni", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Brava nije povezana s internetom, tako da su šifre lozinke, kartice, otisak prsta, i druge metode otvaranja vrata se ne mogu učitati u realnom vremenu.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Ako trebate zadržati povijesne zapise, možete ih izvesti.", + "看不到操作记录,可能原因有": "Ne mogu vidjeti zapise operacije, mogući razlozi", + "操作记录详情": "Detalji zapisa o operaciji", + "操作时间": "Vrijeme rada", + "此模块功能需要锁联网后设置方可生效": "Ova funkcija modula mora biti postavljena nakon što je brava spojena na internet kako bi dobila efekta", + "用户已存在": "Korisnik već postoji", + "钥匙数量已到上限": "Broj tipki je dosegnuo gornju granicu", + "附近没有可用网关": "Ne postoji dostupni prolaz u blizini.", + "正在创建安全连接...": "Stvaranje sigurne veze...", + "监视状态下不能发送录音": "Ne mogu da pošaljem snimke u modu za praćenje", + "挂断": "Spusti slušalicu.", + "监视中暂不能开锁": "Otključavanje nije dostupno tijekom praćenja", + "长按说话": "Pritisnite i držite se.", + "松开发送": "Prijavi za slanje", + "请输入6位数字开锁密码": "Unesite 6-cifrenu otključavanju", + "请输入开锁密码": "Unesite zaporku otključanje", + "接收者在有效期内可以不限次数使用": "Primatelji mogu koristiti ekeys za neograničeno vrijeme u razdoblju valjanosti.", + "接收者可以使用此App开关锁": "Primatelj može zaključati/otključati po ovoj aplikaciji.", + "单次钥匙有效期为1小时,只能使用一次": "Jedanput ekey vrijedi jedan sat i može se koristiti samo jednom.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Primatelji mogu koristiti ekeys za neograničeno vrijeme unutar fiksnog ciklusa vremena.", + "获取模板失败": "Nisam uspio dobaviti šablon", + "微信通知": "WeChat obavijesti", + "系统短信": "Sistemski SMS", + "系统邮件": "Emat", + "模板": "Predložak", + "新建模版": "Napravi šablon", + "您好,您的密码是": "Halo, tvoja lozinka je.", + "密码名字": "Ime lozinke", + "请输入6-9位密码": "Unesite 6-9 značnu šifru.", + "设置密码": "Lozinka", + "操作成功,密码为": "Uspjeli.Lozina", + "类型:自定义-永久": "Vrsta:Prilagođeno-trajno", + "实时播放": "Sviranje u realnom vremenu", + "点击对讲": "Kliknite za interfon.", + "长按开锁": "Duga pritisnite za otključavanje", + "接听失败": "Nisam mogao odgovoriti.", + "请在锁设置中开启远程开锁": "Molim uključite daljinsko otključavanje u postavkama zaključanja", + "接听": "Odgovori.", + "截图已保存到相册": "Snimak ekrana snimljen na albumu", + "添加遥控": "Dodaj daljinski upravljač", + "已连接到锁,请按遥控": "Povezan na bravu, molim pritisnite daljinski upravljač.", + "遥控号": "Broj udaljenog upravljača", + "遥控详情": "Detalji udaljenog upravljalja", + "照明": "Rasvjeta", + "退出演示模式": "Izlazi demo način rada", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Savjet: Trenutno sučelje je prikazano sučelje. Nakon dodavanja uređaja, možete ga nastaviti koristiti.", + "门已上锁": "Vrata su zaključana.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Vaš račun je korišten za prijavu sa novog uređaja.", + "开门成功": "Uspješno otvori vrata.", + "开门失败": "Nisam uspio otvoriti vrata.", + "呼叫提醒": "Podsjetnik poziva", + "收到来自": "Primljeno s", + "锁的呼叫": "Zaključaj poziv", + "加载数据中": "Učitavam podatke", + "搜索所有锁类型": "Pretraži sve tipove zaključanja", + "锁电量更新时间": "Zaključaj vrijeme ažuriranja baterije", + "1月": "Јан.", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Svibanj", + "6月": "Juna", + "7月": "Džull", + "8月": "Aug", + "9月": "Rup", + "10月": "Okt", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Vrući gradovi", + "导出锁数据": "Izvezi zaključavanje podataka", + "一键开锁": "Otključaj jedan klik", + "已开通": "Otvoreno", + "编辑员工": "Uredi osoble", + "一": "Jedan.", + "二": "Dva.", + "三": "Tri.", + "四": "Èetiri.", + "五": "Pet.", + "六": "Šest.", + "日": "Sunce", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?", + "在线": "Na internetu", + "离线": "Odspojeno", + "购买记录": "Podaci o prodaji", + "使用记录": "Korisnički zapisi", + "失效时间要大于当前时间": "Vrijeme isteka mora biti duže od trenutnog vremena", + "修改名字": "Uredi ime:", + "时": "Sat", + "分": "Minute", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Možete koristiti Alexu za otključavanje, zaključati i provjeriti status brave.", + "支持的国家": "Podržane države", + "支持的国家值": "SAD, Kanada, Velika Britanija, Australija, Indija, Njemačka, Francuska, Italija, Španjolska, Japana", + "操作流程": "Proces operacije", + "操作流程值": "1 Dodajte bravu i prolaz s Smart zaključavanje APP-a\n\n2 Omogućite daljinsku funkciju otključavanja brave u APP (ova funkcija je zadano isključena). Ako nemate ovu opciju, brava ne podržava Alexu\n\n3 Dodati vještine Alexa i odobriti ih s Smart lock APP račun i lozinku. Nakon što je ovlaštenje uspješno, možete otkriti uređaje ispod računa\n\n4 Pronađite bravu u Alexa aplikacija, uključi glas otključavanje funkcije, i postavite jezičnu lozinku.\n\n5 brava se može upravljati preko Alexa", + "Google Home": "Google kuća", + "Action name": "Ime akcije", + "ScienerSmart": "ZnanstvenikSmart", + "支持的语言": "Podržani jezici", + "英语": "EngleskiName", + "Google Home操作流程的值": "1. Koristite Smart lock APP za dodavanje brava i prolaza\n\n2. Omogućite daljinsku funkciju otključavanja brave u APP (ova funkcija je zadano isključena). Bez ove opcije, brava ne podržava Google HomeName\n\n3. Instalirajte Google Home APP i kliknite \" \" gumb u gornjem lijevom kutu\n\n4. Na stranici podešavanja odaberite \"Radi s Googleom\"\n\n5. Tražite \"ScienerSmart\" i upotrijebite pametni APP račun i lozinku za ovlašćenje", + "密码需至少包含数字/字母/字符中的2种组合": "Lozinka mora sadržavati najmanje 2 od sljedećih: brojeve, slova i posebne znakove", + "已开锁": "Otključan", + "已闭锁": "Zaključano", + "两次密码不一致哦": "Šifre nisu dosljedne", + "中功率": "Srednja snaga", + "常规使用": "Redovna upotreba", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Nakon što se prolaz ukljuèi, pritisnite i zadržite dugme za reset 5 sekundi, i kliknite Sljedeća kada svjetlost indikatora izmijeniti", + "扫描设备": "Skeniraj uređaj", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Brisanje nije uspjelo. Prolaz je možda nestao. Želite li prisiliti brisati podatke?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_hu.json b/lan/lan_hu.json new file mode 100644 index 00000000..bed7ca9a --- /dev/null +++ b/lan/lan_hu.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Star lock", + "锁通通": "Lock through", + "点击开锁,长按闭锁": "Érintse fel, hogy kinyit, tartsa zárni", + "考勤": "Látogatottság", + "考勤设置": "Látogatottsági beállítások", + "电子钥匙": "Ekeys", + "添加卡": "Kártya hozzáadása", + "卡号": "Kártya száma", + "添加指纹": "Ujjlenyomat hozzáadása", + "指纹号": "Ujjlenyomat-szám", + "遥控": "Távoli", + "添加人脸": "Arca hozzáadása", + "门锁日志": "Ajtózár napló", + "密码号": "Jelszó száma", + "添加者": "Operátor", + "添加时间": "Time", + "重置": "Reset", + "请输入手机号或者邮箱": "Telefonszám/Email", + "工作时间": "Munkaidő", + "工作日设置": "Munkanap beállítása", + "星期一": "Hétfő", + "星期二": "Kedd", + "星期三": "Szerda", + "星期四": "Csütörtök", + "星期五": "Péntek", + "星期六": "Szombat", + "星期日": "Vasárnap", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Sun", + "群发钥匙": "Több ekeys küldése", + "锁": "Lock", + "请添加": "Címzett", + "允许远程开锁": "Távoli kinyit", + "请输入验证码": "Ellenőrző kód", + "获取密码": "Jelkódok létrehozása", + "请给密码命名": "Adja meg a nevét ezt a kódot", + "密码有限期为6个小时,只能使用一次": "Ezt a kódot az aktuális időponttól számított 6 órán belül kell használni, vagy biztonsági okokból felfüggeszteni kell. ez a kódot csak egyszer lehet használni.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Kézzel adja meg a 6-9 számjegyet jelszóként. Lehet hozzá a telefon bluetooth mellett a zár, vagy távolról hozzá az átjárón keresztül", + "获取": "Get", + "添加": "Add", + "删除公司": "Company törlése", + "密码详情": "Jelkód info", + "修改密码": "Pascode módosítása", + "添加虹膜": "Iris hozzáadása", + "添加门磁": "Ajtóérzékelő", + "添加无线键盘": "Vezeték nélküli billentyűzet", + "添加手掌": "Add palm", + "请输入员工账号": "Írja be a munkavállaló számláját", + "批量授权锁": "Több zárak megadása", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Az engedélyezett adminisztrátor többségi engedéllyel rendelkezik ennek a zárnak a működtetéséhez.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ez a funkció lehetővé teszi, hogy az intelligens zárat távolról egy átjárón keresztül feloldja. ezt a funkciót csak bluetooth-on keresztül lehet bekapcsolni vagy kikapcsolni.", + "排列方式": "Lista típusa", + "早到榜": "Korai lista", + "迟到榜": "Kései lista", + "当前模式": "Aktuális mód", + "勤奋榜": "Working hard list", + "延迟时间": "Késleltetési idő", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "A zár automatikusan lezár az idő után. kérjük, először egy alkalommal kinyit, hogy elérhetővé tegye a beállítást.", + "时间": "Time", + "开始时间": "Kezdési idő", + "结束时间": "End time", + "工作时间设置": "Munkaidő beállítása", + "常开模式": "Áthaladási mód", + "常开时间": "Ebben az időszakban", + "常开日期": "Ezeken a napokon", + "添加员工": "Személyzet hozzáadása", + "节假日": "Nyaralás", + "打卡方式": "Módszer", + "员工是否有钥匙": "Már ekey", + "上班时间": "Kezdő idő", + "下班时间": "Zárási idő", + "本周": "Ezen a héten", + "单休": "Egynapos hétvége", + "双休": "Kétnapos hétvége", + "单双休": "Egy-két napos hétvége", + "年": "Év", + "月": "Hónap", + "放假日期": "Nyaralás", + "补班日期": "Munkanapok", + "添加假日": "Add holiday", + "开始日期": "Kezdési dátum", + "必填": "Elkötelezett", + "结束日期": "Végdátum", + "日榜": "Napi", + "月榜": "Havi", + "考勤记录": "Records", + "假日信息": "Nyaralás info", + "基本信息": "Basics", + "无线键盘": "Vezeték nélküli billentyűzet", + "选择无线键盘": "Billentyűzet hozzáadása", + "门磁": "Ajtóérzékelő", + "自动闭锁": "Automatikus zár", + "锁声音": "Lock sound", + "防撬报警": "Tamper alert", + "重置键": "Reset gomb", + "锁时间": "Lock clock", + "诊断": "Diagnosztizálás", + "上传数据": "Adatok feltöltése", + "导入其他锁数据": "Frome importálása egy másik zár", + "锁升级": "Firmware-frissítés", + "标记房态": "Szobaállapot", + "开锁提醒": "Kinyit értesítés", + "微信二维码": "Unlock qr code", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Az elektronikus kulcsokkal rendelkező emberek a wechat-en keresztül olvashatják ezt a qr kódot. Az egyes zárak qr-kódja eltérő. Kinyomtathatja és beillesztheti a megfelelő zár mellé", + "锁编号": "Zár száma", + "电量": "Akkumulátor", + "锁分组": "Lock group", + "选择分组": "Csoport kiválasztása", + "创建新分组": "Csoport létrehozása", + "管理员开锁密码": "Admin jelszó", + "更新": "Frissítés", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Az akkumulátor szintjét az átjáró vagy a telefon bluetooth frissíti", + "当屏幕闪烁时,点击下一步": "Kattintson a tovább gombra, amikor a billentyűzet villog", + "输入*529#或按设置键": "Adja meg a README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # vagy nyomja meg a beállítások gombot", + "长按重置键2秒": "Nyomja meg és tartsa a reset gombot 2 másodperc", + "附近的设备": "Közeli berendezések", + "暂无数据": "Nincs adat", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Az ajtóérzékelővel az átjáróval együtt kaphatod meg az ajtó állapotát. csak egy érzékelő társulhat egy zárához.", + "开始": "Start", + "全天": "All hours", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Több időtartamot is beállíthat az áthaladási módhoz. a beállított időtartamokon belül a zár a feloldást követően nyitott állapotban marad.", + "请选择锁音量": "Kérjük, válassza a lock kötet", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Bekapcsolva hallja a hangzást a zárból", + "低": "Alacsony", + "较低": "Közepes alacsony", + "中": "Közepes", + "较高": "Közepes magas", + "高": "Magas", + "开启后,锁被撬动时,会发出报警声": "Bekapcsolva engedélyezi a tamper riasztást.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Kikapcsolásával a reset gomb letiltott.", + "校准时间": "Kalibrált idő", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "A diagnózis az, hogy elolvassa a konfigurációs információkat a zár belsejében, és feltölti azt, hogy a személyzet elemezze a hiba okát.", + "上传": "Feltöltés", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Feltölteni az adatokat a zár szerver. ez lehet, hogy több perc", + "请选择要从哪把锁导入": "Válassza ki a zár importálásához", + "有新版本": "Van új verzió", + "当前版本": "Jelenlegi verzió", + "升级": "Frissítés", + "空闲": "Üresen", + "已入住": "Megszállt", + "多语言": "Nyelvek", + "添加锁": "Lock hozzáadása", + "锁地址": "Lock cím", + "选择锁类型": "Válassza ki a zár típusát", + "NFC无源锁": "Nfc passzív zár", + "添加设备": "Eszköz hozzáadása", + "网关": "Gateway", + "客服": "Ügyfélszolgálat", + "设置": "Beállítások", + "更多设置": "Több szett", + "消息推送": "Értesítés push", + "锁用户管理": "Lock felhasználók", + "拥有的钥匙": "Az ekeys ehhez a felhasználóhoz kapcsolódik", + "批量授权": "Hatósági menedzsment", + "关联设备": "Kapcsolódó eszköz", + "关联姓名": "Társult név", + "转移智能锁": "Átviteli zár", + "选择锁": "Screen lock", + "接收人信息": "Címzett", + "转移网关": "Átviteli átjáró", + "锁屏": "Screen lock", + "已关闭": "Off", + "已开启": "On", + "开启": "Bekapcsolása", + "确定要开启重置键?": "Továbbra is engedélyezi a reset gombot?", + "确定要关闭重置键?": "Továbbra is letiltani a reset gombot?", + "隐藏无效开锁权限": "Érvénytelen hozzáférés elrejtése", + "APP开锁时需手机连网的锁": "Zárak igénylő telefon online", + "增值服务": "Szolgáltatások", + "关于": "Körülbelül", + "退出": "Logout", + "删除账号": "Fiók törlése", + "个人信息": "Számlainformáció", + "头像": "Avatár", + "昵称": "Beceneve", + "请输入昵称": "Kérjük, adja meg a becenevét", + "修改昵称": "Átnevezés", + "修改账号": "Fiók szerkesztése", + "重置密码": "Jelszó visszaállítása", + "安全问题": "Biztonsági kérdés", + "为了你的账号安全,修改账号前请先使用验证码验证": "A fiók biztonsága érdekében kérjük, használja a fiók jelszóellenőrzését a fiók módosítása előtt", + "请输入新账号": "Kérjük, adja meg az új fiókot", + "找回密码和登录新设备时,可通过绑定的手机验证": "A kötelező telefonszámot az ellenőrző kód fogadására használják.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "A kötelező e-mailt az ellenőrző kód fogadására használják.", + "原密码": "Aktuális jelszó", + "新密码": "Új jelszó", + "确认密码": "Jelszó megerősítése", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Abban az esetben, ha telefonja elveszett, akkor jelentkezzen be az új telefonra a biztonsági kérdések megválaszolásával.", + "问题一": "Kérdés 1", + "问题二": "2. kérdés", + "问题三": "3. kérdés", + "请输入你的答案": "Kérjük, írja be a választ", + "即将到期": "Lejár hamarosan", + "去授权": "Menj az engedélyezés", + "修改名称": "Név szerkesztése", + "状态": "Státusz", + "WiFi名称": "Wifi név", + "网络MAC": "Network mac", + "网关升级": "Gateway frissítés", + "网关连接的锁": "Az átjáróhoz csatlakozó zár (ek)", + "信号强": "Erős", + "选择网关类型": "Válassza az átjáró típusát", + "添加网关": "Gateway hozzáadása", + "重新通电": "Újra csatlakoztassa a hatalom", + "指示灯": "Jelző fény", + "选择网关": "Válaszd az átjárót", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g nem támogatott,. kérjük, válassza ki a wifi 2.4g.", + "WiFi密码": "Wifi passward", + "请输入WiFi密码": "Adja meg a wifi jelszót", + "网关名称": "Átjáró név", + "请输入网关名称": "Adja meg az átjáró nevét", + "IP地址": "Ip-cím", + "子网掩码": "Alhálózati maszk", + "默认网关": "Alapértelmezett átjáró", + "自动获取DNS服务器地址": "Automatikusan megkapja a dns-kiszolgáló címét", + "首选DNS": "Preferált dns", + "备选DNS": "Alternatív dns", + "不使用静态IP": "Nincs statikus ip használatos", + "使用静态IP": "Statikus ip használata", + "请输入IP地址": "Adja meg az ip-címet", + "请输入子网掩码": "Adja meg az alhálózati maszkot", + "请输入默认网关": "Adja meg az alapértelmezett átjárót", + "所有锁": "All locks", + "搜索所有类型的锁": "Scan minden típusú zárak", + "门锁": "Ajtózár", + "挂锁": "Lakatos", + "保险箱锁": "Biztonságos zár", + "智能门禁": "Intelligens hozzáférés-vezérlés", + "车位锁": "Parkolási zár", + "摸亮触摸屏": "Érintse meg a gombot, hogy aktiválja a billentyűzetet", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Kérjük, érintse meg a kulcsot, hogy aktiválja a zárat, és tegye párosítási módba.", + "附近的锁": "Közeli zárak", + "如需修改名字请重新命名,点击确定添加锁": "Ha meg szeretné változtatni a nevet, kérjük, nevezze át, kattintson az ok gombra, hogy hozzáadja a zár", + "添加锁时,手机必须在锁旁边": "A zár hozzáadásakor a telefonnak a zár mellett kell lennie", + "登录": "Bejelentkezés", + "注册": "Regiszter", + "我已阅读并同意": "Elolvastam és egyetértettem", + "验证码": "Kódja", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "A jelszavadnak 8-20 karakterrel kell rendelkeznie, és legalább kétféle számot, betűt és szimbólumot tartalmaznia kell.", + "手机": "Telefon", + "邮箱": "E-mail", + "请输入邮箱": "Írja be az e-mail", + "国家/地区": "Ország/régió", + "你所在的国家/地区": "Az ön országa/régiója", + "选择国家/地区": "Válassza ki országát vagy régióját", + "获取验证码": "Kódot kapni", + "商务合作": "Üzleti", + "电脑网页版": "Webrendszer", + "酒店系统": "Szállodai rendszer", + "说明书网页版": "Felhasználói kézikönyv", + "高级功能": "Fejlett függvény", + "记录保存": "Rekordok megőrzése", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Az sms segítségével a címzettnek a jelkódot és az ekey információkat küldhetjük el.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Az e-mailt felhasználhatjuk, hogy a címzettnek elküldje a kódot és az ekey információkat.", + "购买实名认证提示": "A funkció engedélyezése után az alkalmazás megnyitásához az ujjlenyomat, az arc vagy a fiók jelszavát kell használni. Nincs szükség, hogy ellenőrizze újra 3 percig", + "请选择你希望的实名认证频次": "Kérjük, válassza ki a kívánt valódi név hitelesítési frekvenciát", + "仅首次": "Először", + "每日一次": "Naponta egyszer", + "每周一次": "Hetente egyszer", + "每月一次": "Havonta egyszer", + "当前状态": "Jelenlegi állapot", + "试用中": "Tárgyalás közben", + "高级功能权益内容": "Advanced functions", + "短信模板": "Sms sablon", + "邮件模板": "E-mail sablon", + "发卡工具": "Kártya kódoló", + "购买高级功能须知": "Értesítés", + "购买高级功能提示": "A fejlettebb funkciók fejlesztés alatt állnak, és ha szüksége van rájuk, szívesen megnyitja a szolgáltatást a zárak száma alapján. Fejlett funkciók csak a saját zárak. Ha ön jogosult adminisztrátor, kérjük, lépjen kapcsolatba a zár felső adminisztrátorával a szolgáltatás megnyitásához", + "免费体验": "Ingyenes próbaverzió", + "立即开通": "Nyissa meg most", + "购买短信": "Sms vásárlás", + "购买邮件": "Vásárlás e-mail", + "购买实名认证次数": "Vásárlás valódi név hitelesítési idők", + "开通高级功能": "Enable advanced function", + "选择套餐": "Válassza a csomagot", + "支付方式": "Fizetési mód", + "支付宝": "Alipay", + "去支付": "Pay", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Az üzenetet magad határozza meg. a jelkódot és az ekey információit másoknak küldi.", + "高级功能仅能用于你自己的锁": "A fejlett funkció csak a saját zárak.", + "新建模板": "Kreat sablon", + "类型": "Típus", + "模版内容": "Sablon tartalom", + "预览": "Előnézet", + "房间名": "Szoba", + "预计产生短信条数": "Becsült üzenetszegmensek", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ez a funkció lehetővé teszi, hogy elrejtse a jelszavakat, az ekeys-t, a kártyákat és az ujjlenyomatokat, amelyek egy ideig érvénytelenek.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "A felhasználó telefonja köteles, hogy online, hogy kinyit ezeket a kiválasztott zárak alkalmazással.", + "配置WiFi": "Wifi konfigurálása", + "请输入WiFi名字": "Kérjük, adja meg a wifi nevet", + "WiFi配网": "Wifi elosztó hálózat", + "胁迫卡": "Stressz kártya", + "员工是否有密码": "Már van jelkódja", + "员工是否有卡": "Már van kártya", + "员工是否有指纹": "Már beállítjuk az ujjlenyomatot", + "获取钥匙": "Get key", + "获取卡": "Get card", + "获取指纹": "Kap ujjlenyomat", + "安全验证": "Személyazonossági ellenőrzés", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Az összes számlaadatot végleg eltávolítjuk a platformról, és nem lehet visszanyerni. szeretné törölni?", + "监控": "Monitor", + "视频日志": "Videó napló", + "开门器": "Ajtónyitó", + "面容开锁": "Face kinyit", + "开门方向设置": "Nyitási irány beállítás", + "电机功率设置": "Motorpower beállítás", + "开锁时是否需联网": "Ha az internetre van szükség a feloldáskor", + "选择要加入分组的锁": "Válassza ki a zárak hozzáadásához ezt a csoportot", + "锁数量": "Zárszámlálás", + "小米IOT平台": "Xiaomi iot platform", + "面容开锁设置": "Arc kinyit beállított", + "感应距离": "Érzékelési távolság", + "防误开": "Megakadályozza a rossz nyitást", + "防误开已关闭,关门后仍可使用面容开锁": "Megakadályozzák a félrenyitás be van zárva, miután zárja az ajtót még mindig használja arc kinyit", + "添加和使用面容开锁时": "Az arc hozzáadása és használata a kioldódás során", + "添加和使用面容开锁时提示": "\n1, kérjük, próbálja meg, hogy egyetlen személy előtt az ajtó művelet;\n2, kérjük, álljon az ajtózár előtt körülbelül 0,5 ~ 0,8 méter, szemben az ajtózár;\n3. kérjük, tartsa az arcát akadálytalanul, és tegye ki arcvonásait;\n4. ha az arcfelismerés abnormális, a digitális billentyűzet bármely billentyűzetét megérintse, az arcfelismerés manuálisan újraindításához.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Kérjük, válassza ki a motor teljesítményét óvatosan az ajtózár tényleges helyzete szerint:", + "小功率:": "Miniwatt:", + "耗电少": "Kevesebb energiafogyasztás", + "大功率": "Nagy teljesítményű:", + "大功率提示": "Ha a zár nyelv nem lehet behúzni normálisan, amikor feloldja, vagy kell vezetni", + "开门方向设置提示": "Kérjük, óvatosan válassza ki az irányt, hogy nyissa ki az ajtót az otthoni (ha úgy dönt, a rossz irányba, akkor nem lesz képes-hoz nyit és zárja az ajtót megfelelően):", + "左开": "Nyissa balra", + "右开": "Nyitott jobb", + "判断方法:": "Így:", + "判断方法内容": "A férfi a házon kívül állt, a bejárati ajtóval szemben.", + "录像时段": "Video slot", + "密码": "Passcodes", + "卡": "Kártyák", + "指纹": "Ujjlenyomat", + "人脸": "Arc", + "配件商城": "Lock mall", + "公司名称": "Cégnév", + "请输入公司名字": "Adja meg a cég nevét", + "提示": "Hint", + "是否删除?": "Vajon törölni?", + "员工信息": "Személyzet info", + "员工": "Személyzet", + "打卡方式无效": "Nem elérhető", + "中国": "Kína", + "选择钥匙": "Válasszon ekey", + "编辑": "Szerkesztés", + "无": "Nem", + "有": "Igen", + "请输入姓名": "Kérjük, adja meg a nevét", + "获取人脸": "Getting faces", + "选择密码": "Válassza ki a kódot", + "选择卡": "Válassza a kártyát", + "选择指纹": "Válassza ki az ujjlenyomatot", + "选择人脸": "Válassza az arcot", + "员工是否有人脸": "Hogy a munkavállalónak arca van-e", + "同时删除员工钥匙": "Delete his/her ekey", + "删除": "Delet", + "确定要删除员工吗?": "Törölje ezt a munkavállalót", + "月统计": "Havi statisztika", + "迟到": "Kései", + "早退": "Hagyj korán", + "未打卡": "Nincs rekord", + "钥匙将在": "Ez az ekey lejár a", + "天后失效": "Day (s)", + "电量更新时间:": "Akkumulátor frissítési idő:", + "新增配件": "Add", + "钥匙不可用": "Kulcs nem áll rendelkezésre", + "正在开锁中...": "Kioldó...", + "你的钥匙": "A kulcs", + "常开模式启动!长按闭锁": "Nyílt mód elindult! Hosszú nyomja meg a zár", + "演示模式": "Demo mód", + "请先同意用户协议及隐私政策": "A felhasználói megállapodás és az adatvédelmi szabályzat előzetes elfogadása", + "用户协议": "Felhasználói feltételek", + "隐私政策": "Adatvédelem", + "注册成功": "Regisztráció sikeres", + "你所在的": "You are in", + "手机号": "Telefonszám", + "忘记密码": "Elfelejtett jelszó", + "重置成功": "Reset siker", + "确定要退出吗?": "Kilépés?", + "功能暂未开放": "Funkció még nem nyitott", + "设置成功": "Sikeresen beállítani", + "删除成功": "Successfully delete", + "单次": "Egyszeri", + "永久": "Állandó", + "限时": "Időzített", + "自定义": "Custom", + "清空码": "Erase", + "循环": "Visszatérő", + "工作日": "Munkanap", + "每日": "Napi", + "周末": "Hétvége", + "确定要删除吗?": "Törlése?", + "该锁的密码都将被删除": "A zárolás minden jelszavát töröljük", + "已过期": "Érvénytelen", + "该锁的电子钥匙都将被删除": "Az összes ekeys a zár törlődik", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Törölje az összes ekeys társult ez ekey. ezt a lépést nem lehet visszavonni!", + "删除钥匙会在用户APP连网后生效": "Az ekey törlődik", + "有效时间": "Hatékony idő", + "接收者": "Címzett", + "仅管理自己创建的用户": "Csak saját felhasználóinak kezelése", + "远程开锁": "Távoli kinyit", + "请输入钥匙名称": "Kérjük, adja meg a kulcs nevét", + "修改成功": "Siker módosítása", + "冻结": "Freeze", + "解除冻结": "Thaw", + "授权": "Engedélyezze", + "取消授权": "De-engedélyezése", + "同时解冻其发送的钥匙": "Felolvasztja az összes ekeys által kiadott felhasználó", + "会在用户APP连网后生效": "Ez az ekey felolvad, amikor a felhasználó alkalmazása csatlakozik a hálózathoz", + "同时冻结其发送的钥匙": "Fagyasztani az összes ekeys által kiadott felhasználó", + "冻结会在用户APP连网后生效": "Ez az ekey akkor lesz fagyasztva, amikor a felhasználó alkalmazása csatlakozik a hálózathoz", + "取消授权会在用户APP连网后生效": "A felhasználó elveszíti a/ő jogosultságait, amikor a felhasználó alkalmazása csatlakozik a hálózathoz", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Az engedélyezett felhasználó szinte ugyanolyan jogosultságokkal rendelkezik, mint a lock manager (pl. az ekeys és a passcodes küldésének képessége)", + "失效时间需晚于生效时间": "A lejárati időnek később kell lennie, mint a hatályos idő", + "生效时间需晚于当前时间": "A hatásos időnek később kell lennie, mint az aktuális idő", + "失效日期需晚于生效日期": "A lejárati időnek később kell lennie, mint a hatályos dátum", + "修改有效期": "Módosítási időszak", + "生效日期": "Kezdési dátum", + "失效日期": "Végdátum", + "开锁": "Unlock", + "开锁成功": "Unlock siker", + "请选择锁": "Kérjük, válassza a zárak", + "请选择接收者": "Kérjük, válassza ki a vevőt", + "请选择有效期": "Kérjük, válassza ki az érvényességi időtartamot", + "请选择发送方式": "Kérjük, válassza ki a küldési módszert", + "请选择结束时间": "Kérjük, válassza ki a befejezési idő", + "完成": "Teljes", + "有效日": "Cycle on", + "发送成功": "Siker küldése", + "请选择开始时间": "Kérjük, válassza ki a kezdési időt", + "选择用户": "Válassza ki a címzetteket", + "已选中": "Kiválasztott", + "确定": "Ok", + "请选择要发送的锁": "Kérjük, válassza a zárak", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Az arc valós név hitelesítése arra utal, hogy a felhasználó ellenőrizze az arcát a telefon alkalmazás feloldása előtt, és az ellenőrzés feloldható.", + "分享": "Megosztás", + "请输入接收者账号": "Kérjük, adja meg a vevőfiókot", + "接收者号码未注册,请重新发送": "A vevő száma nem regisztrált, kérjük, küldje újra", + "是否发送电子钥匙给未注册账号": "Szeretne egy ekey-t küldeni egy új számlára", + "取消": "Cancel", + "标记成功": "Mark success", + "微信好友": "Wechat barátok", + "短信": "Sms", + "邮件": "E-mail", + "更多": "Több", + "您好,您的电子钥匙生成成功": "Hello, az elektronikus kulcs sikeresen keletkezik", + "生效时间不能小于当前时间": "A hatásos idő nem lehet kevesebb, mint a jelenlegi idő", + "结束时间不能小于当前时间": "A végeredmény nem lehet kevesebb, mint az aktuális idő", + "是否为管理员": "Ez egy adminisztrátor", + "已连接到锁,请将卡靠近门锁的读卡区": "Csatlakozik. helyezze a kártyát a kártyaolvasó ellen", + "尝试连接设备...": "Csatlakozni a lock. kérjük, várjon...", + "地理位置": "Földrajzi elhelyezkedés", + "检查以确保以下地址是正确的": "Ellenőrizze, hogy a következő cím helyes", + "地图加载中,请稍候。。": "A térkép betöltése, kérjük várjon...", + "跳过": "Skip", + "还未获取到位置信息哦,请耐心等待一下!": "A helyszíni információk még nem kaptak, kérjük, várjon türelmesen!", + "请填写信息": "Kérjük, töltse ki az információt", + "有效期": "Érvényességi időszak", + "生效时间": "Kezdési idő", + "失效时间": "End time", + "上传成功": "Sikeresen feltöltött", + "未生效": "Inaktív", + "已生效": "Hatásos", + "指纹详情": "Ujjlenyomat info", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Akkor kell helyezni az ujját az érzékelő többször. kérjük, kövesse az utasításokat...", + "开始添加": "Start", + "请将您的手指按下": "Helyezze az ujját az érzékelőre", + "根据提示,抬起手指后再进行下一次指纹采集": "Kövesse az utasításokat... akkor kell eltávolítani, és helyezze az ujját az érzékelő a következő rekord", + "添加成功": "Siker hozzáadása", + "更新成功": "A siker frissítése", + "搜索": "Keresés", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "A visszaállítás után a zár kártyája törlődik, szeretné visszaállítani?", + "已失效": "Érvénytelen", + "卡详情": "Kártya info", + "请输入": "Kérjük, adja meg itt", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Kikapcsolva a zár egész nap kinyitva marad, amíg manuálisan be nem zárják", + "请输入小于或等于60的数字": "Kérjük, adja meg a 60-nál kisebb számot", + "操作成功": "Sikeres művelet", + "管理员密码相同,无需修改": "A rendszergazda jelszó ugyanaz, és nem kell módosítani", + "请输入6-9位数字": "6-9 számjegy hosszúságban", + "请输入6-9位管理员密码": "Kérjük, adja meg a 6-9 számjegyű rendszergazda jelszavát", + "请输入新的管理员密码": "Kérjük, adja meg az új rendszergazda jelszavát", + "未分组": "Ungrouped", + "请输入分组名称": "Csoport létrehozása", + "创建成功": "Siker létrehozása", + "设置锁分组成功": "Beállíthatja a lock csoportot sikeresen", + "电池1电量": "Akkumulátor 1", + "电池2电量": "Akkumulátor 2", + "电量更新时间": "Akkumulátor frissítési idő", + "锁电量更新成功": "Lock power update siker", + "您的钥匙未生效": "A kulcs nem hatékony", + "您的钥匙已冻结": "A kulcs már fagyott", + "您的钥匙已过期": "A kulcs lejárt", + "常开模式开启": "A zár áthaladási módban van", + "超级管理员": "Szuper admin", + "授权管理员": "Engedélyezett admin", + "普通用户": "Közönséges felhasználó", + "余": "Mérleg", + "天": "Nap", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "A zár törlése után az összes információ együtt törlődik, biztos vagy benne, hogy törölni szeretné a zárat?", + "请输入登录密码": "Kérjük, adja meg az alkalmazás jelszavát", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "A készülék törlése nem sikerült, kérjük, győződjön meg arról, hogy az eszköz az eszköz közelében van, a készülék nem csatlakozik, és a készülék be van kapcsolva", + "用户无权限": "A felhasználónak nincs engedélye", + "创建公司后,考勤功能才能使用": "Kérjük, hozzon létre egy vállalatot először", + "是否删除钥匙?": "Törli ezt az ekey?", + "邮箱绑定成功": "E-mail kötés siker", + "手机绑定成功": "Mobiltelefon kötelező siker", + "网络访问失败,请检查网络是否正常": "A kérelem nem sikerült. hálózat nem elérhető, kérjük, ellenőrizze és csatlakoztassa a készüléket a 3g/4g/wifi", + "清空": "Clear", + "是否清空?": "Tiszta?", + "消息详情": "Üzenet info", + "创建时间": "Létrehozási idő", + "管理员详情": "Adminisztrátor részletek", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ha valaki arra kényszeríti, hogy nyissa meg az ajtót, használhatja ezt a kártyát. a riasztási üzenetet az adminisztrátoroknak küldik.", + "请不要将胁迫卡用于日常开锁": "Kérjük, ne használja a kényszerkártyát napi használatra.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ha valaki arra kényszeríti, hogy nyissa meg az ajtót, akkor használja ezt az ujjlenyomatot. a riasztási üzenetet az adminisztrátoroknak küldik.", + "请不要将胁迫指纹用于日常开锁": "Kérjük, ne használja a kényszerített ujjlenyomatot napi használatra.", + "创建公司": "Cég létrehozása", + "公司名称不能超过30个字符": "A cég neve nem haladhatja meg a 30 karaktert", + "公司名称不能小于6个字符": "A cég neve nem lehet kevesebb, mint 6 karakter", + "WIFI列表": "Wifi lista", + "刷新": "Frissítés", + "手动配网": "Kézi elosztó hálózat", + "远距离": "Távolsági", + "中距离": "Közepes távolság", + "近距离": "Rövid távolság", + "锁时间更新成功": "Lock idő frissítés siker", + "锁用户": "Lock felhasználók", + "请选择常开日期": "Kérjük, válassza ki a nyílt dátumot", + "结束时间不能小于开始时间哦": "A végeredmény nem lehet kevesebb, mint a kezdési idő", + "介绍": "Történetünk", + "个人信息收集清单": "Személyes adatgyűjtési lista", + "应用权限说明": "Alkalmazás engedélyezési leírás", + "第三方信息共享清单": "Harmadik fél információmegosztási lista", + "请选择您的位置": "Kérjük, válassza ki a helyét", + "请先选择位置": "Kérjük, válassza ki a helyét először", + "管理员密码": "Admin jelszó", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Ha módosítani kell, kérjük, adja meg az új rendszergazda jelszót (6 számjegy), kattintson az ok gombra a módosításhoz", + "修改": "Módosítani", + "网络摄像头": "Kamera", + "重命名": "Átnevezés", + "分组下的锁将被移到未分组里": "A csoport alatti zárak átkerülnek az ungrouped-be", + "编辑成功": "Siker szerkesztése", + "厂商": "Gyártó", + "型号": "Modell", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Miután a jelszó keletkezik, kérjük, használja azt egyszer aktiválás előtt 23:59 ugyanazon a napon, különben lesz érvénytelen után 0 óra. A jelszó aktiválása után az érvényességi időn belül korlátlan ideig használható.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Miután a jelszó keletkezik, kérjük, használja 23:59 előtt ugyanazon a napon, különben 0 óra után érvénytelen lesz. A clear kódot a mai 0 óra előtt keletkezett összes jelszó törlésére használják.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Miután a jelszó keletkezik, kérjük, használja 23:59 előtt ugyanazon a napon, különben 0 óra után érvénytelen lesz.", + "清空密码底部提示": "A jelszó a kiürítés napján 23:59 óráig érvényes", + "相机": "Kamera", + "相册": "Fotók", + "读写": "Tároló", + "定位": "Elhelyezkedés", + "需要访问相机权限才能拍照上传文件例如头像上传": "A fényképezéshez és a fájlok feltöltéséhez hozzáférés szükséges, például egy profilkép feltöltéséhez", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Hozzáférés kamerához szükséges a fájlok és avatárok feltöltéséhez album képek segítségével", + "需要访问读写权限才能使用本地图片上传头像": "Hozzáférés olvasási és írási jogosultságokhoz szükséges az avatarok feltöltéséhez helyi képek segítségével", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "A kulcs hozzáadása funkció használatához hozzáférés szükséges a helymeghatározáshoz", + "申请": "Alkalmazás", + "权限": "Engedély", + "不允许": "Nem megengedett", + "允许": "Megengedett", + "权限被拒绝": "Engedély tagadta", + "请手动在系统设置中开启": "Kézzel engedélyezze a rendszer beállításaiban", + "权限以继续使用应用": "Az alkalmazás használatának folytatásának engedélye.", + "去设置": "Go set it up", + "当前网络": "Jelenlegi hálózat", + "位置信息": "Elhelyezkedési információk", + "请输入wifi名称": "Kérjük, adja meg a wifi nevet", + "虹膜": "Írisz", + "手掌": "Pálma", + "商城": "Mall", + "我的": "My", + "微信公众号推送": "Wechat nyilvános számla", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "A wechat megnyitásához a riasztási üzenetek fogadásához először a skye smart lock wechat nyilvános számlára kell figyelni, kérjük, mentse el a qr kódot és használja a wechat-et a beállítások beolvasásához", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "A bluetooth engedélyekhez való hozzáférés szükséges ahhoz, hogy a kulcs hozzáadása függvény helyének adatait használhassuk", + "请输入Email": "Írja be az e-mail", + "请输入手机号": "Adja meg a telefonszámát", + "家人到家": "Családtag érkezett haza", + "添加家人": "Családi tag hozzáadása", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Ha a zár nem csatlakozik az internethez, a jelkódot, a kártyát, az ujjlenyomatot és más ajtónyitási módszereket nem küldhetjük el időben.", + "消息提醒": "Emlékeztető", + "开门通知": "Megnyitó értesítés", + "N天未开门": "N nap ajtónyitás nélkül", + "门未关好": "Az ajtó nem zárt", + "防拆报警": "Tamper riasztás", + "低电量提醒": "Alacsony akkumulátor", + "胁迫开门": "Kényszerített ajtónyitás", + "有人按门铃": "Valaki megszólalja az ajtócsengőt", + "有人出现在门口": "Valaki megjelenik az ajtónál", + "提醒方式": "Emlékeztető módszer", + "开门方式": "Ajtónyitási módszer", + "请选择": "Kérjük, válassza ki", + "家人": "Családtag", + "保存": "Mentés", + "APP推送": "App push", + "管理员": "Admin", + "未启用": "Nem engedélyezett", + "已启用": "Engedélyezett", + "省电模式": "Energiatakarékos mód", + "逗留抓拍模式": "Maradjon rögzítési mód", + "实时监控模式": "Valós idejű megfigyelési mód", + "自定义模式": "Egyéni mód", + "猫眼设置": "Macska szem beállítás", + "猫眼工作模式": "Macska szem üzemmód", + "自动亮屏": "Automatikus fényes képernyő", + "亮屏持续时间": "Képernyő időben", + "逗留警告": "Maradj figyelmeztetés", + "异常警告": "Rendellenes figyelmeztetés", + "短信提醒": "Sms", + "邮件提醒": "E-mail", + "N天未开门提醒": "N nap ajtónyitás nélkül", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Ha valaki arra kényszeríti, hogy nyissa meg a zár, akkor használja ezt az ujjlenyomatot. A riasztási üzenetet az adminisztrátoroknak elküldjük. a funkció használatához kérjük, győződjön meg róla, hogy a zár online.", + "胁迫指纹": "Kényszerű ujjlenyomat", + "指纹列表": "Ujjlenyomat-lista", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "A beállított idő után, ha a zár nem nyílik meg, a rendszer emlékeztető üzenetet küld a kijelölt címzettnek. Ez a funkció megköveteli, hogy a zár kapcsolódjon az internetre.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Az emlékeztető engedélyezése után, amikor a zár akkumulátor 20%, 10% és 5% alatt van, a rendszer emlékeztető üzenetet küld a kijelölt címzettnek.", + "未开门时间": "Days without door opening", + "添加和使用面容开锁时:": "Az arc feloldásakor hozzáadása és használata:", + "关锁": "Zárzárás", + "功能": "Függvény", + "配件": "Alkatrészek", + "云存": "Felhőtároló", + "本地": "Ez a helység", + "3天滚动储存": "3 napos gördülő tárolás", + "去升级": "Upgrade now", + "下载列表": "Letöltési lista", + "已下载": "Letöltött", + "全部视频": "Minden videó", + "已为本设备免费提供3大滚动视频储存服务": "Három gördülő videótároló szolgáltatás biztosított erre az eszközre ingyenesen", + "视频播放": "Videó lejátszás", + "全选": "All", + "请选择要删除的视频": "Kérjük, válassza ki azt a videót, amelyet törölni szeretne", + "请选择要下载的视频": "Kérjük, válassza ki a letölteni kívánt videót", + "欢迎使用": "Üdvözöljük a használatra", + "用户协议和隐私政策概要": "A felhasználói megállapodás és az adatvédelem összefoglalása", + "协议概要": "Protokoll-összefoglaló", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Köszönjük, hogy használja ezt az alkalmazást. Nagy jelentőséget tulajdonítunk az ön személyes adatainak és adatvédelmi védelmének. A termék használata előtt, kérjük, olvassa el figyelmesen", + "《用户协议》": "Felhasználói feltételek", + "和": "És", + "《隐私政策》": "◆ Adatkezelési szabályzat", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "A teljes tartalmát. A \"egyetértés\" gombra kattintva ön elfogadja az összes feltételt. Ha úgy dönt, hogy nem ért egyet, akkor nem lesz képes használni a termékeinket és szolgáltatásainkat, és kilép az alkalmazás.", + "不同意": "Nem ért egyet", + "同意": "Agree", + "该功能是高级功能,请开通后再使用": "Ez a fejlett funkció. Kérjük, engedélyezze először.", + "常用程序": "Közös programok", + "该锁已被重置": "A zárat visszaállították", + "需要访问读写权限才能使用手动升级固件": "Az olvasási és írási jogosultságokhoz hozzáférés szükséges a firmware manuális frissítéséhez", + "错误D固件,请选择正确的文件": "Rossz firmware, kérjük, válassza ki a megfelelő fájlt", + "非SYD固件,请选择正确的文件": "Nem syd firmware, kérjük, válassza ki a megfelelő fájlt", + "文件校验失败 0x01": "A fájl ellenőrzése nem sikerült 0x01", + "解析元数据失败,请选择正确的文件": "Nem sikerült metaadatok elemzése, kérjük, válassza ki a megfelelő fájlt", + "文件校验失败 0x02": "A fájl ellenőrzése nem sikerült 0x02", + "文件校验失败 0x03": "A fájl ellenőrzése nem sikerült 0x03", + "固件升级完成": "Firmware frissítés befejeződött", + "记录": "Records", + "开通高级功能后才可以对锁进行管理": "Kérjük, engedélyezze az advanced function először a zárak kezeléséhez.", + "去开通": "Enable", + "实名认证": "Valós név hitelesítés", + "当前剩余数量": "Maradék", + "购买": "Vásárlás", + "实名认证为付费功能,请购买后再使用": "A valódi név hitelesítése fizetett funkció, kérjük, a vásárlás után használja", + "密码不一致哦": "A jelszavak nem következetesek", + "退出添加": "Abbahagyja hozzáadását", + "管理员已满": "Admin teljes", + "用户已满": "A felhasználó teljes", + "锁上面添加指纹已满": "Add ujjlenyomat a zár teljes", + "指纹已存在": "Az ujjlenyomat már létezik.", + "锁上面添加人脸已满": "Lock felett add arc teljes", + "人脸已存在": "Az arc már létezik", + "锁上面添加卡已满": "Lock fenti add kártya teljes", + "卡已存在": "Kártya már létezik", + "锁上面添加密码已满": "Lock fenti add jelszó teljes", + "密码已存在": "Egy azonos kódot már létezik. kérjük, válasszon egy másik", + "请输入密码": "Kérjük, adja meg a jelszót", + "暂无密码,无需重置": "Nincs jelszó, nem kell visszaállítani", + "真实姓名": "Valódi név", + "身份证号": "Azonosító szám", + "请输入真实姓名": "Kérjük, adja meg a valódi nevét", + "请输入身份证号": "Kérjük, adja meg az azonosító számát", + "请输入身份证号和真实姓名": "Kérjük, adja meg az azonosító számát és a valódi nevet", + "点击返回设备配对": "Koppintson vissza a készülék párosításához", + "无法连接?尝试升级": "Nem tud csatlakozni? frissítés kísérlet", + "固件升级提示": "Firmware frissítés prompt", + "请先获取固件文件到手机本地,再选择升级": "Kérjük, hogy a firmware fájlt a helyi telefon először, majd válassza a frissítés", + "固件升级中": "A firmware-t frissítik", + "取消升级": "Törli a frissítést", + "固件传输中": "Firmware in transit", + "关闭": "Kikapcsolása", + "传输中'": "In transit", + "操作记录": "Records", + "修改姓名": "Név szerkesztése", + "传输中": "In transit", + "发送人": "Által kibocsátott", + "发送时间": "Kibocsátott idő", + "钥匙详情": "Ekey info", + "姓名": "Név", + "发送": "Küldés", + "请确认姓名全名和身份证号码是否正确": "Kérjük, erősítse meg, hogy a teljes név és azonosító szám helyes", + "传输期间请勿离开当前页面": "Az átigazolás során nem hagyja el az aktuális oldalt", + "机型": "Modellek", + "硬件版本": "Hardver verzió", + "固件版本": "Firmware verzió", + "手动升级": "Kézi frissítés", + "设备连接中...": "Eszköz csatlakozó...", + "未避免异常情况,请在门打开时升级": "Elkerülhetetlen kivételek, kérjük, frissítse, ha az ajtó nyitott", + "钥匙无效": "A kulcs érvénytelen", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Nem tud csatlakozni a zár. kérjük, indítsa újra a telefon blutooth és próbálja újra.", + "如果是全自动锁,请使屏幕变亮": "Ha ez egy teljesen automatikus zár, kérjük, hogy a képernyő világosabb", + "正在尝试闭锁……": "Próbál zárni. kérem, várjon...", + "清空记录": "Clear records", + "是否要删除操作记录?": "A rekordok törlése továbbra is?", + "被删除的记录不能恢复": "A rekordok törlése után nem állíthatók vissza.", + "全部事件": "Minden esemény", + "开锁事件": "Unlock esemény", + "异常事件": "Kóros esemény", + "门铃事件": "Ajtócsengő esemény", + "视频事件": "Videó esemény", + "请开启蓝牙": "Kérjük, kapcsolja be a bluetooth-t", + "请选择有效日": "Kérjük, válassza ki a hatékony nap", + "公司名字长度不能小于 6 ": "A cégnév hossza nem lehet kevesebb, mint 6", + "已是最新版本": "Nincs frissítés", + "新建短信模版": "Létrehozása sms sablon", + "新建邮件模版": "Létrehozása e-mail sablon", + "自定义短信模版": "Sms sablon", + "自定义邮件模版": "E-mail sablon", + "名称": "Név", + "星星锁": "Star lock", + "无考勤记录": "No records", + "大家干劲十足": "Mindenki jön időben", + "工作时长未出炉": "Nincs munkaidő", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Az ország/régió megválasztása befolyásolja az adatbiztonságot. ön jelenleg kiválasztotta albániát, kérjük, erősítse meg a folytatás előtt.", + "确认国家或地区": "Ország/régió megerősítése", + "我知道了": "Got it", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Fontos frissítések fogadásához kattintson az 'ok' gombra, és engedélyezze az értesítéseket a beállításokban.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Bekapcsolása után újra bekapcsolhatja a beállítás gomb hosszú megnyomásával a záron, és újra hozzáadhatja az alkalmazással", + "已有": "Current", + "新增": "Új", + "账号格式错误": "Rossz formátum", + "接收者信息为空": "A címzett információ üres", + "请输入时间(秒)": "Kérjük, adja meg az időt (sec)", + "加载数据失败": "Az adatok betöltése nem sikerült", + "重试": "Próbáld újra", + "升级中,是否退出": "A frissítés során, hogy kilépjen-e", + "下一步": "Következő", + "公寓": "Apartman", + "个人用户": "Személyes", + "星寓": "Star apartman", + "账号": "Számla", + "请输入手机号或email": "Telefonszám vagy e-mail", + "请输入星寓管理员的账号": "Kérjük, adja meg a star apartment administrator fiókját", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "A kiválasztott zár (ek) összes adatát véglegesen továbbítjuk a címzettnek.", + "暂不支持跨平台转移,敬请期待": "A cross-platform transzfert egyelőre nem támogatja, várom, hogy", + "移除坏锁": "Mozgassa hibás/sérült zárak a szemetet", + "转移确认": "Megerősíti az átadást", + "本次共转移": "Ezúttal összesen", + "把智能锁": "Smart lock", + "确认": "Ok", + "移除成功": "Sikeresen eltávolítása", + "转移成功": "Átviteli siker", + "该已锁被删除": "A lezárt törlődik", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "A felhatalmazott adminisztrátor csak a saját maga által létrehozott passzkódokat, az ekeyeket és az etc- t tudja kezelni.", + "添加授权管理员": "Admin létrehozása", + "导出记录": "Rekordok exportálása", + "选择时间段": "Válassza ki az időtartamot", + "导出": "Export", + "批量导出": "Batch export", + "读取记录": "Refresh records", + "设备": "Eszköz", + "消息": "Üzenetek", + "智能分析": "Intelligens analitika", + "精准识别设备事件,过滤无效信息": "Pontosan azonosítsuk az eszköz eseményeit és szűrjük ki az érvénytelen információkat", + "系统设置": "Rendszerbeállítások", + "系统的全局配置在此项内进行设置": "A rendszer globális konfigurációja ebben az elemben van beállítva", + "导出操作记录": "Rekordok exportálása", + "立即查看": "Nézet", + "导出成功": "Sikeresen exportált", + "发送钥匙": "Send ekey", + "进度": "Árfolyam", + "失败": "Nem sikerült", + "人脸详情": "Arc részletek", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Ha valakit körülbelül 1,5 méterrel az ajtó előtt érzékelnek, az arcfelismerő szabadulás automatikusan elindul.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Amikor valaki az ajtó előtt körülbelül 0,8 méterrel érzékelik, az arcfelismerő szabadulás automatikusan elindul.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Amikor valaki az ajtó előtt körülbelül 0,5 métert érzékelnek, az arcfelismerő szabadulás automatikusan elindul.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Az érzékelési távolságot kikapcsolták, a billentyűzet bármely billentyűzetét manuálisan meg kell érinteni az arcfelismerés feloldásához.", + "防误开已打开,开锁后": "Bekapcsolták a hiba elleni nyitást, és a feloldás után", + "秒内不可使用面容开锁": "Face unlocking nem használható másodperceken belül", + "掌静脉": "Pálmavéna", + "添加掌静脉": "Palmavéna hozzáadása", + "胁迫掌静脉": "Kényszerpálmavéna", + "请不要将胁迫掌静脉用于日常开锁": "Kérjük, ne használja kényszerpálmavénákat a napi feloldáshoz", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Csatlakozva a zár, kérjük, természetesen nyissa meg a tenyerét, a tenyeret a kamera felé néz", + "掌静脉详情": "Palm véna részletek", + "掌静脉号": "Pálmavéna-szám", + "蓝牙未打开,请到设置里面打开蓝牙": "A bluetooth nincs bekapcsolva, kérjük, kapcsolja be a bluetooth beállításokat", + "删除用户时,会将用户拥有的钥匙一起删除。": "Ha a felhasználó törlésre kerül, a felhasználóhoz tartozó ekeys is törlődik.", + "配置网络": "Hálózat konfigurálása", + "你好": "Hello", + "成功": "Sikeres", + "类型选择": "Type select", + "请选择要使用哪种类型": "Kérjük, válassza ki, melyik típust kell használni", + "系统邮件(推荐)": "Rendszer e-mail (ajánlott)", + "系统短信(推荐)": "Sms rendszer (ajánlott)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Az e-mailt küldjük ezt az alkalmazást. kérjük, vásároljon e-mail csomag először.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Az sms-t küldjük ez az alkalmazás. kérjük, vásároljon e-mail csomag először.", + "个人邮件": "Személyes e-mail", + "个人短信": "Személyes sms", + "邮件将从你的个人邮箱发给用户": "Az e-mailt a személyes e-mail fiókjáról küldjük el.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Az sms-t az ön személyes telefonszámából küldjük el. a távközlési szolgáltatónak fizet.", + "为了更好地应用体验,请确定权限": "A jobb alkalmazási élmény érdekében kérjük, erősítse meg a jogosultságokat", + "您第一次拒绝权限,请确定权限": "Ön először visszautasította az engedélyt, kérjük, erősítse meg az engedélyt", + "您第二次拒绝权限,请去应用设置开启权限": "Ön másodszor is megtagadta az engedélyt, kérjük, lépjen be az alkalmazási beállításokba, hogy engedélyezze az engedélyt", + "去应用市场": "Menj az app store-ba", + "温馨提示": "Meleg prompt", + "关闭应用": "Az alkalmazás bezárása", + "开启微信接收报警消息需要先关注": "A wechat megnyitásához a riasztási üzenetek fogadásához kövesse", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat nyilvános számla, mentse el a qr kódot, és használja a wechat a beállítások beolvasásához", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "A valódi név hitelesítése fizetett funkció, kérjük, lépjen kapcsolatba a zár adminisztrátorral a vásárláshoz és a használatához", + "位置权限": "Helymeghatározási engedély", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Kérjük, adja meg az alkalmazást, hogy használja a locatian. azt használják, hogy vizsgálja ble zárak és átjárók.", + "相机/相册权限": "Kamera/album engedély", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Kérjük, adja meg az alkalmazást, hogy olvassa el és írja a fényképet és a fájlokat a tárolásból.", + "点击选择": "Kattintson a kiválasztáshoz", + "微信": "Wechat", + "朋友圈": "Moments", + "QQ": "Qq", + "QQ空间": "Qqzone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Link", + "今天": "Ma", + "密码错误": "Érvénytelen jelszó", + "网络中断": "Hálózati megszakítás", + "钥匙不存在": "Kulcs nem létezik", + "钥匙过期": "Kulcs lejárt", + "钥匙已存在": "Kulcs már létezik", + "密码失效": "Jelszó érvénytelen", + "门锁时间异常": "Ajtó zár idő rendellenes", + "APP(手机)未联网": "App (mobiltelefon) nem csatlakozik az internethez", + "数据不存在": "Adatok nem léteznek", + "待接收": "Bereceived", + "已冻结": "Befagyott", + "已删除": "Törölt", + "未知": "Ismeretlen", + "拖动下方滑块完成拼图": "Húzza a csúszkát a helyes posztion", + "验证成功": "Ellenőrzési siker", + "验证失败": "Az ellenőrzés nem sikerült", + "向右拖动滑块填充拼图": "Húzza a csúszkát jobbra, hogy töltse ki a puzzle", + "请先获取到位置信息哦": "Kérjük, hogy a helymeghatározás először", + "请选择国家": "Kérjük, válasszon egy országot", + "获取锁信息": "Get lock information", + "锁数据异常,请重试": "Lock data abnormális, kérjük, próbálja újra", + "连接设备中...": "Csatlakozó eszköz...", + "把锁": "Zárak", + "条": "Szalag", + "封": "Fóka", + "次": "Times", + "支付成功": "Pay success", + "查看详情": "Részletek megtekintése", + "请输入模板名称": "Kérjük, adja meg a sablon nevét", + "模版类型": "Típus", + "再返回一次退出": "Kilépés újra", + "请先添加锁": "Kérjük, hozzáadja a zár először", + "可视对讲": "Visual intercom", + "详细日志": "Részletes napló", + "已复制到剪切板": "Másolt", + "拍照": "Fotó", + "从相册选择": "Válasszon albumból", + "选择问题": "Kérjük, válasszon egy kérdést", + "确认长度不足8位": "Erősítse meg a hossza kevesebb, mint 8 számjegy", + "新密码长度不足8位": "Új jelszó hossza kevesebb, mint 8 számjegy", + "两次密码不一致": "Jelszó nem egyezik. kérjük, próbálja újra", + "请点击获取验证码,验证码将发送到": "Kérjük, kap egy ellenőrző kódot. a kódot elküldjük", + "切换": "Switch", + "验证": "Ellenőrizze", + "验证成功,账号已删除": "Ellenőrzés sikeres, fiók törölt", + "该密码不是自定义密码,无法修改": "Ez a jelszó nem egyéni jelszó, és nem lehet módosítani", + "请选择设备要关联哪些姓名": "Kérjük, válassza ki, hogy az eszköz melyik névhez kell társítani", + "请选择姓名要关联哪些设备": "Kérjük, válassza ki, hogy mely eszközökkel kell társítani a nevet", + "确定要移除所选中的坏锁吗?": "Távolítsa el a hibás zárat?", + "邮件通知": "Értesítés e-mailben", + "短信通知": "Értesítés sms-en keresztül", + "您好,您的授权管理员生成成功": "Helló, az engedélyezett adminisztrátor sikeresen keletkezett", + "请输入接收者姓名": "Kérjük, adja meg itt", + "版本更新": "Verziófrissítés", + "下次再说": "Next time", + "配网成功": "Hálózati elosztás sikere", + "配网失败": "A hálózati eloszlás nem sikerült", + "该锁的无线键盘都将被删除": "Az összes vezeték nélküli billentyűzetet ezt a zárat töröljük", + "实时画面": "Valós idejű kép", + "适合门口较为安全的环境。": "Alkalmas viszonylag biztonságos környezetben az ajtónál.", + "仅发生特定事件才录像,并可查看实时画面。": "Csak konkrét eseményeket jegyeznek fel, és a valós idejű kép megtekinthető.", + "一般情况下,满电可使用7-8个月": "Normál körülmények között 7-8 hónapig használható, ha teljesen feltöltődik", + "有人逗留或发生特定事件才录像,可随时查看": "Valaki tartózkodik, vagy konkrét eseményeket rögzítenek, és bármikor megtekinthetők", + "实时画面。": "Valós idejű kép.", + "一般情况下,满电可使用5~6个月。": "Normális körülmények között, akkor lehet használni 5 ~ 6 hónapig, ha teljesen feltöltött.", + "适合门口人员复杂、较不安全的环境。": "Alkalmas összetett és viszonylag veszélyes környezetben az ajtónál.", + "有人出现就录像,可随时查看实时画面。": "Rögzítse, amikor valaki megjelenik, és nézd meg a valós idejű képet bármikor.", + "一般情况下,满电可使用2~4个月。": "Normális körülmények között, akkor lehet használni 2 ~ 4 hónap, ha teljesen feltöltött.", + "根据您家门口实际情况设置录像和实时画面功能。": "Állítsa be a videó és a valós idejű kép funkciók szerint a tényleges helyzet az ajtónál.", + "可使用时长由具体设置决定。": "A használat időtartamát az adott beállítások határozzák meg.", + "查看": "Nézet", + "有人按门铃或发生": "Valaki csenget az ajtócsengőt, vagy", + "异常事件时": "Kóros esemény", + "不录像": "Nincs videó", + "有人出现、按门铃": "Valaki megjelenik, csenget az ajtócsengő", + "或发生异常事件时": "Vagy rendellenes esemény következik be", + "逗留达到10秒": "Maradj 10 másodpercig", + "约1.5米": "Körülbelül 1,5 méter", + "随时": "Bármikor", + "立即录像": "Rögzíti azonnal", + "录像时机": "Videó időzítés", + "有人出现时录像": "Rögzítse, ha valaki megjelenik", + "人体侦测距离": "Emberi érzékelési távolság", + "查看实时画面": "Valós idejű kép megtekintése", + "自定义时间": "Egyéni idő", + "当日": "Ma", + "次日": "Következő nap", + "自定义时段": "Egyéni időtartam", + "发生事件时查看": "Megnézni, ha egy esemény történik", + "实时查看": "Valós idejű nézet", + "有人在门口出现10秒后开始录像。": "Valaki 10 másodpercig jelenik meg az ajtónál a felvétel előtt.", + "有人按门铃时立即录像。": "Rögzíti azonnal, amikor valaki csenget az ajtócsengő.", + "有人出现在门前1.5米范围时启动录像": "Kezdje el a felvételt, ha valaki 1,5 méteren belül jelenik meg az ajtó előtt", + "约0.8米": "Körülbelül 0,8 méter", + "约3.0米": "Körülbelül 3,0 méter", + "添加指纹失败": "Művelet nem sikerült.", + "项": "Tételek", + "播放中": "Playing", + "下载": "Letöltés", + "暂无下载内容": "Nem letölthető tartalom", + "亮度": "Fényerő", + "音量": "Kötet", + "快进至": "Gyors előre a", + "快退至": "Rewind to", + "暂无视频信息": "Nincs videóinformáció", + "加载出错": "Betöltési hiba", + "请单人正对门锁,距离一个成年人手臂长度": "Kérjük, hogy csak az ajtózár előtt álljon, egy kar hosszában", + "(约0.6米)。": "(Körülbelül 0,6 méter).", + "保持脸部无遮挡,露出五官。": "Tartsa az arcát akadálytalanul, és mutassa meg arcvonásait.", + "准备好了,开始添加": "Kész, kezdj el hozzáadni", + "正在录入中...": "Felvétel...", + "添加人脸失败": "Nem sikerült az arc hozzáadása", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "A visszaállítás után a zár arcait töröljük. Biztos vagy benne, hogy vissza akarsz állítani?", + "人脸号": "Arcszám", + "虹膜详情": "Iris részletek", + "虹膜号": "Íriszszám", + "选择设备类型": "Válassza ki az eszköz típusát", + "照明灯具": "Világítótestek", + "电动窗帘": "Elektromos függönyök", + "门窗传感器": "Ajtó és ablak érzékelő", + "传感器": "Érzékelő", + "清除数据成功": "Sikeresen törölt adatok", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "A zár nem csatlakozik az internethez, így a jelkód, a kártya, az ujjlenyomat és más ajtónyitási módszerek újrakódjait nem lehet valós időben feltölteni.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Ha meg kell őrizni a történelmi nyilvántartások, akkor exportálni őket.", + "看不到操作记录,可能原因有": "Nem láthatjuk a műveleti rekordokat, lehetséges okok", + "操作记录详情": "Művelet rekord részletei", + "操作时间": "Működési idő", + "此模块功能需要锁联网后设置方可生效": "Ezt a modult funkciót kell beállítani, miután a zár csatlakozik az internetre, hogy hatályba lépjen", + "用户已存在": "Felhasználó már létezik", + "钥匙数量已到上限": "A kulcsok száma elérte a felső határt", + "附近没有可用网关": "Nincs elérhető átjáró a közelben", + "正在创建安全连接...": "Biztonságos kapcsolat létrehozása...", + "监视状态下不能发送录音": "Nem küldhet felvételeket monitoring módban", + "挂断": "Hang up", + "监视中暂不能开锁": "A feloldás során nem elérhető", + "长按说话": "Nyomja meg és tartsa meg beszélni", + "松开发送": "Engedje el küldeni", + "请输入6位数字开锁密码": "Kérjük, adja meg a 6 számjegyű kinyit jelszót", + "请输入开锁密码": "Kérjük, adja meg a unlock jelszót", + "接收者在有效期内可以不限次数使用": "A címzettek korlátlan időre használhatják az ekeys-t az érvényességi időn belül.", + "接收者可以使用此App开关锁": "A címzett képes zárni/feloldani ezt az alkalmazást.", + "单次钥匙有效期为1小时,只能使用一次": "Az egyszeri ekey egy óráig érvényes, és csak egyszer használható.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "A címzettek korlátlan ideig használhatják az ekeys-t a fix ciklusidőben.", + "获取模板失败": "Nem sikerült a sablon beszerzése", + "微信通知": "Wechat értesítés", + "系统短信": "Rendszer sms", + "系统邮件": "Rendszer e-mail", + "模板": "Sablon", + "新建模版": "Sablon létrehozása", + "您好,您的密码是": "Hello, a jelszó", + "密码名字": "Jelszó neve", + "请输入6-9位密码": "Kérjük, adja meg a 6-9 számjegyű jelszót", + "设置密码": "Jelszó beállítása", + "操作成功,密码为": "Sikerült. a jelszót", + "类型:自定义-永久": "Típus: egyéni-állandó", + "实时播放": "Valós idejű lejátszás", + "点击对讲": "Kattintson intercom", + "长按开锁": "Hosszú nyomja meg a kinyit", + "接听失败": "Nem sikerült válaszolni", + "请在锁设置中开启远程开锁": "Kérjük, engedélyezze a távoli feloldást a zár beállításaiban", + "接听": "Válasz", + "截图已保存到相册": "Screenshot mentve album", + "添加遥控": "Távirányító hozzáadása", + "已连接到锁,请按遥控": "Csatlakozva a zár, kérjük, nyomja meg a távirányító", + "遥控号": "Távirányító száma", + "遥控详情": "Távirányító részletek", + "照明": "Világítás", + "退出演示模式": "Exit demo mód", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tipp: az aktuális interfész egy megjelenítő felület. A készülék hozzáadása után továbbra is használhatja", + "门已上锁": "Az ajtó zárva van", + "您的账号在异地登录,如非本人,请尽快修改密码": "Az ön fiókját felhasználták egy új eszközről való bejelentkezéshez", + "开门成功": "Nyissa meg sikeresen az ajtót", + "开门失败": "Nem sikerült megnyitni az ajtót", + "呼叫提醒": "Hívó emlékeztető", + "收到来自": "Kapott", + "锁的呼叫": "Lock call", + "加载数据中": "Adatok betöltése", + "搜索所有锁类型": "Keresés az összes zár típusok", + "锁电量更新时间": "Lock akkumulátor frissítési idő", + "1月": "Jan", + "2月": "Febr.", + "3月": "Mar", + "4月": "Ápr.", + "5月": "Május", + "6月": "Jun", + "7月": "Jul.", + "8月": "Aug.", + "9月": "Szept.", + "10月": "Okt.", + "11月": "Nov.", + "12月": "Dec", + "热门城市": "Hot cities", + "导出锁数据": "Zárolási adatok exportálása", + "一键开锁": "Egy kattintással kinyit", + "已开通": "Megnyitott", + "编辑员工": "Személyzet szerkesztése", + "一": "One", + "二": "Two", + "三": "Három", + "四": "Four", + "五": "Öt", + "六": "Hatos", + "日": "Sun", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Vásárlási rekord", + "使用记录": "Felhasználói rekord", + "失效时间要大于当前时间": "A lejárati időnek hosszabb kell lennie, mint a jelenlegi idő", + "修改名字": "Név szerkesztése", + "时": "Óra", + "分": "Perc", + "Amazon Alexa": "Amazon alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexa segítségével kinyit, zár és ellenőrizze a zár állapotát", + "支持的国家": "Támogatott országok", + "支持的国家值": "Usa, kanada, egyesült királyság, ausztrália, india, németország, franciaország, olaszország, spanyolország, japán", + "操作流程": "Műveleti folyamat", + "操作流程值": "1 egy zár és átjáró hozzáadása a smart lock alkalmazással\n\n2 engedélyezze az alkalmazásban lévő zár távoli feloldási funkcióját (ez a funkció alapértelmezés szerint kikapcsolt). Ha nem rendelkezik ezzel a lehetőséggel, a zár nem támogatja az alexát\n\n3 adjunk hozzá készségek alexa, és engedélyezze őket a smart lock app fiókját és jelszavát. Miután az engedélyezés sikeres, a fiók alatti eszközöket fedezhet fel\n\n4 keresse meg a zár az alexa app, kapcsolja be a hang kinyit funkció, és állítsa be a nyelv jelszó\n\n5 a zár lehet működtetni keresztül alexa", + "Google Home": "Google home", + "Action name": "Akció neve", + "ScienerSmart": "Scienersmart", + "支持的语言": "Támogatott nyelvek", + "英语": "Angol", + "Google Home操作流程的值": "1. használja az intelligens zár alkalmazást a zárak és átjárók hozzáadásához\n\n2. engedélyezze az alkalmazásban lévő zár távoli feloldási funkcióját (ez a funkció alapértelmezés szerint kikapcsolt). E lehetőség nélkül a zár nem támogatja a google home-t\n\n3. telepítse a google home alkalmazást, és kattintson a \"\" gombra a bal felső sarokban\n\n4. a beállítások oldalon válassza a \"munka a google\" lehetőséget\n\n5. keresse meg a \"scienersmart\" és használja a smart lock app fiókot és a jelszót, hogy engedélyezze", + "密码需至少包含数字/字母/字符中的2种组合": "A jelszónak a következők közül legalább 2 kell tartalmaznia: számok, betűk és speciális karakterek", + "已开锁": "Unlocked", + "已闭锁": "Locked", + "两次密码不一致哦": "A jelszavak nem következetesek", + "中功率": "Közepes teljesítmény", + "常规使用": "Rendszeres használat", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Miután az átjáró be van kapcsolva, nyomja meg és tartsa a reset gombot 5 másodpercig, és kattintson a következő gombra, amikor a jelző fény felváltva villog", + "扫描设备": "Beolvasási eszköz", + "删除失败,网关可能已经离线,是否强制删除该数据?": "A törlés nem sikerült. Az átjáró lehet, hogy offline lett. Szeretné kényszeríteni az adatok törlését?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_id.json b/lan/lan_id.json new file mode 100644 index 00000000..e494a7b5 --- /dev/null +++ b/lan/lan_id.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Kunci bintang", + "锁通通": "Mengunci melalui", + "点击开锁,长按闭锁": "Sentuh untuk membuka kunci, tahan untuk mengunci", + "考勤": "Kehadiran", + "考勤设置": "Pengaturan kehadiran", + "电子钥匙": "EKeys", + "添加卡": "Tambah kartu", + "卡号": "Nomor kartu", + "添加指纹": "Tambah sidik jari", + "指纹号": "Nomor sidik jari", + "遥控": "Jarak Jauh", + "添加人脸": "Menambah wajah", + "门锁日志": "Kunci pintu log", + "密码号": "Nomor kata sandi", + "添加者": "Operator", + "添加时间": "Waktu", + "重置": "Reset", + "请输入手机号或者邮箱": "Nomor Telepon/Email", + "工作时间": "Waktu kerja", + "工作日设置": "Pengaturan Hari kerja", + "星期一": "Senin", + "星期二": "Selasa", + "星期三": "Rabu", + "星期四": "Kamis", + "星期五": "Jumat", + "星期六": "Sabtu", + "星期日": "Minggu", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Rabu", + "周四": "Thu", + "周五": "Jumat", + "周六": "Satelit Angkatan Laut", + "周日": "Matahari", + "群发钥匙": "Kirim beberapa ekeys", + "锁": "Kunci", + "请添加": "Penerima", + "允许远程开锁": "Buka kunci jarak jauh", + "请输入验证码": "Kode verifikasi", + "获取密码": "Buat kode Masuk", + "请给密码命名": "Masukkan nama untuk kode akses ini", + "密码有限期为6个小时,只能使用一次": "Kode Akses ini harus digunakan dalam 6 jam dari waktu saat ini atau akan ditahan karena alasan keamanan. Kode Akses ini hanya dapat digunakan satu kali.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Masukkan 6-9 digit secara manual sebagai kata sandi. Dapat ditambahkan dengan Bluetooth ponsel di samping kunci, atau ditambahkan dari jarak jauh melalui gateway", + "获取": "Dapatkan", + "添加": "Tambah", + "删除公司": "Hapus Perusahaan", + "密码详情": "Info kode Masuk", + "修改密码": "Ubah Kode Akses", + "添加虹膜": "Tambahkan Iris", + "添加门磁": "Sensor pintu", + "添加无线键盘": "Keypad nirkabel", + "添加手掌": "Tambah telapak tangan", + "请输入员工账号": "Masukkan akun karyawan", + "批量授权锁": "Izinkan beberapa kunci", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Administrator resmi akan memiliki izin sebagian besar untuk mengoperasikan kunci ini.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Fitur ini memungkinkan Anda untuk membuka kunci pintar dari jarak jauh melalui Gateway. Fitur ini hanya dapat dinyalakan atau dimatikan melalui Bluetooth.", + "排列方式": "Jenis daftar", + "早到榜": "Daftar awal", + "迟到榜": "Daftar akhir", + "当前模式": "Mode saat ini", + "勤奋榜": "Daftar keras kerja", + "延迟时间": "Waktu penundaan", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Kunci akan mengunci secara otomatis setelah waktu. Buka kunci untuk satu kali pertama untuk membuat pengaturan tersedia.", + "时间": "Waktu", + "开始时间": "Waktu mulai", + "结束时间": "Waktu akhir", + "工作时间设置": "Pengaturan waktu kerja", + "常开模式": "MODE bagian", + "常开时间": "Dalam periode waktu ini", + "常开日期": "Pada hari-hari ini", + "添加员工": "Tambahkan Staf", + "节假日": "Liburan", + "打卡方式": "Metode", + "员工是否有钥匙": "Sudah ada ekey", + "上班时间": "Memulai waktu", + "下班时间": "Menutup waktu", + "本周": "Minggu ini", + "单休": "Akhir pekan satu hari", + "双休": "Akhir pekan dua hari", + "单双休": "Akhir pekan satu dua hari", + "年": "Tahun", + "月": "Bulan", + "放假日期": "Liburan", + "补班日期": "Hari kerja", + "添加假日": "Tambahkan liburan", + "开始日期": "Tanggal mulai", + "必填": "Diperlukan", + "结束日期": "Tanggal akhir", + "日榜": "Setiap hari", + "月榜": "Bulanan", + "考勤记录": "Catatan", + "假日信息": "Info liburan", + "基本信息": "Dasar", + "无线键盘": "Keypad nirkabel", + "选择无线键盘": "Tambahkan Keypad", + "门磁": "Sensor pintu", + "自动闭锁": "Kunci otomatis", + "锁声音": "Suara kunci", + "防撬报警": "Peringatan perusakan", + "重置键": "Tombol Reset", + "锁时间": "Jam kunci", + "诊断": "Diagnosa", + "上传数据": "Unggah Data", + "导入其他锁数据": "Import frime lock lain", + "锁升级": "Pembaruan perangkat terintegrasi", + "标记房态": "Status kamar", + "开锁提醒": "Buka pemberitahuan", + "微信二维码": "Unlock kode QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Orang dengan tombol elektronik dapat membuka pintu dengan memindai kode QR ini melalui WeChat. Kode QR setiap kunci berbeda. Anda dapat mencetak dan menempelkannya di samping kunci yang sesuai", + "锁编号": "Kunci nomor", + "电量": "Baterai", + "锁分组": "Grup kunci", + "选择分组": "Pilih grup", + "创建新分组": "Buat Grup", + "管理员开锁密码": "Kode masuk Admin", + "更新": "Perbarui", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Level baterai akan diperbarui melalui gateway atau bluetooth ponsel", + "当屏幕闪烁时,点击下一步": "Klik berikutnya ketika keypad berkedip", + "输入*529#或按设置键": "Masukkan README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # atau tekan tombol pengaturan", + "长按重置键2秒": "Tekan dan tahan tombol Reset 2 detik", + "附近的设备": "Peralatan terdekat", + "暂无数据": "Tidak ada Data", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Anda akan bisa mendapatkan status pintu dengan sensor pintu bersama-sama dengan gateway. Hanya satu sensor yang diperbolehkan untuk menghubungkan dengan kunci.", + "开始": "Mulai", + "全天": "Semua jam", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Anda dapat mengatur beberapa periode waktu untuk mode pengangkutan. Dalam periode waktu yang ditentukan, kunci akan tetap dalam keadaan terbuka setelah dibuka.", + "请选择锁音量": "Pilih volume kunci", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Dengan mengaktifkan, Anda akan mendengar suara dari kunci", + "低": "Rendah", + "较低": "Sedang rendah", + "中": "Sedang", + "较高": "Sedang tinggi", + "高": "Tinggi", + "开启后,锁被撬动时,会发出报警声": "Dengan mengaktifkan, Anda memungkinkan peringatan perusakan.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Dengan mematikan, tombol RESET dinonaktifkan.", + "校准时间": "Kalibrasi waktu", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnosis adalah membaca informasi konfigurasi di dalam kunci dan mengunggahnya sehingga staf dapat menganalisis penyebab kegagalan", + "上传": "Unggah", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Unggah data dari kunci ke server. Mungkin diperlukan beberapa menit", + "请选择要从哪把锁导入": "Pilih kunci untuk diimpor dari", + "有新版本": "Memiliki versi baru", + "当前版本": "Versi saat ini", + "升级": "Perbarui", + "空闲": "Kosong", + "已入住": "Sibuk", + "多语言": "Bahasa", + "添加锁": "Tambah kunci", + "锁地址": "Kunci alamat", + "选择锁类型": "Pilih jenis kunci", + "NFC无源锁": "Kunci pasif NFC", + "添加设备": "Tambahkan perangkat", + "网关": "Gateway", + "客服": "Layanan Pelanggan", + "设置": "Pengaturan", + "更多设置": "Set lainnya", + "消息推送": "Notifikasi dorong", + "锁用户管理": "Pengguna kunci", + "拥有的钥匙": "EKeys yang terkait dengan pengguna ini", + "批量授权": "Manajemen Otoritas", + "关联设备": "Perangkat terkait", + "关联姓名": "Nama terkait", + "转移智能锁": "Kunci Transfer", + "选择锁": "Kunci layar", + "接收人信息": "Penerima", + "转移网关": "Transfer Gateway", + "锁屏": "Kunci layar", + "已关闭": "Potongan", + "已开启": "Hidup", + "开启": "Nyalakan", + "确定要开启重置键?": "Lanjut untuk mengaktifkan tombol Reset?", + "确定要关闭重置键?": "Lanjut menonaktifkan tombol Reset?", + "隐藏无效开锁权限": "Sembunyikan akses yang tidak valid", + "APP开锁时需手机连网的锁": "Kunci memerlukan telepon online", + "增值服务": "Layanan", + "关于": "Tentang", + "退出": "Keluar", + "删除账号": "Hapus akun", + "个人信息": "Info akun", + "头像": "Avatar", + "昵称": "Nama panggilan", + "请输入昵称": "Masukkan nama panggilan Anda", + "修改昵称": "Ganti nama", + "修改账号": "Edit akun", + "重置密码": "Reset kata sandi", + "安全问题": "Pertanyaan keamanan", + "为了你的账号安全,修改账号前请先使用验证码验证": "Untuk keamanan akun Anda, silakan gunakan verifikasi kata sandi akun sebelum mengubah akun", + "请输入新账号": "Masukkan akun baru", + "找回密码和登录新设备时,可通过绑定的手机验证": "Nomor Telepon yang mengikat akan digunakan untuk menerima kode verifikasi.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Email pengikat akan digunakan untuk menerima kode verifikasi.", + "原密码": "Kata sandi terkini", + "新密码": "Kata sandi baru", + "确认密码": "Konfirmasi kata sandi", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Jika ponsel Anda hilang, Anda dapat masuk ke telepon baru Dengan menjawab pertanyaan keamanan.", + "问题一": "Pertanyaan 1", + "问题二": "Pertanyaan 2", + "问题三": "Pertanyaan 3", + "请输入你的答案": "Ketik jawaban Anda", + "即将到期": "Segera berakhir", + "去授权": "Masuk ke otorisasi", + "修改名称": "Edit nama", + "状态": "Status", + "WiFi名称": "Nama Wifi", + "网络MAC": "Jaringan MAC", + "网关升级": "Pembaruan Gateway", + "网关连接的锁": "Kunci terhubung ke Gateway ini", + "信号强": "Kuat", + "选择网关类型": "Pilih jenis Gateway", + "添加网关": "Tambah Gateway", + "重新通电": "Sambungkan kembali daya", + "指示灯": "Lampu indikator", + "选择网关": "Pilih Gateway", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G belum support Gan, silakan pilih WiFi 2.4G", + "WiFi密码": "WiFi Pass", + "请输入WiFi密码": "Masukkan kata sandi WiFi", + "网关名称": "Nama Gateway", + "请输入网关名称": "Masukkan nama Gateway", + "IP地址": "Alamat IP", + "子网掩码": "Masker Subnet", + "默认网关": "Gateway Default", + "自动获取DNS服务器地址": "Otomatis mendapatkan alamat Server DNS", + "首选DNS": "DNS pilihan", + "备选DNS": "DNS alternatif", + "不使用静态IP": "Tidak ada IP statis yang digunakan", + "使用静态IP": "Gunakan IP statis", + "请输入IP地址": "Masukkan alamat IP", + "请输入子网掩码": "Enter Subnet Masker", + "请输入默认网关": "Masukkan Gateway Default", + "所有锁": "Semua kunci", + "搜索所有类型的锁": "Pindai semua jenis kunci", + "门锁": "Kunci pintu", + "挂锁": "Gembok", + "保险箱锁": "Kunci pengaman", + "智能门禁": "Kontrol akses cerdas", + "车位锁": "Kunci parkir", + "摸亮触摸屏": "Sentuh tombol apa saja untuk mengaktifkan Keypad", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Silakan sentuh tombol apa saja untuk mengaktifkan kunci dan memasukkannya ke dalam Mode berpasangan. Tekan selanjutnya", + "附近的锁": "Kunci terdekat", + "如需修改名字请重新命名,点击确定添加锁": "Jika ingin mengganti nama, silakan ubah nama, klik OK untuk menambahkan kunci", + "添加锁时,手机必须在锁旁边": "Saat menambahkan kunci, ponsel harus berada di samping kunci", + "登录": "Masuk", + "注册": "Daftar", + "我已阅读并同意": "Saya telah membaca dan setuju", + "验证码": "Kode", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Kata sandi Anda harus memiliki 8-20 karakter, dan sertakan minimum dua jenis angka, huruf, dan simbol", + "手机": "Telepon", + "邮箱": "Email", + "请输入邮箱": "Masukkan Email Anda", + "国家/地区": "Negara/Region", + "你所在的国家/地区": "Negara/kawasan Anda", + "选择国家/地区": "Pilih negara atau kawasan Anda", + "获取验证码": "Dapatkan kode", + "商务合作": "Bisnis", + "电脑网页版": "Sistem Web", + "酒店系统": "Sistem Hotel", + "说明书网页版": "Panduan Pengguna", + "高级功能": "Fungsi canggih", + "记录保存": "Catatan penyimpanan", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS dapat digunakan untuk mengirim kode masuk dan informasi ekey kepada penerima.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Email dapat digunakan untuk mengirim kode masuk dan informasi ekey kepada penerima.", + "购买实名认证提示": "Setelah fungsi diaktifkan, Anda perlu menggunakan sidik jari, wajah, atau kata sandi akun untuk membuka aplikasi. Tidak perlu memverifikasi lagi selama 3 menit", + "请选择你希望的实名认证频次": "Pilih frekuensi otentikasi nama asli yang Anda inginkan", + "仅首次": "Untuk pertama kalinya", + "每日一次": "Sehari sekali", + "每周一次": "Sekali seminggu", + "每月一次": "Sekali setiap bulan", + "当前状态": "Status saat ini", + "试用中": "Sedang uji coba", + "高级功能权益内容": "Fungsi canggih", + "短信模板": "Template SMS", + "邮件模板": "Template Email", + "发卡工具": "Encoder kartu", + "购买高级功能须知": "Pemberitahuan", + "购买高级功能提示": "Fitur lebih canggih sedang dalam pengembangan, dan jika Anda membutuhkannya, Anda dapat membuka layanan berdasarkan jumlah kunci. Fitur canggih hanya tersedia untuk kunci Anda sendiri. Jika Anda adalah administrator resmi, silahkan hubungi administrator atas kunci untuk membuka layanan", + "免费体验": "Uji coba gratis", + "立即开通": "Buka sekarang", + "购买短信": "Beli SMS", + "购买邮件": "Beli EMail", + "购买实名认证次数": "Beli kali autentikasi nama asli", + "开通高级功能": "Aktifkan fungsi lanjutan", + "选择套餐": "Pilih paket", + "支付方式": "Mode pembayaran", + "支付宝": "Alipay", + "去支付": "Bayar", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Anda diperbolehkan untuk menentukan pesan sendiri. Pesan digunakan untuk mengirim informasi kode Pass dan ekey ke orang lain.", + "高级功能仅能用于你自己的锁": "Fungsi lanjutan hanya dapat diterapkan kunci Anda sendiri.", + "新建模板": "Templat Creat", + "类型": "Tipe", + "模版内容": "Konten Template", + "预览": "Pratinjau", + "房间名": "Kamar", + "预计产生短信条数": "Segmen pesan estimasi", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Fitur ini memungkinkan Anda untuk menyembunyikan kode masuk, ekeys, kartu, dan sidik jari yang tidak valid dalam periode waktu.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Ponsel pengguna harus online untuk membuka kunci yang dipilih dengan aplikasi ini.", + "配置WiFi": "Mengkonfigurasi WiFi", + "请输入WiFi名字": "Masukkan nama Wifi", + "WiFi配网": "Jaringan Distribusi WiFi", + "胁迫卡": "Kartu stres", + "员工是否有密码": "Sudah ada kode akses", + "员工是否有卡": "Sudah memiliki kartu", + "员工是否有指纹": "Sudah mengatur sidik jari", + "获取钥匙": "Get Key", + "获取卡": "Dapatkan kartu", + "获取指纹": "Dapatkan sidik jari", + "安全验证": "Verifikasi identitas", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Semua informasi akun Anda akan dihapus dari Platform permanen dan tidak dapat dipulihkan. Apakah Anda ingin menghapus?", + "监控": "Monitor", + "视频日志": "Log Video", + "开门器": "Pembuka pintu", + "面容开锁": "Buka kunci wajah", + "开门方向设置": "Set penunjuk arah", + "电机功率设置": "Pengaturan daya motor", + "开锁时是否需联网": "Jika Internet diperlukan saat membuka kunci", + "选择要加入分组的锁": "Pilih kunci untuk menambahkan ke grup ini", + "锁数量": "Hitungan kunci", + "小米IOT平台": "Platform IOT Xiaomi", + "面容开锁设置": "Set pembuka kunci wajah", + "感应距离": "Penginderaan jarak", + "防误开": "Mencegah pembukaan yang salah", + "防误开已关闭,关门后仍可使用面容开锁": "Mencegah misopenting telah ditutup, setelah menutup pintu masih dapat menggunakan pembuka kunci wajah", + "添加和使用面容开锁时": "Tambahkan dan gunakan wajah saat membuka kunci", + "添加和使用面容开锁时提示": "\n1, silakan coba untuk menjaga satu orang di depan pintu operasi;\n2, silakan berdiri di depan kunci pintu sekitar 0.5 ~ 0.8 meter, menghadap kunci pintu;\n3. Harap menjaga wajah Anda tidak menghalangi dan menunjukkan fitur wajah Anda;\n4. Ketika pengenalan wajah tidak normal, Anda dapat menyentuh tombol apa pun pada keyboard digital untuk memulai kembali pengenalan wajah secara manual.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Silakan pilih daya motor dengan hati-hati sesuai dengan situasi aktual kunci pintu:", + "小功率:": "Miniwatt:", + "耗电少": "Lebih sedikit konsumsi daya", + "大功率": "Daya tinggi:", + "大功率提示": "Jika lidah kunci tidak dapat ditarik kembali secara normal ketika membuka, atau perlu digerakkan", + "开门方向设置提示": "Harap hati-hati memilih arah untuk membuka pintu rumah Anda (jika Anda memilih arah yang salah, Anda tidak akan dapat membuka dan menutup pintu dengan benar):", + "左开": "Buka kiri", + "右开": "Kanan terbuka", + "判断方法:": "RM:", + "判断方法内容": "Pria itu berdiri di luar rumah, menghadap pintu masuk.", + "录像时段": "Slot Video", + "密码": "Kode Akses", + "卡": "Kartu", + "指纹": "Sidik Jari", + "人脸": "Wajah", + "配件商城": "Lock Mall", + "公司名称": "Nama perusahaan", + "请输入公司名字": "Masukkan nama perusahaan", + "提示": "Petunjuk", + "是否删除?": "Apakah ingin menghapus?", + "员工信息": "Info Staf", + "员工": "Staf", + "打卡方式无效": "Tidak tersedia", + "中国": "Tiongkok", + "选择钥匙": "Pilih ekey", + "编辑": "Edit", + "无": "Tidak", + "有": "Ya", + "请输入姓名": "Masukkan nama", + "获取人脸": "Mendapatkan wajah", + "选择密码": "Pilih kode akses", + "选择卡": "Pilih kartu", + "选择指纹": "Pilih sidik jari", + "选择人脸": "Pilih wajah", + "员工是否有人脸": "Apakah karyawan memiliki wajah", + "同时删除员工钥匙": "Hapus his/her ekey", + "删除": "Delet", + "确定要删除员工吗?": "Hapus karyawan ini", + "月统计": "Statistik bulanan", + "迟到": "Larut", + "早退": "Tinggalkan lebih awal", + "未打卡": "Tidak ada catatan", + "钥匙将在": "Ekey ini akan kedaluwarsa", + "天后失效": "Hari", + "电量更新时间:": "Waktu pembaruan baterai:", + "新增配件": "Tambah", + "钥匙不可用": "Kunci tidak tersedia", + "正在开锁中...": "Membuka...", + "你的钥匙": "Kunci Anda", + "常开模式启动!长按闭锁": "Mode terbuka dimulai! Tekan lama untuk mengunci", + "演示模式": "Mode Demo", + "请先同意用户协议及隐私政策": "Harap setujui perjanjian pengguna dan Kebijakan Privasi terlebih dahulu", + "用户协议": "Ketentuan pengguna", + "隐私政策": "Kebijakan Privasi", + "注册成功": "Berhasil registrasi", + "你所在的": "You are in", + "手机号": "Nomor Telepon", + "忘记密码": "Lupa kata sandi", + "重置成功": "Sukses Reset", + "确定要退出吗?": "Keluar?", + "功能暂未开放": "Fungsi belum terbuka", + "设置成功": "Berhasil mengatur", + "删除成功": "Berhasil menghapus", + "单次": "Satu kali", + "永久": "Permanen", + "限时": "Berwaktu", + "自定义": "Custom", + "清空码": "Hapus", + "循环": "Memesan", + "工作日": "Hari kerja", + "每日": "Setiap hari", + "周末": "Akhir Pekan", + "确定要删除吗?": "Hapus?", + "该锁的密码都将被删除": "Semua Kode Akses untuk kunci ini akan dihapus", + "已过期": "Tidak valid", + "该锁的电子钥匙都将被删除": "Semua eKeys untuk kunci ini akan dihapus", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Hapus semua ekeys yang terkait dengan ekey ini. Langkah ini tidak dapat dibatalkan!", + "删除钥匙会在用户APP连网后生效": "Ekey akan dihapus", + "有效时间": "Waktu efektif", + "接收者": "Penerima", + "仅管理自己创建的用户": "Mengelola penggunanya sendiri saja", + "远程开锁": "Buka kunci jarak jauh", + "请输入钥匙名称": "Masukkan nama kunci", + "修改成功": "Sukses modifikasi", + "冻结": "Pembekuan", + "解除冻结": "Tadah", + "授权": "Otorisasi", + "取消授权": "Otorisasi", + "同时解冻其发送的钥匙": "Tadah semua tombol diterbitkan oleh pengguna ini", + "会在用户APP连网后生效": "Ekey ini akan mencairkan ketika aplikasi pengguna menghubungkan ke jaringan", + "同时冻结其发送的钥匙": "Pembekuan semua ekeys dikeluarkan oleh pengguna ini", + "冻结会在用户APP连网后生效": "Ekey ini akan dibekukan saat aplikasi pengguna terhubung ke jaringan", + "取消授权会在用户APP连网后生效": "Pengguna akan kehilangan izin nya saat aplikasi pengguna terhubung ke jaringan", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Pengguna resmi Hampir Memiliki izin yang sama dengan LOCK Manager (misalnya, kemampuan untuk mengirim ekeys dan kode pass)", + "失效时间需晚于生效时间": "Waktu kedaluwarsa harus lebih lambat dari waktu efektif", + "生效时间需晚于当前时间": "Waktu efektif harus lebih lambat dari waktu saat ini", + "失效日期需晚于生效日期": "Tanggal kedaluwarsa harus lebih lambat dari tanggal efektif", + "修改有效期": "Periode perubahan", + "生效日期": "Tanggal mulai", + "失效日期": "Tanggal akhir", + "开锁": "Buka kunci", + "开锁成功": "Buka kunci sukses", + "请选择锁": "Pilih kunci", + "请选择接收者": "Pilih penerima", + "请选择有效期": "Pilih periode validitas", + "请选择发送方式": "Pilih metode pengiriman", + "请选择结束时间": "Pilih waktu akhir", + "完成": "Lengkap", + "有效日": "Bersepeda", + "发送成功": "Berhasil mengirim", + "请选择开始时间": "Pilih waktu awal", + "选择用户": "Pilih penerima", + "已选中": "Dipilih", + "确定": "OK", + "请选择要发送的锁": "Pilih kunci", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Otentikasi nama asli wajah mengacu pada kebutuhan pengguna untuk memverifikasi penampilannya sebelum membuka aplikasi ponsel, dan verifikasi dapat dibuka.", + "分享": "Bagikan", + "请输入接收者账号": "Masukkan akun penerima", + "接收者号码未注册,请重新发送": "Nomor penerima tidak terdaftar, silakan kirim ulang", + "是否发送电子钥匙给未注册账号": "Ingin mengirim ekey ke akun baru", + "取消": "Batalkan", + "标记成功": "Tandai sukses", + "微信好友": "Teman WeChat", + "短信": "SMS", + "邮件": "Email", + "更多": "Selengkapnya", + "您好,您的电子钥匙生成成功": "Halo, kunci elektronik Anda berhasil dibuat", + "生效时间不能小于当前时间": "Waktu yang efektif tidak boleh kurang dari waktu saat ini", + "结束时间不能小于当前时间": "Waktu akhir tidak boleh kurang dari waktu saat ini", + "是否为管理员": "Apa administrator", + "已连接到锁,请将卡靠近门锁的读卡区": "Terhubung. Tempatkan kartu pada pembaca kartu", + "尝试连接设备...": "Terhubung dengan kunci. Tunggu...", + "地理位置": "Lokasi geografis", + "检查以确保以下地址是正确的": "Periksa untuk memastikan alamat berikut benar", + "地图加载中,请稍候。。": "Sedang Memuat map, mohon Tunggu...", + "跳过": "Lewati", + "还未获取到位置信息哦,请耐心等待一下!": "Informasi Lokasi belum didapatkan, harap tunggu dengan sabar!", + "请填写信息": "Isi informasi", + "有效期": "Masa berlaku", + "生效时间": "Waktu mulai", + "失效时间": "Waktu akhir", + "上传成功": "Berhasil diunggah", + "未生效": "Tidak dapat aktif", + "已生效": "Efektif", + "指纹详情": "Info sidik jari", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Perlu tempatkan jari Anda ke Sensor beberapa kali. Silakan ikuti petunjuk...", + "开始添加": "Mulai", + "请将您的手指按下": "Letakkan jari Anda pada Sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Ikuti petunjuk nya... di perlukan dihapus dan jari masuk ke Sensor untuk catatan selanjutnya", + "添加成功": "Berhasil menambahkan", + "更新成功": "Perbarui berhasil", + "搜索": "Pencarian", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Setelah mengatur ulang, kartu kunci akan dihapus, apakah Anda ingin mengatur ulang?", + "已失效": "Tidak valid", + "卡详情": "Info kartu", + "请输入": "Masukkan di sini", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Dengan mematikan, kunci akan tetap terbuka sepanjang hari hingga terkunci secara manual", + "请输入小于或等于60的数字": "Masukkan angka kurang dari 60", + "操作成功": "Operasi berhasil", + "管理员密码相同,无需修改": "Kata sandi administrator sama dan tidak perlu diubah", + "请输入6-9位数字": "Panjang 6-9 digit", + "请输入6-9位管理员密码": "Masukkan kata sandi administrator 6-9 digit", + "请输入新的管理员密码": "Masukkan kata sandi administrator baru", + "未分组": "Tidak dikelompokkan", + "请输入分组名称": "Buat Grup", + "创建成功": "Ciptakan kesuksesan", + "设置锁分组成功": "Berhasil mengatur grup kunci", + "电池1电量": "Baterai 1", + "电池2电量": "Baterai 2", + "电量更新时间": "Waktu pembaruan baterai", + "锁电量更新成功": "Lock power update success", + "您的钥匙未生效": "Kunci Anda tidak efektif", + "您的钥匙已冻结": "Kunci Anda telah dibekukan", + "您的钥匙已过期": "Kunci Anda telah kedaluwarsa", + "常开模式开启": "Kunci adalah dalam Mode ritsleting", + "超级管理员": "Admin Super", + "授权管理员": "Admin resmi", + "普通用户": "Pengguna biasa", + "余": "Keseimbangan", + "天": "Hari", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Setelah menghapus kunci, semua informasi akan dihapus bersama-sama, apakah Anda yakin ingin menghapus kuncinya?", + "请输入登录密码": "Masukkan kata sandi aplikasi", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Gagal menghapus perangkat, pastikan perangkat berada di dekat perangkat, perangkat tidak terhubung, dan perangkat diaktifkan", + "用户无权限": "Pengguna tidak memiliki izin", + "创建公司后,考勤功能才能使用": "Utamakan Perusahaan", + "是否删除钥匙?": "Hapus ekey ini?", + "邮箱绑定成功": "Penjilidan Email berhasil", + "手机绑定成功": "Mengikat ponsel sukses", + "网络访问失败,请检查网络是否正常": "Permintaan gagal. Jaringan tidak tersedia, Periksa dan hubungkan perangkat Anda ke 3G/4G/WIFI", + "清空": "Jelas", + "是否清空?": "Jelas?", + "消息详情": "Info pesan", + "创建时间": "Waktu kreasi", + "管理员详情": "Detail Administrator", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jika ada yang memaksa Anda untuk membuka pintu, Anda dapat menggunakan kartu ini. Pesan alarm akan dikirim ke pengirim. Untuk menggunakan fitur ini, pastikan kunci Anda sudah online.", + "请不要将胁迫卡用于日常开锁": "Harap jangan gunakan kartu paksa untuk penggunaan harian.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jika ada yang memaksa Anda untuk membuka pintu, Anda dapat menggunakan sidik jari ini. Pesan alarm akan dikirim ke pemberian. Untuk menggunakan fitur ini, pastikan kunci Anda sudah online.", + "请不要将胁迫指纹用于日常开锁": "Mohon jangan gunakan sidik jari paksa untuk penggunaan sehari-hari.", + "创建公司": "Buat sebuah perusahaan", + "公司名称不能超过30个字符": "Nama perusahaan tidak boleh lebih dari 30 karakter", + "公司名称不能小于6个字符": "Nama perusahaan tidak boleh kurang dari 6 karakter", + "WIFI列表": "Daftar WIFI", + "刷新": "Segarkan", + "手动配网": "Jaringan Distribusi Manual", + "远距离": "Jarak Jauh", + "中距离": "Jarak sedang", + "近距离": "Jarak pendek", + "锁时间更新成功": "Sukses Lock time update", + "锁用户": "Pengguna kunci", + "请选择常开日期": "Pilih tanggal Buka", + "结束时间不能小于开始时间哦": "Waktu akhir tidak boleh kurang dari waktu awal", + "介绍": "Kisah Kita", + "个人信息收集清单": "Daftar pengumpulan informasi pribadi", + "应用权限说明": "Deskripsi izin aplikasi", + "第三方信息共享清单": "Daftar berbagi informasi pihak ketiga", + "请选择您的位置": "Pilih lokasi Anda", + "请先选择位置": "Pilih lokasi terlebih dahulu", + "管理员密码": "Kode masuk Admin", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Jika Anda perlu mengubah, masukkan kata sandi administrator baru (6 digit), klik oke untuk mengubah", + "修改": "Ubah", + "网络摄像头": "Kamera", + "重命名": "Ganti nama", + "分组下的锁将被移到未分组里": "Kunci di bawah grup akan dipindahkan ke Tidak dikelompokkan", + "编辑成功": "Edit sukses", + "厂商": "Produsen", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Setelah kata sandi dibuat, silakan gunakan sekali untuk aktivasi sebelum 23:59 pada hari yang sama, jika tidak maka akan tidak valid setelah jam 0. Setelah kata sandi diaktifkan, kata sandi dapat digunakan tanpa batas selama masa berlaku.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Setelah kata sandi dibuat, silakan gunakan sebelum 23:59 di hari yang sama, jika tidak maka kata sandi tidak valid setelah jam 0. Kode jelas digunakan untuk menghapus semua kata sandi yang dihasilkan sebelum jam 0 hari ini.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Setelah kata sandi dibuat, silakan gunakan sebelum 23:59 di hari yang sama, jika tidak maka kata sandi tidak valid setelah jam 0.", + "清空密码底部提示": "Kata sandi berlaku hingga 23:59 pada hari peluncuran", + "相机": "Kamera", + "相册": "Foto", + "读写": "Penyimpanan", + "定位": "Lokasi", + "需要访问相机权限才能拍照上传文件例如头像上传": "Akses ke kamera diperlukan untuk mengambil foto dan mengunggah file, seperti mengunggah gambar profil", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Akses ke kamera diperlukan untuk mengunggah file dan avator menggunakan gambar album", + "需要访问读写权限才能使用本地图片上传头像": "Akses ke Izin membaca dan menulis diperlukan untuk mengunggah avator menggunakan image lokal", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Akses ke informasi lokasi diperlukan untuk menggunakan fungsi kunci Tambah", + "申请": "Aplikasi", + "权限": "Izin", + "不允许": "Tidak diperbolehkan", + "允许": "Diperbolehkan", + "权限被拒绝": "Izin ditolak", + "请手动在系统设置中开启": "Silakan aktifkan secara manual di pengaturan sistem", + "权限以继续使用应用": "Izin untuk melanjutkan menggunakan aplikasi.", + "去设置": "Go sett up", + "当前网络": "Jaringan saat ini", + "位置信息": "Informasi Lokasi", + "请输入wifi名称": "Masukkan nama wifi", + "虹膜": "Iris", + "手掌": "Telapak tangan", + "商城": "Mall", + "我的": "My", + "微信公众号推送": "Akun publik Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Untuk membuka wechat untuk menerima pesan alarm, Anda perlu perhatian Skye kunci pintar akun publik wechat terlebih dahulu, Harap simpan kode QR dan gunakan wechat untuk memindai pengaturan", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Akses ke Izin Bluetooth diperlukan untuk menggunakan informasi lokasi fungsi kunci Tambah", + "请输入Email": "Masukkan Email anda", + "请输入手机号": "Masukkan nomor telepon Anda", + "家人到家": "Anggota keluarga tiba di rumah", + "添加家人": "Tambahkan anggota keluarga", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Jika kunci tidak terhubung ke Internet, pengingat untuk kode masuk, kartu, sidik jari, dan metode pembukaan pintu lainnya tidak dapat dikirim secara tepat waktu.", + "消息提醒": "Pengingat", + "开门通知": "Pemberitahuan pembukaan", + "N天未开门": "N hari tanpa bukaan pintu", + "门未关好": "Pintunya tidak tertutup", + "防拆报警": "Alarm pemadat", + "低电量提醒": "Baterai rendah", + "胁迫开门": "Pembuka pintu paksa", + "有人按门铃": "Seseorang berdering bel pintu", + "有人出现在门口": "Ada yg muncul di pintu", + "提醒方式": "Metode pengingat", + "开门方式": "Metode pembukaan pintu", + "请选择": "Pilih", + "家人": "Anggota keluarga", + "保存": "Simpan", + "APP推送": "Aplikasi dorong", + "管理员": "Admin", + "未启用": "Tidak Diaktifkan", + "已启用": "Diaktifkan", + "省电模式": "Mode hemat daya", + "逗留抓拍模式": "Mode Stay capture", + "实时监控模式": "Mode pemantauan Real time", + "自定义模式": "Mode khusus", + "猫眼设置": "Pengaturan mata kucing", + "猫眼工作模式": "Mode bekerja mata kucing", + "自动亮屏": "Layar terang otomatis", + "亮屏持续时间": "Layar tepat waktu", + "逗留警告": "Peringatan tinggal", + "异常警告": "Peringatan Abnormal", + "短信提醒": "SMS", + "邮件提醒": "Email", + "N天未开门提醒": "N hari tanpa bukaan pintu", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Jika seseorang memaksa Anda untuk membuka kunci, Anda dapat menggunakan sidik jari ini. Pesan alarm akan dikirim ke pemberi. Untuk menggunakan fitur ini, pastikan kunci Anda adalah daring.", + "胁迫指纹": "Sidik jari paksa", + "指纹列表": "Daftar sidik jari", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Setelah mengatur waktu, jika kunci tidak dibuka, sistem akan mengirimkan pesan pengingat ke penerima yang ditunjuk. Fungsi ini membutuhkan kunci untuk dihubungkan ke internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Setelah memungkinkan pengingat, ketika baterai kunci di bawah 20%, 10%, dan 5%, sistem akan mengirimkan pesan pengingat kepada penerima yang ditunjuk.", + "未开门时间": "Hari Tanpa bukaan pintu", + "添加和使用面容开锁时:": "Tambahkan dan gunakan wajah saat membuka kunci:", + "关锁": "Kunci dekat", + "功能": "Fungsi", + "配件": "Bagian", + "云存": "Penyimpanan awan", + "本地": "Lokal ini", + "3天滚动储存": "Penyimpanan 3 hari bergulir", + "去升级": "Tingkatkan sekarang", + "下载列表": "Daftar unduhan", + "已下载": "Diunduh", + "全部视频": "Semua Video", + "已为本设备免费提供3大滚动视频储存服务": "Tiga layanan penyimpanan video bergulir telah disediakan untuk perangkat ini secara gratis", + "视频播放": "Pemutaran Video", + "全选": "Semua", + "请选择要删除的视频": "Pilih video yang ingin Anda hapus", + "请选择要下载的视频": "Pilih video yang ingin Anda Unduh", + "欢迎使用": "Selamat datang untuk digunakan", + "用户协议和隐私政策概要": "Ringkasan perjanjian pengguna dan Kebijakan Privasi", + "协议概要": "Ringkasan Protokol", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Terima kasih telah menggunakan aplikasi ini. Kami melampirkan informasi pribadi dan perlindungan privasi Anda. Sebelum menggunakan produk ini, silakan baca dengan saksama", + "《用户协议》": "Ketentuan pengguna", + "和": "Dan", + "《隐私政策》": "《 Kebijakan privasi 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Seluruh isi dari. Dengan mengklik setuju, Anda setuju dan menerima semua ketentuan. Jika Anda memilih untuk tidak setuju, Anda tidak akan dapat menggunakan produk dan layanan kami dan akan keluar dari aplikasi.", + "不同意": "Setuju", + "同意": "Setuju", + "该功能是高级功能,请开通后再使用": "Ini adalah fungsi canggih. Aktifkan terlebih dahulu.", + "常用程序": "Program Umum", + "该锁已被重置": "Kunci telah direset", + "需要访问读写权限才能使用手动升级固件": "Akses ke Izin membaca dan menulis diperlukan untuk meningkatkan firmware secara manual", + "错误D固件,请选择正确的文件": "Firmware yang salah, silakan pilih file yang benar", + "非SYD固件,请选择正确的文件": "Firmware Non SYD, silakan pilih file yang benar", + "文件校验失败 0x01": "Verifikasi File gagal 0x01", + "解析元数据失败,请选择正确的文件": "Gagal menguraikan metadata, pilih file yang benar", + "文件校验失败 0x02": "Verifikasi File gagal 0x02", + "文件校验失败 0x03": "Verifikasi File gagal 0x03", + "固件升级完成": "Peningkatan Firmware selesai", + "记录": "Catatan", + "开通高级功能后才可以对锁进行管理": "Aktifkan fungsi lanjutan terlebih dahulu untuk mengelola kunci.", + "去开通": "Aktifkan", + "实名认证": "Otentikasi nama asli", + "当前剩余数量": "Tersisa", + "购买": "Beli", + "实名认证为付费功能,请购买后再使用": "Otentikasi nama asli adalah fungsi berbayar, silakan gunakan setelah pembelian", + "密码不一致哦": "Kata sandi tidak konsisten", + "退出添加": "Berhenti menambahkan", + "管理员已满": "Admin penuh", + "用户已满": "Pengguna penuh", + "锁上面添加指纹已满": "Tambah sidik jari di kunci penuh", + "指纹已存在": "Sidik jarinya sudah ada.", + "锁上面添加人脸已满": "Kunci di atas Tambahkan wajah penuh", + "人脸已存在": "Wajah sudah ada", + "锁上面添加卡已满": "Kunci di atas Tambahkan kartu penuh", + "卡已存在": "Kartu sudah ada", + "锁上面添加密码已满": "Kunci di atas \"Tambahkan kata sandi\" penuh", + "密码已存在": "Kode Akses yang identik sudah ada. Pilih yang berbeda", + "请输入密码": "Masukkan kata sandi", + "暂无密码,无需重置": "Tidak ada kata sandi, tidak perlu mengulang", + "真实姓名": "Nama asli", + "身份证号": "Nomor identitas", + "请输入真实姓名": "Masukkan nama asli Anda", + "请输入身份证号": "Masukkan nomor ID Anda", + "请输入身份证号和真实姓名": "Masukkan nomor ID dan nama asli Anda", + "点击返回设备配对": "Ketuk kembali untuk memasangkan perangkat", + "无法连接?尝试升级": "Tidak dapat terhubung? Tingkatkan upaya", + "固件升级提示": "Firmware peningkatan cepat", + "请先获取固件文件到手机本地,再选择升级": "Harap Dapatkan file firmware ke telepon lokal terlebih dahulu, dan pilih Upgrade", + "固件升级中": "Firmware sedang diupgrade", + "取消升级": "Batalkan peningkatan", + "固件传输中": "Firmware dalam perjalanan", + "关闭": "Nonaktifkan", + "传输中'": "Dalam perjalanan", + "操作记录": "Catatan", + "修改姓名": "Edit nama", + "传输中": "Dalam perjalanan", + "发送人": "Diterbitkan oleh", + "发送时间": "Waktu diterbitkan", + "钥匙详情": "Info ekey", + "姓名": "Nama", + "发送": "Kirim", + "请确认姓名全名和身份证号码是否正确": "Mohon konfirmasi bahwa nama lengkap dan nomor identitas sudah benar", + "传输期间请勿离开当前页面": "Jangan tinggalkan halaman saat ini selama transfer", + "机型": "Model", + "硬件版本": "Versi perangkat keras", + "固件版本": "Versi Firmware", + "手动升级": "Peningkatan Manual", + "设备连接中...": "Perangkat penghubung...", + "未避免异常情况,请在门打开时升级": "Pengecualian tidak dapat dihindari, mohon Tingkatkan ketika pintu terbuka", + "钥匙无效": "Kunci tidak valid", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Tidak dapat terhubung ke kunci. Silakan mulai ulang Bluetooth telepon Anda dan coba lagi.", + "如果是全自动锁,请使屏幕变亮": "Jika kunci sepenuhnya otomatis, harap jadikan layar lebih terang", + "正在尝试闭锁……": "Mencoba mengunci, Mohon ditunggu...", + "清空记录": "Hapus catatan", + "是否要删除操作记录?": "Lanjut menghapus catatan?", + "被删除的记录不能恢复": "Catatan tidak dapat dipulihkan setelah menghapus.", + "全部事件": "Semua acara", + "开锁事件": "Buka kunci acara", + "异常事件": "Acara normal", + "门铃事件": "Bel pintu acara", + "视频事件": "Video acara", + "请开启蓝牙": "Aktifkan Bluetooth", + "请选择有效日": "Pilih hari efektif", + "公司名字长度不能小于 6 ": "Panjang nama perusahaan tidak boleh kurang dari 6", + "已是最新版本": "Tidak ada pembaruan", + "新建短信模版": "Creat SMS template", + "新建邮件模版": "Template email Creat", + "自定义短信模版": "Template SMS", + "自定义邮件模版": "Template Email", + "名称": "Nama", + "星星锁": "Kunci bintang", + "无考勤记录": "Tidak ada catatan", + "大家干劲十足": "Semua orang datang tepat waktu", + "工作时长未出炉": "Tanpa jam kerja", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Pilihan negara/wilayah akan memengaruhi keamanan data. Saat ini Anda telah memilih Albania, silakan konfirmasi sebelum melanjutkan.", + "确认国家或地区": "Konfirmasi negara/wilayah", + "我知道了": "Tas selempang Got it", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Untuk menerima pembaruan penting, klik 'OK' dan aktifkan pemberitahuan dalam pengaturan.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Setelah dinyalakan, Anda dapat menyalakan ulang dengan menekan lama tombol pengaturan pada kunci, dan menambahkannya dengan aplikasi", + "已有": "Arus", + "新增": "Baru", + "账号格式错误": "Format buruk", + "接收者信息为空": "Informasi penerima kosong", + "请输入时间(秒)": "Masukkan waktu (DET)", + "加载数据失败": "Gagal memuat data", + "重试": "Coba lagi", + "升级中,是否退出": "Selama upgrade, apakah keluar", + "下一步": "Berikutnya", + "公寓": "Apartemen", + "个人用户": "Pribadi", + "星寓": "Apartemen bintang", + "账号": "Akun", + "请输入手机号或email": "Nomor Telepon atau Email", + "请输入星寓管理员的账号": "Masukkan akun administrator apartemen bintang", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Semua data kunci yang dipilih akan ditransfer secara permanen ke penerima.", + "暂不支持跨平台转移,敬请期待": "Transfer lintas platform tidak tersedia untuk saat ini, ditunggu", + "移除坏锁": "Pindahkan kunci rusak/rusak ke sampah", + "转移确认": "Konfirmasi Transfer", + "本次共转移": "Kali ini total", + "把智能锁": "Kunci pintar", + "确认": "OK", + "移除成功": "Berhasil menghapus", + "转移成功": "Berhasil mentransfer", + "该已锁被删除": "Terkunci dihapus", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Admin resmi hanya dapat mengelola kode akses, ekeys, dan etcmade oleh dia.", + "添加授权管理员": "Buat Admin", + "导出记录": "Catatan ekspor", + "选择时间段": "Pilih periode waktu", + "导出": "Ekspor", + "批量导出": "Batch ekspor", + "读取记录": "Refresh rekaman", + "设备": "Perangkat", + "消息": "Pesan", + "智能分析": "Intelligent analytics", + "精准识别设备事件,过滤无效信息": "Secara akurat mengidentifikasi acara perangkat dan menyaring informasi yang tidak valid", + "系统设置": "Pengaturan Sistem", + "系统的全局配置在此项内进行设置": "Konfigurasi global dari sistem ditetapkan dalam item ini", + "导出操作记录": "Catatan ekspor", + "立即查看": "Lihat", + "导出成功": "Berhasil diekspor", + "发送钥匙": "Kirim ekey", + "进度": "Beri Nilai", + "失败": "Gagal", + "人脸详情": "Detail wajah", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Ketika seseorang bersensor sekitar 1.5 meter di depan pintu, buka kunci pengenalan wajah akan secara otomatis dimulai.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Ketika seseorang bersensor sekitar 0.8 meter di depan pintu, buka kunci pengenalan wajah akan secara otomatis dimulai.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Ketika seseorang bersensor sekitar 0.5 meter di depan pintu, buka kunci pengenalan wajah akan secara otomatis dimulai.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Jarak penginderaan telah dinonaktifkan, Anda perlu manual menyentuh tombol apa pun pada keyboard untuk membuka kunci pengenalan wajah.", + "防误开已打开,开锁后": "Pembukaan anti-kesalahan telah diaktifkan, dan setelah membuka kunci", + "秒内不可使用面容开锁": "Buka kunci wajah tidak bisa digunakan dalam hitungan detik", + "掌静脉": "Pembuluh telapak tangan", + "添加掌静脉": "Tambahkan pembuluh telapak tangan", + "胁迫掌静脉": "Pembuluh telapak tangan paksa", + "请不要将胁迫掌静脉用于日常开锁": "Harap jangan menggunakan pembuluh kelapa untuk membuka kunci sehari-hari", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Terhubung ke kunci, silakan buka telapak tangan Anda secara alami, telapak tangan menghadap kamera", + "掌静脉详情": "Detail pembuluh darah", + "掌静脉号": "Nomor pembuluh darah", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth tidak diaktifkan, Aktifkan Bluetooth di pengaturan", + "删除用户时,会将用户拥有的钥匙一起删除。": "Jika pengguna telah menghapus ekeys yang terkait dengan pengguna juga akan dihapus.", + "配置网络": "Konfigurasikan jaringan", + "你好": "Halo", + "成功": "Berhasil", + "类型选择": "Ketik Pilih", + "请选择要使用哪种类型": "Silakan pilih jenis penggunaan yang mana", + "系统邮件(推荐)": "Email sistem (direkomendasikan)", + "系统短信(推荐)": "Sistem SMS (direkomendasikan)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Email akan dikirim dari aplikasi ini. Silakan beli paket email terlebih dahulu.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS akan dikirim dari App ini. Silakan beli paket email terlebih dahulu.", + "个人邮件": "Email pribadi", + "个人短信": "SMS pribadi", + "邮件将从你的个人邮箱发给用户": "Email akan dikirim dari akun email pribadi Anda.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Pesan SMS akan dikirim dari nomor telepon pribadi Anda. Anda membayar ke operator telekomunikasi Anda.", + "为了更好地应用体验,请确定权限": "Untuk pengalaman aplikasi yang lebih baik, pastikan izin", + "您第一次拒绝权限,请确定权限": "Anda menolak izin untuk pertama kali, Harap konfirmasi izin", + "您第二次拒绝权限,请去应用设置开启权限": "Anda menolak izin untuk kedua kalinya, buka pengaturan aplikasi untuk mengaktifkan izin", + "去应用市场": "Buka toko aplikasi", + "温馨提示": "Cepat hangat", + "关闭应用": "Tutup aplikasi", + "开启微信接收报警消息需要先关注": "Untuk membuka WeChat untuk menerima pesan alarm, Anda perlu mengikuti", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Akun publik WeChat, Simpan kode QR dan gunakan WeChat untuk memindai pengaturan", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Otentikasi nama asli adalah fungsi berbayar, silakan hubungi administrator kunci untuk membeli dan menggunakan", + "位置权限": "Izin Lokasi", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Silakan izinkan aplikasi untuk menggunakan lokasi Anda. Ini digunakan untuk memindai kunci dan gerbang.", + "相机/相册权限": "Izin kamera/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Berikan aplikasi untuk membaca dan menulis foto dan berkas dari penyimpanan.", + "点击选择": "Klik untuk memilih", + "微信": "WeChat", + "朋友圈": "Momen", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "FaceBook", + "链接": "Tautan", + "今天": "Hari ini", + "密码错误": "Kata sandi tidak valid", + "网络中断": "Gangguan jaringan", + "钥匙不存在": "Kunci Tidak Ada", + "钥匙过期": "Kunci kedaluwarsa", + "钥匙已存在": "Kunci sudah ada", + "密码失效": "Kata sandi tidak valid", + "门锁时间异常": "Waktu kunci pintu tidak normal", + "APP(手机)未联网": "Aplikasi (ponsel) tidak terhubung ke Internet", + "数据不存在": "Data tidak ada", + "待接收": "BeReceived", + "已冻结": "Frozen", + "已删除": "Dihapus", + "未知": "Tidak diketahui", + "拖动下方滑块完成拼图": "Seret penggeser ke posisi yang benar", + "验证成功": "Verifikasi berhasil", + "验证失败": "Verifikasi gagal", + "向右拖动滑块填充拼图": "Seret penggeser ke kanan untuk mengisi teka-teki", + "请先获取到位置信息哦": "Dapatkan informasi lokasi terlebih dahulu", + "请选择国家": "Pilih negara", + "获取锁信息": "Dapatkan informasi kunci", + "锁数据异常,请重试": "Data kunci tidak normal, coba lagi", + "连接设备中...": "Perangkat penghubung...", + "把锁": "Kunci", + "条": "Strip", + "封": "Segel", + "次": "Waktu", + "支付成功": "Berhasil membayar", + "查看详情": "Lihat rincian", + "请输入模板名称": "Masukkan nama template", + "模版类型": "Tipe", + "再返回一次退出": "Keluar lagi", + "请先添加锁": "Tambahkan kunci terlebih dahulu", + "可视对讲": "Interkom Visual", + "详细日志": "Log terperinci", + "已复制到剪切板": "Disalin", + "拍照": "Foto", + "从相册选择": "Pilih dari album", + "选择问题": "Pilih pertanyaan", + "确认长度不足8位": "Konfirmasi panjang kurang dari 8 digit", + "新密码长度不足8位": "Kata sandi baru panjang kurang dari 8 digit", + "两次密码不一致": "Kata sandi salah kecocokan. Coba lagi", + "请点击获取验证码,验证码将发送到": "Dapet kode verifikasi Ka, Kode akan dikirim ke", + "切换": "Saklar", + "验证": "Verifikasi", + "验证成功,账号已删除": "Verifikasi berhasil, akun dihapus", + "该密码不是自定义密码,无法修改": "Kata sandi ini bukan kata sandi khusus dan tidak dapat diubah", + "请选择设备要关联哪些姓名": "Pilih nama perangkat yang harus terkait dengan", + "请选择姓名要关联哪些设备": "Pilih perangkat mana nama yang harus terkait dengan", + "确定要移除所选中的坏锁吗?": "Hapus kunci kerusakan?", + "邮件通知": "Beri tahu melalui email", + "短信通知": "Beri tahu melalui SMS", + "您好,您的授权管理员生成成功": "Halo, administrator resmi Anda berhasil dibuat", + "请输入接收者姓名": "Masukkan di sini", + "版本更新": "Versi terbaru", + "下次再说": "Lain kali", + "配网成功": "Distribusi Jaringan berhasil", + "配网失败": "Distribusi Jaringan gagal", + "该锁的无线键盘都将被删除": "Semua keypad nirkabel untuk kunci ini akan dihapus", + "实时画面": "Gambar Waktu Nyata", + "适合门口较为安全的环境。": "Cocok untuk lingkungan yang relatif aman di pintu.", + "仅发生特定事件才录像,并可查看实时画面。": "Hanya acara tertentu yang direkam dan gambar real time dapat dilihat.", + "一般情况下,满电可使用7-8个月": "Dalam keadaan normal, ini dapat digunakan selama 7-8 bulan jika terisi penuh", + "有人逗留或发生特定事件才录像,可随时查看": "Seseorang tetap atau acara tertentu direkam, dan dapat dilihat kapan saja", + "实时画面。": "Gambar waktu nyata.", + "一般情况下,满电可使用5~6个月。": "Dalam keadaan normal, ini dapat digunakan selama 5-6 bulan jika terisi penuh.", + "适合门口人员复杂、较不安全的环境。": "Cocok untuk lingkungan yang kompleks dan relatif tidak aman di pintu.", + "有人出现就录像,可随时查看实时画面。": "Merekam ketika seseorang muncul, dan melihat gambar waktu nyata kapan saja.", + "一般情况下,满电可使用2~4个月。": "Dalam keadaan normal, ini dapat digunakan selama 2 ~ 4 bulan jika terisi penuh.", + "根据您家门口实际情况设置录像和实时画面功能。": "Atur fungsi gambar video dan real-time sesuai dengan situasi aktual di pintu Anda.", + "可使用时长由具体设置决定。": "Durasi penggunaan ditentukan oleh pengaturan tertentu.", + "查看": "Lihat", + "有人按门铃或发生": "Seseorang berdering bel pintu atau", + "异常事件时": "Acara normal", + "不录像": "Tidak ada video", + "有人出现、按门铃": "Ada yang muncul, cincin bel pintu", + "或发生异常事件时": "Atau acara normal terjadi", + "逗留达到10秒": "Diam selama 10 detik", + "约1.5米": "Sekitar 1.5 meter", + "随时": "Kapan saja", + "立即录像": "Rekam segera", + "录像时机": "Waktu Video", + "有人出现时录像": "Rekam ketika seseorang muncul", + "人体侦测距离": "Jarak deteksi manusia", + "查看实时画面": "Lihat gambar Waktu Nyata", + "自定义时间": "Waktu kustom", + "当日": "Hari ini", + "次日": "Hari berikutnya", + "自定义时段": "Periode Waktu kustom", + "发生事件时查看": "Lihat ketika sebuah acara terjadi", + "实时查看": "Tampilan Waktu Nyata", + "有人在门口出现10秒后开始录像。": "Seseorang muncul di pintu selama 10 detik sebelum merekam.", + "有人按门铃时立即录像。": "Merekam segera ketika seseorang berdering bel pintu.", + "有人出现在门前1.5米范围时启动录像": "Mulai merekam ketika seseorang muncul dalam 1.5 meter di depan pintu", + "约0.8米": "Sekitar 0.8 meter", + "约3.0米": "Sekitar 3.0 meter", + "添加指纹失败": "Operasi gagal.", + "项": "Item", + "播放中": "Bermain", + "下载": "Unduh", + "暂无下载内容": "Tidak ada konten unduhan", + "亮度": "Kecerahan", + "音量": "Volume", + "快进至": "Cepat maju", + "快退至": "Putar ulang ke", + "暂无视频信息": "Tidak ada informasi video", + "加载出错": "Kesalahan memuat", + "请单人正对门锁,距离一个成年人手臂长度": "Silahkan berdiri di depan kunci pintu saja, di lengan panjang", + "(约0.6米)。": "(Sekitar 0.6 meter).", + "保持脸部无遮挡,露出五官。": "Menjaga wajah Anda tidak menghalangi dan menunjukkan fitur wajah Anda.", + "准备好了,开始添加": "Ready gan, mulai menambahkan", + "正在录入中...": "Merekam...", + "添加人脸失败": "Gagal menambahkan wajah", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Setelah mengatur ulang, wajah kunci akan dihapus. Yakin ingin mengatur ulang?", + "人脸号": "Angka wajah", + "虹膜详情": "Detail Iris", + "虹膜号": "Nomor Iris", + "选择设备类型": "Pilih jenis perangkat", + "照明灯具": "Perlengkapan pencahayaan", + "电动窗帘": "Tirai listrik", + "门窗传感器": "Sensor pintu dan jendela", + "传感器": "Sensor", + "清除数据成功": "Data berhasil dihapus", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Kunci tidak terhubung ke internet, jadi rekoil kode masuk, kartu, sidik jari, dan metode pembukaan pintu lainnya tidak dapat diunggah secara real time.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Jika Anda perlu menyimpan catatan bersejarah, Anda dapat mengekspor data tersebut.", + "看不到操作记录,可能原因有": "Tidak dapat melihat catatan operasi, alasan mungkin", + "操作记录详情": "Detail catatan operasi", + "操作时间": "Waktu operasi", + "此模块功能需要锁联网后设置方可生效": "Fungsi modul ini perlu diatur setelah kunci terhubung ke Internet untuk mengambil efek", + "用户已存在": "Pengguna sudah ada", + "钥匙数量已到上限": "Jumlah kunci telah mencapai batas atas", + "附近没有可用网关": "Tidak ada gateway terdekat", + "正在创建安全连接...": "Membuat koneksi yang aman...", + "监视状态下不能发送录音": "Tidak dapat mengirim rekaman dalam mode pemantauan", + "挂断": "Pasang", + "监视中暂不能开锁": "Buka kunci tidak tersedia selama pemantauan", + "长按说话": "Tekan dan tahan untuk berbicara", + "松开发送": "Lepas untuk mengirim", + "请输入6位数字开锁密码": "Masukkan kata sandi 6 digit pembuka kunci", + "请输入开锁密码": "Masukkan kata sandi unlock", + "接收者在有效期内可以不限次数使用": "Penerima dapat menggunakan ekeys untuk waktu tak terbatas dalam periode validitas.", + "接收者可以使用此App开关锁": "Penerima dapat mengunci/membuka kunci dengan aplikasi ini.", + "单次钥匙有效期为1小时,只能使用一次": "E-key satu kali berlaku selama satu jam dan hanya dapat digunakan satu kali.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Penerima dapat menggunakan ekeys untuk waktu tak terbatas dalam waktu siklus tetap.", + "获取模板失败": "Gagal mendapatkan template", + "微信通知": "Pemberitahuan WeChat", + "系统短信": "SMS sistem", + "系统邮件": "Email sistem", + "模板": "Template", + "新建模版": "Buat template", + "您好,您的密码是": "Halo, kata sandi Anda ada", + "密码名字": "Nama kata sandi", + "请输入6-9位密码": "Masukkan kata sandi 6-9 digit", + "设置密码": "Atur password", + "操作成功,密码为": "Berhasil. Kode Akses adalah", + "类型:自定义-永久": "Tipe: kustom-permanen", + "实时播放": "Pemutaran Real time", + "点击对讲": "Klik untuk interkom", + "长按开锁": "Tekan lama untuk membuka kunci", + "接听失败": "Gagal menjawab", + "请在锁设置中开启远程开锁": "Aktifkan Buka kunci jarak jauh dalam pengaturan kunci", + "接听": "Jawab", + "截图已保存到相册": "Tangkapan layar disimpan ke album", + "添加遥控": "Tambah kendali jarak jauh", + "已连接到锁,请按遥控": "Terhubung ke kunci, silakan tekan pengendali jarak jauh", + "遥控号": "Nomor Remote control", + "遥控详情": "Detail kendali jarak jauh", + "照明": "Penerangan", + "退出演示模式": "Keluar dari mode demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tips: antarmuka saat ini adalah antarmuka tampilan. Setelah menambahkan perangkat, Anda dapat terus menggunakannya", + "门已上锁": "Pintunya terkunci", + "您的账号在异地登录,如非本人,请尽快修改密码": "Akun Anda telah digunakan untuk masuk dari perangkat baru", + "开门成功": "Berhasil membuka pintu", + "开门失败": "Gagal membuka pintu", + "呼叫提醒": "Pengingat panggilan", + "收到来自": "Diterima dari", + "锁的呼叫": "Lock call", + "加载数据中": "Memuat data", + "搜索所有锁类型": "Cari semua jenis kunci", + "锁电量更新时间": "Mengunci waktu pembaruan baterai", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Mei", + "6月": "Jun", + "7月": "Juli", + "8月": "Agustus", + "9月": "Sep", + "10月": "Okt", + "11月": "Nov", + "12月": "Desember", + "热门城市": "Kota Populer", + "导出锁数据": "Data kunci ekspor", + "一键开锁": "Membuka kunci dengan satu klik", + "已开通": "Dibuka", + "编辑员工": "Mengedit Staf", + "一": "Satu", + "二": "Dua", + "三": "Tiga", + "四": "Empat", + "五": "Lima", + "六": "Enam", + "日": "Matahari", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Catatan pembelian", + "使用记录": "Catatan Pengguna", + "失效时间要大于当前时间": "Waktu kedaluwarsa harus lebih lama dari waktu saat ini", + "修改名字": "Edit nama", + "时": "Jam", + "分": "Menit", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Anda dapat menggunakan Alexa untuk membuka, mengunci dan memeriksa status kunci", + "支持的国家": "Negara yang didukung", + "支持的国家值": "AS, Kanada, Inggris Raya, Australia, India, Jerman, Prancis, Italia, Spanyol, Jepang", + "操作流程": "Proses operasi", + "操作流程值": "1 tambahkan kunci dan gateway dengan aplikasi kunci cerdas\n\n2 Aktifkan fungsi membuka kunci jarak jauh pada aplikasi (fungsi ini dinonaktifkan secara default). Jika Anda tidak memiliki opsi ini, kunci tidak mendukung Alexa\n\n3 tambahkan keterampilan untuk Alexa dan otorisasi akun dan kata sandi aplikasi Smart lock. Setelah otorisasi berhasil, Anda dapat menemukan perangkat di bawah akun\n\n4 temukan kunci di aplikasi Alexa, nyalakan fungsi Buka kunci suara, dan atur kata sandi bahasa\n\n5 kunci dapat dioperasikan melalui Alexa", + "Google Home": "Google Home", + "Action name": "Nama Aksi", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Bahasa yang didukung", + "英语": "Inggris", + "Google Home操作流程的值": "1. Gunakan aplikasi kunci cerdas untuk menambahkan kunci dan gerbang\n\n2. Aktifkan fungsi membuka kunci jarak jauh pada aplikasi (fungsi ini dinonaktifkan secara default). Tanpa opsi ini, kunci tidak mendukung Google Home\n\n3. Pasang aplikasi Google Home dan klik tombol \"di sudut kiri atas\n\n4. Pada halaman pengaturan, pilih bekerja dengan Google\n\n5. Cari \"ScienerSmart\" dan gunakan akun aplikasi kunci pintar dan kata sandi untuk mengotorisasi", + "密码需至少包含数字/字母/字符中的2种组合": "Kata sandi harus berisi setidaknya 2 karakter berikut: angka, huruf, dan karakter khusus", + "已开锁": "Tidak terkunci", + "已闭锁": "Terkunci", + "两次密码不一致哦": "Kata sandi tidak konsisten", + "中功率": "Kekuatan sedang", + "常规使用": "Penggunaan biasa", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Setelah gateway menyala, tekan dan tahan tombol reset selama 5 detik, dan klik berikutnya ketika lampu indikator berkedip secara bersamaan", + "扫描设备": "Perangkat Pindai", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Gateway mungkin telah offline. Ingin menghapus data?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_it.json b/lan/lan_it.json new file mode 100644 index 00000000..2434772c --- /dev/null +++ b/lan/lan_it.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Serratura a stella", + "锁通通": "Blocca attraverso", + "点击开锁,长按闭锁": "Tocca per sbloccare, tieni premuto per bloccare", + "考勤": "Partecipazione", + "考勤设置": "Impostazioni di partecipazione", + "电子钥匙": "EKeys", + "添加卡": "Aggiungi scheda", + "卡号": "Numero della carta", + "添加指纹": "Aggiungi impronta digitale", + "指纹号": "Numero dell'impronta digitale", + "遥控": "Telecomando", + "添加人脸": "Aggiungi viso", + "门锁日志": "Log della serratura della porta", + "密码号": "Numero di password", + "添加者": "Operatore", + "添加时间": "Tempo", + "重置": "Reset", + "请输入手机号或者邮箱": "Numero di telefono/e-mail", + "工作时间": "Orario di lavoro", + "工作日设置": "Impostazione giornata lavorativa", + "星期一": "Lunedì", + "星期二": "Martedì", + "星期三": "Mercoledì", + "星期四": "Giovedì", + "星期五": "Venerdì", + "星期六": "Sabato", + "星期日": "Domenica", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Lun", + "周二": "Mar", + "周三": "Mercoledì", + "周四": "Gio", + "周五": "Ven", + "周六": "Sab", + "周日": "Sole", + "群发钥匙": "Invia più ekey", + "锁": "Serratura", + "请添加": "Destinatario", + "允许远程开锁": "Sblocco remoto", + "请输入验证码": "Codice di verifica", + "获取密码": "Genera codice di accesso", + "请给密码命名": "Inserisci un nome per questo passcode", + "密码有限期为6个小时,只能使用一次": "Questo passcode DEVE ESSERE utilizzato entro 6 ore dall'ora corrente o sarà SOSPESO per motivi di sicurezza. Questo passcode può essere utilizzato solo UNA VOLTA.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Inserisci manualmente 6-9 cifre come password. Può essere aggiunto dal telefono Bluetooth accanto alla serratura, o aggiunto in remoto attraverso il gateway", + "获取": "Ottieni", + "添加": "Aggiungi", + "删除公司": "Elimina azienda", + "密码详情": "Informazioni codice di accesso", + "修改密码": "Modifica codice di accesso", + "添加虹膜": "Aggiungi iris", + "添加门磁": "Sensore porta", + "添加无线键盘": "Tastiera senza fili", + "添加手掌": "Aggiungi Palma", + "请输入员工账号": "Inserisci l'account del dipendente", + "批量授权锁": "Concedi più serrature", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "L'amministratore autorizzato avrà il permesso di far funzionare questo blocco a maggioranza.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Questa funzione consente di sbloccare lo Smart Lock in remoto tramite un gateway. Questa funzione può essere attivata o disattivata SOLO tramite Bluetooth.", + "排列方式": "Tipo di elenco", + "早到榜": "Elenco dei primi", + "迟到榜": "Lista tardiva", + "当前模式": "Modalità corrente", + "勤奋榜": "Elenco di lavoro duro", + "延迟时间": "Tempo di ritardo", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Il blocco si bloccherà automaticamente dopo il tempo. Si prega di sbloccarlo per una volta prima di rendere disponibile l'impostazione.", + "时间": "Tempo", + "开始时间": "Ora di inizio", + "结束时间": "Ora di fine", + "工作时间设置": "Impostazione dell'orario di lavoro", + "常开模式": "MODALITÀ Passaggio", + "常开时间": "In questo periodo di tempo", + "常开日期": "In questi giorni", + "添加员工": "Aggiungi personale", + "节假日": "Vacanza", + "打卡方式": "Metodo", + "员工是否有钥匙": "Ha già ekey", + "上班时间": "Orario di inizio", + "下班时间": "Orario di chiusura", + "本周": "Questa settimana", + "单休": "Fine settimana di un giorno", + "双休": "Fine settimana di due giorni", + "单双休": "Fine settimana di uno-due giorni", + "年": "Anno", + "月": "Mese", + "放假日期": "Vacanza", + "补班日期": "Giorni di lavoro", + "添加假日": "Aggiungi vacanza", + "开始日期": "Data di inizio", + "必填": "Richiesto", + "结束日期": "Data di fine", + "日榜": "Ogni giorno", + "月榜": "Mensile", + "考勤记录": "Record", + "假日信息": "Informazioni sulle festività", + "基本信息": "Nozioni di base", + "无线键盘": "Tastiera senza fili", + "选择无线键盘": "Aggiungi tastierino", + "门磁": "Sensore porta", + "自动闭锁": "Blocco automatico", + "锁声音": "Blocca il suono", + "防撬报警": "Avviso di manomissione", + "重置键": "Pulsante di reset", + "锁时间": "Orologio con serratura", + "诊断": "Diagnostica", + "上传数据": "Carica dati", + "导入其他锁数据": "Importa frome un altro lucchetto", + "锁升级": "Aggiornamento firmware", + "标记房态": "Stato della stanza", + "开锁提醒": "Sblocca notifica", + "微信二维码": "Sblocca il codice QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Le persone con chiavi elettroniche possono aprire la porta scansionando questo codice QR tramite WeChat. Il codice QR di ogni serratura è diverso. Puoi stamparlo e incollarlo accanto al lucchetto corrispondente", + "锁编号": "Numero di blocco", + "电量": "Batteria", + "锁分组": "Gruppo di blocco", + "选择分组": "Seleziona gruppo", + "创建新分组": "Creare un gruppo", + "管理员开锁密码": "Codice di accesso amministratore", + "更新": "Aggiornamento", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Il livello della batteria verrà aggiornato dal gateway o dal bluetooth del telefono", + "当屏幕闪烁时,点击下一步": "Clicca dopo quando la tastiera lampeggia", + "输入*529#或按设置键": "Inserisci README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # o premi il tasto Impostazioni", + "长按重置键2秒": "Premere e tenere premuto il pulsante di reset 2 secondi", + "附近的设备": "Attrezzature nelle vicinanze", + "暂无数据": "Nessun dato", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Sarai in grado di ottenere lo stato della porta con un sensore della porta insieme a un gateway. Solo un sensore può essere associato a una serratura.", + "开始": "Inizia", + "全天": "Tutte le ore", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "È possibile impostare più periodi di tempo per la modalità di passaggio. Entro i periodi di tempo impostati, il blocco rimarrà in uno stato aperto dopo essere stato sbloccato.", + "请选择锁音量": "Seleziona il volume della serratura", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Accendendo, sentirete il suono dalla serratura", + "低": "Basso", + "较低": "Medio basso", + "中": "Media", + "较高": "Medio alto", + "高": "Alto", + "开启后,锁被撬动时,会发出报警声": "Con l'accensione, si attiva l'avviso TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Disattivando, il pulsante RESET è disabilitato.", + "校准时间": "Tempo di calibrazione", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "La diagnosi consiste nel leggere le informazioni di configurazione all'interno del lucchetto e caricarlo in modo che il personale possa analizzare la causa del fallimento", + "上传": "Carica", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Carica i dati dal blocco al server. Potrebbero essere necessari diversi minuti", + "请选择要从哪把锁导入": "Seleziona un blocco da cui importare", + "有新版本": "Avere una nuova versione", + "当前版本": "Versione attuale", + "升级": "Aggiornamento", + "空闲": "Sgomberato", + "已入住": "Occupato", + "多语言": "Lingue", + "添加锁": "Aggiungi blocco", + "锁地址": "Blocca indirizzo", + "选择锁类型": "Seleziona il tipo di blocco", + "NFC无源锁": "Serratura passiva NFC", + "添加设备": "Aggiungi dispositivo", + "网关": "Gateway", + "客服": "Servizio clienti", + "设置": "Impostazioni", + "更多设置": "Altro set", + "消息推送": "Push notifica", + "锁用户管理": "Blocca gli utenti", + "拥有的钥匙": "EKeys associate a questo utente", + "批量授权": "Gestione dell'autorità", + "关联设备": "Dispositivo associato", + "关联姓名": "Nome associato", + "转移智能锁": "Blocco trasferimento", + "选择锁": "Blocco schermo", + "接收人信息": "Destinatario", + "转移网关": "Gateway di trasferimento", + "锁屏": "Blocco schermo", + "已关闭": "Fuori", + "已开启": "On", + "开启": "Attiva", + "确定要开启重置键?": "Continua ad abilitare il pulsante Reset?", + "确定要关闭重置键?": "Continua a disattivare il pulsante Reset?", + "隐藏无效开锁权限": "Nascondi l'accesso non valido", + "APP开锁时需手机连网的锁": "Serrature che richiedono il telefono online", + "增值服务": "Servizi", + "关于": "A proposito", + "退出": "Disconnessione", + "删除账号": "Elimina account", + "个人信息": "Informazioni account", + "头像": "Avatar", + "昵称": "Nome del nichel", + "请输入昵称": "Inserisci il tuo nickname", + "修改昵称": "Rinomina", + "修改账号": "Modifica account", + "重置密码": "Reimposta la password", + "安全问题": "Domanda di sicurezza", + "为了你的账号安全,修改账号前请先使用验证码验证": "Per la sicurezza del tuo account, utilizza la verifica della password dell'account prima di modificare l'account", + "请输入新账号": "Inserisci il nuovo account", + "找回密码和登录新设备时,可通过绑定的手机验证": "Il numero di telefono della rilegatura verrà utilizzato per ricevere il codice di verifica.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "L' e-mail di associazione verrà utilizzata per ricevere il codice di verifica.", + "原密码": "Password attuale", + "新密码": "Nuova password", + "确认密码": "Conferma password", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Nel caso in cui il telefono perso, è possibile accedere al nuovo telefono rispondendo alle domande di sicurezza.", + "问题一": "Domanda 1", + "问题二": "Domanda 2", + "问题三": "Domanda 3", + "请输入你的答案": "Digita la risposta", + "即将到期": "Scade presto", + "去授权": "Vai ad autorizzare", + "修改名称": "Modifica nome", + "状态": "Stato", + "WiFi名称": "Nome Wifi", + "网络MAC": "MAC della rete", + "网关升级": "Aggiornamento Gateway", + "网关连接的锁": "Blocco/i collegato a questo Gateway", + "信号强": "Forte", + "选择网关类型": "Scegli il tipo di gateway", + "添加网关": "Aggiungi gateway", + "重新通电": "Ri collegare il potere", + "指示灯": "Indicatore luminoso", + "选择网关": "Scegli Gateway", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "Il 5G non è supportato, Si prega di selezionare un WiFi di 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "Inserisci la password WiFi", + "网关名称": "Nome dell'ingresso", + "请输入网关名称": "Inserisci il nome del gateway", + "IP地址": "Indirizzo IP", + "子网掩码": "Maschera subnet", + "默认网关": "Gateway predefinito", + "自动获取DNS服务器地址": "Ottieni automaticamente l'indirizzo del server DNS", + "首选DNS": "DNS preferito", + "备选DNS": "DNS alternativo", + "不使用静态IP": "Non viene utilizzato alcun IP statico", + "使用静态IP": "Utilizzare l'IP statico", + "请输入IP地址": "Inserisci indirizzo IP", + "请输入子网掩码": "Inserisci Subnet Mask", + "请输入默认网关": "Inserisci il gateway predefinito", + "所有锁": "Tutte le serrature", + "搜索所有类型的锁": "Scansione di tutti i tipi di serrature", + "门锁": "Serratura", + "挂锁": "Lucchetto", + "保险箱锁": "Serratura di sicurezza", + "智能门禁": "Controllo intelligente degli accessi", + "车位锁": "Blocco parcheggio", + "摸亮触摸屏": "Toccare qualsiasi tasto per attivare il tastierino", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Si prega di toccare qualsiasi tasto per attivare il blocco e metterlo in modalità PAIRING. Premere Next", + "附近的锁": "Serrature nelle vicinanze", + "如需修改名字请重新命名,点击确定添加锁": "Se vuoi cambiare il nome, rinomina, fai clic su OK per aggiungere blocco", + "添加锁时,手机必须在锁旁边": "Quando si aggiunge un lucchetto, il telefono deve essere accanto alla serratura", + "登录": "Accesso", + "注册": "Iscrizione", + "我已阅读并同意": "Ho letto e accettato", + "验证码": "Codice", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "La tua password deve avere 8-20 caratteri e includere almeno due tipi di numeri, lettere e simboli", + "手机": "Telefono", + "邮箱": "E-mail", + "请输入邮箱": "Inserisci la tua email", + "国家/地区": "Paese/Regione", + "你所在的国家/地区": "Il tuo paese/regione", + "选择国家/地区": "Scegli il tuo Paese o Regione", + "获取验证码": "Ottieni codice", + "商务合作": "Affari", + "电脑网页版": "Sistema Web", + "酒店系统": "Sistema alberghiero", + "说明书网页版": "Manuale dell'utente", + "高级功能": "Funzione avanzata", + "记录保存": "Conservazione dei record", + "您可通过短信将密码、电子钥匙信息发给接收人。": "L'SMS può essere utilizzato per inviare il passcode e le informazioni di ekey al destinatario.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "L' e-mail può essere utilizzata per inviare passcode e informazioni ekey al destinatario.", + "购买实名认证提示": "Dopo aver abilitato la funzione, è necessario utilizzare la password dell'impronta digitale, del viso o dell'account per aprire l'APP. Non è necessario verificare di nuovo per 3 minuti", + "请选择你希望的实名认证频次": "Seleziona la frequenza di autenticazione del nome reale che desideri", + "仅首次": "Per la prima volta", + "每日一次": "Una volta al giorno", + "每周一次": "Una volta alla settimana", + "每月一次": "Una volta ogni mese", + "当前状态": "Stato attuale", + "试用中": "In prova", + "高级功能权益内容": "Funzioni avanzate", + "短信模板": "Modello SMS", + "邮件模板": "Modello e-mail", + "发卡工具": "Coder per schede", + "购买高级功能须知": "Avviso", + "购买高级功能提示": "Funzionalità più avanzate sono in fase di sviluppo e, se ne hai bisogno, sei il benvenuto ad aprire il servizio in base al numero di serrature. Le funzionalità avanzate sono disponibili solo per le tue serrature. Se sei un amministratore autorizzato, contatta l'amministratore superiore del blocco per aprire il servizio", + "免费体验": "Prova gratuita", + "立即开通": "Apri ora", + "购买短信": "Acquista SMS", + "购买邮件": "Acquista Email", + "购买实名认证次数": "Acquisto di orari di autenticazione del nome reale", + "开通高级功能": "Abilita funzione avanzata", + "选择套餐": "Scegli il pacchetto", + "支付方式": "Modalità di pagamento", + "支付宝": "Alipay", + "去支付": "Paga", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "È consentito definire il messaggio da soli. Viene utilizzato per inviare informazioni di passcode ed ekey ad altri.", + "高级功能仅能用于你自己的锁": "La funzione avanzata può essere applicata solo le tue serrature.", + "新建模板": "Modello Creat", + "类型": "Tipo", + "模版内容": "Contenuto del modello", + "预览": "Anteprima", + "房间名": "Stanza", + "预计产生短信条数": "Segmenti di messaggi stimati", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Questa funzione consente di nascondere codici di accesso, ekeys, carte e impronte digitali che non sono validi per un periodo di tempo.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Il telefono dell'utente deve essere online per sbloccare queste serrature selezionate con APP.", + "配置WiFi": "Configurazione del WiFi", + "请输入WiFi名字": "Inserisci il nome Wifi", + "WiFi配网": "Rete di distribuzione WiFi", + "胁迫卡": "Scheda antistress", + "员工是否有密码": "Ha già il codice di accesso", + "员工是否有卡": "Ha già la carta", + "员工是否有指纹": "Imposta già l'impronta digitale", + "获取钥匙": "Ottieni la chiave", + "获取卡": "Ottieni carta", + "获取指纹": "Ottieni impronte digitali", + "安全验证": "Verifica dell'identità", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tutte le informazioni del tuo account verranno rimosse dalla piattaforma PERMANENTAMENTE e non potranno essere recuperate. Vuoi eliminare?", + "监控": "Monitor", + "视频日志": "Registro video", + "开门器": "Apriporta", + "面容开锁": "Il viso si sblocca", + "开门方向设置": "Set di direzione di apertura", + "电机功率设置": "Impostazione della potenza del motore", + "开锁时是否需联网": "Se Internet è richiesto quando si sblocca", + "选择要加入分组的锁": "Selezionare lockS da aggiungere a questo gruppo", + "锁数量": "Numero di blocchi", + "小米IOT平台": "Piattaforma iot xiaomi", + "面容开锁设置": "Set Sblocca Viso", + "感应距离": "Rilevamento della distanza", + "防误开": "Prevenire l'apertura sbagliata", + "防误开已关闭,关门后仍可使用面容开锁": "Prevenire l'apertura errata è stato chiuso, dopo aver chiuso la porta può ancora utilizzare lo sblocco del viso", + "添加和使用面容开锁时": "Aggiungere e utilizzare il viso quando si sblocca", + "添加和使用面容开锁时提示": "\n1, si prega di cercare di tenere una sola persona davanti al funzionamento della porta;\n2, si prega di stare di fronte alla serratura della porta di circa 0,5 ~ 0,8 metri, di fronte alla serratura della porta;\n3. Si prega di tenere il viso libero ed esporre le caratteristiche del viso;\n4. Quando il riconoscimento facciale è anomalo, è possibile toccare qualsiasi tasto sulla tastiera digitale per riavviare manualmente il riconoscimento facciale.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Si prega di scegliere la potenza del motore con attenzione in base alla situazione reale della serratura della porta:", + "小功率:": "Miniwatt:", + "耗电少": "Meno consumo di energia", + "大功率": "Ad alta potenza:", + "大功率提示": "Se la lingua della serratura non può essere ritratta normalmente quando sblocca, o deve essere guidata", + "开门方向设置提示": "Si prega di scegliere con attenzione la direzione per aprire la porta della vostra casa (se si sceglie la direzione sbagliata, non sarà possibile aprire e chiudere la porta correttamente):", + "左开": "Aperto a sinistra", + "右开": "Apri a destra", + "判断方法:": "判断方法:", + "判断方法内容": "L'uomo stava fuori dalla casa, di fronte alla porta d'ingresso.", + "录像时段": "Slot video", + "密码": "Codice di accesso", + "卡": "Carte", + "指纹": "Impronta digitale", + "人脸": "Viso", + "配件商城": "Chiusura del centro commerciale", + "公司名称": "Nome azienda", + "请输入公司名字": "Inserisci nome azienda", + "提示": "Suggerimento", + "是否删除?": "Se eliminare?", + "员工信息": "Informazioni sul personale", + "员工": "Personale", + "打卡方式无效": "Non disponibile", + "中国": "Cina", + "选择钥匙": "Scegli ekey", + "编辑": "Modifica", + "无": "No", + "有": "Sì", + "请输入姓名": "Inserisci un nome", + "获取人脸": "Ottenere facce", + "选择密码": "Scegli codice di accesso", + "选择卡": "Scegli la carta", + "选择指纹": "Scegli l'impronta digitale", + "选择人脸": "Seleziona la faccia", + "员工是否有人脸": "Se il dipendente ha una faccia", + "同时删除员工钥匙": "Elimina il suo ekey", + "删除": "Delet", + "确定要删除员工吗?": "Elimina questo dipendente", + "月统计": "Statistiche mensili", + "迟到": "In ritardo", + "早退": "Lascia presto", + "未打卡": "Nessun record", + "钥匙将在": "Questo ekey scadrà tra", + "天后失效": "Giorno/i", + "电量更新时间:": "Tempo di aggiornamento della batteria:", + "新增配件": "Aggiungi", + "钥匙不可用": "La chiave non è disponibile", + "正在开锁中...": "Sblocco...", + "你的钥匙": "La tua chiave", + "常开模式启动!长按闭锁": "Modalità aperta avviata! Premi a lungo per bloccare", + "演示模式": "Modalità demo", + "请先同意用户协议及隐私政策": "Si prega di accettare prima l'accordo con l'utente e la politica sulla privacy", + "用户协议": "Termini utente", + "隐私政策": "Politica sulla privacy", + "注册成功": "Registrazione riuscita", + "你所在的": "Sei in", + "手机号": "Numero di telefono", + "忘记密码": "Password dimenticata", + "重置成功": "Ripristina successo", + "确定要退出吗?": "Uscita?", + "功能暂未开放": "La funzione non è ancora aperta", + "设置成功": "Configurazione riuscita", + "删除成功": "Eliminazione riuscita", + "单次": "Una volta", + "永久": "Permanente", + "限时": "Tempestato", + "自定义": "Personalizzato", + "清空码": "Cancellare", + "循环": "Ricorrenti", + "工作日": "Giornata lavorativa", + "每日": "Ogni giorno", + "周末": "Fine settimana", + "确定要删除吗?": "Cancellare?", + "该锁的密码都将被删除": "Tutti i codici di accesso per questa serratura saranno CANCELLATI", + "已过期": "Non valido", + "该锁的电子钥匙都将被删除": "Tutti gli eKeys per questo blocco saranno CANCELLATI", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "CANCELLA Tutti gli ekey associati a questo ekey. Questo passaggio non può essere FATTO!", + "删除钥匙会在用户APP连网后生效": "L'ekey sarà CANCELLATO", + "有效时间": "Tempo effettivo", + "接收者": "Destinatario", + "仅管理自己创建的用户": "Gestisci solo i suoi utenti", + "远程开锁": "Sblocco remoto", + "请输入钥匙名称": "Inserisci il nome della chiave", + "修改成功": "Modifica riuscita", + "冻结": "Congelamento", + "解除冻结": "Scongelamento", + "授权": "Autorizza", + "取消授权": "Disautorizza", + "同时解冻其发送的钥匙": "Scongelare tutti gli ekey emessi da questo utente", + "会在用户APP连网后生效": "Questo ekey sarà SCONTATO quando l'APP dell'utente si collega a una rete", + "同时冻结其发送的钥匙": "Congelare tutti gli ekey emessi da questo utente", + "冻结会在用户APP连网后生效": "Questo ekey sarà FROZEN quando l'APP dell'utente si collega a una rete", + "取消授权会在用户APP连网后生效": "L'utente smette le sue autorizzazioni quando l'APP dell'utente si connette a una rete", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "L'utente autorizzato ha quasi le stesse autorizzazioni del LOCK Manager (ad es. Possibilità di inviare ekeys e passcode)", + "失效时间需晚于生效时间": "Il tempo di scadenza deve essere successivo al tempo effettivo", + "生效时间需晚于当前时间": "Il tempo effettivo deve essere successivo all'ora corrente", + "失效日期需晚于生效日期": "La data di scadenza deve essere successiva alla data di entrata in vigore", + "修改有效期": "Periodo di modifica", + "生效日期": "Data di inizio", + "失效日期": "Data di fine", + "开锁": "Sblocca", + "开锁成功": "Sblocca successo", + "请选择锁": "Seleziona le serrature", + "请选择接收者": "Si prega di selezionare il ricevitore", + "请选择有效期": "Seleziona il periodo di validità", + "请选择发送方式": "Seleziona il metodo di invio", + "请选择结束时间": "Seleziona l'ora di fine", + "完成": "Completa", + "有效日": "Ciclo su", + "发送成功": "Invia con successo", + "请选择开始时间": "Seleziona l'ora di inizio", + "选择用户": "Seleziona i destinatari", + "已选中": "Selezionato", + "确定": "OK", + "请选择要发送的锁": "Seleziona le serrature", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "L'autenticazione del nome reale del volto si riferisce alla necessità dell'utente di verificare il suo viso prima di sbloccare l'APP del telefono e la verifica può essere sbloccata.", + "分享": "Condividi", + "请输入接收者账号": "Inserisci l'account del destinatario", + "接收者号码未注册,请重新发送": "Il numero del destinatario non è registrato, invia nuovamente", + "是否发送电子钥匙给未注册账号": "Vuoi inviare un ekey a un nuovo account", + "取消": "Annulla", + "标记成功": "Segna il successo", + "微信好友": "Amici di WeChat", + "短信": "SMS", + "邮件": "E-mail", + "更多": "Altro", + "您好,您的电子钥匙生成成功": "Ciao, la tua chiave elettronica è stata generata con successo", + "生效时间不能小于当前时间": "Il tempo effettivo non può essere inferiore all'ora corrente", + "结束时间不能小于当前时间": "L'ora di fine non può essere inferiore all'ora corrente", + "是否为管理员": "È un amministratore", + "已连接到锁,请将卡靠近门锁的读卡区": "Collegato. Posizionare la Carta contro il Lettore di Schede", + "尝试连接设备...": "Connessione con serratura. Attendi...", + "地理位置": "Posizione geografica", + "检查以确保以下地址是正确的": "Verificare che il seguente indirizzo sia corretto", + "地图加载中,请稍候。。": "La mappa si sta caricando, attendi...", + "跳过": "Salta", + "还未获取到位置信息哦,请耐心等待一下!": "Le informazioni sulla posizione non sono ancora state ottenute, si prega di attendere pazientemente!", + "请填写信息": "Inserisci le informazioni", + "有效期": "Periodo di validità", + "生效时间": "Ora di inizio", + "失效时间": "Ora di fine", + "上传成功": "Caricato con successo", + "未生效": "Inattivo", + "已生效": "Efficace", + "指纹详情": "Informazioni sull'impronta digitale", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Ti verrà richiesto di posizionare il dito sul sensore più volte. Si prega di seguire le istruzioni...", + "开始添加": "Inizia", + "请将您的手指按下": "Posiziona il dito sul sensore", + "根据提示,抬起手指后再进行下一次指纹采集": "Seguire le istruzioni... Ti verrà richiesto di rimuovere e posizionare il dito sul sensore per il prossimo record", + "添加成功": "Aggiungi successo", + "更新成功": "Aggiornamento riuscito", + "搜索": "Ricerca", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Dopo il ripristino, la scheda del blocco verrà eliminata, vuoi reimpostare?", + "已失效": "Non valido", + "卡详情": "Informazioni sulla carta", + "请输入": "Inserisci qui", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Spegnendosi, il blocco rimarrà sbloccato tutto il giorno fino a quando non verrà bloccato manualmente", + "请输入小于或等于60的数字": "Inserisci un numero inferiore a 60", + "操作成功": "Operazione riuscita", + "管理员密码相同,无需修改": "La password di amministratore è la stessa e non deve essere modificata", + "请输入6-9位数字": "6-9 cifre di lunghezza", + "请输入6-9位管理员密码": "Inserisci una password amministratore di 6-9 cifre", + "请输入新的管理员密码": "Inserisci una nuova password di amministratore", + "未分组": "Non raggruppati", + "请输入分组名称": "Creare un gruppo", + "创建成功": "Crea successo", + "设置锁分组成功": "Impostare correttamente il gruppo di blocco", + "电池1电量": "Batteria 1", + "电池2电量": "Batteria 2", + "电量更新时间": "Tempo di aggiornamento della batteria", + "锁电量更新成功": "Blocca l'aggiornamento di potenza riuscito", + "您的钥匙未生效": "La tua chiave non è efficace", + "您的钥匙已冻结": "La tua chiave è stata congelata", + "您的钥匙已过期": "La tua chiave è scaduta", + "常开模式开启": "La serratura è in modalità Passage", + "超级管理员": "Super amministratore", + "授权管理员": "Amministratore", + "普通用户": "Utente ordinario", + "余": "Equilibrio", + "天": "Giorno", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Dopo aver eliminato il blocco, tutte le informazioni verranno eliminate insieme, sei sicuro di voler eliminare il blocco?", + "请输入登录密码": "Inserisci la password dell'applicazione", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Impossibile eliminare il dispositivo, assicurati che il dispositivo sia vicino al dispositivo, che il dispositivo non sia connesso e che il dispositivo sia acceso", + "用户无权限": "L'utente non ha alcuna autorizzazione", + "创建公司后,考勤功能才能使用": "Crea prima una società", + "是否删除钥匙?": "Eliminare questo ekey?", + "邮箱绑定成功": "Email di associazione riuscita", + "手机绑定成功": "Successo di rilegatura del telefono cellulare", + "网络访问失败,请检查网络是否正常": "Richiesta non riuscita. Rete non disponibile, si prega di controllare e collegare il dispositivo a 3G/4G/WIFI", + "清空": "Chiaro", + "是否清空?": "Chiaro?", + "消息详情": "Informazioni sul messaggio", + "创建时间": "Tempo di creazione", + "管理员详情": "Dettagli dell'amministratore", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Se qualcuno ti obbliga ad aprire la porta, puoi usare questa scheda. Il messaggio di allarme verrà inviato ai responsabili. Per utilizzare questa funzione, assicurati che il lucchetto sia online.", + "请不要将胁迫卡用于日常开锁": "Si prega di non utilizzare la carta forzata per l'uso quotidiano.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Se qualcuno ti obbliga ad aprire la porta, puoi usare questa impronta digitale. Il messaggio di allarme verrà inviato ai responsabili. Per utilizzare questa funzione, assicurati che il lucchetto sia online.", + "请不要将胁迫指纹用于日常开锁": "Si prega di non utilizzare l'impronta digitale forzata per l'uso quotidiano.", + "创建公司": "Creare un'azienda", + "公司名称不能超过30个字符": "Il nome della società non può superare i 30 caratteri", + "公司名称不能小于6个字符": "Il nome della società non può essere inferiore a 6 caratteri", + "WIFI列表": "Lista WIFI", + "刷新": "Aggiorna", + "手动配网": "Rete di distribuzione manuale", + "远距离": "Lunga distanza", + "中距离": "Media distanza", + "近距离": "Breve distanza", + "锁时间更新成功": "Aggiornamento del tempo di blocco riuscito", + "锁用户": "Blocca gli utenti", + "请选择常开日期": "Si prega di selezionare la data di apertura", + "结束时间不能小于开始时间哦": "L'ora di fine non può essere inferiore all'ora di inizio", + "介绍": "La nostra storia", + "个人信息收集清单": "Elenco di raccolta di informazioni personali", + "应用权限说明": "Descrizione dell'autorizzazione della domanda", + "第三方信息共享清单": "Elenco di condivisione delle informazioni di terze parti", + "请选择您的位置": "Seleziona la tua posizione", + "请先选择位置": "Seleziona prima la posizione", + "管理员密码": "Codice di accesso amministratore", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Se è necessario modificare, inserire una nuova password di amministratore (6 cifre), fare clic su OK per modificare", + "修改": "Modifica", + "网络摄像头": "Fotocamera", + "重命名": "Rinomina", + "分组下的锁将被移到未分组里": "I blocchi sotto il gruppo verranno spostati in non raggruppati", + "编辑成功": "Modifica riuscita", + "厂商": "Produttore", + "型号": "Modello", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Dopo aver generato la password, utilizzarla una volta per l'attivazione prima delle 23:59 dello stesso giorno, altrimenti non sarà valida dopo le ore 0. Dopo aver attivato la password, può essere utilizzata per tempi illimitati entro il periodo di validità.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Dopo aver generato la password, utilizzarla prima delle 23:59 dello stesso giorno, altrimenti non sarà valida dopo le ore 0. Il codice chiaro viene utilizzato per cancellare tutte le password generate prima delle 0 di oggi.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Dopo aver generato la password, utilizzarla prima delle 23:59 dello stesso giorno, altrimenti non sarà valida dopo le ore 0.", + "清空密码底部提示": "La password è valida fino alle 23:59 del giorno di svuotamento", + "相机": "Fotocamera", + "相册": "Foto", + "读写": "Stoccaggio", + "定位": "Posizione", + "需要访问相机权限才能拍照上传文件例如头像上传": "L'accesso alla fotocamera è necessario per scattare foto e caricare file, come caricare un'immagine del profilo", + "需要访问相机权限才能使用相册图片上传文件上传头像": "L'accesso alla fotocamera è necessario per caricare file e avatar utilizzando le immagini dell'album", + "需要访问读写权限才能使用本地图片上传头像": "È necessario accedere alle autorizzazioni di lettura e scrittura per caricare avatar utilizzando immagini locali", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Per utilizzare la funzione di add key è necessario l'accesso alle informazioni sulla posizione", + "申请": "Domanda", + "权限": "Permesso", + "不允许": "Non consentito", + "允许": "Consentito", + "权限被拒绝": "Permesso negato", + "请手动在系统设置中开启": "Si prega di abilitarlo manualmente nelle impostazioni di sistema", + "权限以继续使用应用": "Autorizzazione per continuare a utilizzare l'applicazione.", + "去设置": "Vai a sistemarlo", + "当前网络": "Rete attuale", + "位置信息": "Informazioni sulla posizione", + "请输入wifi名称": "Inserisci il nome wifi", + "虹膜": "Iride", + "手掌": "Palm", + "商城": "Centro commerciale", + "我的": "Il mio", + "微信公众号推送": "Conto pubblico Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Per aprire wechat per ricevere messaggi di allarme, è necessario prestare attenzione prima all'account pubblico Skye Smart Lock wechat, salva il codice QR e usa wechat per scansionare le impostazioni", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Per utilizzare le informazioni sulla posizione della funzione add key è necessario l'accesso alle autorizzazioni Bluetooth", + "请输入Email": "Inserisci la tua email", + "请输入手机号": "Inserisci il tuo numero di telefono", + "家人到家": "Il membro della famiglia è arrivato a casa", + "添加家人": "Aggiungi membro della famiglia", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Se la serratura non è collegata a Internet, i promemoria per il codice di accesso, la carta, l'impronta digitale e altri metodi di apertura della porta non possono essere inviati in modo tempestivo.", + "消息提醒": "Promemoria", + "开门通知": "Avviso di apertura", + "N天未开门": "N giorni senza apertura della porta", + "门未关好": "La porta non è chiusa", + "防拆报警": "Allarme manomissione", + "低电量提醒": "Batteria bassa", + "胁迫开门": "Apertura forzata della porta", + "有人按门铃": "Qualcuno suona il campanello", + "有人出现在门口": "Qualcuno appare alla porta", + "提醒方式": "Metodo di promemoria", + "开门方式": "Metodo di apertura della porta", + "请选择": "Seleziona", + "家人": "Membro della famiglia", + "保存": "Salva", + "APP推送": "Push APP", + "管理员": "Amministratore", + "未启用": "Non abilitato", + "已启用": "Abilitato", + "省电模式": "Modalità di risparmio energetico", + "逗留抓拍模式": "Mantieni la modalità di cattura", + "实时监控模式": "Modalità di monitoraggio in tempo reale", + "自定义模式": "Modalità personalizzata", + "猫眼设置": "Impostazione occhi di gatto", + "猫眼工作模式": "Modalità di lavoro dell'occhio di gatto", + "自动亮屏": "Schermo luminoso automatico", + "亮屏持续时间": "Schermo in tempo", + "逗留警告": "Rimani in guardia", + "异常警告": "Avviso anomalo", + "短信提醒": "SMS", + "邮件提醒": "E-mail", + "N天未开门提醒": "N giorni senza apertura della porta", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Se qualcuno ti costringe ad aprire il blocco, puoi usare questa impronta digitale. Il messaggio di allarme verrà inviato ai responsabili. Per utilizzare questa funzione, assicurati che il lucchetto sia online.", + "胁迫指纹": "Impronta digitale forzata", + "指纹列表": "Lista impronte digitali", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Dopo il tempo impostato, se il blocco non viene aperto, il sistema invierà un messaggio di promemoria al destinatario designato. Questa funzione richiede che il lucchetto sia connesso a Internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Dopo aver attivato il promemoria, quando la batteria di blocco è inferiore al 20%, 10% e 5%, il sistema invierà un messaggio di promemoria al destinatario designato.", + "未开门时间": "Giorni senza apertura della porta", + "添加和使用面容开锁时:": "Aggiungi e usa il viso quando sblocchi:", + "关锁": "Chiusura chiusura", + "功能": "Funzione", + "配件": "Parti", + "云存": "Cloud storage", + "本地": "Questa località", + "3天滚动储存": "3 giorni di stoccaggio di laminazione", + "去升级": "Aggiorna ora", + "下载列表": "Elenco download", + "已下载": "Scaricato", + "全部视频": "Tutti i video", + "已为本设备免费提供3大滚动视频储存服务": "Per questo dispositivo sono stati forniti gratuitamente tre servizi di archiviazione video a scorrimento", + "视频播放": "Riproduzione video", + "全选": "Tutto", + "请选择要删除的视频": "Seleziona il video che vuoi eliminare", + "请选择要下载的视频": "Seleziona il video che vuoi scaricare", + "欢迎使用": "Benvenuto da usare", + "用户协议和隐私政策概要": "Riepilogo dell'accordo con gli utenti e politica sulla privacy", + "协议概要": "Sintesi del protocollo", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Grazie per l'utilizzo di questa applicazione. Attribuiamo grande importanza alle tue informazioni personali e alla protezione della privacy. Prima di utilizzare questo prodotto, si prega di leggerlo attentamente", + "《用户协议》": "Termini utente", + "和": "E", + "《隐私政策》": "Informazioni sulla privacy", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "L'intero contenuto di. Facendo clic su \"Accetti\", accetti e accetti tutti i termini. Se scegli di non essere d'accordo, non sarai in grado di utilizzare i nostri prodotti e servizi e uscirai dall'applicazione.", + "不同意": "Non d'accordo", + "同意": "D'accordo", + "该功能是高级功能,请开通后再使用": "Questa è la funzione avanzata. Si prega di abilitarlo prima.", + "常用程序": "Programmi comuni", + "该锁已被重置": "Il blocco è stato resettato", + "需要访问读写权限才能使用手动升级固件": "L'accesso alle autorizzazioni di lettura e scrittura è necessario per aggiornare manualmente il firmware", + "错误D固件,请选择正确的文件": "Firmware sbagliato, si prega di selezionare il file corretto", + "非SYD固件,请选择正确的文件": "Firmware non SYD, si prega di selezionare il file corretto", + "文件校验失败 0x01": "Verifica file non riuscita 0x01", + "解析元数据失败,请选择正确的文件": "Impossibile analizzare i metadati, seleziona il file corretto", + "文件校验失败 0x02": "Verifica file non riuscita 0x02", + "文件校验失败 0x03": "Verifica file non riuscita 0x03", + "固件升级完成": "Aggiornamento del firmware completato", + "记录": "Record", + "开通高级功能后才可以对锁进行管理": "Si prega di abilitare prima la funzione avanzata per gestire i blocchi.", + "去开通": "Abilita", + "实名认证": "Autenticazione del nome reale", + "当前剩余数量": "Rimanendo", + "购买": "Acquista", + "实名认证为付费功能,请购买后再使用": "L'autenticazione del nome reale è una funzione a pagamento, si prega di utilizzarla dopo l'acquisto", + "密码不一致哦": "Le password sono incoerenti", + "退出添加": "Esci dall'aggiunta", + "管理员已满": "Amministratore completo", + "用户已满": "L'utente è pieno", + "锁上面添加指纹已满": "Aggiungere l'impronta digitale sul lucchetto è pieno", + "指纹已存在": "L'impronta digitale esiste già.", + "锁上面添加人脸已满": "La serratura sopra aggiunge la faccia è piena", + "人脸已存在": "Il volto esiste già", + "锁上面添加卡已满": "La carta aggiunta di blocco sopra è piena", + "卡已存在": "La carta esiste già", + "锁上面添加密码已满": "Blocco sopra aggiungere la password è piena", + "密码已存在": "Esiste già un codice di accesso identico. Scegli uno diverso", + "请输入密码": "Inserisci la password", + "暂无密码,无需重置": "Nessuna password, non c' è bisogno di resettare", + "真实姓名": "Vero nome", + "身份证号": "Numero identificativo", + "请输入真实姓名": "Inserisci il tuo vero nome", + "请输入身份证号": "Inserisci il tuo numero ID", + "请输入身份证号和真实姓名": "Inserisci il tuo numero ID e il tuo nome reale", + "点击返回设备配对": "Tocca Back to device pairing", + "无法连接?尝试升级": "Non riesci a connetterti? L'aggiornamento ha tentato", + "固件升级提示": "Prompt di aggiornamento del firmware", + "请先获取固件文件到手机本地,再选择升级": "Si prega di ottenere prima il file del firmware al telefono locale, quindi selezionare Upgrade", + "固件升级中": "Il firmware è in fase di aggiornamento", + "取消升级": "Annulla l'aggiornamento", + "固件传输中": "Firmware in transito", + "关闭": "Spegni", + "传输中'": "In transito", + "操作记录": "Record", + "修改姓名": "Modifica nome", + "传输中": "In transito", + "发送人": "Rilasciato da", + "发送时间": "Tempo emesso", + "钥匙详情": "Info ekey", + "姓名": "Nome", + "发送": "Invia", + "请确认姓名全名和身份证号码是否正确": "Conferma che il nome completo e il numero ID siano corretti", + "传输期间请勿离开当前页面": "Non lasciare la pagina corrente durante il trasferimento", + "机型": "Modelli", + "硬件版本": "Versione hardware", + "固件版本": "Versione firmware", + "手动升级": "Aggiornamento manuale", + "设备连接中...": "Connessione del dispositivo...", + "未避免异常情况,请在门打开时升级": "Eccezioni inevitabili, si prega di aggiornare quando la porta è aperta", + "钥匙无效": "La chiave non è valida", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Impossibile connettersi al blocco. Riavvia il blutooth del telefono e riprova.", + "如果是全自动锁,请使屏幕变亮": "Se si tratta di un blocco completamente automatico, si prega di rendere lo schermo più luminoso", + "正在尝试闭锁……": "Sto cercando di chiudere. Per favore aspetta...", + "清空记录": "Registrazioni chiare", + "是否要删除操作记录?": "Continua a eliminare i record?", + "被删除的记录不能恢复": "I record non possono essere recuperati dopo l'eliminazione.", + "全部事件": "Tutti gli eventi", + "开锁事件": "Sblocca evento", + "异常事件": "Evento anomalo", + "门铃事件": "Evento campanello", + "视频事件": "Evento video", + "请开启蓝牙": "Si prega di attivare il Bluetooth", + "请选择有效日": "Si prega di selezionare il giorno effettivo", + "公司名字长度不能小于 6 ": "La lunghezza del nome della società non può essere inferiore a 6", + "已是最新版本": "Nessun aggiornamento", + "新建短信模版": "Modello di SMS Creat", + "新建邮件模版": "Modello di email Creat", + "自定义短信模版": "Modello SMS", + "自定义邮件模版": "Modello e-mail", + "名称": "Nome", + "星星锁": "Serratura a stella", + "无考勤记录": "Nessun record", + "大家干劲十足": "Tutti arrivano in tempo", + "工作时长未出炉": "Nessuna ora di lavoro", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "La scelta del paese/regione influirà sulla sicurezza dei dati. Al momento hai selezionato l'Albania, conferma prima di procedere.", + "确认国家或地区": "Conferma paese/regione", + "我知道了": "Capito", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Per ricevere aggiornamenti importanti, fare clic su \"OK\" e abilitare le notifiche nelle impostazioni.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Dopo l'accensione, è possibile riaccendere premendo a lungo il tasto di impostazione sul blocco e aggiungerlo nuovamente con l'APP", + "已有": "Attuale", + "新增": "Nuovo", + "账号格式错误": "Formato cattivo", + "接收者信息为空": "Le informazioni del destinatario sono vuote", + "请输入时间(秒)": "Inserisci l'ora (sec)", + "加载数据失败": "Impossibile caricare i dati", + "重试": "Prova di nuovo", + "升级中,是否退出": "Durante l'aggiornamento, se uscire", + "下一步": "Successivo", + "公寓": "Appartamento", + "个人用户": "Personale", + "星寓": "Appartamento Star", + "账号": "Conto", + "请输入手机号或email": "Numero di telefono o e-mail", + "请输入星寓管理员的账号": "Inserisci l'account dell'amministratore dell'appartamento stellato", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Tutti i dati dei lucchetto selezionati saranno trasferiti in modo permanente al destinatario.", + "暂不支持跨平台转移,敬请期待": "Per il momento il trasferimento multipiattaforma non è supportato, attendi con impazienza", + "移除坏锁": "Spostare i blocchi difettosi/danneggiati nel cestino", + "转移确认": "Conferma trasferimento", + "本次共转移": "Questa volta un totale di", + "把智能锁": "Serratura intelligente", + "确认": "OK", + "移除成功": "Rimuovere correttamente", + "转移成功": "Trasferimento riuscito", + "该已锁被删除": "Il blocco viene eliminato", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "L'amministratore autorizzato può gestire solo codici di accesso, ekeys ed etccreate da lui stesso.", + "添加授权管理员": "Crea amministratore", + "导出记录": "Esporta i record", + "选择时间段": "Seleziona periodo di tempo", + "导出": "Esportazione", + "批量导出": "Esportazione in batch", + "读取记录": "Aggiorna i record", + "设备": "Dispositivo", + "消息": "Messaggi", + "智能分析": "Analisi intelligente", + "精准识别设备事件,过滤无效信息": "Identificare accuratamente gli eventi del dispositivo e filtrare le informazioni non valide", + "系统设置": "Impostazioni di sistema", + "系统的全局配置在此项内进行设置": "La configurazione globale del sistema è impostata in questa voce", + "导出操作记录": "Esporta i record", + "立即查看": "Visualizza", + "导出成功": "Esportato correttamente", + "发送钥匙": "Invia ekey", + "进度": "Tasso", + "失败": "Impossibile", + "人脸详情": "Dettagli del viso", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Quando qualcuno viene percepito a circa 1,5 metri davanti alla porta, lo sblocco del riconoscimento del volto verrà avviato automaticamente.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Quando qualcuno viene percepito a circa 0,8 metri davanti alla porta, lo sblocco del riconoscimento facciale verrà avviato automaticamente.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Quando qualcuno viene percepito a circa 0,5 metri davanti alla porta, lo sblocco del riconoscimento del volto verrà avviato automaticamente.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "La distanza di rilevamento è stata disattivata, è necessario toccare manualmente qualsiasi tasto sulla tastiera per eseguire lo sblocco del riconoscimento facciale.", + "防误开已打开,开锁后": "L'apertura anti-errore è stata accesa, e dopo lo sblocco", + "秒内不可使用面容开锁": "Lo sblocco del viso non può essere utilizzato in pochi secondi", + "掌静脉": "Vena di palma", + "添加掌静脉": "Aggiungi la vena di palma", + "胁迫掌静脉": "Vena di palma forzata", + "请不要将胁迫掌静脉用于日常开锁": "Si prega di non utilizzare le vene del palmo della coercizione per lo sblocco quotidiano", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Collegato alla serratura, si prega di aprire naturalmente il palmo della mano, il palmo è rivolto verso la fotocamera", + "掌静脉详情": "Dettagli della vena di palma", + "掌静脉号": "Numero della vena di palma", + "蓝牙未打开,请到设置里面打开蓝牙": "Il Bluetooth non è acceso, si prega di attivare il Bluetooth nelle impostazioni", + "删除用户时,会将用户拥有的钥匙一起删除。": "Se un Utente viene CANCELLATO, verranno cancellate anche le ekey associate all'Utente.", + "配置网络": "Configura la rete", + "你好": "Ciao", + "成功": "Riuscito", + "类型选择": "Tipo di selezione", + "请选择要使用哪种类型": "Seleziona il tipo da utilizzare", + "系统邮件(推荐)": "Email di sistema (consigliata)", + "系统短信(推荐)": "Sistema SMS (consigliato)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "L' e-mail verrà inviata da questa app. Si prega di acquistare prima il pacchetto e-mail.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Gli SMS verranno inviati da questa app. Si prega di acquistare prima il pacchetto e-mail.", + "个人邮件": "E-mail personale", + "个人短信": "SMS personali", + "邮件将从你的个人邮箱发给用户": "L' e-mail verrà inviata dal tuo account di posta elettronica personale.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Il messaggio SMS verrà inviato dal tuo numero di telefono personale. Paghi al tuo operatore di telecomunicazioni.", + "为了更好地应用体验,请确定权限": "Per una migliore esperienza di applicazione, si prega di confermare le autorizzazioni", + "您第一次拒绝权限,请确定权限": "Hai rifiutato l'autorizzazione per la prima volta, conferma l'autorizzazione", + "您第二次拒绝权限,请去应用设置开启权限": "Hai rifiutato l'autorizzazione per la seconda volta, vai alle impostazioni dell'applicazione per abilitare l'autorizzazione", + "去应用市场": "Vai all'app store", + "温馨提示": "Prompt caldo", + "关闭应用": "Chiudi l'applicazione", + "开启微信接收报警消息需要先关注": "Per aprire WeChat per ricevere messaggi di allarme, è necessario seguire", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Account pubblico WeChat, salva il codice QR e usa WeChat per scansionare le impostazioni", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "L'autenticazione del nome reale è una funzione a pagamento, contatta l'amministratore della serratura per acquistare e utilizzare", + "位置权限": "Permesso di localizzazione", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Concedi all'app di utilizzare il tuo locatian. Viene utilizzato per scansionare serrature e gateway BLE.", + "相机/相册权限": "Autorizzazione fotocamera/album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Si prega di concedere l'app per leggere e scrivere foto e file dallo spazio di archiviazione.", + "点击选择": "Fai clic per selezionare", + "微信": "WeChat", + "朋友圈": "Momenti", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Collegamento", + "今天": "Oggi", + "密码错误": "Password non valida", + "网络中断": "Interruzione della rete", + "钥匙不存在": "La chiave non esiste", + "钥匙过期": "Chiave scaduta", + "钥匙已存在": "La chiave esiste già", + "密码失效": "Password non valida", + "门锁时间异常": "Tempo di blocco della porta anormale", + "APP(手机)未联网": "APP (telefono cellulare) non è connesso a Internet", + "数据不存在": "I dati non esistono", + "待接收": "Ricevuto", + "已冻结": "Congelato", + "已删除": "Eliminazione", + "未知": "Sconosciuto", + "拖动下方滑块完成拼图": "Trascina il cursore nella posizione corretta", + "验证成功": "Verifica riuscita", + "验证失败": "Verifica non riuscita", + "向右拖动滑块填充拼图": "Trascinare il cursore verso destra per riempire il puzzle", + "请先获取到位置信息哦": "Si prega di ottenere prima le informazioni sulla posizione", + "请选择国家": "Seleziona un paese", + "获取锁信息": "Ottieni informazioni sulla serratura", + "锁数据异常,请重试": "I dati di blocco sono anomali, riprova", + "连接设备中...": "Dispositivo di collegamento...", + "把锁": "Serrature", + "条": "Striscia", + "封": "Sigillo", + "次": "Volte", + "支付成功": "Paga riuscita", + "查看详情": "Visualizza dettagli", + "请输入模板名称": "Inserisci il nome del modello", + "模版类型": "Tipo", + "再返回一次退出": "Esci di nuovo", + "请先添加锁": "Aggiungi prima il lucchetto", + "可视对讲": "Interfono visivo", + "详细日志": "Registro dettagliato", + "已复制到剪切板": "Copiato", + "拍照": "Foto", + "从相册选择": "Scegli dall'album", + "选择问题": "Seleziona una domanda", + "确认长度不足8位": "Conferma lunghezza inferiore a 8 cifre", + "新密码长度不足8位": "Nuova lunghezza della password inferiore a 8 cifre", + "两次密码不一致": "Mancata corrispondenza della password. Riprova", + "请点击获取验证码,验证码将发送到": "Si prega di ottenere un codice di verifica. Il codice verrà inviato a", + "切换": "Interruttore", + "验证": "Verifica", + "验证成功,账号已删除": "Verifica riuscita, account eliminato", + "该密码不是自定义密码,无法修改": "Questa password non è una password personalizzata e non può essere modificata", + "请选择设备要关联哪些姓名": "Seleziona a quali nomi deve essere associato il dispositivo", + "请选择姓名要关联哪些设备": "Seleziona a quali dispositivi deve essere associato il nome", + "确定要移除所选中的坏锁吗?": "Rimuovere il blocco malfunzionante?", + "邮件通知": "Avvisa via e-mail", + "短信通知": "Notifica tramite SMS", + "您好,您的授权管理员生成成功": "Ciao, il tuo amministratore autorizzato è stato generato con successo", + "请输入接收者姓名": "Inserisci qui", + "版本更新": "Aggiornamento della versione", + "下次再说": "La prossima volta", + "配网成功": "Successo della distribuzione della rete", + "配网失败": "Distribuzione della rete non riuscita", + "该锁的无线键盘都将被删除": "Tutte le tastiere wireless per questo lucchetto saranno CANCELLATE", + "实时画面": "Immagine in tempo reale", + "适合门口较为安全的环境。": "Adatto per ambienti relativamente sicuri alla porta.", + "仅发生特定事件才录像,并可查看实时画面。": "Vengono registrati solo eventi specifici e l'immagine in tempo reale può essere visualizzata.", + "一般情况下,满电可使用7-8个月": "In circostanze normali, può essere utilizzato per 7-8 mesi quando è completamente carico", + "有人逗留或发生特定事件才录像,可随时查看": "Qualcuno rimane o eventi specifici vengono registrati e possono essere visualizzati in qualsiasi momento", + "实时画面。": "Immagine in tempo reale.", + "一般情况下,满电可使用5~6个月。": "In circostanze normali, può essere utilizzato per 5 ~ 6 mesi quando è completamente carico.", + "适合门口人员复杂、较不安全的环境。": "Adatto per ambienti complessi e relativamente pericolosi alla porta.", + "有人出现就录像,可随时查看实时画面。": "Registra quando appare qualcuno e visualizza l'immagine in tempo reale in qualsiasi momento.", + "一般情况下,满电可使用2~4个月。": "In circostanze normali, può essere utilizzato per 2 ~ 4 mesi quando è completamente carico.", + "根据您家门口实际情况设置录像和实时画面功能。": "Imposta il video e le funzioni dell'immagine in tempo reale in base alla situazione reale alla tua porta.", + "可使用时长由具体设置决定。": "La durata dell'uso è determinata dalle impostazioni specifiche.", + "查看": "Visualizza", + "有人按门铃或发生": "Qualcuno suona il campanello o", + "异常事件时": "Evento anomalo", + "不录像": "Nessun video", + "有人出现、按门铃": "Appare qualcuno, suona il campanello", + "或发生异常事件时": "O si verifica un evento anormale", + "逗留达到10秒": "Rimani per 10 secondi", + "约1.5米": "Circa 1,5 metri", + "随时": "In qualsiasi momento", + "立即录像": "Record subito", + "录像时机": "Timing video", + "有人出现时录像": "Registra quando appare qualcuno", + "人体侦测距离": "Distanza di rilevamento umano", + "查看实时画面": "Visualizza foto in tempo reale", + "自定义时间": "Tempo personalizzato", + "当日": "Oggi", + "次日": "Il giorno dopo", + "自定义时段": "Periodo di tempo personalizzato", + "发生事件时查看": "Visualizza quando si verifica un evento", + "实时查看": "Visualizzazione in tempo reale", + "有人在门口出现10秒后开始录像。": "Qualcuno appare alla porta per 10 secondi prima di registrare.", + "有人按门铃时立即录像。": "Registra subito quando qualcuno suona al campanello.", + "有人出现在门前1.5米范围时启动录像": "Inizia a registrare quando qualcuno appare entro 1,5 metri davanti alla porta", + "约0.8米": "Circa 0,8 metri", + "约3.0米": "Circa 3,0 metri", + "添加指纹失败": "Operazione non riuscita.", + "项": "Articoli", + "播放中": "Giocare", + "下载": "Scaricare", + "暂无下载内容": "Nessun contenuto di download", + "亮度": "Luminosità", + "音量": "Volume", + "快进至": "Avanti veloce a", + "快退至": "Riavvolgi", + "暂无视频信息": "Nessuna informazione video", + "加载出错": "Errore di caricamento", + "请单人正对门锁,距离一个成年人手臂长度": "Per favore, mettiti di fronte alla serratura della porta da solo, a distanza di un braccio", + "(约0.6米)。": "(Circa 0,6 metri).", + "保持脸部无遮挡,露出五官。": "Tieni il viso libero e mostra i tratti del viso.", + "准备好了,开始添加": "Pronto, inizia ad aggiungere", + "正在录入中...": "Registrazione...", + "添加人脸失败": "Impossibile aggiungere il viso", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Dopo il ripristino, le facce del lucchetto verranno eliminate. Sei sicuro di voler reimpostare?", + "人脸号": "Numero del volto", + "虹膜详情": "Dettagli dell'iride", + "虹膜号": "Numero dell'iride", + "选择设备类型": "Seleziona il tipo di dispositivo", + "照明灯具": "Apparecchi di illuminazione", + "电动窗帘": "Tende elettriche", + "门窗传感器": "Sensore per porte e finestre", + "传感器": "Sensore", + "清除数据成功": "Dati cancellati con successo", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Il blocco non è collegato a Internet, quindi i ritodi di passcode, carta, impronta digitale e altri metodi di apertura della porta non possono essere caricati in tempo reale.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Se hai bisogno di conservare i record storici, puoi esportarli.", + "看不到操作记录,可能原因有": "Impossibile vedere i registri delle operazioni, possibili ragioni", + "操作记录详情": "Dettagli del record dell'operazione", + "操作时间": "Tempo di funzionamento", + "此模块功能需要锁联网后设置方可生效": "Questa funzione del modulo deve essere impostata dopo che il blocco è connesso a Internet per avere effetto", + "用户已存在": "L'utente esiste già", + "钥匙数量已到上限": "Il numero di chiavi ha raggiunto il limite superiore", + "附近没有可用网关": "Non c' è un gateway disponibile nelle vicinanze", + "正在创建安全连接...": "Creazione di una connessione sicura...", + "监视状态下不能发送录音": "Impossibile inviare registrazioni in modalità di monitoraggio", + "挂断": "Riaggancia", + "监视中暂不能开锁": "Lo sblocco non è disponibile durante il monitoraggio", + "长按说话": "Premi e tieni premuto per parlare", + "松开发送": "Rilascia per inviare", + "请输入6位数字开锁密码": "Inserisci una password di sblocco a 6 cifre", + "请输入开锁密码": "Inserisci la password di sblocco", + "接收者在有效期内可以不限次数使用": "I destinatari possono utilizzare le ekey per tempi illimitati entro il periodo di validità.", + "接收者可以使用此App开关锁": "Il destinatario è in grado di bloccare/sbloccare da questa app.", + "单次钥匙有效期为1小时,只能使用一次": "L'ekey una tantum è valido per un'ora e può essere utilizzato solo UNA VOLTA.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "I destinatari possono utilizzare gli ekey per tempi illimitati entro il tempo di ciclo fisso.", + "获取模板失败": "Impossibile ottenere il modello", + "微信通知": "Notifica di WeChat", + "系统短信": "Sistema SMS", + "系统邮件": "Email di sistema", + "模板": "Modello", + "新建模版": "Crea modello", + "您好,您的密码是": "Ciao, la tua password è", + "密码名字": "Nome della password", + "请输入6-9位密码": "Inserisci una password di 6-9 cifre", + "设置密码": "Imposta password", + "操作成功,密码为": "Successo. Il passcode è", + "类型:自定义-永久": "Tipo: Custom-permanente", + "实时播放": "Riproduzione in tempo reale", + "点击对讲": "Clicca per citofonare", + "长按开锁": "Premi a lungo per sbloccare", + "接听失败": "Risposta non riuscita", + "请在锁设置中开启远程开锁": "Abilita lo sblocco remoto nelle impostazioni di blocco", + "接听": "Risposta", + "截图已保存到相册": "Screenshot salvato nell'album", + "添加遥控": "Aggiungi telecomando", + "已连接到锁,请按遥控": "Collegato alla serratura, si prega di premere il telecomando", + "遥控号": "Numero di telecomando", + "遥控详情": "Dettagli del telecomando", + "照明": "Illuminazione", + "退出演示模式": "Esci dalla modalità demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Suggerimento: l'interfaccia corrente è un'interfaccia di visualizzazione. Dopo aver aggiunto il dispositivo, puoi continuare a usarlo", + "门已上锁": "La porta è chiusa a chiave", + "您的账号在异地登录,如非本人,请尽快修改密码": "Il tuo account è stato utilizzato per accedere da un nuovo dispositivo", + "开门成功": "Apri la porta con successo", + "开门失败": "Impossibile aprire la porta", + "呼叫提醒": "Promemoria chiamata", + "收到来自": "Ricevuto da", + "锁的呼叫": "Chiamata di blocco", + "加载数据中": "Caricamento dei dati", + "搜索所有锁类型": "Cerca tutti i tipi di blocco", + "锁电量更新时间": "Blocca l'ora di aggiornamento della batteria", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Maggio", + "6月": "Jun", + "7月": "Jul", + "8月": "Ago", + "9月": "Set", + "10月": "Oct", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Città calde", + "导出锁数据": "Esporta i dati del blocco", + "一键开锁": "Sblocco con un clic", + "已开通": "Aperto", + "编辑员工": "Modifica personale", + "一": "Uno", + "二": "Due", + "三": "Tre", + "四": "Quattro", + "五": "Cinque", + "六": "Sei", + "日": "Sole", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Record di acquisto", + "使用记录": "Registrazione utente", + "失效时间要大于当前时间": "Il tempo di scadenza deve essere più lungo dell'ora corrente", + "修改名字": "Modifica nome", + "时": "Ora", + "分": "Minuto", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "È possibile utilizzare Alexa per sbloccare, bloccare e controllare lo stato di blocco", + "支持的国家": "Paesi supportati", + "支持的国家值": "USA, Canada, Regno Unito, Australia, India, Germania, Francia, Italia, Spagna, Giappone", + "操作流程": "Processo di funzionamento", + "操作流程值": "1 Aggiungi un lucchetto e un gateway con l'APP Smart Lock\n\n2 Abilita la funzione di sblocco remoto del blocco nell'APP (questa funzione è disattivata per impostazione predefinita). Se non hai questa opzione, il blocco non supporta Alexa\n\n3 Aggiungi competenze ad Alexa e autorizzale con l'account e la password dell'APP Smart Lock. Una volta completata l'autorizzazione, puoi scoprire i dispositivi sotto l'account\n\n4 Individuare il blocco nell'app Alexa, attivare la funzione di sblocco vocale e impostare la password della lingua\n\n5 La serratura può essere azionata tramite Alexa", + "Google Home": "Google Home", + "Action name": "Nome azione", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Lingue supportate", + "英语": "Inglese", + "Google Home操作流程的值": "1. Utilizzare l'APP Smart Lock per aggiungere serrature e gateway\n\n2. Abilita la funzione di sblocco remoto del blocco nell'APP (questa funzione è disattivata per impostazione predefinita). Senza questa opzione, il blocco non supporta Google Home\n\n3. Installare l'APP Google Home e fare clic sul pulsante \"\" nell'angolo in alto a sinistra\n\n4. Nella pagina Impostazioni, seleziona \"Lavora con Google\"\n\n5. Cerca \"ScienerSmart\" e utilizza l'account e la password APP smart lock per autorizzare", + "密码需至少包含数字/字母/字符中的2种组合": "La password deve contenere almeno 2 dei seguenti: numeri, lettere e caratteri speciali", + "已开锁": "Sbloccato", + "已闭锁": "Bloccato", + "两次密码不一致哦": "Le password sono incoerenti", + "中功率": "Potenza media", + "常规使用": "Uso regolare", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Dopo aver acceso il gateway, tenere premuto il pulsante di ripristino per 5 secondi e fare clic su Avanti quando l'indicatore luminoso lampeggia alternativamente", + "扫描设备": "Dispositivo di scansione", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Eliminazione non riuscita. Il gateway potrebbe essere andato offline. Vuoi forzare l'eliminazione dei dati?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_ja.json b/lan/lan_ja.json new file mode 100644 index 00000000..be431bac --- /dev/null +++ b/lan/lan_ja.json @@ -0,0 +1,1122 @@ +{ + "星锁": "スターロック", + "锁通通": "ロックスルー", + "点击开锁,长按闭锁": "ロックを解除するためにタッチ、ロックするためにホールド", + "考勤": "出席", + "考勤设置": "出席設定", + "电子钥匙": "EKeys", + "添加卡": "カードを追加", + "卡号": "カード番号", + "添加指纹": "指紋を追加", + "指纹号": "指紋番号", + "遥控": "リモート", + "添加人脸": "顔を追加", + "门锁日志": "ドアロックログ", + "密码号": "パスワード番号", + "添加者": "オペレーター", + "添加时间": "時間", + "重置": "リセット", + "请输入手机号或者邮箱": "電話番号またはメール", + "工作时间": "働く時間", + "工作日设置": "Workdayセッティング", + "星期一": "月曜日", + "星期二": "火曜日", + "星期三": "水曜日", + "星期四": "木曜日", + "星期五": "金曜日", + "星期六": "土曜日", + "星期日": "日曜日", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "月", + "周二": "火曜日", + "周三": "水", + "周四": "木", + "周五": "金曜日", + "周六": "土", + "周日": "太陽", + "群发钥匙": "複数のekeysを送信する", + "锁": "ロック", + "请添加": "受信者", + "允许远程开锁": "リモートロック解除", + "请输入验证码": "検証コード", + "获取密码": "パスコードの生成", + "请给密码命名": "このパスコードの名前を入力してください", + "密码有限期为6个小时,只能使用一次": "このパスコードは、現在の時刻から6時間以内に使用するか、セキュリティ上の理由から一時的に使用する必要があります。このパスコードは1回のみ使用できます。", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "パスワードとして手動で6〜9桁を入力します。ロックの横にある電話Bluetoothで追加することも、ゲートウェイを介してリモートで追加することもできます", + "获取": "取得", + "添加": "追加", + "删除公司": "会社を削除", + "密码详情": "パスコード情報", + "修改密码": "パスコードの変更", + "添加虹膜": "アイリスを追加", + "添加门磁": "ドアセンサー", + "添加无线键盘": "ワイヤレスキーパッド", + "添加手掌": "手のひらを追加", + "请输入员工账号": "従業員のアカウントを入力", + "批量授权锁": "複数のロックの付与", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "許可された管理者は、このロックを操作するための過半数の権限を持ちます。", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "この機能を使用すると、ゲートウェイ経由でリモートでスマートロックを解除できます。この機能は、Bluetooth経由でのみオンまたはオフにできます。", + "排列方式": "リストタイプ", + "早到榜": "早期リスト", + "迟到榜": "後期リスト", + "当前模式": "現在のモード", + "勤奋榜": "働くハードリスト", + "延迟时间": "遅延時間", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "ロックは時間の後に自動的にロックされます。設定を利用できるようにするために、最初に1回ロックを解除してください。", + "时间": "時間", + "开始时间": "開始時間", + "结束时间": "終了時刻", + "工作时间设置": "作業時間の設定", + "常开模式": "通路モード", + "常开时间": "この期間に", + "常开日期": "これらの日に", + "添加员工": "スタッフを追加", + "节假日": "休日", + "打卡方式": "メソッド", + "员工是否有钥匙": "すでにekeyを持っています", + "上班时间": "開始時間", + "下班时间": "終了時間", + "本周": "今週", + "单休": "1日の週末", + "双休": "2日間の週末", + "单双休": "1日2日の週末", + "年": "年", + "月": "月", + "放假日期": "休日", + "补班日期": "就労日", + "添加假日": "休日を追加", + "开始日期": "開始日", + "必填": "必須", + "结束日期": "終了日", + "日榜": "毎日", + "月榜": "毎月", + "考勤记录": "レコード", + "假日信息": "ホリデー情報", + "基本信息": "基本", + "无线键盘": "ワイヤレスキーパッド", + "选择无线键盘": "キーパッドを追加", + "门磁": "ドアセンサー", + "自动闭锁": "自動ロック", + "锁声音": "ロックサウンド", + "防撬报警": "改ざんアラート", + "重置键": "リセットボタン", + "锁时间": "ロッククロック", + "诊断": "診断", + "上传数据": "データのアップロード", + "导入其他锁数据": "別のロックfrommeのインポート", + "锁升级": "ファームウェア更新", + "标记房态": "部屋のステータス", + "开锁提醒": "ロック解除通知", + "微信二维码": "QRコードのロック解除", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "電子キーを持っている人は、WeChatを介してこのQRコードをスキャンすることでドアを開けることができます。各ロックのQRコードは異なります。印刷して、対応するロックの横に貼り付けることができます", + "锁编号": "ロック番号", + "电量": "バッテリー", + "锁分组": "ロックグループ", + "选择分组": "グループを選択", + "创建新分组": "グループの作成", + "管理员开锁密码": "管理者のパスコード", + "更新": "更新", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "バッテリーレベルは、ゲートウェイまたは電話のBluetoothによって更新されます", + "当屏幕闪烁时,点击下一步": "キーパッドが点滅したら次をクリック", + "输入*529#或按设置键": "README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # と入力するか、 [設定] キーを押します", + "长按重置键2秒": "リセットボタンを2秒押して保持する", + "附近的设备": "近くの設備", + "暂无数据": "データなし", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "ゲートウェイと一緒にドアセンサーを使用してドアステータスを取得できます。ロックに関連付けることができるセンサーは1つだけです。", + "开始": "開始", + "全天": "すべての時間", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "通過モードには複数の期間を設定できます。設定した期間内で、ロック解除後もロックは開いた状態のままになります。", + "请选择锁音量": "ロックボリュームを選択してください", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "オンにすると、ロックからの音が聞こえます", + "低": "低い", + "较低": "中低", + "中": "中", + "较高": "ミディアムハイ", + "高": "高い", + "开启后,锁被撬动时,会发出报警声": "オンにすると、TAMPERアラートを有効にします。", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "オフにすると、リセットボタンが無効になります。", + "校准时间": "時間の調整", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "診断は、ロック内の構成情報を読み取り、スタッフが障害の原因を分析できるようにアップロードすることです。", + "上传": "アップロード", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "ロックからサーバーにデータをアップロードします。数分かかる場合があります", + "请选择要从哪把锁导入": "からインポートするロックを選択します。", + "有新版本": "新しいバージョンを持っている", + "当前版本": "現在のバージョン", + "升级": "更新", + "空闲": "空いている", + "已入住": "占有", + "多语言": "言語", + "添加锁": "ロックの追加", + "锁地址": "アドレスをロック", + "选择锁类型": "ロックタイプの選択", + "NFC无源锁": "NFCパッシブロック", + "添加设备": "デバイスの追加", + "网关": "ゲートウェイ", + "客服": "カスタマーサービス", + "设置": "設定", + "更多设置": "もっとセット", + "消息推送": "通知プッシュ", + "锁用户管理": "ユーザーのロック", + "拥有的钥匙": "このユーザーに関連付けられたeKeys", + "批量授权": "権限管理", + "关联设备": "関連デバイス", + "关联姓名": "関連付けられた名前", + "转移智能锁": "転送ロック", + "选择锁": "画面ロック", + "接收人信息": "受信者", + "转移网关": "転送ゲートウェイ", + "锁屏": "画面ロック", + "已关闭": "オフ", + "已开启": "オン", + "开启": "オンにする", + "确定要开启重置键?": "リセットボタンを引き続き有効にしますか?", + "确定要关闭重置键?": "リセットボタンを無効にし続けますか?", + "隐藏无效开锁权限": "無効なアクセスを隠す", + "APP开锁时需手机连网的锁": "オンラインで電話を必要とするロック", + "增值服务": "サービス", + "关于": "について", + "退出": "ログアウト", + "删除账号": "アカウントの削除", + "个人信息": "アカウント情報", + "头像": "アバター", + "昵称": "NickName", + "请输入昵称": "ニックネームを入力してください", + "修改昵称": "名前の変更", + "修改账号": "アカウントの編集", + "重置密码": "パスワードのリセット", + "安全问题": "セキュリティに関する質問", + "为了你的账号安全,修改账号前请先使用验证码验证": "アカウントのセキュリティのために、アカウントを変更する前にアカウントのパスワード確認を使用してください", + "请输入新账号": "新しいアカウントを入力してください", + "找回密码和登录新设备时,可通过绑定的手机验证": "バインディング電話番号は、検証コードを受信するために使用される。", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "バインディングメールは、検証コードを受信するために使用されます。", + "原密码": "現在のパスワード", + "新密码": "新しいパスワード", + "确认密码": "パスワードの確認", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "電話が紛失した場合は、セキュリティの質問に答えて新しい電話にログインできます。", + "问题一": "質問1", + "问题二": "質問2", + "问题三": "質問3", + "请输入你的答案": "あなたの答えを入力してください", + "即将到期": "すぐに期限切れ", + "去授权": "認証する", + "修改名称": "名前の編集", + "状态": "ステータス", + "WiFi名称": "Wifi名", + "网络MAC": "ネットワークMAC", + "网关升级": "ゲートウェイの更新", + "网关连接的锁": "このゲートウェイに接続されたロック", + "信号强": "強い", + "选择网关类型": "ゲートウェイタイプの選択", + "添加网关": "ゲートウェイの追加", + "重新通电": "力を接続して下さい", + "指示灯": "インジケータライト", + "选择网关": "ゲートウェイの選択", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5Gはサポートされていません。2.4GのWiFiを選択してください。", + "WiFi密码": "WiFiの通路", + "请输入WiFi密码": "WiFiパスワードを入力", + "网关名称": "ゲートウェイ名", + "请输入网关名称": "ゲートウェイ名の入力", + "IP地址": "IPアドレス", + "子网掩码": "サブネットマスク", + "默认网关": "デフォルトゲートウェイ", + "自动获取DNS服务器地址": "DNSサーバーアドレスを自動的に取得する", + "首选DNS": "優先DNS", + "备选DNS": "代替DNS", + "不使用静态IP": "静的IPは使用されません", + "使用静态IP": "静的IPの使用", + "请输入IP地址": "IPアドレスを入力", + "请输入子网掩码": "サブネットマスクの入力", + "请输入默认网关": "デフォルトゲートウェイの入力", + "所有锁": "すべてのロック", + "搜索所有类型的锁": "すべてのタイプのロックをスキャンする", + "门锁": "ドアロック", + "挂锁": "南京錠", + "保险箱锁": "安全なロック", + "智能门禁": "インテリジェントなアクセス制御", + "车位锁": "駐車ロック", + "摸亮触摸屏": "キーパッドを有効にするために任意のキーをタッチ", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "任意のキーをタッチしてロックを有効にし、ペアリングモードにしてください。次を押します", + "附近的锁": "近くのロック", + "如需修改名字请重新命名,点击确定添加锁": "名前を変更したい場合は、 [OK] をクリックしてロックを追加してください。", + "添加锁时,手机必须在锁旁边": "ロックを追加するとき、電話はロックの隣になければなりません", + "登录": "ログイン", + "注册": "登録", + "我已阅读并同意": "私は読んで同意しました", + "验证码": "コード", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "パスワードは8〜20文字で、最低2種類の数字、文字、記号が含まれている必要があります", + "手机": "電話", + "邮箱": "メール", + "请输入邮箱": "メールを入力", + "国家/地区": "国/地域", + "你所在的国家/地区": "あなたの国/地域", + "选择国家/地区": "国または地域を選択してください", + "获取验证码": "コードを取得", + "商务合作": "ビジネス", + "电脑网页版": "Webシステム", + "酒店系统": "ホテルシステム", + "说明书网页版": "ユーザーマニュアル", + "高级功能": "高度な関数", + "记录保存": "レコード保持", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMSを使用して、受信者にパスコードとekey情報を送信できます。", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "メールは、受信者にパスコードとekey情報を送信するために使用できます。", + "购买实名认证提示": "この機能を有効にしたら、指紋、顔、またはアカウントのパスワードを使用してAPPを開く必要があります。3分間再度確認する必要はありません", + "请选择你希望的实名认证频次": "希望する実名認証頻度を選択してください", + "仅首次": "初めて", + "每日一次": "1日1回", + "每周一次": "週に一度", + "每月一次": "毎月1回", + "当前状态": "現在のステータス", + "试用中": "トライアル中", + "高级功能权益内容": "高度な機能", + "短信模板": "SMSテンプレート", + "邮件模板": "メールテンプレート", + "发卡工具": "カードエンコーダ", + "购买高级功能须知": "通知", + "购买高级功能提示": "より高度な機能は開発中であり、それらが必要な場合は、ロックの数に基づいてサービスを開くことを歓迎します。高度な機能は、独自のロックでのみ使用できます。あなたが許可された管理者であるならば、サービスを開くためにロックのトップ管理者に連絡してください", + "免费体验": "無料トライアル", + "立即开通": "今すぐ開く", + "购买短信": "SMSを購入", + "购买邮件": "電子メールを購入", + "购买实名认证次数": "実名認証時間の購入", + "开通高级功能": "詳細機能の有効化", + "选择套餐": "パッケージを選ぶ", + "支付方式": "支払いモード", + "支付宝": "Alipay", + "去支付": "支払い", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "自分でメッセージを定義することができます。パスコードとekeyの情報を他の人に送信するために使用されます。", + "高级功能仅能用于你自己的锁": "高度な機能は、独自のロックのみを適用できます。", + "新建模板": "Creatテンプレート", + "类型": "タイプ", + "模版内容": "テンプレートの内容", + "预览": "プレビュー", + "房间名": "ルーム", + "预计产生短信条数": "推定メッセージセグメント", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "この機能を使用すると、パスコード、キー、カード、および指紋を一定期間無効に隠すことができます。", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "APPでこれらの選択したロックのロックを解除するには、ユーザーの電話がオンラインである必要があります。", + "配置WiFi": "WiFiの設定", + "请输入WiFi名字": "Wifi名を入力してください", + "WiFi配网": "WiFi配布ネットワーク", + "胁迫卡": "ストレスカード", + "员工是否有密码": "すでにパスコードがあります", + "员工是否有卡": "すでにカードを持っています", + "员工是否有指纹": "すでに指紋を設定しています", + "获取钥匙": "キーを取得", + "获取卡": "カードを入手", + "获取指纹": "指紋を取得する", + "安全验证": "ID検証", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "すべてのアカウント情報は完全にプラットフォームから削除され、回復できません。削除しますか?", + "监控": "モニター", + "视频日志": "ビデオログ", + "开门器": "ドアオープナー", + "面容开锁": "顔のロック解除", + "开门方向设置": "オープニング方向セット", + "电机功率设置": "MotorPowerの設定", + "开锁时是否需联网": "ロック解除時にインターネットが必要な場合", + "选择要加入分组的锁": "LockSを選択してこのグループに追加する", + "锁数量": "ロック数", + "小米IOT平台": "Xiaomi IOTプラットフォーム", + "面容开锁设置": "顔ロック解除セット", + "感应距离": "センシング距離", + "防误开": "間違った開きを防ぐ", + "防误开已关闭,关门后仍可使用面容开锁": "ドアを閉じた後も、顔のロック解除を使用できます。", + "添加和使用面容开锁时": "ロック解除時に顔を追加して使用する", + "添加和使用面容开锁时提示": "\n1、ドア操作の前に一人の人を保つようにしてください。\n2、ドアロックの前に約0.5〜0.8メートル、ドアロックに面して立ってください。\n3.あなたの顔を妨げないように保ち、あなたの顔の特徴を露出させてください。\n4.顔認識が異常な場合は、デジタルキーボードの任意のキーをタッチして手動で顔認識を再開できます。", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "ドアロックの実際の状況に従ってモーター力を注意深く選んで下さい:", + "小功率:": "Miniwatt:", + "耗电少": "より少ない消費電力", + "大功率": "ハイパワー:", + "大功率提示": "ロック解除時にロック舌を正常に引き込むことができない場合、または運転する必要がある場合", + "开门方向设置提示": "あなたの家のドアを開く方向を慎重に選択してください (間違った方向を選択すると、ドアを正しく開閉することができなくなります):", + "左开": "左に開く", + "右开": "右に開く", + "判断方法:": "判定方法:", + "判断方法内容": "男は家の外に立って玄関のドアに面していた。", + "录像时段": "ビデオスロット", + "密码": "パスコード", + "卡": "カード", + "指纹": "指紋", + "人脸": "顔", + "配件商城": "ロックモール", + "公司名称": "会社名", + "请输入公司名字": "会社名を入力", + "提示": "ヒント", + "是否删除?": "削除するかどうか?", + "员工信息": "スタッフ情報", + "员工": "スタッフ", + "打卡方式无效": "利用不可", + "中国": "中国", + "选择钥匙": "Ekeyを選ぶ", + "编辑": "編集", + "无": "いいえ", + "有": "はい", + "请输入姓名": "名前を入力してください", + "获取人脸": "顔をする", + "选择密码": "パスコードの選択", + "选择卡": "カードを選ぶ", + "选择指纹": "指紋を選択", + "选择人脸": "顔を選択", + "员工是否有人脸": "従業員に顔があるかどうか", + "同时删除员工钥匙": "彼/彼女のekeyを削除する", + "删除": "デレ", + "确定要删除员工吗?": "この従業員を削除する", + "月统计": "月次統計", + "迟到": "遅い", + "早退": "早めに出発", + "未打卡": "記録なし", + "钥匙将在": "このekeyは", + "天后失效": "日", + "电量更新时间:": "バッテリー更新时间:", + "新增配件": "追加", + "钥匙不可用": "キーは使用できません", + "正在开锁中...": "ロック解除...", + "你的钥匙": "あなたのキー", + "常开模式启动!长按闭锁": "オープンモード開始! ロックするロングプレス", + "演示模式": "デモモード", + "请先同意用户协议及隐私政策": "最初にユーザー同意とプライバシーポリシーに同意してください", + "用户协议": "ユーザー条件", + "隐私政策": "プライバシーポリシー", + "注册成功": "登録成功", + "你所在的": "あなたは", + "手机号": "電話番号", + "忘记密码": "パスワードを忘れた", + "重置成功": "リセット成功", + "确定要退出吗?": "出口?", + "功能暂未开放": "関数はまだ開いていません", + "设置成功": "正常にセットアップ", + "删除成功": "削除に成功", + "单次": "ワンタイム", + "永久": "永久", + "限时": "時限", + "自定义": "カスタム", + "清空码": "消去", + "循环": "再発", + "工作日": "ワークデー", + "每日": "毎日", + "周末": "週末", + "确定要删除吗?": "削除?", + "该锁的密码都将被删除": "このロックのすべてのパスコードは削除されます", + "已过期": "無効", + "该锁的电子钥匙都将被删除": "このロックのすべてのeKeysは削除されます", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "このekeyに関連付けられているすべてのekeysを削除します。このステップはUNONEにすることはできません!", + "删除钥匙会在用户APP连网后生效": "Ekeyは削除されます", + "有效时间": "有効時間", + "接收者": "受信者", + "仅管理自己创建的用户": "自分のユーザーのみを管理する", + "远程开锁": "リモートロック解除", + "请输入钥匙名称": "キー名を入力してください", + "修改成功": "成功の変更", + "冻结": "フリーズ", + "解除冻结": "解凍", + "授权": "権限付与", + "取消授权": "権限付与解除", + "同时解冻其发送的钥匙": "このユーザーが発行したすべてのekeysを解凍する", + "会在用户APP连网后生效": "このekeyは、ユーザーのAPPがネットワークに接続するときに使用されます", + "同时冻结其发送的钥匙": "このユーザーが発行したすべてのekeysをフリーズ", + "冻结会在用户APP连网后生效": "このekeyは、ユーザーのAPPがネットワークに接続すると凍結されます", + "取消授权会在用户APP连网后生效": "ユーザーのAPPがネットワークに接続すると、ユーザーは自分の権限を失います", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "許可されたユーザーは、LOCK Managerとほぼ同じ権限を持っています (例: キーとパスコードを送信する機能)", + "失效时间需晚于生效时间": "有効期限は有効時間より後でなければなりません", + "生效时间需晚于当前时间": "有効時間は現在の時間より後でなければなりません", + "失效日期需晚于生效日期": "有効期限は有効日より後でなければなりません", + "修改有效期": "変更期間", + "生效日期": "開始日", + "失效日期": "終了日", + "开锁": "ロック解除", + "开锁成功": "ロック解除の成功", + "请选择锁": "ロックを選択してください", + "请选择接收者": "受信機を選択してください", + "请选择有效期": "有効期間を選択してください", + "请选择发送方式": "送信方法を選択してください", + "请选择结束时间": "終了時間を選択してください", + "完成": "完了", + "有效日": "サイクルオン", + "发送成功": "成功を送る", + "请选择开始时间": "開始時間を選択してください", + "选择用户": "受信者の選択", + "已选中": "選択済み", + "确定": "わかった", + "请选择要发送的锁": "ロックを選択してください", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Face実名認証とは、電話APPのロックを解除する前にユーザーが顔を確認する必要があることを指し、検証のロックを解除できます。", + "分享": "シェア", + "请输入接收者账号": "受信者アカウントを入力してください", + "接收者号码未注册,请重新发送": "受信機番号が登録されていません。再送してください", + "是否发送电子钥匙给未注册账号": "新しいアカウントにekeyを送信しますか", + "取消": "キャンセル", + "标记成功": "マーク成功", + "微信好友": "WeChatフレンド", + "短信": "SMS", + "邮件": "メール", + "更多": "詳細", + "您好,您的电子钥匙生成成功": "こんにちは、あなたの電子キーは正常に生成されます", + "生效时间不能小于当前时间": "有効時間は現在の時間より短くすることはできません", + "结束时间不能小于当前时间": "終了時間は現在の時間より短くすることはできません", + "是否为管理员": "それは管理者ですか", + "已连接到锁,请将卡靠近门锁的读卡区": "Connected.カードリーダーに対してカードを置きます", + "尝试连接设备...": "ロックで接続します。しばらくお待ちください...", + "地理位置": "地理的位置", + "检查以确保以下地址是正确的": "次のアドレスが正しいことを確認してください", + "地图加载中,请稍候。。": "マップがロードされています、しばらくお待ちください...", + "跳过": "スキップ", + "还未获取到位置信息哦,请耐心等待一下!": "位置情報はまだ取得されていませんので、しばらくお待ちください!", + "请填写信息": "情報を入力してください", + "有效期": "有効期間", + "生效时间": "開始時間", + "失效时间": "終了時刻", + "上传成功": "アップロードに成功", + "未生效": "非アクティブ", + "已生效": "有効", + "指纹详情": "指紋情報", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "センサーに指を数回置く必要があります。プロンプトに従ってください...", + "开始添加": "開始", + "请将您的手指按下": "センサーに指を置く", + "根据提示,抬起手指后再进行下一次指纹采集": "プロンプトに従ってください... あなたは次の記録のためにセンサーに指を取り外して置く必要があります", + "添加成功": "成功を追加", + "更新成功": "更新の成功", + "搜索": "検索", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "リセット後、ロックのカードが削除されます。リセットしますか?", + "已失效": "無効", + "卡详情": "カード情報", + "请输入": "ここに入力してください", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "オフにすると、ロックは手動でロックされるまで一日中ロック解除されたままになります", + "请输入小于或等于60的数字": "60未満の数字を入力してください", + "操作成功": "操作成功", + "管理员密码相同,无需修改": "管理者パスワードは同じで、変更する必要はありません", + "请输入6-9位数字": "6-9桁の長さ", + "请输入6-9位管理员密码": "6〜9桁の管理者パスワードを入力してください", + "请输入新的管理员密码": "新しい管理者パスワードを入力してください", + "未分组": "グループ化されていない", + "请输入分组名称": "グループの作成", + "创建成功": "成功の作成", + "设置锁分组成功": "ロックグループを正常に設定する", + "电池1电量": "バッテリー1", + "电池2电量": "バッテリー2", + "电量更新时间": "バッテリー更新时间", + "锁电量更新成功": "ロックパワーアップデートの成功", + "您的钥匙未生效": "あなたのキーは効果的ではありません", + "您的钥匙已冻结": "あなたのキーは凍結されています", + "您的钥匙已过期": "キーの有効期限が切れました", + "常开模式开启": "ロックは通過モードにあります", + "超级管理员": "スーパー管理者", + "授权管理员": "許可された管理者", + "普通用户": "通常のユーザー", + "余": "バランス", + "天": "日", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "ロックを削除すると、すべての情報が一緒に削除されます。ロックを削除してもよろしいですか。", + "请输入登录密码": "アプリケーションのパスワードを入力してください", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "デバイスの削除に失敗しました。デバイスがデバイスの近くにあり、デバイスが接続されておらず、デバイスがオンになっていることを確認してください。", + "用户无权限": "ユーザーに権限がない", + "创建公司后,考勤功能才能使用": "最初に会社を作成してください", + "是否删除钥匙?": "このekeyを削除しますか?", + "邮箱绑定成功": "メールバインディングの成功", + "手机绑定成功": "携帯電話のバインディングの成功", + "网络访问失败,请检查网络是否正常": "リクエストが失敗しました。ネットワークが利用できません。デバイスを確認して3G/4G/WIFIに接続してください", + "清空": "クリア", + "是否清空?": "クリア?", + "消息详情": "メッセージ情報", + "创建时间": "作成時間", + "管理员详情": "管理者の詳細", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "誰かがあなたにドアを開けるように強制した場合、あなたはこのカードを使うことができます。アラームメッセージが管理者に送信されます。この機能を使用するには、ロックがオンラインであることを確認してください。", + "请不要将胁迫卡用于日常开锁": "強制カードを毎日使用しないでください。", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "誰かがあなたにドアを開けるように強制した場合、あなたはこの指紋を使うことができます。アラームメッセージが管理者に送信されます。この機能を使用するには、ロックがオンラインであることを確認してください。", + "请不要将胁迫指纹用于日常开锁": "毎日の使用に強制指紋を使用しないでください。", + "创建公司": "会社を作る", + "公司名称不能超过30个字符": "会社名は30文字を超えることはできません", + "公司名称不能小于6个字符": "会社名は6文字未満にすることはできません", + "WIFI列表": "WIFIリスト", + "刷新": "リフレッシュ", + "手动配网": "マニュアル配布ネットワーク", + "远距离": "長い距離", + "中距离": "中距離", + "近距离": "短い距離", + "锁时间更新成功": "ロックタイム更新成功", + "锁用户": "ユーザーのロック", + "请选择常开日期": "オープン日を選択してください", + "结束时间不能小于开始时间哦": "終了時間は開始時間より小さくすることはできません", + "介绍": "私たちの物語", + "个人信息收集清单": "個人情報収集リスト", + "应用权限说明": "アプリケーション権限の説明", + "第三方信息共享清单": "第三者情報共有リスト", + "请选择您的位置": "場所を選択してください", + "请先选择位置": "最初に場所を選択してください", + "管理员密码": "管理者のパスコード", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "変更が必要な場合は、新しい管理者パスワード (6桁) を入力してください。[OK] をクリックして変更してください。", + "修改": "変更", + "网络摄像头": "カメラ", + "重命名": "名前の変更", + "分组下的锁将被移到未分组里": "グループの下のロックはグループ化されていないに移動されます", + "编辑成功": "編集成功", + "厂商": "メーカー", + "型号": "モデル", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "パスワードが生成された後、同じ日の23:59までに有効化するために一度使用してください。そうしないと、0時以降は無効になります。パスワードを有効にすると、有効期間内に無制限に使用できます。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "パスワードが生成された後、同じ日の23:59までに使用してください。そうしないと、0時以降は無効になります。クリアコードは、今日0時より前に生成されたすべてのパスワードをクリアするために使用されます。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "パスワードが生成された後、同じ日の23:59までに使用してください。そうしないと、0時以降は無効になります。", + "清空密码底部提示": "パスワードは空の日の23:59まで有効です", + "相机": "カメラ", + "相册": "写真", + "读写": "ストレージ", + "定位": "位置", + "需要访问相机权限才能拍照上传文件例如头像上传": "写真の撮影やプロフィール写真のアップロードなどのファイルのアップロードには、カメラへのアクセスが必要です。", + "需要访问相机权限才能使用相册图片上传文件上传头像": "アルバム画像を使用してファイルとアバターをアップロードするには、カメラへのアクセスが必要です", + "需要访问读写权限才能使用本地图片上传头像": "ローカルイメージを使用してアバターをアップロードするには、読み取りおよび書き込み権限へのアクセスが必要です。", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "追加キー機能を使用するには、位置情報へのアクセスが必要です", + "申请": "アプリケーション", + "权限": "権限", + "不允许": "許可されていません", + "允许": "許可", + "权限被拒绝": "許可拒否", + "请手动在系统设置中开启": "システム設定で手動で有効にしてください", + "权限以继续使用应用": "アプリケーションの使用を継続する権限。", + "去设置": "それを設定してください", + "当前网络": "現在のネットワーク", + "位置信息": "位置情報", + "请输入wifi名称": "Wifi名を入力してください", + "虹膜": "アイリス", + "手掌": "手のひら", + "商城": "モール", + "我的": "私の", + "微信公众号推送": "Wechatパブリックアカウント", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Wechatを開いてアラームメッセージを受信するには、まずSkye Smart Lock wechat公開アカウントに注意を払う必要があります。QRコードを保存し、wechatを使用して設定をスキャンしてください。", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "追加キー機能の位置情報を使用するには、Bluetooth権限へのアクセスが必要です。", + "请输入Email": "メールを入力", + "请输入手机号": "電話番号を入力してください", + "家人到家": "家族が家に着いた", + "添加家人": "家族を追加", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "ロックがインターネットに接続されていない場合、パスコード、カード、指紋、およびその他のドアを開ける方法のリマインダーをタイムリーに送信することはできません。", + "消息提醒": "リマインダー", + "开门通知": "オープニング通知", + "N天未开门": "ドアを開けないN日", + "门未关好": "ドアが閉まっていない", + "防拆报警": "改ざんアラーム", + "低电量提醒": "低バッテリー", + "胁迫开门": "強制ドア開口部", + "有人按门铃": "誰かがドアベルを鳴らします", + "有人出现在门口": "誰かがドアに現れる", + "提醒方式": "リマインダー方法", + "开门方式": "ドアを開ける方法", + "请选择": "選択してください", + "家人": "家族", + "保存": "保存", + "APP推送": "APPプッシュ", + "管理员": "管理者", + "未启用": "有効化されていません", + "已启用": "有効化", + "省电模式": "パワーセービングモード", + "逗留抓拍模式": "キャプチャモードを維持", + "实时监控模式": "リアルタイム監視モード", + "自定义模式": "カスタムモード", + "猫眼设置": "猫目セッティング", + "猫眼工作模式": "猫目の働くモード", + "自动亮屏": "自動明るいスクリーン", + "亮屏持续时间": "時間通りのスクリーン", + "逗留警告": "滞在警告", + "异常警告": "異常な警告", + "短信提醒": "SMS", + "邮件提醒": "メール", + "N天未开门提醒": "ドアを開けないN日", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "誰かがあなたにロックを開くように強制した場合、あなたはこの指紋を使うことができます。アラームメッセージはadministorsに送信されます。この機能を使用するには、ロックがオンラインであることを確認してください。", + "胁迫指纹": "強制指紋", + "指纹列表": "指紋リスト", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "設定された時間の後、ロックが開かれていない場合、システムは指定された受信者にリマインダーメッセージを送信します。この機能では、ロックをインターネットに接続する必要があります。", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "リマインダーを有効にした後、ロックバッテリーが20% 、10% 、および5% を下回ると、システムは指定された受信者にリマインダーメッセージを送信します。", + "未开门时间": "ドアを開けない日", + "添加和使用面容开锁时:": "ロック解除時にFaceを追加して使用する:", + "关锁": "近いロック", + "功能": "関数", + "配件": "パーツ", + "云存": "クラウドストレージ", + "本地": "この地域", + "3天滚动储存": "3日ローリングストレージ", + "去升级": "今すぐアップグレード", + "下载列表": "ダウンロードリスト", + "已下载": "ダウンロード済み", + "全部视频": "すべてのビデオ", + "已为本设备免费提供3大滚动视频储存服务": "このデバイスには3つのスクロールビデオストレージサービスが無料で提供されています", + "视频播放": "ビデオ再生", + "全选": "すべて", + "请选择要删除的视频": "削除したいビデオを選択してください", + "请选择要下载的视频": "ダウンロードしたいビデオを選択してください", + "欢迎使用": "使用へようこそ", + "用户协议和隐私政策概要": "ユーザー合意とプライバシーポリシーの概要", + "协议概要": "プロトコルの概要", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "このアプリケーションを使用していただきありがとうございます。私たちはあなたの個人情報とプライバシー保護を非常に重要視しています。このプロダクトを使用する前に、それを注意深く読んで下さい", + "《用户协议》": "ユーザー条件", + "和": "と", + "《隐私政策》": "《プライバシーポリシー》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "のコンテンツ全体。「同意する」をクリックすると、すべての条件に同意します。同意しないことを選択した場合、当社の製品やサービスを使用することはできず、アプリケーションを終了します。", + "不同意": "同意しない", + "同意": "同意する", + "该功能是高级功能,请开通后再使用": "これは高度な機能です。まず有効にしてください。", + "常用程序": "共通プログラム", + "该锁已被重置": "ロックがリセットされました", + "需要访问读写权限才能使用手动升级固件": "ファームウェアを手動でアップグレードするには、読み取りおよび書き込み権限へのアクセスが必要です。", + "错误D固件,请选择正确的文件": "間違ったファームウェア、正しいファイルを選択してください", + "非SYD固件,请选择正确的文件": "非SYDファームウェア、正しいファイルを選択してください", + "文件校验失败 0x01": "ファイル検証が失敗した0x01", + "解析元数据失败,请选择正确的文件": "メタデータの解析に失敗しました。正しいファイルを選択してください", + "文件校验失败 0x02": "ファイル検証が失敗した0x02", + "文件校验失败 0x03": "ファイル検証が失敗した0x03", + "固件升级完成": "ファームウェアのアップグレード完了", + "记录": "レコード", + "开通高级功能后才可以对锁进行管理": "最初に高度な機能を有効にしてロックを管理してください。", + "去开通": "有効化", + "实名认证": "実名認証", + "当前剩余数量": "残り", + "购买": "購入", + "实名认证为付费功能,请购买后再使用": "実名認証は有料機能です。購入後にご利用ください", + "密码不一致哦": "パスワードが一致しない", + "退出添加": "追加を終了", + "管理员已满": "フル管理", + "用户已满": "ユーザーはいっぱいです", + "锁上面添加指纹已满": "ロックで指紋を追加することがいっぱいです", + "指纹已存在": "指紋は既に存在します。", + "锁上面添加人脸已满": "顔を追加の上のロックがいっぱいです", + "人脸已存在": "顔はすでに存在します", + "锁上面添加卡已满": "カードを追加する上のロックがいっぱいです", + "卡已存在": "カードは既に存在します", + "锁上面添加密码已满": "パスワードを追加する上のロックがいっぱいです", + "密码已存在": "同一のパスコードは既に存在します。別のパスコードを選択してください", + "请输入密码": "パスワードを入力してください", + "暂无密码,无需重置": "パスワードなし、リセットする必要はありません", + "真实姓名": "本名", + "身份证号": "ID番号", + "请输入真实姓名": "本名を入力してください", + "请输入身份证号": "ID番号を入力してください", + "请输入身份证号和真实姓名": "ID番号と本名を入力してください", + "点击返回设备配对": "タップ戻るデバイスペアリング", + "无法连接?尝试升级": "接続できませんか?アップグレードを試みました", + "固件升级提示": "ファームウェアのアップグレードプロンプト", + "请先获取固件文件到手机本地,再选择升级": "まずローカル電話にファームウェアファイルを取得し、 [アップグレード] を選択してください", + "固件升级中": "ファームウェアがアップグレード中", + "取消升级": "アップグレードをキャンセル", + "固件传输中": "輸送中のファームウェア", + "关闭": "オフにする", + "传输中'": "輸送中", + "操作记录": "レコード", + "修改姓名": "名前の編集", + "传输中": "輸送中", + "发送人": "発行者", + "发送时间": "発行された時間", + "钥匙详情": "Ekey情報", + "姓名": "名前", + "发送": "送信", + "请确认姓名全名和身份证号码是否正确": "フルネームとID番号が正しいことを確認してください", + "传输期间请勿离开当前页面": "転送中に現在のページを離れないでください", + "机型": "モデル", + "硬件版本": "ハードウェアバージョン", + "固件版本": "ファームウェアのバージョン", + "手动升级": "手動アップグレード", + "设备连接中...": "デバイス接続中...", + "未避免异常情况,请在门打开时升级": "避けられない例外、ドアが開いているときにアップグレードしてください", + "钥匙无效": "キーが無効です", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "ロックに接続できません。携帯電話のBlutoothを再起動して、もう一度お試しください。", + "如果是全自动锁,请使屏幕变亮": "完全自動ロックの場合は、画面を明るくしてください", + "正在尝试闭锁……": "ロックしようとしています。お待ちください...", + "清空记录": "レコードをクリア", + "是否要删除操作记录?": "レコードを削除し続けますか?", + "被删除的记录不能恢复": "レコードは削除後に復元できません。", + "全部事件": "すべてのイベント", + "开锁事件": "イベントのロック解除", + "异常事件": "異常なイベント", + "门铃事件": "ドアベルイベント", + "视频事件": "ビデオイベント", + "请开启蓝牙": "Bluetoothをオンにしてください", + "请选择有效日": "有効日を選択してください", + "公司名字长度不能小于 6 ": "会社名の長さは6未満にすることはできません", + "已是最新版本": "更新なし", + "新建短信模版": "Creat SMSテンプレート", + "新建邮件模版": "Creatメールテンプレート", + "自定义短信模版": "SMSテンプレート", + "自定义邮件模版": "メールテンプレート", + "名称": "名前", + "星星锁": "スターロック", + "无考勤记录": "記録なし", + "大家干劲十足": "誰もが時間内に来る", + "工作时长未出炉": "労働時間なし", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "国/地域の選択はデータセキュリティに影響します。現在アルバニアを選択しています。続行する前に確認してください。", + "确认国家或地区": "国/地域の確認", + "我知道了": "それを得た", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "重要な更新を受け取るには、「OK」をクリックして、設定で通知を有効にしてください。", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "オンにした後、ロックの設定キーを長押しして電源を入れ、APPで再追加することができます", + "已有": "現在", + "新增": "新しい", + "账号格式错误": "悪いフォーマット", + "接收者信息为空": "受信者情報は空です", + "请输入时间(秒)": "時間 (秒) を入力してください", + "加载数据失败": "データのロードに失敗しました", + "重试": "もう一度お試しください", + "升级中,是否退出": "アップグレード中に、終了するかどうか", + "下一步": "次へ", + "公寓": "アパート", + "个人用户": "個人", + "星寓": "星のアパート", + "账号": "アカウント", + "请输入手机号或email": "電話番号またはメール", + "请输入星寓管理员的账号": "スターアパート管理者のアカウントを入力してください", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "選択されたロックのすべてのデータは、受信者に永久に転送されます。", + "暂不支持跨平台转移,敬请期待": "クロスプラットフォーム転送は当面サポートされていません。楽しみにしてください", + "移除坏锁": "故障した/破損したロックをゴミ箱に移動する", + "转移确认": "転送の確認", + "本次共转移": "今回は合計", + "把智能锁": "スマートロック", + "确认": "わかった", + "移除成功": "正常に削除", + "转移成功": "転送成功", + "该已锁被删除": "ロックが削除されました", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "許可された管理者は、自分でパスコード、ekey、etccreatedのみを管理できます。", + "添加授权管理员": "管理者の作成", + "导出记录": "レコードのエクスポート", + "选择时间段": "期間の選択", + "导出": "エクスポート", + "批量导出": "一括エクスポート", + "读取记录": "レコードの更新", + "设备": "デバイス", + "消息": "メッセージ", + "智能分析": "インテリジェント分析", + "精准识别设备事件,过滤无效信息": "デバイスイベントを正確に特定し、無効な情報を除外します", + "系统设置": "システム設定", + "系统的全局配置在此项内进行设置": "システムのグローバル构成はこの项目で设定されています", + "导出操作记录": "レコードのエクスポート", + "立即查看": "表示", + "导出成功": "エクスポートに成功", + "发送钥匙": "Ekeyを送る", + "进度": "レート", + "失败": "失敗しました", + "人脸详情": "顔の詳細", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "誰かがドアの前で約1.5メートルを感知すると、顔認識のロック解除が自動的に開始されます。", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "誰かがドアの前で約0.8メートルを感知すると、顔認識のロック解除が自動的に開始されます。", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "誰かがドアの前で約0.5メートルを感知すると、顔認識のロック解除が自動的に開始されます。", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "センシング距離がオフになっているため、キーボード上の任意のキーを手動でタッチして、顔認識のロック解除を実行する必要があります。", + "防误开已打开,开锁后": "アンチミスオープニングがオンになり、ロック解除後", + "秒内不可使用面容开锁": "顔のロック解除は数秒以内に使用できません", + "掌静脉": "手のひら静脈", + "添加掌静脉": "手のひら静脈を追加する", + "胁迫掌静脉": "強制手のひら静脈", + "请不要将胁迫掌静脉用于日常开锁": "毎日のロック解除には強制的な手のひら静脈を使用しないでください", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "ロックに接続されて、自然に手のひらを開いてください、手のひらはカメラに面しています", + "掌静脉详情": "手のひら静脈の詳細", + "掌静脉号": "手のひら静脈番号", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetoothがオンになっていない、設定でBluetoothをオンにしてください", + "删除用户时,会将用户拥有的钥匙一起删除。": "ユーザーがDELETEDされている場合、ユーザーに関連付けられているすべてのekeysもDELETEDされます。", + "配置网络": "ネットワークの設定", + "你好": "こんにちは", + "成功": "成功", + "类型选择": "タイプ選択", + "请选择要使用哪种类型": "使用するタイプを選択してください", + "系统邮件(推荐)": "システムメール (推奨)", + "系统短信(推荐)": "システムSMS (推奨)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "メールはこのアプリから送信されます。まずメールパッケージを購入してください。", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMSはこのアプリから送信されます。まずメールパッケージを購入してください。", + "个人邮件": "個人用メール", + "个人短信": "個人的なSMS", + "邮件将从你的个人邮箱发给用户": "メールは個人のメールアカウントから送信されます。", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMSメッセージはあなたの個人の電話番号から送信されます。あなたはあなたの電気通信事業者に支払います。", + "为了更好地应用体验,请确定权限": "アプリケーションのエクスペリエンスを向上させるには、権限を確認してください", + "您第一次拒绝权限,请确定权限": "初めて許可を拒否しました。許可を確認してください", + "您第二次拒绝权限,请去应用设置开启权限": "2回目の許可を拒否しました。許可を有効にするには、アプリケーションの設定にアクセスしてください", + "去应用市场": "アプリストアに行く", + "温馨提示": "暖かいプロンプト", + "关闭应用": "アプリケーションを閉じる", + "开启微信接收报警消息需要先关注": "WeChatを開いてアラームメッセージを受信するには、フォローする必要があります", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChatパブリックアカウント、QRコードを保存し、WeChatを使用して設定をスキャンします", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "実名認証は有料機能です。ロック管理者に連絡して購入して使用してください", + "位置权限": "ロケーション許可", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "あなたのlocatia.Itを使用するようにアプリを付与してくださいBLEロックとゲートウェイをスキャンするために使用されます。", + "相机/相册权限": "カメラ/アルバムの許可", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "ストレージから写真やファイルを読み書きするためにアプリを付与してください。", + "点击选择": "クリックして選択", + "微信": "WeChat", + "朋友圈": "モーメント", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "フェイスブック", + "链接": "リンク", + "今天": "今日", + "密码错误": "無効なパスワード", + "网络中断": "ネットワーク中断", + "钥匙不存在": "キーが存在しない", + "钥匙过期": "キーの有効期限が切れた", + "钥匙已存在": "キーは既に存在します", + "密码失效": "パスワード無効", + "门锁时间异常": "ドアロック時間異常", + "APP(手机)未联网": "APP (携帯電話) がインターネットに接続されていない", + "数据不存在": "データが存在しない", + "待接收": "受信済み", + "已冻结": "冷凍", + "已删除": "削除済み", + "未知": "不明", + "拖动下方滑块完成拼图": "スライダーを正しい位置にドラッグします", + "验证成功": "検証の成功", + "验证失败": "検証に失敗しました", + "向右拖动滑块填充拼图": "スライダーを右にドラッグしてパズルを埋める", + "请先获取到位置信息哦": "最初に位置情報を入手してください", + "请选择国家": "国を選択してください", + "获取锁信息": "ロック情報を取得する", + "锁数据异常,请重试": "データのロックが異常です。もう一度お試しください", + "连接设备中...": "接続デバイス...", + "把锁": "ロック", + "条": "ストリップ", + "封": "シール", + "次": "回数", + "支付成功": "支払い成功", + "查看详情": "詳細の表示", + "请输入模板名称": "テンプレート名を入力してください", + "模版类型": "タイプ", + "再返回一次退出": "もう一度終了", + "请先添加锁": "最初にロックを追加してください", + "可视对讲": "ビジュアルインターホン", + "详细日志": "詳細ログ", + "已复制到剪切板": "コピー", + "拍照": "写真", + "从相册选择": "アルバムから選ぶ", + "选择问题": "質問を選択してください", + "确认长度不足8位": "8桁未満の長さを確認する", + "新密码长度不足8位": "新しいパスワードの長さが8桁未満", + "两次密码不一致": "パスワードの不一致。もう一度お試しください", + "请点击获取验证码,验证码将发送到": "確認コードを入手してください。コードはに送信されます", + "切换": "スイッチ", + "验证": "確認", + "验证成功,账号已删除": "確認に成功、アカウントを削除", + "该密码不是自定义密码,无法修改": "このパスワードはカスタムパスワードではなく、変更できません", + "请选择设备要关联哪些姓名": "デバイスを関連付ける名前を選択してください", + "请选择姓名要关联哪些设备": "名前を関連付けるデバイスを選択してください", + "确定要移除所选中的坏锁吗?": "故障したロックを外しますか?", + "邮件通知": "メールで通知", + "短信通知": "SMS経由で通知", + "您好,您的授权管理员生成成功": "こんにちは、あなたの許可された管理者は正常に生成されました", + "请输入接收者姓名": "ここに入力してください", + "版本更新": "バージョン更新", + "下次再说": "次回は", + "配网成功": "ネットワーク配信の成功", + "配网失败": "ネットワーク配信に失敗しました", + "该锁的无线键盘都将被删除": "このロックのすべてのワイヤレスキーパッドは削除されます", + "实时画面": "リアルタイム画像", + "适合门口较为安全的环境。": "ドアの比較的安全な環境に適しています。", + "仅发生特定事件才录像,并可查看实时画面。": "特定のイベントのみが記録され、リアルタイム画像を表示できます。", + "一般情况下,满电可使用7-8个月": "通常の状況では、完全に充電されたときに7〜8ヶ月使用できます", + "有人逗留或发生特定事件才录像,可随时查看": "誰かが滞在または特定のイベントを記録し、いつでも見ることができます", + "实时画面。": "リアルタイム画像。", + "一般情况下,满电可使用5~6个月。": "通常の状況下では、完全に充電されたときに5〜6ヶ月間使用することができます。", + "适合门口人员复杂、较不安全的环境。": "ドアの複雑で比較的危険な環境に適しています。", + "有人出现就录像,可随时查看实时画面。": "誰かが現れたときに記録し、いつでもリアルタイムの画像を表示します。", + "一般情况下,满电可使用2~4个月。": "通常の状況下では、完全に充電されたときに2〜4ヶ月使用することができます。", + "根据您家门口实际情况设置录像和实时画面功能。": "ドアの実際の状況に応じて、ビデオとリアルタイムの画像機能を設定します。", + "可使用时长由具体设置决定。": "使用期間は、特定の設定によって決まります。", + "查看": "表示", + "有人按门铃或发生": "誰かがドアベルを鳴らしたり、", + "异常事件时": "異常なイベント", + "不录像": "Noビデオ", + "有人出现、按门铃": "誰かが現れ、ドアベルを鳴らします", + "或发生异常事件时": "または異常なイベントが発生した", + "逗留达到10秒": "10秒間滞在", + "约1.5米": "約1.5メートル", + "随时": "いつでも", + "立即录像": "すぐに記録する", + "录像时机": "ビデオタイミング", + "有人出现时录像": "誰かが現れたときの記録", + "人体侦测距离": "人間の検出距離", + "查看实时画面": "リアルタイム画像を表示", + "自定义时间": "カスタム時間", + "当日": "今日", + "次日": "次の日", + "自定义时段": "カスタム期間", + "发生事件时查看": "イベントが発生したときの表示", + "实时查看": "リアルタイムビュー", + "有人在门口出现10秒后开始录像。": "録音する前に誰かが10秒間ドアに現れます。", + "有人按门铃时立即录像。": "誰かがドアベルを鳴らしたらすぐに記録します。", + "有人出现在门前1.5米范围时启动录像": "誰かがドアの前の1.5メートル以内に現れたら録音を開始します", + "约0.8米": "0.8メートルについて", + "约3.0米": "3.0メートルについて", + "添加指纹失败": "操作に失敗しました。", + "项": "アイテム", + "播放中": "再生中", + "下载": "ダウンロード", + "暂无下载内容": "ダウンロードコンテンツなし", + "亮度": "明るさ", + "音量": "ボリューム", + "快进至": "早送り", + "快退至": "に巻き戻す", + "暂无视频信息": "ビデオ情報なし", + "加载出错": "読み込みエラー", + "请单人正对门锁,距离一个成年人手臂长度": "ドアロックの前に一人で、腕の長さで立ってください", + "(约0.6米)。": "(約0.6メートル)。", + "保持脸部无遮挡,露出五官。": "顔を遮らないようにし、顔の特徴を示します。", + "准备好了,开始添加": "準備完了、追加を開始", + "正在录入中...": "録音中...", + "添加人脸失败": "顔の追加に失敗しました", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "リセット後、ロックの面は削除されます。リセットしてもよろしいですか。", + "人脸号": "フェイスナンバー", + "虹膜详情": "アイリスの詳細", + "虹膜号": "アイリス番号", + "选择设备类型": "デバイスタイプの選択", + "照明灯具": "照明器具", + "电动窗帘": "电気カーテン", + "门窗传感器": "ドアと窓のセンサー", + "传感器": "センサー", + "清除数据成功": "データが正常にクリアされました", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "ロックはインターネットに接続されていないため、パスコード、カード、指紋、その他のドアを開ける方法の再コードをリアルタイムでアップロードすることはできません。", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "履歴記録を保持する必要がある場合は、それらをエクスポートできます。", + "看不到操作记录,可能原因有": "操作記録が見えない、考えられる理由", + "操作记录详情": "操作レコードの詳細", + "操作时间": "操作時間", + "此模块功能需要锁联网后设置方可生效": "このモジュール機能は、ロックを有効にするためにインターネットに接続した後に設定する必要があります", + "用户已存在": "ユーザーは既に存在します", + "钥匙数量已到上限": "キーの数が上限に達しました", + "附近没有可用网关": "近くに利用可能なゲートウェイはありません", + "正在创建安全连接...": "安全な接続を作成しています...", + "监视状态下不能发送录音": "モニタリングモードで記録を送信できません", + "挂断": "ハングアップ", + "监视中暂不能开锁": "モニタリング中はロック解除できません", + "长按说话": "話すために押して保持する", + "松开发送": "リリースして送信", + "请输入6位数字开锁密码": "6桁のロック解除パスワードを入力してください", + "请输入开锁密码": "ロック解除パスワードを入力してください", + "接收者在有效期内可以不限次数使用": "受信者は、有効期間内に無制限にekeysを使用することができます。", + "接收者可以使用此App开关锁": "受信者は、このアプリでロック/ロック解除することができます。", + "单次钥匙有效期为1小时,只能使用一次": "One-time ekeyは1時間有効で、1回のみ使用できます。", + "接收者可以在有效期内的固定时间段里,不限次数使用": "受信者は、固定サイクル時間内に無制限にekeysを使用することができます。", + "获取模板失败": "テンプレートの取得に失敗しました", + "微信通知": "WeChat通知", + "系统短信": "システムSMS", + "系统邮件": "システムメール", + "模板": "テンプレート", + "新建模版": "テンプレートの作成", + "您好,您的密码是": "こんにちは、あなたのパスワードは", + "密码名字": "パスワード名", + "请输入6-9位密码": "6〜9桁のパスワードを入力してください", + "设置密码": "パスワードの設定", + "操作成功,密码为": "成功しました。パスコードは", + "类型:自定义-永久": "タイプ: カスタム永久", + "实时播放": "リアルタイム再生", + "点击对讲": "クリックしてインターホン", + "长按开锁": "ロングプレスでロックを解除", + "接听失败": "回答に失敗しました", + "请在锁设置中开启远程开锁": "ロック設定でリモートロック解除を有効にしてください", + "接听": "回答", + "截图已保存到相册": "アルバムに保存されたスクリーンショット", + "添加遥控": "リモコンを追加", + "已连接到锁,请按遥控": "ロックに接続されて、リモコンを押してください", + "遥控号": "リモコン番号", + "遥控详情": "リモコンの詳細", + "照明": "照明", + "退出演示模式": "デモモードを終了", + "提示:当前界面为展示界面,添加设备后才能继续使用": "ヒント: 現在のインターフェイスは表示インターフェイスです。デバイスを追加した後、引き続き使用できます", + "门已上锁": "ドアがロックされている", + "您的账号在异地登录,如非本人,请尽快修改密码": "アカウントを使用して新しいデバイスからログインしました", + "开门成功": "ドアを正常に開く", + "开门失败": "ドアを開けなかった", + "呼叫提醒": "リマインダーを呼び出す", + "收到来自": "受信元", + "锁的呼叫": "ロックコール", + "加载数据中": "データの読み込み", + "搜索所有锁类型": "すべてのロックタイプを検索", + "锁电量更新时间": "バッテリーの更新時間をロックする", + "1月": "1月", + "2月": "2月", + "3月": "3月", + "4月": "4月", + "5月": "5月", + "6月": "6月", + "7月": "7月", + "8月": "8月", + "9月": "9月", + "10月": "10月", + "11月": "11月", + "12月": "12月", + "热门城市": "人気都市", + "导出锁数据": "ロックデータのエクスポート", + "一键开锁": "ワンクリックロック解除", + "已开通": "オープン", + "编辑员工": "スタッフの編集", + "一": "1つ", + "二": "2つ", + "三": "3つ", + "四": "4つ", + "五": "5", + "六": "6つ", + "日": "太陽", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。", + "在线": "オンライン", + "离线": "オフライン", + "购买记录": "購入記録", + "使用记录": "ユーザーレコード", + "失效时间要大于当前时间": "有効期限は現在の時間より長くなければなりません", + "修改名字": "名前を編集", + "时": "時間", + "分": "分", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexaを使用して、ロックステータスのロックを解除、ロック、および確認できます。", + "支持的国家": "支えられた国", + "支持的国家值": "米国、カナダ、イギリス、オーストラリア、インド、ドイツ、フランス、イタリア、スペイン、日本", + "操作流程": "操作プロセス", + "操作流程值": "1スマートロックアプリでロックとゲートウェイを追加する\n\n2 APPでロックのリモートロック解除機能を有効にします (この機能はデフォルトでオフになっています)。このオプションがない場合、ロックはAlexaをサポートしていません\n\n3 Alexaにスキルを追加し、Smart lock APPのアカウントとパスワードでそれらを承認します。承認が成功すると、アカウントの下にあるデバイスを検出できます。\n\n4 Alexaアプリでロックを見つけ、音声ロック解除機能をオンにして、言語パスワードを設定します\n\n5ロックはAlexaを通して操作することができます", + "Google Home": "Googleホーム", + "Action name": "アクション名", + "ScienerSmart": "ScienerSmart", + "支持的语言": "サポートされている言語", + "英语": "英語", + "Google Home操作流程的值": "1.スマートロックアプリを使用してロックとゲートウェイを追加する\n\n2.APPでロックのリモートロック解除機能を有効にします (この機能はデフォルトでオフになっています)。このオプションがないと、ロックはGoogle Homeをサポートしません\n\n3.Google Home APPをインストールし、左上隅の「」ボタンをクリックします\n\n4.設定ページで、「Googleで作業する」を選択します\n\n5.「ScienerSmart」を検索し、スマートロックAPPアカウントとパスワードを使用して承認する", + "密码需至少包含数字/字母/字符中的2种组合": "パスワードには、数字、文字、特殊文字のうち少なくとも2つを含める必要があります。", + "已开锁": "ロック解除", + "已闭锁": "ロック済み", + "两次密码不一致哦": "パスワードが一致しない", + "中功率": "ミディアムパワー", + "常规使用": "通常の使用", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "ゲートウェイの電源がオンになった後、リセットボタンを5秒間押し続け、インジケーターライトが交互に点滅したら [次へ] をクリックします。", + "扫描设备": "スキャン装置", + "删除失败,网关可能已经离线,是否强制删除该数据?": "削除に失敗しました。ゲートウェイがオフラインになった可能性があります。強制的にデータを削除しますか?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 84f4279f..a26d6864 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1,22 +1,22 @@ { - "星锁":"星锁", - "锁通通":"锁通通", - "点击开锁,长按闭锁":"点击开锁,长按闭锁", - "考勤":"考勤", + "星锁": "星锁", + "锁通通": "锁通通", + "点击开锁,长按闭锁": "点击开锁,长按闭锁", + "考勤": "考勤", "考勤设置": "考勤设置", - "电子钥匙":"电子钥匙", + "电子钥匙": "电子钥匙", "添加卡": "添加卡", "卡号": "卡号", "添加指纹": "添加指纹", "指纹号": "指纹号", "遥控": "遥控", "添加人脸": "添加人脸", - "门锁日志":"门锁日志", + "门锁日志": "门锁日志", "密码号": "密码号", - "添加者":"添加者", - "添加时间":"添加时间", - "重置":"重置", - "请输入手机号或者邮箱":"请输入手机号或者邮箱", + "添加者": "添加者", + "添加时间": "添加时间", + "重置": "重置", + "请输入手机号或者邮箱": "请输入手机号或者邮箱", "工作时间": "工作时间", "工作日设置": "工作日设置", "星期一": "星期一", @@ -26,7 +26,6 @@ "星期五": "星期五", "星期六": "星期六", "星期日": "星期日", - "简写周一": "简写周一", "简写周二": "简写周二", "简写周三": "简写周三", @@ -34,7 +33,6 @@ "简写周五": "简写周五", "简写周六": "简写周六", "简写周日": "简写周日", - "周一": "周一", "周二": "周二", "周三": "周三", @@ -42,18 +40,17 @@ "周五": "周五", "周六": "周六", "周日": "周日", - - "群发钥匙":"群发钥匙", + "群发钥匙": "群发钥匙", "锁": "锁", - "请添加":"请添加", - "允许远程开锁":"允许远程开锁", + "请添加": "请添加", + "允许远程开锁": "允许远程开锁", "请输入验证码": "请输入验证码", "获取密码": "获取密码", - "请给密码命名":"请给密码命名", - "密码有限期为6个小时,只能使用一次":"密码有限期为6个小时,只能使用一次", - "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加":"手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加", + "请给密码命名": "请给密码命名", + "密码有限期为6个小时,只能使用一次": "密码有限期为6个小时,只能使用一次", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加", "获取": "获取", - "添加":"添加", + "添加": "添加", "删除公司": "删除公司", "密码详情": "密码详情", "修改密码": "修改密码", @@ -61,444 +58,328 @@ "添加门磁": "添加门磁", "添加无线键盘": "添加无线键盘", "添加手掌": "添加手掌", - - "accountNumber":"accountNumber", - "volumeAuthorizationLock":"volumeAuthorizationLock", - "authorizedAdminTip":"authorizedAdminTip", - "lockOperatingRecordTip":"lockOperatingRecordTip", - "rankingList":"rankingList", - "earlyArrivalList":"earlyArrivalList", - "lateList":"lateList", - "hardWorkingList":"hardWorkingList", - "company":"company", - "staff":"staff", - "work":"work", - "workday":"workday", - "holidays":"holidays", - "punchingMode":"punchingMode", - "whetherTheEmployeeHasAKey":"whetherTheEmployeeHasAKey", - "selectKey":"selectKey", - "officeHours":"officeHours", - "closingTime":"closingTime", - "thisWeek":"thisWeek", - "singleDayWeekend":"singleDayWeekend", - "twoDaysOff":"twoDaysOff", - "oddOrEvenDaysOff":"oddOrEvenDaysOff", - "year":"year", - "month":"month", - "libertyDay":"libertyDay", - "coverDate":"coverDate", - "addedHoliday":"addedHoliday", - "startDate":"startDate", - "accessDate":"accessDate", - "mustFillIn":"mustFillIn", - "endDate":"endDate", - "dailyCharts":"dailyCharts", - "monthlyLeaderboard":"monthlyLeaderboard", - "noAttendanceRecord":"noAttendanceRecord", - "attendanceRecord":"attendanceRecord", - "everyoneIsVeryMotivated":"everyoneIsVeryMotivated", - "workingHoursWereNotReleased":"workingHoursWereNotReleased", - "beLate":"beLate", - "leaveEarly":"leaveEarly", - "noCardPunched":"noCardPunched", - "holidayInfo":"holidayInfo", - - "basicInformation":"basicInformation", - "wirelessKeyboard":"wirelessKeyboard", - "doorMagnetic":"doorMagnetic", - "remoteUnlocking":"remoteUnlocking", - "automaticBlocking":"automaticBlocking", - "normallyOpenMode":"normallyOpenMode", - "automaticUnLock":"automaticUnLock", - "automaticUnLockTip":"automaticUnLockTip", - "lockSound":"lockSound", - "burglarAlarm":"burglarAlarm", - "resetButton":"resetButton", - "lockTime":"lockTime", - "diagnose":"diagnose", - "uploadData":"uploadData", - "importOtherLockData":"importOtherLockData", - "lockEscalation":"lockEscalation", - "markedHouseState":"markedHouseState", - "unlockReminder":"unlockReminder", - "unlockQRCode":"unlockQRCode", - "lockNumber":"lockNumber", - "electricQuantity":"electricQuantity", - "lockName":"lockName", - "lockGrouping":"lockGrouping", - "selectGroup":"selectGroup", - "createNewGroup":"createNewGroup", - "adminOpenLockPassword":"adminOpenLockPassword", - "update":"update", - "updateElectricQuantityTip":"updateElectricQuantityTip", - "adminOpenLockPasswordTip":"adminOpenLockPasswordTip", - "updateLockAdminPassword":"updateLockAdminPassword", - "whenScreenFlashesClickNext":"whenScreenFlashesClickNext", - "theScreenNeverFlickered":"theScreenNeverFlickered", - "enterNumberOrPressSet":"enterNumberOrPressSet", - "theLocationOfTheSetKeyWillBeDifferent":"theLocationOfTheSetKeyWillBeDifferent", - "pressAndHoldTheResetButtonTwoSeconds":"pressAndHoldTheResetButtonTwoSeconds", - "nearbyEquipment":"nearbyEquipment", - "noData":"noData", - "doorMagneticListTopTip":"doorMagneticListTopTip", - "remoteUnlockingPageTip":"remoteUnlockingPageTip", - "currentMode":"currentMode", - "delayTime":"delayTime", - "automaticBlockingTip":"automaticBlockingTip", - "time":"time", - "normallyOpen":"normallyOpen", - "date":"date", - "begin":"begin", - "end":"end", - "allDay":"allDay", - "save":"save", - "normallyOpenModeTip":"normallyOpenModeTip", - "pleaseSelectLockVolume":"pleaseSelectLockVolume", - "lockSoundTip":"lockSoundTip", - "low":"low", - "lower":"lower", - "medium":"medium", - "high":"high", - "higher":"higher", - "burglarAlarmTip":"burglarAlarmTip", - "resetButtonTip1":"resetButtonTip1", - "resetButtonTip2":"resetButtonTip2", - "calibrationTime":"calibrationTime", - "setTheDSTMode":"setTheDSTMode", - "diagnoseTip":"diagnoseTip", - "uploading":"uploading", - "uploadDataTip":"uploadDataTip", - "importOtherLockDataTip":"importOtherLockDataTip", - "haveNewVersion":"haveNewVersion", - "currentVersion":"currentVersion", - "newVersion":"newVersion", - "upgrade":"upgrade", - "leisure":"leisure", - "checkedIn":"checkedIn", - - "lanEnglish":"lanEnglish", - "lanChinese":"lanChinese", - "multilingual":"multilingual", - "addLock":"addLock", - "lockAddress":"lockAddress", - "selectLockType":"selectLockType", - "videoIntercomDoorLock":"videoIntercomDoorLock", - "NFCPassiveLock":"NFCPassiveLock", - "addDevice":"addDevice", - "gateway":"gateway", - "message":"message", - "supportStaff":"supportStaff", - "set":"set", - "moreServices":"moreServices", - - "moreSet":"moreSet", - "prompTone":"prompTone", - "touchUnlock":"touchUnlock", - "pushNotification":"pushNotification", - "lockUserManagement":"lockUserManagement", - "ownedKey":"ownedKey", - "authorityManagement":"authorityManagement", - "associatedDevice":"associatedDevice", - "associatedName":"associatedName", - "device":"device", - "authorizedAdmin":"authorizedAdmin", - "addAuthorizedAdmin":"addAuthorizedAdmin", - "lockGroup":"lockGroup", - "transferSmartLock":"transferSmartLock", - "selectiveLock":"selectiveLock", - "recipientInformation":"recipientInformation", - "transferGateway":"transferGateway", - "multiLanguage":"multiLanguage", - "lockScreen":"lockScreen", - "closed":"closed", - "opened":"opened", - "close":"close", - "open":"open", - "hideInvalidUnlockPermissions":"hideInvalidUnlockPermissions", - "appUnlockRequiresMobilePhoneAccessToTheLock":"appUnlockRequiresMobilePhoneAccessToTheLock", - "valueAddedServices":"valueAddedServices", - "about":"about", - "userAgreement":"userAgreement", - "privacyPolicy":"privacyPolicy", - "personalInformationCollectionList":"personalInformationCollectionList", - "applicationPermissionDescription":"applicationPermissionDescription", - "thirdPartyInformationSharingList":"thirdPartyInformationSharingList", - "logout":"logout", - "deleteAccount":"deleteAccount", - "personalInformation":"personalInformation", - "avatar":"avatar", - "nickName":"nickName", - "changeNickName":"changeNickName", - "modifyAccount":"modifyAccount", - "重置密码":"重置密码", - "safetyProblem":"safetyProblem", - "modifyAccountTip":"modifyAccountTip", - "pleaseEnterAccountNumber":"pleaseEnterAccountNumber", - "pleaseEnterNewAccountNumber":"pleaseEnterNewAccountNumber", - "changeIphoneTip":"changeIphoneTip", - "changeEmailTip":"changeEmailTip", - "goBind":"goBind", - "originalPassword":"originalPassword", - "newPassword":"newPassword", - "确认密码":"确认密码", - "safetyProblemTip":"safetyProblemTip", - "problemOne":"problemOne", - "problemTwo":"problemTwo", - "problemThree":"problemThree", - "pleaseEnterYourAnswer":"pleaseEnterYourAnswer", - "aboutToExpire":"aboutToExpire", - "deAuthorize":"deAuthorize", - "changeName":"changeName", - - "designation": "designation", - "state": "state", - "wifiName": "wifiName", - "networkMAC": "networkMAC", - "gatewayUpgrade": "gatewayUpgrade", - "gatewayConnectionLock": "gatewayConnectionLock", - "strongSignal": "strongSignal", - "mediumSignal": "mediumSignal", - "averageSignal": "averageSignal", - "weakSignal": "weakSignal", - "selectGatewayType": "selectGatewayType", - "addGateway": "addGateway", - "turnThePowerBackOn": "turnThePowerBackOn", - "indicatorLight": "indicatorLight", - "selectGatewayTypeNextTip": "selectGatewayTypeNextTip", - "selectGateway": "selectGateway", - "gatewayConfigurationWifiTip": "gatewayConfigurationWifiTip", - "wifiPassward": "wifiPassward", - "pleaseEnterTheWiFiPassword": "pleaseEnterTheWiFiPassword", - "gatewayName": "gatewayName", - "pleaseEnterGatewayName": "pleaseEnterGatewayName", - "wifiMAC": "wifiMAC", - "ipAddress": "ipAddress", - "subnetMask": "subnetMask", - "defaultGateway": "defaultGateway", - "automaticallyGetTheDNSServerAddress": "automaticallyGetTheDNSServerAddress", - "preferredDNS": "preferredDNS", - "alternativeDNS": "alternativeDNS", - "noStaticIPIsUsed": "noStaticIPIsUsed", - - "allLock":"allLock", - "searchAllLockType":"searchAllLockType", - "doorLock":"doorLock", - "padlock":"padlock", - "safeLock":"safeLock", - "intelligentLockCore":"intelligentLockCore", - "itelligentAccessControl":"itelligentAccessControl", - "parkingLock":"parkingLock", - "bicycleLock":"bicycleLock", - "longRangeControl":"longRangeControl", - "lightTouchScreen":"lightTouchScreen", - "lightTouchScreenTip":"lightTouchScreenTip", - "next":"next", - "nearbyLock":"nearbyLock", - "addSuccessfullyPleaseRename":"addSuccessfullyPleaseRename", - "whenAddingLockThePhoneMustBeNextToTheLock":"whenAddingLockThePhoneMustBeNextToTheLock", - - "login":"login", - "register":"register", - "forgetPassword":"forgetPassword", - "readAndAgree":"readAndAgree", - "verificationCode":"verificationCode", - "registerPasswordTip":"registerPasswordTip", - "iphone":"iphone", - "email":"email", - "mobileNumber":"mobileNumber", - "countryAndRegion":"countryAndRegion", - "select":"select", - "getVerificationCode":"getVerificationCode", - - "businessCooperation":"businessCooperation", - "officialWebsite":"officialWebsite", - "computerWebVersion":"computerWebVersion", - "hotelSystem":"hotelSystem", - "manualWebVersion":"manualWebVersion", - "introduce":"introduce", - - "note":"note", - "mail":"mail", - "advancedFunction":"advancedFunction", - "pushMessage":"pushMessage", - "recordsRetention":"recordsRetention", - - "smsBuyTip":"smsBuyTip", - "emailBuyTip":"emailBuyTip", - "currentRemainingQuantity":"currentRemainingQuantity", - "buy":"buy", - "customSMSTemplate":"customSMSTemplate", - "customMailTemplate":"customMailTemplate", - "record":"record", - "buyRealNameTip":"buyRealNameTip", - "buyRealNameSelectYouWantBuyTip":"buyRealNameSelectYouWantBuyTip", - "forTheFirstTime":"forTheFirstTime", - "onceDay":"onceDay", - "weekOnce":"weekOnce", - "monthOnce":"monthOnce", - "currentState":"currentState", - "onTrial":"onTrial", - "haveNotOpened":"haveNotOpened", - "advancedFeaturesAndBenefitsContent":"advancedFeaturesAndBenefitsContent", - "smsTemplate":"smsTemplate", - "emailTemplate":"emailTemplate", - "cardIssuingtool":"cardIssuingtool", - "titleForBuyingAdvancedFeatures":"titleForBuyingAdvancedFeatures", - "tipsForBuyingAdvancedFeatures":"tipsForBuyingAdvancedFeatures", - "freeTrial":"freeTrial", - "openNow":"openNow", - - "buySMS":"buySMS", - "buyMail":"buyMail", - "buyRealNameAuthenticationTimes":"buyRealNameAuthenticationTimes", - "enablingAdvancedFeatures":"enablingAdvancedFeatures", - "chooseAPackage":"chooseAPackage", - "modeOfPayment":"modeOfPayment", - "alipay":"alipay", - "goToPay":"goToPay", - - "customTemplatesTip":"customTemplatesTip", - "haveOpened":"haveOpened", - "unHaveOpenedTip1":"unHaveOpenedTip1", - "unHaveOpenedTip2":"unHaveOpenedTip2", - "freeTrialKeywords":"freeTrialKeywords", - "goToTheOpen":"goToTheOpen", - "creatingANewTemplate":"creatingANewTemplate", - "type":"type", - "templateContent":"templateContent", - "preview":"preview", - "hello":"hello", - "yourRoomIs":"yourRoomIs", - "roomName":"roomName", - "theCodeToOpenTheDoorIs":"theCodeToOpenTheDoorIs", - "templateTip1":"templateTip1", - "templateTip2":"templateTip2", - "templateTip3":"templateTip3", - "expectedNotoCount":"expectedNotoCount", - "templateTip4": "templateTip4", - "and":"and", - "willBeReplacedWithTheActualValue":"willBeReplacedWithTheActualValue", - "downloadLink":"downloadLink", - - "lockScreenTip":"lockScreenTip", - "hideInvalidUnlockPermissionsTip":"hideInvalidUnlockPermissionsTip", - "appUnlockRequiresMobilePhoneAccessToTheLockTip":"appUnlockRequiresMobilePhoneAccessToTheLockTip", - "checkAll":"checkAll", - - "wifiDistributionNetwork":"wifiDistributionNetwork", - "configuringWiFi":"configuringWiFi", - "pleaseEnterWifiName":"pleaseEnterWifiName", - "wifiPwd":"wifiPwd", - "pleaseEnterWifiPwd":"pleaseEnterWifiPwd", - "edit":"edit", - "stressFingerprint":"stressFingerprint", - "effectiveDay":"effectiveDay", - "stressPassword":"stressPassword", - "stressCard":"stressCard", - - "whetherTheEmployeeHasPassword":"whetherTheEmployeeHasPassword", - "whetherTheEmployeeHasCard":"whetherTheEmployeeHasCard", - "whetherTheEmployeeHasFingerprint":"whetherTheEmployeeHasFingerprint", - "selectPassword":"selectPassword", - "selectCard":"selectCard", - "selectFingerprint":"selectFingerprint", - "getKey":"getKey", - "getCard":"getCard", - "getFingerprint":"getFingerprint", - "safeVerify":"safeVerify", - "deleteAccountTips":"deleteAccountTips", - - "humanFace":"humanFace", - "monitoring":"monitoring", - "videoLog":"videoLog", - "messageReminding":"messageReminding", - "superAdmin":"superAdmin", - "normalUser":"normalUser", - "gatewayDevice":"gatewayDevice", - - "illumination":"illumination", - "doorOpener":"doorOpener", - "faceUnlocks":"faceUnlocks", - "catEyeSet":"catEyeSet", - "openingDirectionSet":"openingDirectionSet", - "motorPowerSetting":"motorPowerSetting", - "bluetoothBroadcast":"bluetoothBroadcast", - "whetherInternetRequiredWhenUnlocking":"whetherInternetRequiredWhenUnlocking", - - "selectTheLockToJoinTheGroup":"selectTheLockToJoinTheGroup", - "lockTrCount":"lockTrCount", - "xiaomiIOTPlatform":"xiaomiIOTPlatform", - "connectBlueErrorTip":"connectBlueErrorTip", - "pleaseEnterAGroupName": "pleaseEnterAGroupName", - "hint": "hint", - "areYouSureYouWantToDeleteIt": "areYouSureYouWantToDeleteIt", - - "faceUnlocksSet": "faceUnlocksSet", - "automaticBrighteningScreen": "automaticBrighteningScreen", - "sensingDistance": "sensingDistance", - "sensingDistanceTip": "sensingDistanceTip", - "preventWrongOpening": "preventWrongOpening", - "preventWrongOpeningTip": "preventWrongOpeningTip", - "remote": "remote", - "closeRange": "closeRange", - "addAndUseFaceWhenUnlocking": "addAndUseFaceWhenUnlocking", - "addAndUseFaceWhenUnlockingTip":"addAndUseFaceWhenUnlockingTip", - - "second": "second", - "motorPowerSettingTip": "motorPowerSettingTip", - "miniwatt": "miniwatt", - "miniwattTip": "miniwattTip", - "highPower": "highPower", - "highPowerTip": "highPowerTip", - - "openingDirectionSetTip": "openingDirectionSetTip", - "openLeft": "openLeft", - "openRight": "openRight", - "judgmentMethod": "judgmentMethod", - "judgmentMethodContent": "judgmentMethodContent", - - "customMode": "customMode", - "videoSlot": "videoSlot", - - "密码":"密码", - "卡":"卡", - "指纹":"指纹", - "人脸":"人脸", - "配件商城":"配件商城", - "公司名称":"公司名称", - "修改公司名字":"修改公司名字", - "请输入公司名字":"请输入公司名字", - "提示":"提示", - "是否删除?":"是否删除?", - "员工信息":"员工信息", - "员工":"员工", - "打卡方式无效":"打卡方式无效", - "中国":"中国", - "选择钥匙":"选择钥匙", - "编辑":"编辑", - "无":"无", - "有":"有", - "请输入姓名":"请输入姓名", - "获取人脸":"获取人脸", - "选择密码":"选择密码", - "选择卡":"选择卡", - "选择指纹":"选择指纹", - "选择人脸":"选择人脸", - "员工是否有人脸":"员工是否有人脸", - "同时删除员工钥匙":"同时删除员工钥匙", - "删除":"删除", - "确定要删除员工吗?":"确定要删除员工吗?", - "月统计":"月统计", - "迟到":"迟到", - "早退":"早退", - "未打卡":"未打卡", - "钥匙将在":"钥匙将在", - "天后失效":"天后失效", - "电量更新时间:":"电量更新时间:", - "新增配件":"新增配件", - "钥匙不可用":"钥匙不可用", - "正在开锁中...":"正在开锁中...", + "请输入员工账号": "请输入员工账号", + "批量授权锁": "批量授权锁", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。", + "排列方式": "排列方式", + "早到榜": "早到榜", + "迟到榜": "迟到榜", + "当前模式": "当前模式", + "勤奋榜": "勤奋榜", + "延迟时间": "延迟时间", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。", + "时间": "时间", + "开始时间": "开始时间", + "结束时间": "结束时间", + "工作时间设置": "工作时间设置", + "常开模式": "常开模式", + "常开时间": "常开时间", + "常开日期": "常开日期", + "添加员工": "添加员工", + "编辑员工": "编辑员工", + "节假日": "节假日", + "打卡方式": "打卡方式", + "员工是否有钥匙": "员工是否有钥匙", + "上班时间": "上班时间", + "下班时间": "下班时间", + "本周": "本周", + "单休": "单休", + "双休": "双休", + "单双休": "单双休", + "年": "年", + "月": "月", + "放假日期": "放假日期", + "补班日期": "补班日期", + "添加假日": "添加假日", + "开始日期": "开始日期", + "必填": "必填", + "结束日期": "结束日期", + "日榜": "日榜", + "月榜": "月榜", + "考勤记录": "考勤记录", + "假日信息": "假日信息", + "基本信息": "基本信息", + "无线键盘": "无线键盘", + "选择无线键盘": "选择无线键盘", + "门磁": "门磁", + "自动闭锁": "自动闭锁", + "锁声音": "锁声音", + "防撬报警": "防撬报警", + "重置键": "重置键", + "锁时间": "锁时间", + "诊断": "诊断", + "上传数据": "上传数据", + "导入其他锁数据": "导入其他锁数据", + "锁升级": "锁升级", + "标记房态": "标记房态", + "开锁提醒": "开锁提醒", + "微信二维码": "微信二维码", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边", + "锁编号": "锁编号", + "电量": "电量", + "锁分组": "锁分组", + "选择分组": "选择分组", + "创建新分组": "创建新分组", + "管理员开锁密码": "管理员开锁密码", + "更新": "更新", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新", + "当屏幕闪烁时,点击下一步": "当屏幕闪烁时,点击下一步", + "输入*529#或按设置键": "输入*529#或按设置键", + "长按重置键2秒": "长按重置键2秒", + "附近的设备": "附近的设备", + "暂无数据": "暂无数据", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁", + "开始": "开始", + "全天": "全天", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。", + "请选择锁音量": "请选择锁音量", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。", + "低": "低", + "较低": "较低", + "中": "中", + "较高": "较高", + "高": "高", + "开启后,锁被撬动时,会发出报警声": "开启后,锁被撬动时,会发出报警声", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "关闭后,重置键无效,锁要通过app删除后才能重新添加", + "校准时间": "校准时间", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因", + "上传": "上传", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待", + "请选择要从哪把锁导入": "请选择要从哪把锁导入", + "有新版本": "有新版本", + "当前版本": "当前版本", + "升级": "升级", + "空闲": "空闲", + "已入住": "已入住", + "英文": "英文", + "简体中文": "简体中文", + "多语言": "多语言", + "添加锁": "添加锁", + "锁地址": "锁地址", + "选择锁类型": "选择锁类型", + "NFC无源锁": "NFC无源锁", + "添加设备": "添加设备", + "网关": "网关", + "客服": "客服", + "设置": "设置", + "更多设置": "更多设置", + "消息推送": "消息推送", + "锁用户管理": "锁用户管理", + "拥有的钥匙": "拥有的钥匙", + "批量授权": "批量授权", + "关联设备": "关联设备", + "关联姓名": "关联姓名", + "转移智能锁": "转移智能锁", + "选择锁": "选择锁", + "接收人信息": "接收人信息", + "转移网关": "转移网关", + "锁屏": "锁屏", + "已关闭": "已关闭", + "已开启": "已开启", + "开启": "开启", + "确定要开启重置键?": "确定要开启重置键?", + "确定要关闭重置键?": "确定要关闭重置键?", + "隐藏无效开锁权限": "隐藏无效开锁权限", + "APP开锁时需手机连网的锁": "APP开锁时需手机连网的锁", + "增值服务": "增值服务", + "关于": "关于", + "退出": "退出", + "删除账号": "删除账号", + "个人信息": "个人信息", + "头像": "头像", + "昵称": "昵称", + "请输入昵称": "请输入昵称", + "修改昵称": "修改昵称", + "修改账号": "修改账号", + "重置密码": "重置密码", + "安全问题": "安全问题", + "为了你的账号安全,修改账号前请先使用验证码验证": "为了你的账号安全,修改账号前请先使用验证码验证", + "请输入新账号": "请输入新账号", + "找回密码和登录新设备时,可通过绑定的手机验证": "找回密码和登录新设备时,可通过绑定的手机验证", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "找回密码和登录新设备时,可通过绑定的邮箱验证", + "原密码": "原密码", + "新密码": "新密码", + "确认密码": "确认密码", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "当你手机丢了,可以通过回答设置的安全问题来登录新设备", + "问题一": "问题一", + "问题二": "问题二", + "问题三": "问题三", + "请输入你的答案": "请输入你的答案", + "即将到期": "即将到期", + "去授权": "去授权", + "修改名称": "修改名称", + "状态": "状态", + "WiFi名称": "WiFi名称", + "网络MAC": "网络MAC", + "网关升级": "网关升级", + "网关连接的锁": "网关连接的锁", + "信号强": "信号强", + "选择网关类型": "选择网关类型", + "添加网关": "添加网关", + "重新通电": "重新通电", + "指示灯": "指示灯", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步", + "选择网关": "选择网关", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置", + "WiFi密码": "WiFi密码", + "请输入WiFi密码": "请输入WiFi密码", + "网关名称": "网关名称", + "请输入网关名称": "请输入网关名称", + "IP地址": "IP地址", + "子网掩码": "子网掩码", + "默认网关": "默认网关", + "自动获取DNS服务器地址": "自动获取DNS服务器地址", + "首选DNS": "首选DNS", + "备选DNS": "备选DNS", + "不使用静态IP": "不使用静态IP", + "使用静态IP": "使用静态IP", + "请输入IP地址": "请输入IP地址", + "请输入子网掩码": "请输入子网掩码", + "请输入默认网关": "请输入默认网关", + "所有锁": "所有锁", + "搜索所有类型的锁": "搜索所有类型的锁", + "门锁": "门锁", + "挂锁": "挂锁", + "保险箱锁": "保险箱锁", + "智能门禁": "智能门禁", + "车位锁": "车位锁", + "摸亮触摸屏": "摸亮触摸屏", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "摸亮触摸屏,锁进入可添加状态,点击下一步", + "附近的锁": "附近的锁", + "如需修改名字请重新命名,点击确定添加锁": "如需修改名字请重新命名,点击确定添加锁", + "添加锁时,手机必须在锁旁边": "添加锁时,手机必须在锁旁边", + "登录": "登录", + "注册": "注册", + "我已阅读并同意": "我已阅读并同意", + "验证码": "验证码", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "密码必须是8-20位,至少包括数字/字母/符号中的2种", + "手机": "手机", + "邮箱": "邮箱", + "请输入邮箱": "请输入邮箱", + "国家/地区": "国家/地区", + "你所在的国家/地区": "你所在的国家/地区", + "选择国家/地区": "你所在的国家/地区", + "获取验证码": "获取验证码", + "商务合作": "商务合作", + "电脑网页版": "电脑网页版", + "酒店系统": "酒店系统", + "说明书网页版": "说明书网页版", + "高级功能": "高级功能", + "记录保存": "记录保存", + "您可通过短信将密码、电子钥匙信息发给接收人。": "您可通过短信将密码、电子钥匙信息发给接收人。", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "您可通过邮件将密码、电子钥匙信息发给接收人。", + "购买实名认证提示": "购买实名认证提示", + "请选择你希望的实名认证频次": "请选择你希望的实名认证频次", + "仅首次": "仅首次", + "每日一次": "每日一次", + "每周一次": "每周一次", + "每月一次": "每月一次", + "当前状态": "当前状态", + "试用中": "试用中", + "高级功能权益内容": "高级功能权益内容", + "短信模板": "短信模板", + "邮件模板": "邮件模板", + "发卡工具": "发卡工具", + "购买高级功能须知": "购买高级功能须知", + "购买高级功能提示": "购买高级功能提示", + "免费体验": "免费体验", + "立即开通": "立即开通", + "购买短信": "购买短信", + "购买邮件": "购买邮件", + "购买实名认证次数": "购买实名认证次数", + "开通高级功能": "开通高级功能", + "选择套餐": "选择套餐", + "支付方式": "支付方式", + "支付宝": "支付宝", + "去支付": "去支付", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人", + "高级功能仅能用于你自己的锁": "高级功能仅能用于你自己的锁", + "新建模板": "新建模板", + "类型": "类型", + "模版内容": "模版内容", + "预览": "预览", + "房间名": "房间名", + "预计产生短信条数": "预计产生短信条数", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁", + "配置WiFi": "配置WiFi", + "请输入WiFi名字": "请输入WiFi名字", + "WiFi配网": "WiFi配网", + "胁迫卡": "胁迫卡", + "员工是否有密码": "员工是否有密码", + "员工是否有卡": "员工是否有卡", + "员工是否有指纹": "员工是否有指纹", + "获取钥匙": "获取钥匙", + "获取卡": "获取卡", + "获取指纹": "获取指纹", + "安全验证": "安全验证", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?", + "监控": "监控", + "视频日志": "视频日志", + "开门器": "开门器", + "面容开锁": "面容开锁", + "开门方向设置": "开门方向设置", + "电机功率设置": "电机功率设置", + "开锁时是否需联网": "开锁时是否需联网", + "选择要加入分组的锁": "选择要加入分组的锁", + "锁数量": "锁数量", + "小米IOT平台": "小米IOT平台", + "面容开锁设置": "面容开锁设置", + "感应距离": "感应距离", + "防误开": "防误开", + "防误开已关闭,关门后仍可使用面容开锁": "防误开已关闭,关门后仍可使用面容开锁", + "添加和使用面容开锁时": "添加和使用面容开锁时", + "添加和使用面容开锁时提示": "添加和使用面容开锁时提示", + "秒": "秒", + "请根据门锁实际情况,请谨慎选择电机功率:": "请根据门锁实际情况,请谨慎选择电机功率:", + "小功率:": "小功率:", + "耗电少": "耗电少", + "大功率": "大功率", + "大功率提示": "大功率提示", + "开门方向设置提示": "开门方向设置提示", + "左开": "左开", + "右开": "右开", + "判断方法:": "判断方法:", + "判断方法内容": "判断方法内容", + "录像时段": "录像时段", + "密码": "密码", + "卡": "卡", + "指纹": "指纹", + "人脸": "人脸", + "配件商城": "配件商城", + "公司名称": "公司名称", + "请输入公司名字": "请输入公司名字", + "提示": "提示", + "是否删除?": "是否删除?", + "员工信息": "员工信息", + "员工": "员工", + "打卡方式无效": "打卡方式无效", + "中国": "中国", + "选择钥匙": "选择钥匙", + "编辑": "编辑", + "无": "无", + "有": "有", + "请输入姓名": "请输入姓名", + "获取人脸": "获取人脸", + "选择密码": "选择密码", + "选择卡": "选择卡", + "选择指纹": "选择指纹", + "选择人脸": "选择人脸", + "员工是否有人脸": "员工是否有人脸", + "同时删除员工钥匙": "同时删除员工钥匙", + "删除": "删除", + "确定要删除员工吗?": "确定要删除员工吗?", + "月统计": "月统计", + "迟到": "迟到", + "早退": "早退", + "未打卡": "未打卡", + "钥匙将在": "钥匙将在", + "天后失效": "天后失效", + "电量更新时间:": "电量更新时间:", + "新增配件": "新增配件", + "钥匙不可用": "钥匙不可用", + "正在开锁中...": "正在开锁中...", "你的钥匙": "你的钥匙", "常开模式启动!长按闭锁": "常开模式启动!长按闭锁", "演示模式": "演示模式", @@ -536,19 +417,18 @@ "请输入钥匙名称": "请输入钥匙名称", "修改成功": "修改成功", "冻结": "冻结", - "取消冻结": "取消冻结", + "解除冻结": "解除冻结", "授权": "授权", "取消授权": "取消授权", "同时解冻其发送的钥匙": "同时解冻其发送的钥匙", - "取消冻结会在用户APP连网后生效": "取消冻结会在用户APP连网后生效", + "会在用户APP连网后生效": "会在用户APP连网后生效", "同时冻结其发送的钥匙": "同时冻结其发送的钥匙", "冻结会在用户APP连网后生效": "冻结会在用户APP连网后生效", "取消授权会在用户APP连网后生效": "取消授权会在用户APP连网后生效", "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码", - "失效时间需大于生效时间": "失效时间需大于生效时间", - "生效时间需大于当前时间": "生效时间需大于当前时间", - "失效日期要大于生效日期": "失效日期要大于生效日期", - "失效时间要大于生效时间": "失效时间要大于生效时间", + "失效时间需晚于生效时间": "失效时间需晚于生效时间", + "生效时间需晚于当前时间": "生效时间需晚于当前时间", + "失效日期需晚于生效日期": "失效日期需晚于生效日期", "修改有效期": "修改有效期", "生效日期": "生效日期", "失效日期": "失效日期", @@ -582,7 +462,7 @@ "生效时间不能小于当前时间": "生效时间不能小于当前时间", "结束时间不能小于当前时间": "结束时间不能小于当前时间", "是否为管理员": "是否为管理员", - "已连接到锁,请将卡靠近锁的读卡区": "已连接到锁,请将卡靠近锁的读卡区", + "已连接到锁,请将卡靠近门锁的读卡区": "已连接到锁,请将卡靠近门锁的读卡区", "尝试连接设备...": "尝试连接设备...", "地理位置": "地理位置", "检查以确保以下地址是正确的": "检查以确保以下地址是正确的", @@ -619,8 +499,8 @@ "请输入分组名称": "请输入分组名称", "创建成功": "创建成功", "设置锁分组成功": "设置锁分组成功", - "电池1": "电池1", - "电池2": "电池2", + "电池1电量": "电池1电量", + "电池2电量": "电池2电量", "电量更新时间": "电量更新时间", "锁电量更新成功": "锁电量更新成功", "您的钥匙未生效": "您的钥匙未生效", @@ -635,7 +515,6 @@ "删除锁后,所有信息都会一起删除,确定删除锁吗?": "删除锁后,所有信息都会一起删除,确定删除锁吗?", "请输入登录密码": "请输入登录密码", "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "删除设备失败,请确保在设备附近,设备未被连接,设备已打开", - "。如果是全自动锁,请使屏幕变亮": "。如果是全自动锁,请使屏幕变亮", "用户无权限": "用户无权限", "创建公司后,考勤功能才能使用": "创建公司后,考勤功能才能使用", "是否删除钥匙?": "是否删除钥匙?", @@ -683,11 +562,10 @@ "厂商": "厂商", "型号": "型号", "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。", - "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。":"密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。", "密码生成后,请在当日23:59前使用,否则过0点后失效。": "密码生成后,请在当日23:59前使用,否则过0点后失效。", "清空密码底部提示": "清空密码底部提示", - "密码不一致哦":"密码不一致哦", - + "密码不一致哦": "密码不一致哦", "相机": "相机", "相册": "相册", "读写": "读写", @@ -704,144 +582,137 @@ "请手动在系统设置中开启": "请手动在系统设置中开启", "权限以继续使用应用": "权限以继续使用应用。", "去设置": "去设置", - - "虹膜":"虹膜", - "手掌":"手掌", - - "商城":"mall", - "我的":"my", - "微信公众号推送":"微信公众号推送", - "开启微信接收报警消息需要先关注锁通通锁微信公众号,请保存二维码并使用微信扫一扫设置":"开启微信接收报警消息需要先关注锁通通锁微信公众号,请保存二维码并使用微信扫一扫设置", - "蓝牙":"蓝牙", - "需要访问蓝牙权限才能使用添加钥匙功能的位置信息":"需要访问蓝牙权限才能使用添加钥匙功能的位置信息", - "请输入Email":"请输入Email", - "请输入手机号":"请输入手机号", - "家人到家":"家人到家", - "添加家人":"添加家人", - "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。":"若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。", - "消息提醒":"消息提醒", - "开门通知":"开门通知", - "N天未开门":"N天未开门", - "门未关好":"门未关好", - "防拆报警":"防拆报警", - "低电量提醒":"低电量提醒", - "胁迫开门":"胁迫开门", - "有人按门铃":"有人按门铃", - "有人出现在门口":"有人出现在门口", - "提醒方式":"提醒方式", - "开门方式":"开门方式", - "请选择":"请选择", - "家人":"家人", - "保存":"保存", - "APP推送":"APP推送", - "管理员":"管理员", - "未启用":"未启用", - "已启用":"已启用", - "省电模式":"省电模式", - "逗留抓拍模式":"逗留抓拍模式", - "实时监控模式":"实时监控模式", - "自定义模式":"自定义模式", - "秒":"秒", - "猫眼设置":"猫眼设置", - "猫眼工作模式":"猫眼工作模式", - "自动亮屏":"自动亮屏", - "亮屏持续时间":"亮屏持续时间", - "逗留警告":"逗留警告", - "异常警告":"异常警告", - "短信提醒":"短信提醒", - "邮件提醒":"邮件提醒", - "关锁":"Close Lock", - "功能":"Function", - "配件":"Parts", - "N天未开门提醒":"N天未开门提醒", - "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网":"当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网", - "胁迫指纹":"胁迫指纹", - "指纹列表":"指纹列表", - "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网":"经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网", - "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。":"打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。", - "门未开时间":"门未开时间", - "添加和使用面容开锁时:":"添加和使用面容开锁时:", - "云存":"云存", - "本地":"本地", - "3天滚动储存":"3天滚动储存", - "去升级":"去升级", - "下载列表":"下载列表", - "已下载":"已下载", - "全部视频":"全部视频", - "已为本设备免费提供3大滚动视频储存服务":"已为本设备免费提供3大滚动视频储存服务", - "视频播放":"视频播放", - "全选":"全选", - "请选择要删除的视频":"请选择要删除的视频", - "请选择要下载的视频":"请选择要下载的视频", - "欢迎使用":"欢迎使用", + "虹膜": "虹膜", + "手掌": "手掌", + "商城": "mall", + "我的": "my", + "微信公众号推送": "微信公众号推送", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置", + "蓝牙": "蓝牙", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "需要访问蓝牙权限才能使用添加钥匙功能的位置信息", + "请输入Email": "请输入Email", + "请输入手机号": "请输入手机号", + "家人到家": "家人到家", + "添加家人": "添加家人", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。", + "消息提醒": "消息提醒", + "开门通知": "开门通知", + "N天未开门": "N天未开门", + "门未关好": "门未关好", + "防拆报警": "防拆报警", + "低电量提醒": "低电量提醒", + "胁迫开门": "胁迫开门", + "有人按门铃": "有人按门铃", + "有人出现在门口": "有人出现在门口", + "提醒方式": "提醒方式", + "开门方式": "开门方式", + "请选择": "请选择", + "家人": "家人", + "保存": "保存", + "APP推送": "APP推送", + "管理员": "管理员", + "未启用": "未启用", + "已启用": "已启用", + "省电模式": "省电模式", + "逗留抓拍模式": "逗留抓拍模式", + "实时监控模式": "实时监控模式", + "自定义模式": "自定义模式", + "猫眼设置": "猫眼设置", + "猫眼工作模式": "猫眼工作模式", + "自动亮屏": "自动亮屏", + "亮屏持续时间": "亮屏持续时间", + "逗留警告": "逗留警告", + "异常警告": "异常警告", + "短信提醒": "短信提醒", + "邮件提醒": "邮件提醒", + "关锁": "Close Lock", + "功能": "Function", + "配件": "Parts", + "N天未开门提醒": "N天未开门提醒", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网", + "胁迫指纹": "胁迫指纹", + "指纹列表": "指纹列表", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。", + "未开门时间": "未开门时间", + "添加和使用面容开锁时:": "添加和使用面容开锁时:", + "云存": "云存", + "本地": "本地", + "3天滚动储存": "3天滚动储存", + "去升级": "去升级", + "下载列表": "下载列表", + "已下载": "已下载", + "全部视频": "全部视频", + "已为本设备免费提供3大滚动视频储存服务": "已为本设备免费提供3大滚动视频储存服务", + "视频播放": "视频播放", + "全选": "全选", + "请选择要删除的视频": "请选择要删除的视频", + "请选择要下载的视频": "请选择要下载的视频", + "欢迎使用": "欢迎使用", "用户协议和隐私政策概要": "用户协议和隐私政策概要", "协议概要": "协议概要", - "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读":"感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读", - "《用户协议》":"《用户协议》", - "和":"和", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读", + "《用户协议》": "《用户协议》", + "和": "和", "《隐私政策》": "《隐私政策》", "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。", - "不同意":"不同意", - "同意":"同意", - "当前状态:已开通":"当前状态:已开通", - "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", - "常用程序":"常用程序", - "该锁已被重置":"该锁已被重置", - "需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件", - "错误D固件,请选择正确的文件":"错误固件,请选择正确的文件", - "非SYD固件,请选择正确的文件":"非SYD固件,请选择正确的文件", - "文件校验失败 0x01":"文件校验失败 0x01", - "解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件", - "文件校验失败 0x02":"文件校验失败 0x02", - "文件校验失败 0x03":"文件校验失败 0x03", - "固件升级完成":"固件升级完成", - "记录":"记录", - "开通高级功能后才可以对锁进行管理":"开通高级功能后才可以对锁进行管理", - "去开通":"去开通", - "实名认证":"实名认证", - "当前剩余数量":"当前剩余数量", - "购买":"购买", - "实名认证为付费功能,请购买后再使用":"实名认证为付费功能,请购买后再使用", - - "退出添加":"退出添加", - "管理员已满":"管理员已满", + "不同意": "不同意", + "同意": "同意", + "该功能是高级功能,请开通后再使用": "该功能是高级功能,请开通后再使用", + "常用程序": "常用程序", + "该锁已被重置": "该锁已被重置", + "需要访问读写权限才能使用手动升级固件": "需要访问读写权限才能使用手动升级固件", + "错误D固件,请选择正确的文件": "错误固件,请选择正确的文件", + "非SYD固件,请选择正确的文件": "非SYD固件,请选择正确的文件", + "文件校验失败 0x01": "文件校验失败 0x01", + "解析元数据失败,请选择正确的文件": "解析元数据失败,请选择正确的文件", + "文件校验失败 0x02": "文件校验失败 0x02", + "文件校验失败 0x03": "文件校验失败 0x03", + "固件升级完成": "固件升级完成", + "记录": "记录", + "开通高级功能后才可以对锁进行管理": "开通高级功能后才可以对锁进行管理", + "去开通": "去开通", + "实名认证": "实名认证", + "当前剩余数量": "当前剩余数量", + "购买": "购买", + "实名认证为付费功能,请购买后再使用": "实名认证为付费功能,请购买后再使用", + "退出添加": "退出添加", + "管理员已满": "管理员已满", "用户已满": "用户已满", "锁上面添加指纹已满": "锁上面添加指纹已满", "指纹已存在": "指纹已存在", "锁上面添加人脸已满": "锁上面添加人脸已满", "人脸已存在": "人脸已存在", - "锁上面添加卡已满":"锁上面添加卡已满", + "锁上面添加卡已满": "锁上面添加卡已满", "卡已存在": "卡已存在", "锁上面添加密码已满": "锁上面添加密码已满", "密码已存在": "密码已存在", "请输入密码": "请输入密码", "暂无密码,无需重置": "暂无密码,无需重置", - - "真实姓名":"真实姓名", - "身份证号":"身份证号", - "请输入真实姓名":"请输入真实姓名", - "请输入身份证号":"请输入身份证号", - "请输入身份证号和真实姓名":"请输入身份证号和真实姓名", - - "点击返回设备配对":"点击返回设备配对", - "无法连接?尝试升级":"无法连接?尝试升级", - "固件升级提示":"固件升级提示", - "请先获取固件文件到手机本地,再选择升级":"请先获取固件文件到手机本地,再选择升级", - "固件升级中":"固件升级中", - "取消升级":"取消升级", - "固件传输中":"固件传输中", - "关闭":"关闭", - "传输中'":"传输中", - "操作记录":"操作记录", - "修改姓名":"修改姓名", - "传输中":"传输中", - "发送人":"发送人", - "发送时间":"发送时间", - "钥匙详情":"钥匙详情", - "姓名":"姓名", - "发送":"发送", - "请确认姓名全名和身份证号码是否正确":"请确认姓名全名和身份证号码是否正确", - "传输期间请勿离开当前页面":"传输期间请勿离开当前页面", + "真实姓名": "真实姓名", + "身份证号": "身份证号", + "请输入真实姓名": "请输入真实姓名", + "请输入身份证号": "请输入身份证号", + "请输入身份证号和真实姓名": "请输入身份证号和真实姓名", + "点击返回设备配对": "点击返回设备配对", + "无法连接?尝试升级": "无法连接?尝试升级", + "固件升级提示": "固件升级提示", + "请先获取固件文件到手机本地,再选择升级": "请先获取固件文件到手机本地,再选择升级", + "固件升级中": "固件升级中", + "取消升级": "取消升级", + "固件传输中": "固件传输中", + "关闭": "关闭", + "传输中'": "传输中", + "操作记录": "操作记录", + "修改姓名": "修改姓名", + "传输中": "传输中", + "发送人": "发送人", + "发送时间": "发送时间", + "钥匙详情": "钥匙详情", + "姓名": "姓名", + "发送": "发送", + "请确认姓名全名和身份证号码是否正确": "请确认姓名全名和身份证号码是否正确", + "传输期间请勿离开当前页面": "传输期间请勿离开当前页面", "机型": "机型", "硬件版本": "硬件版本", "固件版本": "固件版本", @@ -852,41 +723,39 @@ "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。", "如果是全自动锁,请使屏幕变亮": "如果是全自动锁,请使屏幕变亮", "正在尝试闭锁……": "正在尝试闭锁……", - "清空记录":"清空记录", - "是否要删除操作记录?":"是否要删除操作记录?", - "被删除的记录不能恢复":"被删除的记录不能恢复", - "全部事件":"全部事件", - "开锁事件":"开锁事件", - "异常事件":"异常事件", - "门铃事件":"门铃事件", - "视频事件":"视频事件", - "请开启蓝牙":"请开启蓝牙", - "请选择有效日":"请选择有效日", + "清空记录": "清空记录", + "是否要删除操作记录?": "是否要删除操作记录?", + "被删除的记录不能恢复": "被删除的记录不能恢复", + "全部事件": "全部事件", + "开锁事件": "开锁事件", + "异常事件": "异常事件", + "门铃事件": "门铃事件", + "视频事件": "视频事件", + "请开启蓝牙": "请开启蓝牙", + "请选择有效日": "请选择有效日", "公司名字长度不能小于 6 ": "公司名字长度不能小于 6 ", "已是最新版本": "已是最新版本", - "一":"一", - "二":"二", - "三":"三", - "四":"四", - "五":"五", - "六":"六", - "日":"日", - "新建短信模版":"新建短信模版", - "新建邮件模版":"新建邮件模版", - "自定义短信模版":"自定义短信模版", - "自定义邮件模版":"自定义邮件模版", - "名称":"名称", + "一": "一", + "二": "二", + "三": "三", + "四": "四", + "五": "五", + "六": "六", + "日": "日", + "新建短信模版": "新建短信模版", + "新建邮件模版": "新建邮件模版", + "自定义短信模版": "自定义短信模版", + "自定义邮件模版": "自定义邮件模版", + "名称": "名称", "星星锁": "星星锁", - "无考勤记录": "无考勤记录", "大家干劲十足": "大家干劲十足", "工作时长未出炉": "工作时长未出炉", "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续", "确认国家或地区": "确认国家或地区", "我知道了": "我知道了", - "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。", - "开启后,可通过长按锁上的设置键重新上电,用APP重新添加":"开启后,可通过长按锁上的设置键重新上电,用APP重新添加", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "开启后,可通过长按锁上的设置键重新上电,用APP重新添加", "已有": "已有", "新增": "新增", "账号格式错误": "账号格式错误", @@ -895,13 +764,11 @@ "加载数据失败": "加载数据失败", "重试": "重试", "升级中,是否退出": "升级中,是否退出", - "下一步": "下一步", "公寓": "公寓", "个人用户": "个人用户", "星寓": "星寓", "账号": "账号", - "请输入手机号或email": "请输入手机号或email", "请输入星寓管理员的账号": "请输入星寓管理员的账号", "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权", @@ -916,45 +783,343 @@ "该已锁被删除": "该已锁被删除", "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限", "添加授权管理员": "添加授权管理员", - "导出记录":"导出记录", - "选择时间段":"选择时间段", - "导出":"导出", - "批量导出":"批量导出", - "读取记录":"读取记录", - "手机需联网":"手机需联网", - "设备":"设备", - "消息":"消息", - "智能分析":"智能分析", - "精准识别设备事件,过滤无效信息":"精准识别设备事件,过滤无效信息", - "系统设置":"系统设置", - "系统的全局配置在此项内进行设置":"系统的全局配置在此项内进行设置", - "导出操作记录":"导出操作记录", - "立即查看":"立即查看", - "导出成功":"导出成功", + "导出记录": "导出记录", + "选择时间段": "选择时间段", + "导出": "导出", + "批量导出": "批量导出", + "读取记录": "读取记录", + "手机需联网": "手机需联网", + "设备": "设备", + "消息": "消息", + "智能分析": "智能分析", + "精准识别设备事件,过滤无效信息": "精准识别设备事件,过滤无效信息", + "系统设置": "系统设置", + "系统的全局配置在此项内进行设置": "系统的全局配置在此项内进行设置", + "导出操作记录": "导出操作记录", + "立即查看": "立即查看", + "导出成功": "导出成功", "发送钥匙": "发送钥匙", "进度": "进度", "失败": "失败", "人脸详情": "人脸详情", - "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。", "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。", "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。", "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。", "防误开已打开,开锁后": "防误开已打开,开锁后", "秒内不可使用面容开锁": "秒内不可使用面容开锁", - "Amazon Alexa": "Amazon Alexa", - "您可以使用Alexa进行开锁、闭锁和查看锁状态":"您可以使用Alexa进行开锁、闭锁和查看锁状态", - "支持的国家":"支持的国家", - "支持的国家值":"支持的国家值", - "操作流程":"操作流程", + "掌静脉": "掌静脉", + "添加掌静脉": "添加掌静脉", + "胁迫掌静脉": "胁迫掌静脉", + "请不要将胁迫掌静脉用于日常开锁": "请不要将胁迫掌静脉用于日常开锁", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "已连接到锁,请自然张开手掌,掌心正对摄像头", + "掌静脉详情": "掌静脉详情", + "掌静脉号": "掌静脉号", + "蓝牙未打开,请到设置里面打开蓝牙": "蓝牙未打开,请到设置里面打开蓝牙", + "删除用户时,会将用户拥有的钥匙一起删除。": "删除用户时,会将用户拥有的钥匙一起删除。", + "配置网络": "配置网络", + "你好": "你好", + "成功": "成功", + "类型选择": "类型选择", + "请选择要使用哪种类型": "请选择要使用哪种类型", + "系统邮件(推荐)": "系统邮件(推荐)", + "系统短信(推荐)": "系统短信(推荐)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。", + "个人邮件": "个人邮件", + "个人短信": "个人短信", + "邮件将从你的个人邮箱发给用户": "邮件将从你的个人邮箱发给用户", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除", + "为了更好地应用体验,请确定权限": "为了更好地应用体验,请确定权限", + "您第一次拒绝权限,请确定权限": "您第一次拒绝权限,请确定权限", + "您第二次拒绝权限,请去应用设置开启权限": "您第二次拒绝权限,请去应用设置开启权限", + "去应用市场": "去应用市场", + "温馨提示": "温馨提示", + "关闭应用": "关闭应用", + "开启微信接收报警消息需要先关注": "开启微信接收报警消息需要先关注", + "微信公众号,请保存二维码并使用微信扫一扫设置": "微信公众号,请保存二维码并使用微信扫一扫设置", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "实名认证为付费功能,请联系锁的管理员购买后再使用", + "位置权限": "位置权限", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作", + "相机/相册权限": "相机/相册权限", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "请开启本地存储权限,允许应用读写设备上的照片及文件", + "点击选择": "点击选择", + "微信": "微信", + "朋友圈": "朋友圈", + "QQ": "QQ", + "QQ空间": "QQ空间", + "微博": "微博", + "FaceBook": "FaceBook", + "链接": "链接", + "今天": "今天", + "密码错误": "密码错误", + "网络中断": "网络中断", + "钥匙不存在": "钥匙不存在", + "钥匙过期": "钥匙过期", + "钥匙已存在": "钥匙已存在", + "密码失效": "密码失效", + "门锁时间异常": "门锁时间异常", + "APP(手机)未联网": "APP(手机)未联网", + "数据不存在": "数据不存在", + "待接收": "待接收", + "已冻结": "已冻结", + "已删除": "已删除", + "未知": "未知", + "拖动下方滑块完成拼图": "拖动下方滑块完成拼图", + "验证成功": "验证成功", + "验证失败": "验证失败", + "向右拖动滑块填充拼图": "向右拖动滑块填充拼图", + "请先获取到位置信息哦": "请先获取到位置信息哦", + "请选择国家": "请选择国家", + "获取锁信息": "获取锁信息", + "锁数据异常,请重试": "锁数据异常,请重试", + "连接设备中...": "连接设备中...", + "把锁": "把锁", + "条": "条", + "封": "封", + "次": "次", + "支付成功": "支付成功", + "查看详情": "查看详情", + "请输入模板名称": "请输入模板名称", + "模版类型": "模版类型", + "再返回一次退出": "再返回一次退出", + "请先添加锁": "请先添加锁", + "可视对讲": "可视对讲", + "详细日志": "详细日志", + "已复制到剪切板": "已复制到剪切板", + "拍照": "拍照", + "从相册选择": "从相册选择", + "选择问题": "选择问题", + "确认长度不足8位": "确认长度不足8位", + "新密码长度不足8位": "新密码长度不足8位", + "两次密码不一致": "两次密码不一致", + "请点击获取验证码,验证码将发送到": "请点击获取验证码,验证码将发送到", + "切换": "切换", + "验证": "验证", + "验证成功,账号已删除": "验证成功,账号已删除", + "该密码不是自定义密码,无法修改": "该密码不是自定义密码,无法修改", + "请选择设备要关联哪些姓名": "请选择设备要关联哪些姓名", + "请选择姓名要关联哪些设备": "请选择姓名要关联哪些设备", + "确定要移除所选中的坏锁吗?": "确定要移除所选中的坏锁吗?", + "邮件通知": "邮件通知", + "短信通知": "短信通知", + "您好,您的授权管理员生成成功": "您好,您的授权管理员生成成功", + "请输入接收者姓名": "请输入接收者姓名", + "版本更新": "版本更新", + "下次再说": "下次再说", + "配网成功": "配网成功", + "配网失败": "配网失败", + "该锁的无线键盘都将被删除": "该锁的无线键盘都将被删除", + "实时画面": "实时画面", + "适合门口较为安全的环境。": "适合门口较为安全的环境。", + "仅发生特定事件才录像,并可查看实时画面。": "仅发生特定事件才录像,并可查看实时画面。", + "一般情况下,满电可使用7-8个月": "一般情况下,满电可使用7-8个月", + "有人逗留或发生特定事件才录像,可随时查看": "有人逗留或发生特定事件才录像,可随时查看", + "实时画面。": "实时画面。", + "一般情况下,满电可使用5~6个月。": "一般情况下,满电可使用5~6个月。", + "适合门口人员复杂、较不安全的环境。": "适合门口人员复杂、较不安全的环境。", + "有人出现就录像,可随时查看实时画面。": "有人出现就录像,可随时查看实时画面。", + "一般情况下,满电可使用2~4个月。": "一般情况下,满电可使用2~4个月。", + "根据您家门口实际情况设置录像和实时画面功能。": "根据您家门口实际情况设置录像和实时画面功能。", + "可使用时长由具体设置决定。": "可使用时长由具体设置决定。", + "查看": "查看", + "有人按门铃或发生": "有人按门铃或发生", + "异常事件时": "异常事件时", + "不录像": "不录像", + "有人出现、按门铃": "有人出现、按门铃", + "或发生异常事件时": "或发生异常事件时", + "逗留达到10秒": "逗留达到10秒", + "约1.5米": "约1.5米", + "随时": "随时", + "立即录像": "立即录像", + "录像时机": "录像时机", + "有人出现时录像": "有人出现时录像", + "人体侦测距离": "人体侦测距离", + "查看实时画面": "查看实时画面", + "自定义时间": "自定义时间", + "当日": "当日", + "次日": "次日", + "自定义时段": "自定义时段", + "发生事件时查看": "发生事件时查看", + "实时查看": "实时查看", + "有人在门口出现10秒后开始录像。": "有人在门口出现10秒后开始录像。", + "有人按门铃时立即录像。": "有人按门铃时立即录像。", + "有人出现在门前1.5米范围时启动录像": "有人出现在门前1.5米范围时启动录像", + "约0.8米": "约0.8米", + "约3.0米": "约3.0米", + "添加指纹失败": "添加指纹失败", + "项": "项", + "播放中": "播放中", + "下载": "下载", + "暂无下载内容": "暂无下载内容", + "亮度": "亮度", + "音量": "音量", + "快进至": "快进至", + "快退至": "快退至", + "暂无视频信息": "暂无视频信息", + "加载出错": "加载出错", + "请单人正对门锁,距离一个成年人手臂长度": "请单人正对门锁,距离一个成年人手臂长度", + "(约0.6米)。": "(约0.6米)。", + "保持脸部无遮挡,露出五官。": "保持脸部无遮挡,露出五官。", + "准备好了,开始添加": "准备好了,开始添加", + "正在录入中...": "正在录入中...", + "添加人脸失败": "添加人脸失败", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "重置后,该锁的人脸都将被删除哦,确认要重置吗?", + "人脸号": "人脸号", + "虹膜详情": "虹膜详情", + "虹膜号": "虹膜号", + "选择设备类型": "选择设备类型", + "照明灯具": "照明灯具", + "电动窗帘": "电动窗帘", + "门窗传感器": "门窗传感器", + "传感器": "传感器", + "清除数据成功": "清除数据成功", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录", + "看不到操作记录,可能原因有": "看不到操作记录,可能原因有", + "操作记录详情": "操作记录详情", + "操作时间": "操作时间", + "此模块功能需要锁联网后设置方可生效": "此模块功能需要锁联网后设置方可生效", + "用户已存在": "用户已存在", + "钥匙数量已到上限": "钥匙数量已到上限", + "附近没有可用网关": "附近没有可用网关", + "正在创建安全连接...": "正在创建安全连接...", + "监视状态下不能发送录音": "监视状态下不能发送录音", + "挂断": "挂断", + "监视中暂不能开锁": "监视中暂不能开锁", + "长按说话": "长按说话", + "松开发送": "松开发送", + "请输入6位数字开锁密码": "请输入6位数字开锁密码", + "请输入开锁密码": "请输入开锁密码", + "接收者在有效期内可以不限次数使用": "接收者在有效期内可以不限次数使用", + "接收者可以使用此App开关锁": "接收者可以使用此App开关锁", + "单次钥匙有效期为1小时,只能使用一次": "单次钥匙有效期为1小时,只能使用一次", + "接收者可以在有效期内的固定时间段里,不限次数使用": "接收者可以在有效期内的固定时间段里,不限次数使用", + "获取模板失败": "获取模板失败", + "微信通知": "微信通知", + "系统短信": "系统短信", + "系统邮件": "系统邮件", + "模板": "模板", + "新建模版": "新建模版", + "您好,您的密码是": "您好,您的密码是", + "密码名字": "密码名字", + "请输入6-9位密码": "请输入6-9位密码", + "设置密码": "设置密码", + "操作成功,密码为": "操作成功,密码为", + "类型:自定义-永久": "类型:自定义-永久", + "实时播放": "实时播放", + "点击对讲": "点击对讲", + "长按开锁": "长按开锁", + "接听失败": "接听失败", + "请在锁设置中开启远程开锁": "请在锁设置中开启远程开锁", + "接听": "接听", + "截图已保存到相册": "截图已保存到相册", + "添加遥控": "添加遥控", + "已连接到锁,请按遥控": "已连接到锁,请按遥控", + "遥控号": "遥控号", + "遥控详情": "遥控详情", + "照明": "照明", + "退出演示模式": "退出演示模式", + "提示:当前界面为展示界面,添加设备后才能继续使用": "提示:当前界面为展示界面,添加设备后才能继续使用", + "门已上锁": "门已上锁", + "您的账号在异地登录,如非本人,请尽快修改密码": "您的账号在异地登录,如非本人,请尽快修改密码", + "开门成功": "开门成功", + "开门失败": "开门失败", + "呼叫提醒": "呼叫提醒", + "收到来自": "收到来自", + "锁的呼叫": "锁的呼叫", + "加载数据中": "加载数据中", + "搜索所有锁类型": "搜索所有锁类型", + "锁电量更新时间": "锁电量更新时间", + "1月": "1月", + "2月": "2月", + "3月": "3月", + "4月": "4月", + "5月": "5月", + "6月": "6月", + "7月": "7月", + "8月": "8月", + "9月": "9月", + "10月": "10月", + "11月": "11月", + "12月": "12月", + "热门城市": "热门城市", + "导出锁数据": "导出锁数据", + "一键开锁": "一键开锁", + "已开通": "已开通", + "繁体中文": "繁体中文", + "法语": "法语", + "俄语": "俄语", + "德语": "德语", + "日语": "日语", + "韩语": "韩语", + "意大利语": "意大利语", + "乌克兰语": "乌克兰语", + "葡萄牙语": "葡萄牙语", + "西班牙语": "西班牙语", + "阿拉伯语": "阿拉伯语", + "越南语": "越南语", + "马来语": "马来语", + "荷兰语": "荷兰语", + "罗马尼亚语": "罗马尼亚语", + "立陶宛语": "立陶宛语", + "瑞典语": "瑞典语", + "爱沙尼亚语": "爱沙尼亚语", + "波兰语": "波兰语", + "斯洛伐克语": "斯洛伐克语", + "捷克语": "捷克语", + "希腊语": "希腊语", + "希伯来语": "希伯来语", + "塞尔维亚语": "塞尔维亚语", + "土耳其语": "土耳其语", + "匈牙利语": "匈牙利语", + "保加利亚语": "保加利亚语", + "哈萨克斯坦语": "哈萨克斯坦语", + "孟加拉语": "孟加拉语", + "克罗地亚语": "克罗地亚语", + "泰语": "泰语", + "印度尼西亚语": "印度尼西亚语", + "芬兰语": "芬兰语", + "丹麦语": "丹麦语", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?", + "在线": "在线", + "离线": "离线", + "购买记录": "购买记录", + "使用记录": "使用记录", + "失效时间要大于当前时间": "失效时间要大于当前时间", + "修改名字": "修改名字", + "时": "时", + "分": "分", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa进行开锁、闭锁和查看锁状态", + "支持的国家": "支持的国家", + "支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本", + "操作流程": "操作流程", + "操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了", + "Google Home": "Google Home", + "Action name": "Action name", + "ScienerSmart": "ScienerSmart", + "支持的语言": "支持的语言", + "英语": "英语", + "Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n", "密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合", - "操作流程值":"操作流程值", - "Google Home":"Google Home", - "Action name":"Action name", - "ScienerSmart":"ScienerSmart", - "支持的语言":"支持的语言", - "英语":"英语", - "Google Home操作流程的值":"Google Home操作流程的值", - "开启":"开启" + "已开锁": "已开锁", + "已闭锁": "已闭锁", + "两次密码不一致哦": "两次密码不一致哦", + + "中功率": "中功率", + "常规使用": "常规使用", + "扫描设备": "扫描设备", + "删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败,网关可能已经离线,是否强制删除该数据?", + "超级管理员英文": "超级管理员英文", + "授权管理员英文": "授权管理员英文", + "普通管理员英文": "普通管理员英文", + "网关设备英文": "网关设备英文", + "手机需联网英文": "手机需联网英文", + "年简称": "年简称", + "月简称": "月简称", + "日简称": "日简称", + "时简称": "时简称", + "分简称": "分简称" } diff --git a/lan/lan_kk.json b/lan/lan_kk.json new file mode 100644 index 00000000..1c8871ae --- /dev/null +++ b/lan/lan_kk.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Жұлдыз блоктар", + "锁通通": "Бұқсату", + "点击开锁,长按闭锁": "Жүктеу үшін, Бұғаттау", + "考勤": "Келесі", + "考勤设置": "Келесі параметрлері", + "电子钥匙": "EKeys", + "添加卡": "Карта қосу", + "卡号": "Карт нөмірі", + "添加指纹": "Бастапқы басы қосу", + "指纹号": "Бақылау нөмірі", + "遥控": "Қашықтақ", + "添加人脸": "Тірке қосу", + "门锁日志": "Қашықтығы бұғаттау журналы", + "密码号": "Пароль нөмірі", + "添加者": "Операторы", + "添加时间": "Уақыты", + "重置": "Қайтау", + "请输入手机号或者邮箱": "Телефон нөмірі/Email", + "工作时间": "Жұмыс уақыты", + "工作日设置": "Жұмыс күнін баптау", + "星期一": "Дөресі", + "星期二": "Сейшашағы", + "星期三": "Сәзбә", + "星期四": "Бешшебені", + "星期五": "Жүйені", + "星期六": "Қисабылын", + "星期日": "Жібері", + "简写周一": "M", + "简写周二": "T", + "简写周三": "WW", + "简写周四": "T", + "简写周五": "F", + "简写周六": "SName", + "简写周日": "SName", + "周一": "MonComment", + "周二": "Туе", + "周三": "Жеті", + "周四": "Thur", + "周五": "Fris", + "周六": "Sat", + "周日": "Күн", + "群发钥匙": "Бірнеше істелді жіберу", + "锁": "Бұқсат", + "请添加": "Алушысы", + "允许远程开锁": "Қашықтан ашу", + "请输入验证码": "Тексеру", + "获取密码": "Бастапқы кодтары", + "请给密码命名": "Бұл паролькод үшін атауын келтіріңіз", + "密码有限期为6个小时,只能使用一次": "Бұл Passcode қазіргі уақыттан 6 сағат ішкенде қолданылатын немесе қауіпсіздігі себептер үшін SUSPENDD. Бұл Passcode тек ғана ONCE қолданылады.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Парольді 6-9 цифры қолмен келтіріңіз. Бұқсат жагындағы Bluetooth телефоны немесе қашықтан қоса алады.", + "获取": "Қайда", + "添加": "Қосу...", + "删除公司": "Компанияны өшіру", + "密码详情": "Passcode ақпараты", + "修改密码": "Бастапқы кодтары", + "添加虹膜": "Ирис қосу", + "添加门磁": "Қашықтың сенсоры", + "添加无线键盘": "Сымсыз пернегі", + "添加手掌": "Palm қосу", + "请输入员工账号": "Жұмыс тіркелгісін келтіріңіз", + "批量授权锁": "Бірнеше блоктауларды рұқсат ету", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Сыртталған администраторы осы бұғаттағы рұқсат ету үшін көпшігі рұқсат бар.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Бұл таңбалар шлюзмен қашықтан таңбалауды ашу мүмкіндік береді. Бұл мүмкіндігі ТЕК ББИТ- тін ЖАЛАТЫ", + "排列方式": "Тізім түрі", + "早到榜": "Бірінші тізімі", + "迟到榜": "Келесі тізімі", + "当前模式": "Ағымдағы режімі", + "勤奋榜": "Қосымша жұмыс тізімі", + "延迟时间": "Кеңейту уақыты", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Бұғасқа уақыттан соң автоматты түрде бұғаттайды. Басқа баптау үшін бір рет ашу керек.", + "时间": "Уақыты", + "开始时间": "Бастау уақыты", + "结束时间": "Аяқтау уақыты", + "工作时间设置": "Жұмыс уақытын баптаулары", + "常开模式": "Жүйелік MODE", + "常开时间": "Осы уақытта", + "常开日期": "Бұл күндер", + "添加员工": "Желіде қосу", + "节假日": "Күйі", + "打卡方式": "Ред", + "员工是否有钥匙": "Eky бар ғой", + "上班时间": "Бастау уақыты", + "下班时间": "Жатау уақыты", + "本周": "Бұл аптасы", + "单休": "Бір күні аптасы", + "双休": "Екі күні аптасы", + "单双休": "Бір- екі күн аясы", + "年": "Жыл", + "月": "Ай:", + "放假日期": "Күйі", + "补班日期": "Жұмыс күндері", + "添加假日": "Күнті қосу", + "开始日期": "Бастау күні", + "必填": "Кереу", + "结束日期": "Аяқтау күні", + "日榜": "Күн", + "月榜": "Ая", + "考勤记录": "Жазуы", + "假日信息": "Шақтаны ақпараты", + "基本信息": "Негізгі", + "无线键盘": "Сымсыз пернегі", + "选择无线键盘": "Пернелерді қосу", + "门磁": "Қашықтың сенсоры", + "自动闭锁": "Автоқлау", + "锁声音": "Дыбыс бұғаттау", + "防撬报警": "Темпер ескерті", + "重置键": "Бетті ысырып тастау", + "锁时间": "Сағаттары", + "诊断": "Диагноу", + "上传数据": "Деректерді жүктеу", + "导入其他锁数据": "Басқа блокадан импорттау", + "锁升级": "Firmware жаңартуы", + "标记房态": "Кұсқа күйі", + "开锁提醒": "Құлақтандыру", + "微信二维码": "QR кодін ашу", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Электронлық кілттер бар адамдар осы QR коды \"WeChat\" дегенді сіздеп, шұқсаты ашылады. Әрбір блоктың QR коды басқа. Оны баспаға сәйкесті блоктың жағысын орналаса аласыз.", + "锁编号": "Боқталсын", + "电量": "БатареяName", + "锁分组": "Топты бұғаттау", + "选择分组": "Топты таңдау", + "创建新分组": "Топты құру", + "管理员开锁密码": "Admin паролькоды", + "更新": "Жаңарту", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Батарея деңгейі пернесін не телефоны bluetooth", + "当屏幕闪烁时,点击下一步": "Кілттің перне басыңыз", + "输入*529#或按设置键": "README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# келтіріңіз немесе баптаулар пернесін басу", + "长按重置键2秒": "Келесі батырмасын 2 секундты тоқтату", + "附近的设备": "Қосымша құралы", + "暂无数据": "Деректер жоқ", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Сіз шұрыс шұрыспен ғазап орын аласыз. Тек бір сенсор бұғаттау мүмкіндік береді.", + "开始": "Бастау", + "全天": "Барлық сағата", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Сіз өту режімінің бір уақыт аралығын орнатуға болады. Орнатылған уақыт аралығында, бұғасқа бұғатталғандан кейін ашық күйін қалды.", + "请选择锁音量": "Үнді бұғаттап таңдаңыз", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Жүйеген дыбыс блоктаудан тықтайсыз.", + "低": "Төменweather forecast", + "较低": "Орташа төменweather forecast", + "中": "Орташа", + "较高": "Қалыпты жоғару", + "高": "Жоғары:", + "开启后,锁被撬动时,会发出报警声": "Қосымша, TAMPER ескертуді рұқсат ету.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Бұрып, RESET батырмасы рұқсат етілмеді.", + "校准时间": "Калибрат уақыты", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Диагноз - блоктауның аясындағы баптау мәліметті оқып жүктеу, сондар қатесің себебін анализдеуге болады.", + "上传": "Жүктеу", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Бұғатталған деректер серверіне жүктеу.It can take times", + "请选择要从哪把锁导入": "Импорттайтын блоктасын таңдаңыз", + "有新版本": "Жаңа нұсқасын көрсету", + "当前版本": "Ағымдағы нұсқасы", + "升级": "Жаңарту", + "空闲": "Таңдау", + "已入住": "Бетті", + "多语言": "Тілдер", + "添加锁": "Осы қосу", + "锁地址": "Адресті бұғаттау", + "选择锁类型": "Бұқсат түрін таңдау", + "NFC无源锁": "NFC пассив", + "添加设备": "Құрылғы қосу", + "网关": "Шлюз", + "客服": "Қалыпты қызметі", + "设置": "Баптаулары", + "更多设置": "Қосыма", + "消息推送": "Құлақтандыру", + "锁用户管理": "Пайдаланушыларды бұғаттау", + "拥有的钥匙": "EKeys осы пайдаланушымен сәйкес келетін eKeys", + "批量授权": "Ауыста басқаруы", + "关联设备": "Қосымша құрылғысы", + "关联姓名": "Қосымша аты", + "转移智能锁": "Бұғат", + "选择锁": "Экран бұғаттау", + "接收人信息": "Алушысы", + "转移网关": "Ауыстыру", + "锁屏": "Экран блоктасы", + "已关闭": "Өшіру", + "已开启": "Тек", + "开启": "Орындау", + "确定要开启重置键?": "Қайталау батырмасын іске қосу бе?", + "确定要关闭重置键?": "Қайталау батырмасын сөндіру", + "隐藏无效开锁权限": "Жарамсыз қатынау жасыру", + "APP开锁时需手机连网的锁": "Интернетті телефонтың блоктар", + "增值服务": "Қызметтер", + "关于": "Оқылмаған", + "退出": "Шығу", + "删除账号": "Тіркелгі өшіру", + "个人信息": "Тіркелгі мәліметі", + "头像": "Аватар", + "昵称": "Ным атауы", + "请输入昵称": "Үлгі атауыңызды келтіріңіз", + "修改昵称": "Атын ауыстыру", + "修改账号": "Тіркелгі өңдеу", + "重置密码": "Парольді ысырып тастау", + "安全问题": "Қауіпсіздік сұранысы", + "为了你的账号安全,修改账号前请先使用验证码验证": "Тіркелгіңіздің қауіпсіздігі", + "请输入新账号": "Жаңа тіркелгісін келтіріңіз", + "找回密码和登录新设备时,可通过绑定的手机验证": "Тексеру кодын алу үшін жалғастырылды.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Тексеру кодын алуға қолданылады.", + "原密码": "Ағымдағы пароль", + "新密码": "Жаңа пароль", + "确认密码": "Парольді құптау", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Телефоныңызды жоғалтқанда, қауіпсіз сұрақтарды жауап беріңіз жаңа телефонына кіруге болады.", + "问题一": "Сұраныс 1", + "问题二": "2 сұрау", + "问题三": "3 сұрағы", + "请输入你的答案": "Жауапңызды келтіріңіз", + "即将到期": "Келесі біткен", + "去授权": "Ажырату", + "修改名称": "Атауы өңдеу", + "状态": "Қалып-күйі", + "WiFi名称": "Wifi аты", + "网络MAC": "Желі MAC", + "网关升级": "Шлюсті жаңарту", + "网关连接的锁": "Осы шлюзге қосылған(лер) р)", + "信号强": "Қосым", + "选择网关类型": "Шлюз түрін таңдау", + "添加网关": "Шлюзді қосу", + "重新通电": "Қуатты қосылу", + "指示灯": "Нұсқасы:", + "选择网关": "Шығыс таңдау", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G қолдауы жоқ.", + "WiFi密码": "WiFi өту", + "请输入WiFi密码": "WiFi паролін келтіріңіз", + "网关名称": "Шлюз атауы", + "请输入网关名称": "Шлюз атауын келтіріңіз", + "IP地址": "IP адресі", + "子网掩码": "Іш желі қалқасы", + "默认网关": "Әдетті шлюз", + "自动获取DNS服务器地址": "DNS серверінің адресін автоматты түрде алу", + "首选DNS": "Қосымша DNS", + "备选DNS": "Бастапқы DNSComment", + "不使用静态IP": "Статикалық IP қолданылмаған", + "使用静态IP": "Статикалық IP қолданылсын", + "请输入IP地址": "IP адресін келтіріңіз", + "请输入子网掩码": "Іш желі қалқасын келтіру", + "请输入默认网关": "Әдетті шлюзуды келтіріңіз", + "所有锁": "Барлық блоктар", + "搜索所有类型的锁": "Бұқсаттарды барлық түрлерін сканеру", + "门锁": "Қашықтыққ", + "挂锁": "Пайдалануу", + "保险箱锁": "Қауіпсіз қылу", + "智能门禁": "Ілеспе қатынау контроллері", + "车位锁": "Паркинг блоктар", + "摸亮触摸屏": "Пернегі", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Қосулғысын белсендіру үшін бірде-бір кілтті тіркесімді, оны МИРИЯНЕ режімінде орнатыңыз.Press Next", + "附近的锁": "Келесі блоктар", + "如需修改名字请重新命名,点击确定添加锁": "Егер атауын өзгерту келсе, ауыстыру ауыстырыңыз, Қосулы қосу үшін Тұны басыңыз", + "添加锁时,手机必须在锁旁边": "Бұғат қосқанда телефон блоктауға жағы болу керек.", + "登录": "Жүйеге кіру", + "注册": "Регистре", + "我已阅读并同意": "Оқып келдім.", + "验证码": "Коді", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Пароліңізді 8- 20 таңбалар болу керек, бірақ сан, әріптер мен символдар санының кемімі", + "手机": "Телефоны", + "邮箱": "Эл. поштасы", + "请输入邮箱": "Эл. поштаңызды келтіріңіз", + "国家/地区": "Өл/ Рейона", + "你所在的国家/地区": "Еліңіздез", + "选择国家/地区": "Ел не ауыстыңызды таңдаңыз", + "获取验证码": "Кодты алуы", + "商务合作": "Таңдау", + "电脑网页版": "Веб- жүйесі", + "酒店系统": "Hotel SystemComment", + "说明书网页版": "Пайдаланушы қолма", + "高级功能": "Қосымша функциясы", + "记录保存": "Жазуы", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS алушыға парискод мен etey мәліметін жіберу үшін қолданылады.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Эл. пошта алушыға парускод мен etey мәліметті жіберу үшін қолданылады.", + "购买实名认证提示": "Функция рұқсат етілгеннен соң, APP- тіркелгі тіркелгі пароліңізді қолдану керек. 3 минутға қайта тексеру керек емес", + "请选择你希望的实名认证频次": "Өздігінен аутентификация жарлықты таңдаңыз", + "仅首次": "Бірінші рет", + "每日一次": "Күнде бір рет", + "每周一次": "Апта бір рет", + "每月一次": "Айдар бір рет", + "当前状态": "Ағымдағы күй- жайы", + "试用中": "Сынау", + "高级功能权益内容": "Қосымша функциялар", + "短信模板": "SMS үлгісі", + "邮件模板": "Эл. пошта үлгі:", + "发卡工具": "КодтамасыComment", + "购买高级功能须知": "Хабарламасы", + "购买高级功能提示": "Қосымша мүмкіндіктер құрылғыда, егер керек болса, бұғаттардың санын ашу үшін көмектесіңіз. Қосымша мүмкіндіктері ғана өзіңізді бұғаттарыңыз. Егер әкімгілікті әкімші болса, қызметті ашу үшін блоктау жоғарғы әкімшісін қатынасыз", + "免费体验": "Бос сынауName", + "立即开通": "Қазір ашу", + "购买短信": "SMS сақтау", + "购买邮件": "Эл. поштаны сақтау", + "购买实名认证次数": "Аутентификация уақыты", + "开通高级功能": "Қосымша функцияны қосу", + "选择套餐": "Пакетті таңдау", + "支付方式": "Үлгі режімі", + "支付宝": "Alipaye", + "去支付": "Жүйе", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Хатты өзіңізді анықтауға рұқсат етілетініңіз. Бұл пароскод мен ekey- мәліметті басқаларды жіберу үшін қолданылады.", + "高级功能仅能用于你自己的锁": "Қосымша функциясы тек өз бұғаттарыңызды қолданылады.", + "新建模板": "Үлгі құру", + "类型": "Түрі", + "模版内容": "Үлгі мазмұны", + "预览": "Нобайы", + "房间名": "Олығы", + "预计产生短信条数": "Хаттарды сегменттері", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Бұл паролі, координаттар, карталар мен аралығында дұрыс емес, бірақ уақытта дұрыс емес.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Таңдалған блоктарды APP-мен ашу үшін пайдаланушының телефонын онлайн болу керек.", + "配置WiFi": "WiFi баптау", + "请输入WiFi名字": "Wifi атын келтіріңіз", + "WiFi配网": "WiFi тарату желіName", + "胁迫卡": "Стрес картасыName", + "员工是否有密码": "Бастапқы кодтары", + "员工是否有卡": "Карта бар ғой", + "员工是否有指纹": "Бақылау тізімін орнату", + "获取钥匙": "Кілті", + "获取卡": "Картасын алу", + "获取指纹": "Бақылау тізімін алу", + "安全验证": "Іс- әлпеті тексеру", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Тіркелгіңіздің барлық мәліметі Платформадан өшірілген және қайта жоғалтылмайды. Өшіруге қалайсыз ба?", + "监控": "Монитор", + "视频日志": "Видео журналы", + "开门器": "Қашықтығы ашу", + "面容开锁": "Өшірілгендер", + "开门方向设置": "Ашату жолы жинағы", + "电机功率设置": "MotorPower баптаулары", + "开锁时是否需联网": "Жүктеу кезінде интернет керек", + "选择要加入分组的锁": "LDAP таңдауS to add to this group.", + "锁数量": "Бұқсат саны", + "小米IOT平台": "Xiaomi IOT платформа", + "面容开锁设置": "Өшірісті", + "感应距离": "Себеу қашықтығы", + "防误开": "Жарамсыз ашу", + "防误开已关闭,关门后仍可使用面容开锁": "Ашылмағанды жабылсын", + "添加和使用面容开锁时": "Жүктеу кезінде тағы қосу мен қолданылсын", + "添加和使用面容开锁时提示": "\n1, бір адам қашықтығы операцияның алдында ұстап көріңіз.\n2, қазірішін бұғаттардың алдында 0,5 ~ 0,8 мсят, әзірін бұғаттарды келтіріңіз.\n3. Өшіріңізді бейімде болсап, өзіңізді таңдаңыз.\n4. Көйін анықтауы дұрыс емес болса, цифриқ пернетінің перне енгізінді қолмен қайта қосу үшін перне іске қоса аласыз.", + "秒": "SName", + "请根据门锁实际情况,请谨慎选择电机功率:": "Мотодор қуаттандық қадамдастыру үшін таңдаңыз:", + "小功率:": "Миноват:", + "耗电少": "Қуаттандықтан кейі", + "大功率": "Жоғарғы:", + "大功率提示": "Бұғаттардың тілі дұрыс емес болса, немесе өшіру керек есе", + "开门方向设置提示": "Үйдіңіздің егеріңізді ашқанның жолы таңдаңыз (сеңіз дұрыс жолын таңдаңыз) Сіз қазірін дұрыс ашып жатыра алмайсыз:", + "左开": "Сол жақтан ашу", + "右开": "Оң жақ ашу", + "判断方法:": "Эк", + "判断方法内容": "Ол кейге үй тышқанда басып, келесі қазіріп кетті.", + "录像时段": "Видео сұрау", + "密码": "Passcoded", + "卡": "Картар", + "指纹": "Бақыт", + "人脸": "Қалығы", + "配件商城": "Бұғаттау", + "公司名称": "Компания атауы", + "请输入公司名字": "Компанияның атауы келтіріңіз", + "提示": "Анықтама", + "是否删除?": "Өшіру керек пе?", + "员工信息": "Жергілікті мәліметі", + "员工": "Таңдау", + "打卡方式无效": "Қол жеткізбеді", + "中国": "КітаName", + "选择钥匙": "Eky таңдау", + "编辑": "Өңдеу", + "无": "Жоқ", + "有": "Иә", + "请输入姓名": "Атауын келтіріңіз", + "获取人脸": "Толықтар алу", + "选择密码": "Бастапқы кодтауын таңдау", + "选择卡": "Таңдау", + "选择指纹": "Бақылау тізімін таңдау", + "选择人脸": "Таңдау", + "员工是否有人脸": "Тапсырманы бар бейе", + "同时删除员工钥匙": "Өшіру", + "删除": "Өшіру", + "确定要删除员工吗?": "Бұл жұмысты өшіру", + "月统计": "Айлық статистикасы", + "迟到": "Соңы", + "早退": "Жерде шығу", + "未打卡": "Жазу жоқ", + "钥匙将在": "Бұл ekey мерзімі", + "天后失效": "Күндер", + "电量更新时间:": "Батарея жаңарту уақыты:", + "新增配件": "Қосу...", + "钥匙不可用": "Кілт емес", + "正在开锁中...": "Жүктеу...", + "你的钥匙": "Кілті", + "常开模式启动!长按闭锁": "Ашатын режімі басталды! Қосуласу үшін ұзын басу", + "演示模式": "Демоу режімі", + "请先同意用户协议及隐私政策": "Пайдаланушының келтіріп және жекемен ережелерге келтіріңіз", + "用户协议": "Пайдаланушы ақпараты", + "隐私政策": "Жеке ережелері", + "注册成功": "Жазуды сәттін", + "你所在的": "Сізге бар.", + "手机号": "Телефон нөмірі", + "忘记密码": "Пароль:", + "重置成功": "Сәтті ысырып тастау", + "确定要退出吗?": "Шығу", + "功能暂未开放": "Функция әлі ашылмайды", + "设置成功": "Сәтті тіркеу", + "删除成功": "Сәтті өшіру", + "单次": "Бір уақыты", + "永久": "Тұтасы", + "限时": "Уақыты", + "自定义": "Таңдауыңызша", + "清空码": "Өшіру", + "循环": "Қайталау", + "工作日": "Жұмыс күні", + "每日": "Күн", + "周末": "Аптан соңы", + "确定要删除吗?": "Өшіру керек пе?", + "该锁的密码都将被删除": "Осы блоктау үшін барлық пароскоді", + "已过期": "Қате емес", + "该锁的电子钥匙都将被删除": "Осы бұғаттау үшін барлық eKeys (CELEDADE) бағдарламады", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Бұны қадамы UNDONE болмайды!", + "删除钥匙会在用户APP连网后生效": "Ekey- өңдейді", + "有效时间": "Еңгей уақыты", + "接收者": "Алушысы", + "仅管理自己创建的用户": "Тек өзі пайдаланушыларды басқару", + "远程开锁": "Алыстан ашу", + "请输入钥匙名称": "Кілттің атауын келтіріңіз", + "修改成功": "Сәтті өзгерту", + "冻结": "Өшіру", + "解除冻结": "Thaw", + "授权": "Ауарды", + "取消授权": "Оқып алу", + "同时解冻其发送的钥匙": "Бұл пайдаланушының барлық ekeys Thaw", + "会在用户APP连网后生效": "Пайдаланушы APP желімен қосылғанда, бұл ekey", + "同时冻结其发送的钥匙": "Пайдаланушының барлық ekeys", + "冻结会在用户APP连网后生效": "Пайдаланушы APP желімен қосылғанда, бұл ekey FROZEN болады", + "取消授权会在用户APP连网后生效": "Пайдаланушы APP желімен қосылғанда, рұқсаттары рұқсат етіледі.", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Уақытты пайдаланушысы LOCK менеджеріне бір рұқсаттары бар. Ekeys және Passcodes", + "失效时间需晚于生效时间": "Уақыт уақыты есептеу уақыты болу керек.", + "生效时间需晚于当前时间": "Назардағы уақыты өткін болу керек.", + "失效日期需晚于生效日期": "Уақыты күні есептеу", + "修改有效期": "Уақытты өзгерту", + "生效日期": "Бастау күні", + "失效日期": "Аяқтау күні", + "开锁": "Жүктеу", + "开锁成功": "Жүктеу сәттін", + "请选择锁": "Бұғаттарды таңдаңыз", + "请选择接收者": "Қапшықты таңдаңыз", + "请选择有效期": "Дұрыс уақытын таңдаңыз", + "请选择发送方式": "Жіберу жолын таңдаңыз", + "请选择结束时间": "Аяқтау уақытын таңдаңыз", + "完成": "Аяқталсын", + "有效日": "Циклі", + "发送成功": "Сәтті жіберу", + "请选择开始时间": "Бастау уақытын таңдаңыз", + "选择用户": "Алушыларды таңдау", + "已选中": "Таңдалған", + "确定": "ОК", + "请选择要发送的锁": "Бұғаттарды таңдаңыз", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Тек- аты аутентификациясы APP- тін жегілдер алдында пайдаланушының тәсілді тексеруге келеді. Тексеруді бұғаттау мүмкін.", + "分享": "Ортақ", + "请输入接收者账号": "Алушы тіркелгісін келтіріңіз", + "接收者号码未注册,请重新发送": "Қапшықтар нөмірі жазылмаған, қайта жіберіңіз", + "是否发送电子钥匙给未注册账号": "Жаңа тіркелгіге ekey жіберуді қалайсыз ба?", + "取消": "Қайту", + "标记成功": "Сәтті белгілеу", + "微信好友": "WeChat- деңгей", + "短信": "SMS", + "邮件": "Эл. поштасы", + "更多": "Қосыма", + "您好,您的电子钥匙生成成功": "Жақсат, електронлық кілті", + "生效时间不能小于当前时间": "Назардағы уақыттан кем болмайды", + "结束时间不能小于当前时间": "Аяқтау уақыты назардағы уақыттан кем болмайды", + "是否为管理员": "Бұл администраторы", + "已连接到锁,请将卡靠近门锁的读卡区": "Қосылған. Картанды оқу үшін картанын сөндіру", + "尝试连接设备...": "Бұғатқа қосылу.", + "地理位置": "Географлық орны", + "检查以确保以下地址是正确的": "Келесі адресі дұрыс деп тексеру үшін тексеру", + "地图加载中,请稍候。。": "Карта жүктеу, күтіңіз...", + "跳过": "Жоғарлау", + "还未获取到位置信息哦,请耐心等待一下!": "Орналастыру мәлімет әлі алмады, күте тұрыңыз!", + "请填写信息": "Мәліметтін толтырсын", + "有效期": "Дұрыс уақыты", + "生效时间": "Бастау уақыты", + "失效时间": "Аяқтау уақыты", + "上传成功": "Жүктеу сәтті.", + "未生效": "Белсенділу", + "已生效": "Еңгей", + "指纹详情": "Бастапқы мәліметі", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Сіз сенсорға кәдімгі ауысу керек.", + "开始添加": "Бастау", + "请将您的手指按下": "Сенсорға сақтау", + "根据提示,抬起手指后再进行下一次指纹采集": "Сұраныстырды келесі жазуында сенсорға өшіріп, өшіріп тұрыңыз.", + "添加成功": "Сәтті қосу", + "更新成功": "Сәтті жаңарту", + "搜索": "Іздеу", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Қайта ысырып ысырып алудан соң, блоктауды өшіріледі, ысырып тастауды қалайсыз ба?", + "已失效": "Қате емес", + "卡详情": "Карта ақпараты", + "请输入": "Мұнда келтіріңіз", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "ШЫМЫШАға ауысқанда, The Lock бүкіл күні қолмен бұғаттап қалды.", + "请输入小于或等于60的数字": "60ден кем санды келтіріңіз", + "操作成功": "Операция сәттін", + "管理员密码相同,无需修改": "Әкімшіңіз паролі біреу және өзгертілмейді", + "请输入6-9位数字": "6-9 таңбала ұзындығы", + "请输入6-9位管理员密码": "6-9 цифры әкімшінің паролін келтіріңіз", + "请输入新的管理员密码": "Жаңа әкімшінің паролін келтіріңіз", + "未分组": "Топталмаған", + "请输入分组名称": "Топты құру", + "创建成功": "Сәтті құру", + "设置锁分组成功": "Бұқсат тобы сәтті орнату", + "电池1电量": "Батарея 1", + "电池2电量": "Батарея 2", + "电量更新时间": "Батарея жаңарту уақыты", + "锁电量更新成功": "Жүктеу жаңарту сәтті бұғаттау", + "您的钥匙未生效": "Кілті", + "您的钥匙已冻结": "Кілті", + "您的钥匙已过期": "Кілті", + "常开模式开启": "Бұқсат беру режіміндегі", + "超级管理员": "Супер администраторы", + "授权管理员": "АуыстырылдыComment", + "普通用户": "Әдетті пайдаланушысы", + "余": "Балансы", + "天": "Күн", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Бұғат өшірілген соң, барлық мәлімет бірге өшіріледі, блоктауды өшіріңіз келгені рас па?", + "请输入登录密码": "Қолданбаның парольді келтіріңіз", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Құрылғыны өшіру қатесі, құрылғысы құрылғысына жағы екенін тексеріңіз, құрылғы қосылмаған, Құрылғы қосулыды", + "用户无权限": "Пайдаланушының рұқсат жоқ.", + "创建公司后,考勤功能才能使用": "Бірінші компоненті құрыңыз", + "是否删除钥匙?": "Осы ekey өшірілсін бе?", + "邮箱绑定成功": "Эл. пошта сәйкесті сәттіComment", + "手机绑定成功": "Жергілікті телефон жалғастыру сәттіComment", + "网络访问失败,请检查网络是否正常": "Сұрау жаңылысы", + "清空": "Тазалау", + "是否清空?": "Тазалы?", + "消息详情": "Хабарлама ақпарат", + "创建时间": "Жазу уақыты", + "管理员详情": "Администраторы егжей- тегжейі", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Егер сізді шұқсаты ашып кетпесеңіз бұл картасын қолдануға болады. Ескерту хатты администерге жіберілді. Бұл мүмкіндігін қолдану үшін блоктауыңызды онлайн екенін тексеріңіз.", + "请不要将胁迫卡用于日常开锁": "Күнді қолданылмаңыз.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Егер сізді әрі ашыруға маңызды, осы қайшы басты болады. Ескерту хатты администерге жіберілді. Бұл мүмкіндігін қолдану үшін блоктауыңызды онлайн екенін тексеріңіз.", + "请不要将胁迫指纹用于日常开锁": "Күнді қолдану үшін мақтаған бақылауды қолданбаңыз.", + "创建公司": "Компанияны жасау", + "公司名称不能超过30个字符": "Компанияның атауы 30 таңбалар артық болмайды", + "公司名称不能小于6个字符": "Компанияның атауы 6 таңба болмайды", + "WIFI列表": "WIFI тізімі", + "刷新": "Жаңарту", + "手动配网": "Қолмен үлестірім желіName", + "远距离": "Үл қашықтығы", + "中距离": "Орташа қашықтығы", + "近距离": "Қысқа қашықтығы", + "锁时间更新成功": "Уақыт жаңарту сәтті бұғаттау", + "锁用户": "Пайдаланушыларды бұғаттау", + "请选择常开日期": "Ашылған күнді таңдаңыз", + "结束时间不能小于开始时间哦": "Аяқтау уақыт бастау уақыттан кем болмайды", + "介绍": "Біздің оқымы", + "个人信息收集清单": "Жеке ақпарат жинақтар", + "应用权限说明": "Қолданба рұқсат сипаттамасы", + "第三方信息共享清单": "Үшінші ақпаратты ортақтастыру тізімі", + "请选择您的位置": "Орналасуыңызды таңдаңыз", + "请先选择位置": "Бірінші орналасуын таңдаңыз", + "管理员密码": "Әдетті өшіру", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Егер өзгерту керек болса, жаңа әкімшіші", + "修改": "Өзгерту", + "网络摄像头": "КамераName", + "重命名": "Атын ауыстыру", + "分组下的锁将被移到未分组里": "Топтың төменгі блокталар тобысмен жылжытады", + "编辑成功": "Сәтті өңдеу", + "厂商": "Өлшегіш", + "型号": "Жинағы", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Пароль құрылғаннан соң, бір кейбір кейбір кейін белсендіру үшін қолданыңыз. Әдетті сағат 0 о'тан кейін дұрыс емес. Пароль белсенділген соң, дұрыс уақыт аралығында шектелбеген уақыттарды қолданылады.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Пароль құрылғаннан соң, сол күнде 23:59 алдында қолданыңыз, 0 сағатдан кейін дұрыс емес. Тазалау код бүгүнкі 0 сағат алдында құрылған барлық парольдерді өшіру үшін қолданылады.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Пароль құрылғаннан соң, сол күнде 23:59 алдында қолданыңыз, 0 сағатдан кейін дұрыс емес.", + "清空密码底部提示": "Пароль бос күнде 23: 59ге дұрыс", + "相机": "Камера", + "相册": "Фотографиялары", + "读写": "Сақтау", + "定位": "Орналасуы", + "需要访问相机权限才能拍照上传文件例如头像上传": "Фотографиялар мен файлдарды жүктеу үшін камера қатынау керек.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Альбом кескіндердің файлдарды жүктеп алу үшін камера қатынау талап етей", + "需要访问读写权限才能使用本地图片上传头像": "Жергілікті суреттерді жүктеу үшін оқу мен жазу рұқсаттары керек рұқсат ету", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Кілттер функциясы қолдану үшін орналастыру мәліметі керек", + "申请": "Бағдарламасы", + "权限": "Рұқсаты", + "不允许": "Рұқсат емес", + "允许": "Рұқсат", + "权限被拒绝": "Рұқсаты жоқ", + "请手动在系统设置中开启": "Жүйелік параметрлерде қолмен іске қосыңыз", + "权限以继续使用应用": "Қолданбаны жалғастыру рұқсат ету.", + "去设置": "Оны орнату", + "当前网络": "Назардағы желіName", + "位置信息": "Орналасуы ақпарат", + "请输入wifi名称": "Wifi атауын келтіріңіз", + "虹膜": "Iris", + "手掌": "Пальм", + "商城": "Ескері", + "我的": "Менін", + "微信公众号推送": "Жалпы тіркелгі тіркеу", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Ескерту хабарламасын алу үшін, алдымен Skye Smart Lock wechat ашық тіркелгі тіркелгісін ашу керек. QR кодын сақтау және баптауларды сканың үшін wechat қолданыңын", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Кілттерді қосу функцияның орналасуы қолдану үшін Bluetooth рұқсаттарын қатынау керек еті", + "请输入Email": "Эл. поштаңызды келтіріңіз", + "请输入手机号": "Телефон нөміріңізді келтіріңіз", + "家人到家": "Үл-ші мүшесінге кетті.", + "添加家人": "Үлкен мүшесін қосу", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Егер блоктау Интернетке қосылмаған болса, парускод, карта, сақтық басуы және басқа шкірі ашу тәсілі уақытша жібермейді.", + "消息提醒": "Ескерту:", + "开门通知": "Ескертуді ашу", + "N天未开门": "N күнде ашу", + "门未关好": "Қашы жабылмайды", + "防拆报警": "Темпер ескертуі", + "低电量提醒": "Төмен батареясы", + "胁迫开门": "Жақсатын ашу", + "有人按门铃": "Келесі қашықтығы рұқсаты.", + "有人出现在门口": "Келесі қазірінде көрсетеді.", + "提醒方式": "Ескерту жолы", + "开门方式": "Қашықты ашылсын", + "请选择": "Таңдау", + "家人": "Үлгі мүшесіName", + "保存": "Сақтау", + "APP推送": "APP басы", + "管理员": "Adminu", + "未启用": "Қосулмаған", + "已启用": "Қосулы", + "省电模式": "Қуатты сақтау режімі", + "逗留抓拍模式": "Қалыу", + "实时监控模式": "Үтін уақыт бақылау режімі", + "自定义模式": "Таңдауыңызша", + "猫眼设置": "Көшін баптаулары", + "猫眼工作模式": "Көшін көзі жұмыс режімі", + "自动亮屏": "Автоматты түрде жарық экраны", + "亮屏持续时间": "Экран уақыты", + "逗留警告": "Ескерту болсын", + "异常警告": "Әдетті ескертуі", + "短信提醒": "SMS", + "邮件提醒": "Эл. поштасы", + "N天未开门提醒": "N күнде ашу", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Егер сізді бұғаттарга мәжбүрлеп тұрса, осы бақылауды қолдануға болады. Ескерту хабарламаны administorға жіберіледі. TO осыны қолданыңыз, блоктауңызды онлайн деп тексеріңіз.", + "胁迫指纹": "Мәжбүрлі аралығын", + "指纹列表": "Бақылау тізімі@ info: whatsthis", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Белгісі қойылмаған уақыттан соң, бұғаттау ашылмаса, жүйе таңдалған алушыға еске салу хабарламаны жібереді. Бұл функция бұғаттау интернетке қосылу керек.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Ескертуді рұқсат етілгеннен соң, бұғас батареясы 20%, 10% және 5% төменге болса, Жүйені таңдалған алушыға еске салу хабарламасын жібереді.", + "未开门时间": "Қақша ашылған күндер", + "添加和使用面容开锁时:": "Жүктеу кезінде таңдау қос мен қолдану:", + "关锁": "Бұғаттау", + "功能": "Функциясы", + "配件": "Parts", + "云存": "Бұлт сақтау", + "本地": "Осы жерік", + "3天滚动储存": "3 күн жылжыту сақтау", + "去升级": "Қазір жаңарту", + "下载列表": "Жүктеу", + "已下载": "Жүктеу", + "全部视频": "Барлық видеолар", + "已为本设备免费提供3大滚动视频储存服务": "Құрылғының шкі видео сақтау қызметі орындалды", + "视频播放": "Видео ойнау", + "全选": "БарлықтыName", + "请选择要删除的视频": "Өшіру келетін видеоін таңдаңыз", + "请选择要下载的视频": "Жүктеу үшін осы видеоты таңдаңыз", + "欢迎使用": "Қолданға қоша", + "用户协议和隐私政策概要": "Пайдаланушы келесі мен бақылау ережесінің ақпарат", + "协议概要": "Протоколды тобысы", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Бұл қолданба қолданбасы үшін рахмет. Біздің жеке мәліметіңізді әдеттіңізге және жеке ақпараттық қорғастырыңызды. Осы продуктты қолдану алдында, оны ескертін оқыңызName", + "《用户协议》": "Пайдаланушы ақпараты", + "和": "Сот", + "《隐私政策》": "חPrivacy ережес", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Барлық мазмұны. \"Кеңреңіз\" дегенді басып, барлық сөздерді келтіріп келесіз. Егер келтірілмесін таңдаңыз, біздің продукттары мен қызметтерді қолдануға болмайсыз, бағдарламадан шыға аласыз.", + "不同意": "Есепмеу", + "同意": "Келтіру", + "该功能是高级功能,请开通后再使用": "Бұл - қосымша функциясы. Алдымен қосыңыз.", + "常用程序": "Жалпы бағдарлар", + "该锁已被重置": "Бұғастырылды", + "需要访问读写权限才能使用手动升级固件": "Оқу мен жазу үшін рұқсаттары қолмен жаңарту үшін, рұқсат етілсін", + "错误D固件,请选择正确的文件": "Қате формвері, керек файлды таңдаңыз", + "非SYD固件,请选择正确的文件": "SYD формвері емес. Дұрыс файлды таңдаңыз", + "文件校验失败 0x01": "0x01 файлды тексеру жаңылысы", + "解析元数据失败,请选择正确的文件": "Мета деректер талдау сәтсіз. Дұрыс файлды таңдаңыз", + "文件校验失败 0x02": "0x02 файлды тексеру жаңылысы", + "文件校验失败 0x03": "Файлды тексеруді 0x03 қатесі", + "固件升级完成": "Firmware жаңарту аяқталды", + "记录": "Жазуы", + "开通高级功能后才可以对锁进行管理": "Блоктерді басқаруға қосымша функциясын рұқсат етіңіз.", + "去开通": "Қосулы", + "实名认证": "Пайдаланушы аутентификациясы", + "当前剩余数量": "Қала", + "购买": "Сығат", + "实名认证为付费功能,请购买后再使用": "Үлгі атауы аутентификация ашқан функция, сақтан кейін қолданыңыз", + "密码不一致哦": "Парольдер болмаған", + "退出添加": "Қосууда шығу", + "管理员已满": "Келесі өшіру", + "用户已满": "Пайдаланушы толықтар", + "锁上面添加指纹已满": "Бұқсат қылу", + "指纹已存在": "Бақылау тізімі бар ғой.", + "锁上面添加人脸已满": "Жоғарда қосу түрін блоктау толды", + "人脸已存在": "Көріс бар ғой", + "锁上面添加卡已满": "Жоғарда қосу", + "卡已存在": "Карта бар ғой", + "锁上面添加密码已满": "Жоғарда қосу", + "密码已存在": "Бастапқы кодтамасы бар ғой.", + "请输入密码": "Парольді келтіріңіз", + "暂无密码,无需重置": "Парольді жоқ, ысырып тастау керек емес", + "真实姓名": "Үлгі аты", + "身份证号": "ИД нөмірі", + "请输入真实姓名": "Ауыстыңызды келтіріңіз", + "请输入身份证号": "ИД нөміріңізді келтіріңіз", + "请输入身份证号和真实姓名": "ІД нөміріңіз және шын атауыңызды келтіріңіз", + "点击返回设备配对": "Құрылғының пішіміне қайтау", + "无法连接?尝试升级": "Қосылмады?", + "固件升级提示": "Firmware жаңарту сұранысы", + "请先获取固件文件到手机本地,再选择升级": "Бірінші жергілікті телефонға фирмайлер файлды алу және жаңартуін таңдаңыз", + "固件升级中": "Формвердің жаңартылды", + "取消升级": "Жаңарту бастау", + "固件传输中": "Бірнеше FirmwareComment", + "关闭": "Аюу", + "传输中'": "Қайталау", + "操作记录": "Жазуы", + "修改姓名": "Атауы өңдеу", + "传输中": "Қайталау", + "发送人": "Тіркен", + "发送时间": "Уақыты", + "钥匙详情": "Ekey мәліметі", + "姓名": "Атауы", + "发送": "Жіберу", + "请确认姓名全名和身份证号码是否正确": "Толық атау және ID нөмірі дұрыс екенін тексеріңіз", + "传输期间请勿离开当前页面": "Ағымдағы парақтан тастау", + "机型": "Моделдер", + "硬件版本": "Hardware нұсқасы", + "固件版本": "Firmware нұсқасы", + "手动升级": "Қолмен жаңарту", + "设备连接中...": "Құрылғы қосылу", + "未避免异常情况,请在门打开时升级": "Өлкелмейтін сәйкестіктер, әзін ашылғанда жаңартуіңіз", + "钥匙无效": "Кілтті дұрыс емес", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Жұмысқа қосылмады", + "如果是全自动锁,请使屏幕变亮": "Егер толық автоматты түрде бұғатталса, экранды жарықтайтын жасаңыз", + "正在尝试闭锁……": "Бұғатталды. Күте тұрыңыз...", + "清空记录": "Жазбаларды тазалау", + "是否要删除操作记录?": "Жазбаларды өшіру жалғастыру керек пе?", + "被删除的记录不能恢复": "Өшірілген кейін жазбалар қайталамайды.", + "全部事件": "Барлық оқиғалары", + "开锁事件": "Оқиға жіберу", + "异常事件": "Әдетті оқиған", + "门铃事件": "Қашықтығы рұқсат", + "视频事件": "Видеоо", + "请开启蓝牙": "Bluetooth ендіріңіз", + "请选择有效日": "Нақтығы күнді таңдаңыз", + "公司名字长度不能小于 6 ": "Компания атының ұзынды 6ден кем болмайды", + "已是最新版本": "Жаңарту жоқ", + "新建短信模版": "SMS үлгі құру", + "新建邮件模版": "Эл. пошта үлгі құру", + "自定义短信模版": "SMS үлгісі", + "自定义邮件模版": "Эл. пошта үлгі:", + "名称": "Атауы", + "星星锁": "Жұлдыз бұғасы", + "无考勤记录": "Жазу жоқ", + "大家干劲十足": "Барлық уақытта келеді.", + "工作时长未出炉": "Жұмыс сағаттары жоқ", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Елдер/ реңгенді таңдау деректер қауіпсіздікке жеткілікті болады. Албанияны таңдалған, сонда тексеріңіз.", + "确认国家或地区": "Айт/күлдерді құптау", + "我知道了": "Оны алсын", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Маңызды жаңартуларды алу үшін 'ОК' дегенді басып, баптауларда құлақтандыру рұқсат ету.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Желіденнен кейін, перне енгізу басып, APP-мен қайта қоса аласыз.", + "已有": "Ағыма", + "新增": "Жаңа:", + "账号格式错误": "Қате пішімі", + "接收者信息为空": "Алушы мәлімет бос", + "请输入时间(秒)": "Уақытты келтіріңіз (сек)", + "加载数据失败": "Деректер жүктеу қатесі", + "重试": "Қайта әрекеті", + "升级中,是否退出": "Жаңарту кезінде шығу керек пес", + "下一步": "Келесі", + "公寓": "Ортақ", + "个人用户": "Жеке", + "星寓": "Жұлдыз", + "账号": "Тіркелгі:", + "请输入手机号或email": "Телефон нөмірін не эл. поштасы", + "请输入星寓管理员的账号": "Жұлдыздың әкімшінің тіркелгісін келтіріңіз", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Таңдалған бұғаттардың барлық деректер алушыға қайда алмайды.", + "暂不支持跨平台转移,敬请期待": "Көрсетілетін платформ ауысу қолдамайды, олды күтіңіз.", + "移除坏锁": "Бұқсат/ Қолданған блоктарды өшірілгендерге тастау", + "转移确认": "Тапсырманы құптау", + "本次共转移": "Бұны жалғастыру", + "把智能锁": "Қайталау", + "确认": "ОК", + "移除成功": "Сәттін өшіру", + "转移成功": "Ауыстықтау", + "该已锁被删除": "Бұғатталған өшірілген", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Сыртталған администратор ғана ғана пасскоды, текшері және т.д.", + "添加授权管理员": "Администраторты құру", + "导出记录": "Жазуды экспорттау", + "选择时间段": "Уақыт уақытын таңдау", + "导出": "Экспорттау", + "批量导出": "Бағдарлама экспорттау", + "读取记录": "Жаңарту", + "设备": "Құрылғысы", + "消息": "Хаттар", + "智能分析": "Интелгент аналітикасы", + "精准识别设备事件,过滤无效信息": "Құрылғы оқиғалар дұрыс анықтап, дұрыс емес ақпаратын сүзгісін", + "系统设置": "Жүйе баптаулары", + "系统的全局配置在此项内进行设置": "Бұл элементте жүйенің жалпы баптаулары орнатын", + "导出操作记录": "Жазуды экспорттау", + "立即查看": "Көрініс", + "导出成功": "Сәтті экспортталды", + "发送钥匙": "Ekey жіберу", + "进度": "Өшірілі", + "失败": "Қатесі", + "人脸详情": "Көрсетілері", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Бірақ шқашанда 1.5 мсят сезімдегенде, өшірісті автоматты түрде басталады.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Келесі шқашанда 0,8 мсят сезімде, әзін таңбалауы автоматты түрде басталады.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Бірақ шқашанда 0,5 мсяттарды сезілген кезде, әзін таңбалауы автоматты түрде басталады.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Сездеру қашықтығы өшірілген, пернетақтаның келтірілген перне қолмен тіркеу керек.", + "防误开已打开,开锁后": "Келесі аяқталған ашқаны жегілді, жегілді", + "秒内不可使用面容开锁": "Өшіруге өшіру секундда қолданылмайды", + "掌静脉": "Палм вея", + "添加掌静脉": "Палмды қосу", + "胁迫掌静脉": "Мәжірген пальм", + "请不要将胁迫掌静脉用于日常开锁": "Күн- күнді бұғаттау үшін ғоймау", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Қолшаға қосылған, қалдыңізді ашуды, аңды камерасын көреу", + "掌静脉详情": "Palm венан егжей- тегжейі", + "掌静脉号": "Палмша саны", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth енгізілмеген, Bluetooth баптауларын көрсетіңіз", + "删除用户时,会将用户拥有的钥匙一起删除。": "Пайдаланушының келтірілген, егер Пайдаланушыға сәйкес келеді.", + "配置网络": "Желі & баптау", + "你好": "ЖарыName", + "成功": "Сәттін", + "类型选择": "Таңдау", + "请选择要使用哪种类型": "Қолданатын түрін таңдаңыз", + "系统邮件(推荐)": "Жүйелік эл. пошта (кеңдеген)", + "系统短信(推荐)": "Жүйелік SMS", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Эл. пошта осы App іске жібереді. Алдымен эл. пошта дестесін сақтайды.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS осы App іске жіберілді. Алдымен эл. пошта дестесін сақтайды.", + "个人邮件": "Жеке...", + "个人短信": "Жеке SMS", + "邮件将从你的个人邮箱发给用户": "Эл. пошта тіркелгіңізден жібереді.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS хабарламаның жеке телефон нөміріңізден жіберіледі.", + "为了更好地应用体验,请确定权限": "Бағдарламаның әдетті рұқсаттарды тексеріңіз", + "您第一次拒绝权限,请确定权限": "Сіз бірінші рет рұқсат еткеніңіз, рұқсаты тексеріңіз", + "您第二次拒绝权限,请去应用设置开启权限": "Сіз рұқсат рұқсат еткеніңіз, рұқсат ету үшін қолданбаның баптауларыға өтіңіз", + "去应用市场": "Бағдарламасына өту", + "温馨提示": "Жарқым сұралы", + "关闭应用": "Қолданба жабу", + "开启微信接收报警消息需要先关注": "\"WeChat\" ескерту хабарламасын алуға ашу үшін қолдану керек.", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat жарлық тіркелгі тіркелгі, QR кодды сақтап WeChat баптауларды скандау үшін қолданылсын", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Үлгі атауы аутентификация ашу функциясы, сақтау және қолдану үшін блок әкімшімен хабарласыңыз", + "位置权限": "Орналасуы рұқсаты", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Лоцианыңызды қолдану үшін App- ге жетіңіз. БЛЕ бұғаттарды және шшұрарды сканер үшін қолданылады.", + "相机/相册权限": "Камера/ Альбом рұқсат ету", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Қосымша оқып, жазу үшін App оқыңыз.", + "点击选择": "Таңдау үшін түртіңіз", + "微信": "WeChat", + "朋友圈": "Текшер", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "WeiboName", + "FaceBook": "FaceBook", + "链接": "Сілтеме", + "今天": "Бүгіз", + "密码错误": "Жарамсыз пароль", + "网络中断": "Желі өшіру", + "钥匙不存在": "Кілтті жоқ", + "钥匙过期": "Кілт мерзімі мерзімі", + "钥匙已存在": "Кілтті бар ғой", + "密码失效": "Пароль қате", + "门锁时间异常": "Қашықтың бүкіл уақыты дұрыс емес", + "APP(手机)未联网": "APP (шкіл телефон) Интернетке қосылмайды", + "数据不存在": "Деректер жоқ", + "待接收": "Қатынасы", + "已冻结": "Кіреу", + "已删除": "Өшірілген", + "未知": "Белгісіз", + "拖动下方滑块完成拼图": "Жүйені дұрыс орындау", + "验证成功": "Тексеру сәттін", + "验证失败": "Тексеру жаңылысы", + "向右拖动滑块填充拼图": "Жүктеу үшін оңға басып салу", + "请先获取到位置信息哦": "Алдымен орналастыру мәліметті алуын", + "请选择国家": "Айты таңдаңыз", + "获取锁信息": "Бұғат мәліметті алу", + "锁数据异常,请重试": "Бұғат деректер дұрыс емес, қайталап көріңіз", + "连接设备中...": "Құрылғы қосылу...", + "把锁": "Бұғат", + "条": "Стропт", + "封": "शবিд", + "次": "Уақыты", + "支付成功": "Жетілмен", + "查看详情": "Егжей- тегжейлерді қарау", + "请输入模板名称": "Үлгі атауын келтіріңіз", + "模版类型": "Түрі", + "再返回一次退出": "Қайта шығу", + "请先添加锁": "Алдымен блоктауды қосыңыз", + "可视对讲": "Көріністі", + "详细日志": "Егжей- тегжей журналы", + "已复制到剪切板": "Көшірілген", + "拍照": "Фотост", + "从相册选择": "Альбомдан таңдау", + "选择问题": "Сұраныс таңдаңыз", + "确认长度不足8位": "8 цифран кемен ұзынды құптау", + "新密码长度不足8位": "Жаңа пароль ұзынды 8 цифран кем", + "两次密码不一致": "Пароль қате", + "请点击获取验证码,验证码将发送到": "Тексеру кодын алыңыз.", + "切换": "ӨзгертуComment", + "验证": "Тексеру", + "验证成功,账号已删除": "Тексеру сәтті, тіркелгі өшілді", + "该密码不是自定义密码,无法修改": "Бұл пароліңіз паролі емес және өзгертілмейді", + "请选择设备要关联哪些姓名": "Құрылғының атауын таңдаңыз", + "请选择姓名要关联哪些设备": "Атауы қай құрылғылармен сәйкес келтіру таңдаңыз", + "确定要移除所选中的坏锁吗?": "Қате істейтін блоктауды өшірілсін бе?", + "邮件通知": "Эл. поштамен құлақтандыру", + "短信通知": "SMS- пен құлақтандыру", + "您好,您的授权管理员生成成功": "Сейме, әкімшіңіздің әкімші сәтті құрылды", + "请输入接收者姓名": "Мұнда келтіріңіз", + "版本更新": "Нұсқасын жаңарту", + "下次再说": "Келесі рет", + "配网成功": "Желі үлестірімін сәттіComment", + "配网失败": "Желіден үлестірім қатесі", + "该锁的无线键盘都将被删除": "Осы бұғаттау үшін барлық жағалмаған пернестер енгізілсін", + "实时画面": "Үтін уақытын суреті", + "适合门口较为安全的环境。": "Қазіріптеге салыштырмалы қауіпсіз қоршауы үшін керек.", + "仅发生特定事件才录像,并可查看实时画面。": "Тек таңдалған оқиғалар жазылатын және шын уақыт суретті қарауға болады.", + "一般情况下,满电可使用7-8个月": "Кәдімгі шарттарда, ол толық сұраныс ай болса, 7-8 ай болады", + "有人逗留或发生特定事件才录像,可随时查看": "Келесі қалыпты немесе оқиғалар жазылды, әдетте қарауға болады.", + "实时画面。": "Үлгі уақытың сурет.", + "一般情况下,满电可使用5~6个月。": "Кәдімгі шарттарда, ол толық дұрыс болса, 5 ~ 6 ай үшін қолданылады.", + "适合门口人员复杂、较不安全的环境。": "Қазіріпте комплекс және қалпына қауіпсіз қоршауы үшін керек.", + "有人出现就录像,可随时查看实时画面。": "Келесі көрсеткенде жазып, әдеттеріңіз.", + "一般情况下,满电可使用2~4个月。": "Кәдімгі шарттарда, ол толық дұрыс болса 2 ~ 4 ай үшін қолданылады.", + "根据您家门口实际情况设置录像和实时画面功能。": "Келесіңіздің қазірі", + "可使用时长由具体设置决定。": "Қолданған уақыты таңдау параметрлерімен анықтайды.", + "查看": "Көрініс", + "有人按门铃或发生": "Келесі шұқсаттар", + "异常事件时": "Оқиға ақпараты", + "不录像": "Видео жоқ", + "有人出现、按门铃": "Келесі көруді, қашықтығы рұқсаты.", + "或发生异常事件时": "Не дұрыс емес оқиған", + "逗留达到10秒": "10 секунд болсын", + "约1.5米": "1.5 метр мағ", + "随时": "Келесі уақыты", + "立即录像": "Тіркен", + "录像时机": "Видео уақыты", + "有人出现时录像": "Келесі көргенде жазу", + "人体侦测距离": "Адамның байқау қашықтығы", + "查看实时画面": "Үлгі уақыт суретін қарау", + "自定义时间": "Таңдауыңызша", + "当日": "Бүгіз", + "次日": "Келесі күні", + "自定义时段": "Таңдауыңызша", + "发生事件时查看": "Оқиғанда көрсетілсін", + "实时查看": "Үтін уақыт көрінісі", + "有人在门口出现10秒后开始录像。": "Келесі 10 секунда келтіріп келеді.", + "有人按门铃时立即录像。": "Келесі шұқсатқа ауысқанда жазыңыз.", + "有人出现在门前1.5米范围时启动录像": "Келесі қазірді 1,5 метрде көрсеткенде жазуды бастаңыз", + "约0.8米": "0.8 метр мағ", + "约3.0米": "3, 0 метр мағ", + "添加指纹失败": "Операция жаңылысы.", + "项": "Элементтер", + "播放中": "Ойналу", + "下载": "Жүктеу", + "暂无下载内容": "Жүктеу мазмұны жоқ", + "亮度": "Жарықтығы", + "音量": "Үнді", + "快进至": "Жоғарда тез", + "快退至": "Қайта", + "暂无视频信息": "Видео мәлімет жоқ", + "加载出错": "Жүктеу қатесі", + "请单人正对门锁,距离一个成年人手臂长度": "Қазір шықтауға тек қатынасында тураңыз", + "(约0.6米)。": "(Середер 0,6 метр)", + "保持脸部无遮挡,露出五官。": "Өстіңізді тіркеліңізді тағыңызды көрсетуіңіз.", + "准备好了,开始添加": "Дайын, қосу бастау", + "正在录入中...": "Жазууда...", + "添加人脸失败": "Қалыпты қосу қатесі", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Қайта ысырып алудан соң бұғаттары өшіріледі. Шынымен ысырып тастауды қалайсыз ба?", + "人脸号": "Қасыр нөмірі", + "虹膜详情": "Iris- тегжей- тегжейі", + "虹膜号": "Ирис нөмірі", + "选择设备类型": "Құрылғы түрін таңдау", + "照明灯具": "Ашырыл", + "电动窗帘": "Электрикалдыр", + "门窗传感器": "Қашы мен терезе сенсоры", + "传感器": "Сенсорыс", + "清除数据成功": "Деректер сәтті тазаланды", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Бұқсат интернетке қосылмайды, сондықтан парускод, карта, жіберу және басқа ашу тәсілі уақытта жүктелмейді.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Егер тариқи жазуларды сақтау керек болса, оларды экспорттай аласыз.", + "看不到操作记录,可能原因有": "Операция жазулары, мүмкүн себебі көрсетілмеді", + "操作记录详情": "Операция жазу егжей- тегжейі", + "操作时间": "Операция уақыты", + "此模块功能需要锁联网后设置方可生效": "Интернетке қосылғаннан соң модулі функциясы орнату керек", + "用户已存在": "Пайдаланушы бар ғой", + "钥匙数量已到上限": "Кілттер саны жоғарғы шегін жетті.", + "附近没有可用网关": "Келесі шлюзу жоқ", + "正在创建安全连接...": "Қауіпсіз қосылымды құру...", + "监视状态下不能发送录音": "Жазуды баптау режімінде жіберу мүмкін емес", + "挂断": "Қайтау", + "监视中暂不能开锁": "Баптау кезінде бұғаттау қолтаңбасы жоқ", + "长按说话": "Сөйру үшін басып сақтау", + "松开发送": "Жіберу үшін өшіру", + "请输入6位数字开锁密码": "6- цифрын бүкіл алу парольді келтіріңіз", + "请输入开锁密码": "Өшіру парольді келтіріңіз", + "接收者在有效期内可以不限次数使用": "Алушылар дұрыс аралығында ejeys шектелбеген уақытына қолдануға мүмкін.", + "接收者可以使用此App开关锁": "Алушысы осы App-мен бұғаттау/ бұғаттау мүмкін.", + "单次钥匙有效期为1小时,只能使用一次": "ЕНЕ сағат үшін дұрыс болмайды, ғана ғана бүкіл.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Алушылар нүктелген цикл уақытта шектелбеген уақытына қолдануға мүмкін.", + "获取模板失败": "Үлгі алу қатесі", + "微信通知": "WeChat құлақтандыру", + "系统短信": "Жүйелік SMS", + "系统邮件": "Жүйе эл. поштасы", + "模板": "Үлгілер", + "新建模版": "Үлгіні құру", + "您好,您的密码是": "Сыял, пароліңіз...", + "密码名字": "Пароль атауы", + "请输入6-9位密码": "6-9 цифрлау паролін келтіріңіз", + "设置密码": "Пароль орнату", + "操作成功,密码为": "Сәтті.The Passcode is", + "类型:自定义-永久": "Түрі: Таңдау", + "实时播放": "Үтін уақыт орындау", + "点击对讲": "Интерфейстін басыңын", + "长按开锁": "Бұға шығару үшін әзін басу", + "接听失败": "Жауап беру қатесі", + "请在锁设置中开启远程开锁": "Бұғат баптауларын қашықтағы бұғаттау", + "接听": "Жауап", + "截图已保存到相册": "Экраншот альбомға сақталды", + "添加遥控": "Қашықтағы контролді қосу", + "已连接到锁,请按遥控": "Бұғатталған, қашықтан басқаруды басыңыз", + "遥控号": "Қашықтағы басқару нөмірі", + "遥控详情": "Қашықтан басқару егжей- тегжейі", + "照明": "Өткіншіweather condition", + "退出演示模式": "Дейманы шығу", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Мәлімет: Назардағы интерфейс - дисплей интерфейсі. Құрылғыны қосқаннан соң, оны қолдануға болады.", + "门已上锁": "Қашысы бұғатталды", + "您的账号在异地登录,如非本人,请尽快修改密码": "Тіркелгіңізге жаңа құрылғыдан кіру үшін қолданылды", + "开门成功": "Қашықты сәтті ашу", + "开门失败": "Қашықты ашылмады", + "呼叫提醒": "Ілеспелер еске салу", + "收到来自": "Алынталды", + "锁的呼叫": "Бұқсат шақыру", + "加载数据中": "Деректерді жүктеу", + "搜索所有锁类型": "Бұқсат түрлерін іздеу", + "锁电量更新时间": "Батареяны жаңарту уақыты", + "1月": "Джен", + "2月": "Feb", + "3月": "Brazil. kgm", + "4月": "Africa. kgm", + "5月": "Мей", + "6月": "Джун", + "7月": "July", + "8月": "Aug", + "9月": "Sep", + "10月": "Ок", + "11月": "Nov", + "12月": "Дек", + "热门城市": "Қалыр", + "导出锁数据": "Бұғат деректер экспорттау", + "一键开锁": "Жүктеу шерту", + "已开通": "Ашылған", + "编辑员工": "Таңдау", + "一": "Бірі", + "二": "Еш", + "三": "Үш", + "四": "Төрт", + "五": "Бест", + "六": "Алтынта", + "日": "Күн", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?", + "在线": "Онлайн", + "离线": "Желіде емес", + "购买记录": "Сөндіру жазу", + "使用记录": "Пайдаланушы жазу", + "失效时间要大于当前时间": "Уақыт уақыты назардағы уақыттан артық болу керек.", + "修改名字": "Атауы өңдеу", + "时": "Сағат", + "分": "Минуты", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Бұғат күй- жайын шектеу үшін Alexa қолдануға, бұғаттап тексеру", + "支持的国家": "Қолданысталған елдер", + "支持的国家值": "Америка, Канада, Британия, Австралия, Индия, Германия, Франция, Италия, Испания, Япония, Япония.", + "操作流程": "Әрекет процесі", + "操作流程值": "1 Smart Lock APP- ғазамен бұғаттау мен шүшін\n\n2 APP- ге бұғатталған қашықтағы бұғаттау функциясын рұқсат ету Егер бұл параметрі жоқ болса, блокта Alexa қолдамайды\n\n3 Alexa дегенге бақылауды қосып, оларды Smart Lock APP тіркелгі мен паролін рұқсат ету. Құрылғының сәтті тіркелгісінде құрылғыларды табыла аласыз.\n\n4 Alexa қолданбасында блоктауды орнатыңыз, дақы бұғаттап тіл парольді орнату\n\n5 Бұқсат Alexa арнайы қолданылсын", + "Google Home": "Google Мекені", + "Action name": "Әрекет атауы", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Қолдайтын тілдер", + "英语": "Англияс", + "Google Home操作流程的值": "1. Бұғаттарды мен шшұрарды қосу үшін Smart Lock APP қолданылсын\n\n2. APP- ге блоктасын қашықтағы бұғаттау функциясын рұқсат ету Бұл құсбелгіні блоктау Google Home қолдамайды\n\n3. Google Home APP- енді орнатып, жоғарғы сол жақтағы батырмасын басыңын\n\n4. Баптаулар бетінде \"Google with Joork\" дегенді таңдаңыз\n\n5. \"ScienerSmart\" іздеп, Smart Lock APP тіркелгі тіркелгі мен паролін рұқсат ету үшін қолданылсын", + "密码需至少包含数字/字母/字符中的2种组合": "Парольді келесінің кемінде 2- кемде болу керек: сандар, әріптер мен арнаулы таңбалары", + "已开锁": "Жүктеу", + "已闭锁": "Бұғатталған", + "两次密码不一致哦": "Парольдер болмаған", + "中功率": "Орташа қуары", + "常规使用": "Қалыпты қолданылсын", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Келесі періңізнен соң, ысырып тасымалдау батырмасын басып 5 секунд басыңыз, Индикаторның жарықты ауыстырғанда, келесі басыңыз", + "扫描设备": "Сканер құрылғысы", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Өшіру жаңылысы. Келесі жіберді. Деректерді өшіргіңіз келе ме?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_ko.json b/lan/lan_ko.json new file mode 100644 index 00000000..589b5633 --- /dev/null +++ b/lan/lan_ko.json @@ -0,0 +1,1122 @@ +{ + "星锁": "스타 잠금", + "锁通通": "잠금 통해", + "点击开锁,长按闭锁": "잠금 해제 터치, 잠금 유지", + "考勤": "출석", + "考勤设置": "출석 설정", + "电子钥匙": "EKeys", + "添加卡": "카드 추가", + "卡号": "카드 번호", + "添加指纹": "지문 추가", + "指纹号": "지문 번호", + "遥控": "원격", + "添加人脸": "얼굴 추가", + "门锁日志": "도어 잠금 로그", + "密码号": "암호 번호", + "添加者": "연산자", + "添加时间": "시간", + "重置": "리셋", + "请输入手机号或者邮箱": "전화 번호 또는 이메일", + "工作时间": "근무 시간", + "工作日设置": "근무일 설정", + "星期一": "월요일", + "星期二": "화요일", + "星期三": "수요일", + "星期四": "목요일", + "星期五": "금요일", + "星期六": "토요일", + "星期日": "일요일", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "몬", + "周二": "화", + "周三": "웨드", + "周四": "Thu", + "周五": "금", + "周六": "토", + "周日": "태양", + "群发钥匙": "여러 ekey 보내기", + "锁": "잠금", + "请添加": "수령인", + "允许远程开锁": "원격 잠금 해제", + "请输入验证码": "검증 코드", + "获取密码": "암호 생성", + "请给密码命名": "이 암호의 이름을 입력합니다.", + "密码有限期为6个小时,只能使用一次": "이 암호는 현재 시간으로부터 6 시간 이내에 사용되어야 하거나 보안상의 이유로 중단됩니다. 이 암호는 한 번만 사용할 수 있습니다.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "수동으로 6-9 자리를 암호로 입력합니다. 잠금 장치 옆에 전화 블루투스로 추가하거나 게이트웨이를 통해 원격으로 추가 할 수 있습니다.", + "获取": "얻기", + "添加": "추가", + "删除公司": "회사 삭제", + "密码详情": "암호 정보", + "修改密码": "암호 변경", + "添加虹膜": "아이리스 추가", + "添加门磁": "도어 센서", + "添加无线键盘": "무선 키패드", + "添加手掌": "팜 추가", + "请输入员工账号": "직원의 계정 입력", + "批量授权锁": "여러 자물쇠 부여", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "권한있는 관리자는이 잠금을 작동 할 수있는 대부분의 권한을 갖습니다.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "이 기능을 사용하면 게이트웨이를 통해 스마트 잠금을 원격으로 잠금 해제 할 수 있습니다. 이 기능은 블루투스를 통해서만 켜거나 꺼질 수 있습니다.", + "排列方式": "목록 유형", + "早到榜": "초기 목록", + "迟到榜": "늦은 목록", + "当前模式": "현재 모드", + "勤奋榜": "작업 하드 목록", + "延迟时间": "지연 시간", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "잠금은 시간이 지나면 자동으로 잠깁니다. 설정을 사용할 수 있도록 한 번 먼저 잠금을 해제하십시오.", + "时间": "시간", + "开始时间": "시작 시간", + "结束时间": "종료 시간", + "工作时间设置": "작업 시간 설정", + "常开模式": "통로 모드", + "常开时间": "이 기간에", + "常开日期": "이 날에", + "添加员工": "직원 추가", + "节假日": "휴일", + "打卡方式": "방법", + "员工是否有钥匙": "이미 ekey가 있습니다.", + "上班时间": "시작 시간", + "下班时间": "닫는 시간", + "本周": "이번 주", + "单休": "하루 주말", + "双休": "이틀간의 주말", + "单双休": "1 일 2 일 주말", + "年": "년", + "月": "달", + "放假日期": "휴일", + "补班日期": "작업 일", + "添加假日": "휴일 추가", + "开始日期": "시작 날짜", + "必填": "필수", + "结束日期": "종료 날짜", + "日榜": "매일", + "月榜": "월간", + "考勤记录": "기록", + "假日信息": "휴일 정보", + "基本信息": "기본 사항", + "无线键盘": "무선 키패드", + "选择无线键盘": "키패드 추가", + "门磁": "도어 센서", + "自动闭锁": "자동 잠금", + "锁声音": "잠금 사운드", + "防撬报警": "탬퍼 경보", + "重置键": "리셋 버튼", + "锁时间": "잠금 시계", + "诊断": "진단", + "上传数据": "데이터 업로드", + "导入其他锁数据": "수입 frome 다른 자물쇠", + "锁升级": "펌웨어 업데이트", + "标记房态": "객실 상태", + "开锁提醒": "알림 잠금 해제", + "微信二维码": "QR 코드 잠금 해제", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "전자 키를 가진 사람들은 WeChat을 통해이 QR 코드를 스캔하여 문을 열 수 있습니다. 각 잠금 장치의 QR 코드가 다릅니다. 인쇄하여 해당 잠금 장치 옆에 붙여 넣을 수 있습니다.", + "锁编号": "잠금 번호", + "电量": "배터리", + "锁分组": "잠금 그룹", + "选择分组": "그룹 선택", + "创建新分组": "그룹 만들기", + "管理员开锁密码": "관리자 암호", + "更新": "업데이트", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "배터리 수준은 게이트웨이 또는 전화 블루투스로 업데이트됩니다.", + "当屏幕闪烁时,点击下一步": "키패드가 깜박일 때 다음을 클릭하십시오.", + "输入*529#或按设置键": "README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # 을 입력하거나 설정 키를 누릅니다.", + "长按重置键2秒": "리셋 버튼 2 초를 누르고", + "附近的设备": "주변 장비", + "暂无数据": "데이터 없음", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "게이트웨이와 함께 도어 센서로 도어 상태를 얻을 수 있습니다. 하나의 센서 만 잠금 장치와 연결할 수 있습니다.", + "开始": "시작", + "全天": "모든 시간", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "통과 모드에 대해 여러 기간을 설정할 수 있습니다. 설정된 기간 내에 잠금이 해제 된 후에도 잠금 장치가 열린 상태로 유지됩니다.", + "请选择锁音量": "잠금 볼륨을 선택하십시오.", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "켜면 자물쇠에서 소리가 들립니다.", + "低": "낮은", + "较低": "중간 낮은", + "中": "중간", + "较高": "중간 높이", + "高": "높은", + "开启后,锁被撬动时,会发出报警声": "전원을 켜면 TAMPER 경고를 활성화합니다.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "끄면 RESET 버튼이 비활성화됩니다.", + "校准时间": "시간 보정", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "진단은 잠금 장치 내부의 구성 정보를 읽고 직원이 실패의 원인을 분석 할 수 있도록 업로드하는 것입니다.", + "上传": "업로드", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "잠금에서 서버로 데이터를 업로드합니다. 몇 분이 걸릴 수 있습니다.", + "请选择要从哪把锁导入": "가져올 잠금을 선택", + "有新版本": "새로운 버전을 가지고", + "当前版本": "현재 버전", + "升级": "업데이트", + "空闲": "빈", + "已入住": "점령", + "多语言": "언어", + "添加锁": "잠금 추가", + "锁地址": "주소 잠금", + "选择锁类型": "잠금 유형 선택", + "NFC无源锁": "NFC 패시브 잠금", + "添加设备": "장치 추가", + "网关": "게이트웨이", + "客服": "고객 서비스", + "设置": "설정", + "更多设置": "더 많은 세트", + "消息推送": "알림 푸시", + "锁用户管理": "사용자 잠금", + "拥有的钥匙": "이 사용자와 관련된 eKeys", + "批量授权": "권한 관리", + "关联设备": "관련 장치", + "关联姓名": "관련 이름", + "转移智能锁": "전송 잠금", + "选择锁": "화면 잠금", + "接收人信息": "수령인", + "转移网关": "전송 게이트웨이", + "锁屏": "화면 잠금", + "已关闭": "오프", + "已开启": "온", + "开启": "켜기", + "确定要开启重置键?": "재설정 버튼을 계속 활성화하려면?", + "确定要关闭重置键?": "재설정 버튼을 계속 비활성화합니까?", + "隐藏无效开锁权限": "잘못된 액세스 숨기기", + "APP开锁时需手机连网的锁": "전화 온라인 필요 자물쇠", + "增值服务": "서비스", + "关于": "에 관하여", + "退出": "로그 아웃", + "删除账号": "계정 삭제", + "个人信息": "계정 정보", + "头像": "아바타", + "昵称": "니크네임", + "请输入昵称": "닉네임을 입력하십시오.", + "修改昵称": "이름 바꾸기", + "修改账号": "계정 편집", + "重置密码": "암호 재설정", + "安全问题": "보안 질문", + "为了你的账号安全,修改账号前请先使用验证码验证": "계정 보안을 위해 계정을 수정하기 전에 계정 암호 확인을 사용하십시오.", + "请输入新账号": "새 계정을 입력하십시오.", + "找回密码和登录新设备时,可通过绑定的手机验证": "바인딩 전화 번호는 확인 코드를 수신하는 데 사용됩니다.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "바인딩 이메일은 확인 코드를 수신하는 데 사용됩니다.", + "原密码": "현재 암호", + "新密码": "새로운 암호", + "确认密码": "비밀번호 확인", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "휴대 전화가 분실 된 경우 보안 질문에 응답하여 새 전화에 로그인 할 수 있습니다.", + "问题一": "<질문 1>", + "问题二": "질문 2", + "问题三": "질문 3", + "请输入你的答案": "당신의 대답을 입력하십시오", + "即将到期": "곧 만료", + "去授权": "승인하기 위해 이동", + "修改名称": "이름 편집", + "状态": "상태", + "WiFi名称": "와이파이 이름", + "网络MAC": "네트워크 MAC", + "网关升级": "게이트웨이 업데이트", + "网关连接的锁": "이 게이트웨이에 연결된 잠금", + "信号强": "강한", + "选择网关类型": "게이트웨이 유형 선택", + "添加网关": "게이트웨이 추가", + "重新通电": "전원을 다시 연결하십시오.", + "指示灯": "표시등", + "选择网关": "게이트웨이 선택", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G 는 지원되지 않습니다. 2.4G 의 WiFi를 선택하십시오.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "WiFi 비밀번호 입력", + "网关名称": "게이트웨이 이름", + "请输入网关名称": "게이트웨이 이름 입력", + "IP地址": "IP 주소", + "子网掩码": "서브넷 마스크", + "默认网关": "기본 게이트웨이", + "自动获取DNS服务器地址": "DNS 서버 주소를 자동으로 가져옵니다.", + "首选DNS": "선호 DNS", + "备选DNS": "대체 DNS", + "不使用静态IP": "정적 IP가 사용되지 않습니다.", + "使用静态IP": "정적 IP 사용", + "请输入IP地址": "IP 주소 입력", + "请输入子网掩码": "서브넷 마스크 입력", + "请输入默认网关": "기본 게이트웨이 입력", + "所有锁": "모든 자물쇠", + "搜索所有类型的锁": "모든 유형의 자물쇠 스캔", + "门锁": "도어 잠금", + "挂锁": "자물쇠", + "保险箱锁": "안전 잠금", + "智能门禁": "지능형 액세스 제어", + "车位锁": "주차 잠금 장치", + "摸亮触摸屏": "키패드를 활성화하려면 키를 터치하십시오.", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "잠금 장치를 활성화하려면 키를 터치하고 지불 모드로 전환하십시오.", + "附近的锁": "주변 자물쇠", + "如需修改名字请重新命名,点击确定添加锁": "이름을 변경하려면 이름을 바꾸고 확인을 클릭하여 잠금을 추가하십시오.", + "添加锁时,手机必须在锁旁边": "자물쇠를 추가 할 때 전화가 자물쇠 옆에 있어야합니다.", + "登录": "로그인", + "注册": "등록", + "我已阅读并同意": "나는 읽고 동의했다.", + "验证码": "코드", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "암호에는 8-20 문자가 있어야하며 최소 두 가지 유형의 숫자, 문자 및 기호가 포함되어야합니다.", + "手机": "전화", + "邮箱": "이메일", + "请输入邮箱": "이메일 입력", + "国家/地区": "국가/지역", + "你所在的国家/地区": "귀하의 국가/지역", + "选择国家/地区": "국가 또는 지역 선택", + "获取验证码": "코드 받기", + "商务合作": "사업", + "电脑网页版": "웹 시스템", + "酒店系统": "호텔 시스템", + "说明书网页版": "사용자 설명서", + "高级功能": "고급 기능", + "记录保存": "기록 보유", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS는 수신자에게 암호 및 전자 키 정보를 전송하는 데 사용할 수 있습니다.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "이메일을 사용하여 수신자에게 암호 및 전자 키 정보를 보낼 수 있습니다.", + "购买实名认证提示": "기능을 활성화 한 후에는 지문, 얼굴 또는 계정 암호를 사용하여 APP를 열어야합니다. 3 분 동안 다시 확인할 필요가 없습니다.", + "请选择你希望的实名认证频次": "원하는 실제 인증 빈도를 선택하십시오.", + "仅首次": "처음으로", + "每日一次": "하루에 한 번", + "每周一次": "일주일에 한 번", + "每月一次": "매달 한 번", + "当前状态": "현재 상태", + "试用中": "재판에서", + "高级功能权益内容": "고급 기능", + "短信模板": "SMS 템플릿", + "邮件模板": "이메일 템플릿", + "发卡工具": "카드 인코더", + "购买高级功能须知": "공지", + "购买高级功能提示": "고급 기능이 개발 중이며 필요한 경우 잠금 장치 수에 따라 서비스를 열 수 있습니다. 고급 기능은 자신의 잠금 장치에서만 사용할 수 있습니다. 공인 관리자 인 경우 잠금 장치의 최고 관리자에게 연락하여 서비스를 엽니 다.", + "免费体验": "무료 시험", + "立即开通": "지금 열기", + "购买短信": "SMS 구매", + "购买邮件": "EMail 구매", + "购买实名认证次数": "실제 이름 인증 시간 구매", + "开通高级功能": "고급 기능 활성화", + "选择套餐": "패키지 선택", + "支付方式": "지불 모드", + "支付宝": "알리페이", + "去支付": "지불", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "직접 메시지를 정의 할 수 있습니다. 암호 및 전자 키의 정보를 다른 사람에게 보내는 데 사용됩니다.", + "高级功能仅能用于你自己的锁": "고급 기능은 자신의 잠금 장치 만 적용 할 수 있습니다.", + "新建模板": "Creat 템플릿", + "类型": "유형", + "模版内容": "템플릿 내용", + "预览": "미리보기", + "房间名": "방", + "预计产生短信条数": "예상 메시지 세그먼트", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "이 기능을 사용하면 일정 기간 동안 유효하지 않은 암호, 전자 키, 카드 및 지문을 숨길 수 있습니다.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "APP로 선택한 잠금 장치의 잠금을 해제하려면 사용자의 전화가 온라인 상태 여야합니다.", + "配置WiFi": "WiFi 구성", + "请输入WiFi名字": "와이파이 이름을 입력하십시오", + "WiFi配网": "WiFi 배포 네트워크", + "胁迫卡": "스트레스 카드", + "员工是否有密码": "이미 암호", + "员工是否有卡": "이미 카드가 있습니다", + "员工是否有指纹": "이미 지문 설정", + "获取钥匙": "키 얻기", + "获取卡": "카드 받기", + "获取指纹": "지문 받기", + "安全验证": "신원 확인", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "모든 계정 정보는 플랫폼에서 자동으로 삭제되며 복구 할 수 없습니다. 삭제 하시겠습니까?", + "监控": "모니터", + "视频日志": "비디오 로그", + "开门器": "도어 오프너", + "面容开锁": "얼굴 잠금 해제", + "开门方向设置": "오프닝 방향 세트", + "电机功率设置": "모터 파워 설정", + "开锁时是否需联网": "잠금 해제 할 때 인터넷이 필요한 경우", + "选择要加入分组的锁": "이 그룹에 추가하려면 lockS 선택", + "锁数量": "자물쇠 수", + "小米IOT平台": "Xiaomi IOT 플랫폼", + "面容开锁设置": "얼굴 잠금 해제 세트", + "感应距离": "감지 거리", + "防误开": "잘못된 개방 방지", + "防误开已关闭,关门后仍可使用面容开锁": "문을 닫은 후에도 얼굴 잠금 해제를 사용할 수 있습니다.", + "添加和使用面容开锁时": "잠금 해제 할 때 얼굴 추가 및 사용", + "添加和使用面容开锁时提示": "\n1, 문 작업의 앞에 한 사람을 유지하려고;\n2, 문 자물쇠를 마주 보는 약 0.5 ~ 0.8 미터의 문 자물쇠 앞에 서십시오;\n3. 얼굴을 방해하지 않고 얼굴 특징을 노출하십시오.\n4. 얼굴 인식이 비정상적인 경우 디지털 키보드의 모든 키를 터치하여 얼굴 인식을 수동으로 다시 시작할 수 있습니다.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "도어 잠금 장치의 실제 상황에 따라 모터 전원을 신중하게 선택하십시오.", + "小功率:": "미니와트:", + "耗电少": "적은 전력 소비", + "大功率": "고출력:", + "大功率提示": "잠금 장치를 해제 할 때 정상적으로 철회 할 수 없거나 구동해야하는 경우", + "开门方向设置提示": "집의 문을 여는 방향을 신중하게 선택하십시오 (잘못된 방향을 선택하면 문을 제대로 열고 닫을 수 없습니다).", + "左开": "왼쪽 열기", + "右开": "오픈 라이트", + "判断方法:": "판방법:", + "判断方法内容": "그 남자는 집 밖에 서서 입구 문을 향했다.", + "录像时段": "비디오 슬롯", + "密码": "암호", + "卡": "카드", + "指纹": "지문", + "人脸": "얼굴", + "配件商城": "자물쇠 몰", + "公司名称": "회사 이름", + "请输入公司名字": "회사 이름 입력", + "提示": "힌트", + "是否删除?": "삭제 여부?", + "员工信息": "직원 정보", + "员工": "직원", + "打卡方式无效": "사용할 수 없음", + "中国": "중국", + "选择钥匙": "Ekey 선택", + "编辑": "편집", + "无": "아니", + "有": "예", + "请输入姓名": "이름을 입력하십시오.", + "获取人脸": "얼굴 얻기", + "选择密码": "암호 선택", + "选择卡": "카드 선택", + "选择指纹": "지문 선택", + "选择人脸": "얼굴 선택", + "员工是否有人脸": "직원이 얼굴을 가지고 있는지 여부", + "同时删除员工钥匙": "그/그녀의 ekey 삭제", + "删除": "팔찌", + "确定要删除员工吗?": "이 직원 삭제", + "月统计": "월간 통계", + "迟到": "늦게", + "早退": "일찍 떠나", + "未打卡": "기록 없음", + "钥匙将在": "이 전자 키는 에서 만료됩니다.", + "天后失效": "일", + "电量更新时间:": "배터리 업데이트 시간:", + "新增配件": "추가", + "钥匙不可用": "키를 사용할 수 없습니다.", + "正在开锁中...": "잠금 해제...", + "你的钥匙": "당신의 열쇠", + "常开模式启动!长按闭锁": "오픈 모드 시작! 잠그는 긴 압박", + "演示模式": "데모 모드", + "请先同意用户协议及隐私政策": "먼저 사용자 계약 및 개인 정보 보호 정책에 동의하십시오.", + "用户协议": "사용자 약관", + "隐私政策": "개인 정보 보호 정책", + "注册成功": "등록 성공", + "你所在的": "당신은", + "手机号": "전화 번호", + "忘记密码": "암호 잊기", + "重置成功": "성공 재설정", + "确定要退出吗?": "출구?", + "功能暂未开放": "기능이 아직 열려 있지 않습니다.", + "设置成功": "성공적으로 설정", + "删除成功": "성공적으로 삭제", + "单次": "일회성", + "永久": "영구", + "限时": "타이밍", + "自定义": "맞춤", + "清空码": "지우기", + "循环": "되풀이", + "工作日": "근무일", + "每日": "매일", + "周末": "주말", + "确定要删除吗?": "삭제?", + "该锁的密码都将被删除": "이 잠금에 대한 모든 암호는 삭제됩니다", + "已过期": "무효", + "该锁的电子钥匙都将被删除": "이 잠금에 대한 모든 eKeys는 삭제됩니다.", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "이 ekey와 관련된 모든 ekey를 삭제하십시오. 이 단계는 UNDONE 될 수 없습니다!", + "删除钥匙会在用户APP连网后生效": "Ekey는 삭제됩니다", + "有效时间": "효과적인 시간", + "接收者": "수령인", + "仅管理自己创建的用户": "자신의 사용자 만 관리", + "远程开锁": "원격 잠금 해제", + "请输入钥匙名称": "키 이름을 입력하십시오.", + "修改成功": "성공 수정", + "冻结": "동결", + "解除冻结": "해동", + "授权": "권한 부여", + "取消授权": "승인 해제", + "同时解冻其发送的钥匙": "이 사용자가 발행 한 모든 에키 해동", + "会在用户APP连网后生效": "이 전자 키는 사용자의 APP가 네트워크에 연결되면", + "同时冻结其发送的钥匙": "이 사용자가 발행 한 모든 ekey 동결", + "冻结会在用户APP连网后生效": "이 전자 키는 사용자의 APP가 네트워크에 연결되면 FROZEN이됩니다.", + "取消授权会在用户APP连网后生效": "사용자의 APP가 네트워크에 연결되면 사용자가 자신의 권한을 잃게됩니다.", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "인증 된 사용자는 LOCK 관리자와 거의 동일한 권한을 갖습니다 (예: 전자 키 및 암호 전송 기능)", + "失效时间需晚于生效时间": "만료 시간은 유효 시간보다 늦어야합니다.", + "生效时间需晚于当前时间": "유효 시간은 현재 시간보다 늦어야합니다.", + "失效日期需晚于生效日期": "만료일은 유효일보다 늦어야합니다.", + "修改有效期": "변경 기간", + "生效日期": "시작 날짜", + "失效日期": "종료 날짜", + "开锁": "잠금 해제", + "开锁成功": "성공 잠금 해제", + "请选择锁": "자물쇠를 선택하세요", + "请选择接收者": "수신기를 선택하십시오.", + "请选择有效期": "유효 기간을 선택하십시오", + "请选择发送方式": "보내는 방법을 선택하십시오.", + "请选择结束时间": "종료 시간을 선택하십시오.", + "完成": "완료", + "有效日": "사이클 온", + "发送成功": "성공 보내기", + "请选择开始时间": "시작 시간을 선택하십시오.", + "选择用户": "수신자 선택", + "已选中": "선정", + "确定": "OK", + "请选择要发送的锁": "자물쇠를 선택하세요", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "얼굴 실명 인증은 전화 APP를 잠금 해제하기 전에 자신의 얼굴을 확인해야하는 사용자의 필요성을 말하며 검증은 잠금 해제 될 수 있습니다.", + "分享": "공유", + "请输入接收者账号": "수신기 계정을 입력하십시오.", + "接收者号码未注册,请重新发送": "수신기 번호가 등록되지 않았습니다.", + "是否发送电子钥匙给未注册账号": "새 계정으로 전자 키를 보내고 싶습니까?", + "取消": "취소", + "标记成功": "마크 성공", + "微信好友": "위챗 친구", + "短信": "SMS", + "邮件": "이메일", + "更多": "더 보기", + "您好,您的电子钥匙生成成功": "안녕하세요, 전자 키가 성공적으로 생성됩니다.", + "生效时间不能小于当前时间": "유효 시간은 현재 시간보다 작을 수 없습니다.", + "结束时间不能小于当前时间": "종료 시간은 현재 시간보다 작을 수 없습니다.", + "是否为管理员": "관리자입니까?", + "已连接到锁,请将卡靠近门锁的读卡区": "연결된. 카드 리더에 카드를 놓습니다.", + "尝试连接设备...": "자물쇠로 연결. 기다려주세요...", + "地理位置": "지리적 위치", + "检查以确保以下地址是正确的": "다음 주소가 올바른지 확인하십시오.", + "地图加载中,请稍候。。": "지도가로드 중입니다. 기다려주세요...", + "跳过": "건너 뛰기", + "还未获取到位置信息哦,请耐心等待一下!": "위치 정보는 아직 얻지 못했습니다. 참을성있게 기다리십시오!", + "请填写信息": "정보를 기입하십시오.", + "有效期": "유효 기간", + "生效时间": "시작 시간", + "失效时间": "종료 시간", + "上传成功": "성공적으로 업로드", + "未生效": "비활성", + "已生效": "효과적인", + "指纹详情": "지문 정보", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "손가락을 센서에 여러 번 놓아야합니다. 프롬프트를 따르십시오...", + "开始添加": "시작", + "请将您的手指按下": "센서에 손가락을 놓습니다.", + "根据提示,抬起手指后再进行下一次指纹采集": "다음 기록을 위해 손가락을 제거하고 센서에 배치해야합니다.", + "添加成功": "성공 추가", + "更新成功": "업데이트 성공", + "搜索": "검색", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "재설정 후 잠금 카드가 삭제됩니다. 재설정 하시겠습니까?", + "已失效": "무효", + "卡详情": "카드 정보", + "请输入": "여기에 입력하십시오.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "끄면 잠금이 수동으로 잠글 때까지 하루 종일 잠금 해제 상태로 유지됩니다.", + "请输入小于或等于60的数字": "60 미만의 숫자를 입력하십시오.", + "操作成功": "성공적인 운영", + "管理员密码相同,无需修改": "관리자 암호는 동일하며 수정할 필요가 없습니다.", + "请输入6-9位数字": "길이 6-9 자리", + "请输入6-9位管理员密码": "6-9 자리 관리자 암호를 입력하십시오.", + "请输入新的管理员密码": "새 관리자 암호를 입력하십시오.", + "未分组": "그룹화되지 않음", + "请输入分组名称": "그룹 만들기", + "创建成功": "성공 만들기", + "设置锁分组成功": "잠금 그룹을 성공적으로 설정", + "电池1电量": "배터리 1", + "电池2电量": "배터리 2", + "电量更新时间": "배터리 업데이트 시간", + "锁电量更新成功": "잠금 전원 업데이트 성공", + "您的钥匙未生效": "키가 효과적이지 않습니다.", + "您的钥匙已冻结": "키가 얼어 붙었습니다.", + "您的钥匙已过期": "키가 만료되었습니다.", + "常开模式开启": "잠금 장치가 통과 모드에 있습니다.", + "超级管理员": "슈퍼 관리자", + "授权管理员": "공인 관리자", + "普通用户": "일반 사용자", + "余": "균형", + "天": "날", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "잠금을 삭제하면 모든 정보가 함께 삭제됩니다. 잠금을 삭제하고 싶습니까?", + "请输入登录密码": "응용 프로그램 암호를 입력하십시오.", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "장치를 삭제하지 못했습니다. 장치가 장치 근처에 있고 장치가 연결되어 있지 않고 장치가 켜져 있는지 확인하십시오.", + "用户无权限": "사용자에게 권한이 없습니다.", + "创建公司后,考勤功能才能使用": "먼저 회사를 만드십시오.", + "是否删除钥匙?": "이 ekey를 삭제 하시겠습니까?", + "邮箱绑定成功": "이메일 바인딩 성공", + "手机绑定成功": "휴대 전화 바인딩 성공", + "网络访问失败,请检查网络是否正常": "요청이 실패했습니다. 네트워크를 사용할 수 없으므로 장치를 3G/4G/WIFI에 확인하고 연결하십시오.", + "清空": "클리어", + "是否清空?": "클리어?", + "消息详情": "메시지 정보", + "创建时间": "창조 시간", + "管理员详情": "관리자 세부 정보", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "누군가가 문을 열도록 강요하면이 카드를 사용할 수 있습니다. 경보 메시지가 관리자에게 전송됩니다. 이 기능을 사용하려면 자물쇠가 온라인 상태인지 확인하십시오.", + "请不要将胁迫卡用于日常开锁": "매일 사용하기 위해 강제 카드를 사용하지 마십시오.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "누군가가 문을 열도록 강요하면이 지문을 사용할 수 있습니다. 경보 메시지가 관리자에게 전송됩니다. 이 기능을 사용하려면 자물쇠가 온라인 상태인지 확인하십시오.", + "请不要将胁迫指纹用于日常开锁": "매일 사용하기 위해 강제 지문을 사용하지 마십시오.", + "创建公司": "회사 만들기", + "公司名称不能超过30个字符": "회사 이름은 30 자를 초과 할 수 없습니다", + "公司名称不能小于6个字符": "회사 이름은 6 자 미만일 수 없습니다", + "WIFI列表": "WIFI 목록", + "刷新": "새로 고침", + "手动配网": "수동 배포 네트워크", + "远距离": "장거리", + "中距离": "중간 거리", + "近距离": "짧은 거리", + "锁时间更新成功": "잠금 시간 업데이트 성공", + "锁用户": "사용자 잠금", + "请选择常开日期": "오픈 날짜를 선택하십시오.", + "结束时间不能小于开始时间哦": "종료 시간은 시작 시간보다 작을 수 없습니다.", + "介绍": "우리의 이야기", + "个人信息收集清单": "개인 정보 수집 목록", + "应用权限说明": "신청 권한 설명", + "第三方信息共享清单": "제 3 자 정보 공유 목록", + "请选择您的位置": "위치를 선택하십시오.", + "请先选择位置": "먼저 위치를 선택하십시오.", + "管理员密码": "관리자 암호", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "수정해야하는 경우 새 관리자 암호 (6 자리) 를 입력하고 확인을 클릭하여 수정하십시오.", + "修改": "수정", + "网络摄像头": "카메라", + "重命名": "이름 바꾸기", + "分组下的锁将被移到未分组里": "그룹 아래의 잠금은 그룹화되지 않은 것으로 이동합니다.", + "编辑成功": "성공 편집", + "厂商": "제조업체", + "型号": "모델", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "암호가 생성 된 후, 같은 날 23:59 전에 활성화를 위해 한 번 사용하십시오. 그렇지 않으면 0 시 이후에 유효하지 않습니다. 암호가 활성화되면 유효 기간 내에 무제한으로 사용할 수 있습니다.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "암호가 생성 된 후에는 같은 날 23:59 전에 사용하십시오. 그렇지 않으면 0 시 이후에 유효하지 않습니다. 클리어 코드는 오늘 0 시 이전에 생성 된 모든 암호를 지우는 데 사용됩니다.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "암호가 생성 된 후에는 같은 날 23:59 전에 사용하십시오. 그렇지 않으면 0 시 이후에 유효하지 않습니다.", + "清空密码底部提示": "비밀번호는 비우는 날 23:59 까지 유효합니다.", + "相机": "카메라", + "相册": "사진", + "读写": "저장", + "定位": "위치", + "需要访问相机权限才能拍照上传文件例如头像上传": "사진을 찍고 프로필 사진을 업로드하는 것과 같은 파일을 업로드하려면 카메라에 액세스해야합니다.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "앨범 이미지를 사용하여 파일 및 아바타를 업로드하려면 카메라에 액세스해야합니다.", + "需要访问读写权限才能使用本地图片上传头像": "로컬 이미지를 사용하여 아바타를 업로드하려면 읽기 및 쓰기 권한에 대한 액세스가 필요합니다.", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "키 추가 기능을 사용하려면 위치 정보에 대한 액세스가 필요합니다.", + "申请": "신청", + "权限": "허가", + "不允许": "허용되지 않음", + "允许": "허용", + "权限被拒绝": "허가 거부", + "请手动在系统设置中开启": "시스템 설정에서 수동으로 활성화하십시오.", + "权限以继续使用应用": "응용 프로그램을 계속 사용할 수있는 권한.", + "去设置": "가서 설정", + "当前网络": "현재 네트워크", + "位置信息": "위치 정보", + "请输入wifi名称": "와이파이 이름을 입력하십시오", + "虹膜": "홍채", + "手掌": "손바닥", + "商城": "몰", + "我的": "내", + "微信公众号推送": "위챗 공개 계정", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "경보 메시지를 받기 위해 wechat을 열려면 먼저 Skye Smart Lock wechat 공개 계정에주의를 기울여야합니다. QR 코드를 저장하고 wechat을 사용하여 설정을 스캔하십시오.", + "蓝牙": "블루투스", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "추가 키 기능의 위치 정보를 사용하려면 Bluetooth 권한에 대한 액세스가 필요합니다.", + "请输入Email": "이메일 입력", + "请输入手机号": "전화 번호 입력", + "家人到家": "가족이 집에 도착", + "添加家人": "가족 구성원 추가", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "잠금이 인터넷에 연결되어 있지 않으면 암호, 카드, 지문 및 기타 문 열기 방법에 대한 알림을 적시에 보낼 수 없습니다.", + "消息提醒": "알림", + "开门通知": "개관 공지", + "N天未开门": "문을 열지 않고 N 일", + "门未关好": "문이 닫히지 않았습니다.", + "防拆报警": "탬퍼 알람", + "低电量提醒": "낮은 배터리", + "胁迫开门": "강제 문 열기", + "有人按门铃": "누군가 초인종을 울립니다.", + "有人出现在门口": "누군가 문에 나타납니다.", + "提醒方式": "알림 방법", + "开门方式": "문 열기 방법", + "请选择": "선택하십시오", + "家人": "가족 구성원", + "保存": "저장", + "APP推送": "앱 푸시", + "管理员": "관리자", + "未启用": "사용할 수 없음", + "已启用": "사용", + "省电模式": "절전 모드", + "逗留抓拍模式": "캡처 모드 유지", + "实时监控模式": "실시간 모니터링 모드", + "自定义模式": "사용자 지정 모드", + "猫眼设置": "고양이 눈 설정", + "猫眼工作模式": "고양이 눈 작업 모드", + "自动亮屏": "자동 밝은 화면", + "亮屏持续时间": "시간에 스크린", + "逗留警告": "경고 유지", + "异常警告": "비정상적인 경고", + "短信提醒": "SMS", + "邮件提醒": "이메일", + "N天未开门提醒": "문을 열지 않고 N 일", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "누군가가 자물쇠를 열도록 강요하면이 지문을 사용할 수 있습니다. 경보 메시지가 관리자에게 전송됩니다. 이 기능을 사용하려면 잠금 장치가 온라인 상태인지 확인하십시오.", + "胁迫指纹": "강제 지문", + "指纹列表": "지문 목록", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "설정된 시간이 지나면 잠금이 열리지 않으면 시스템은 지정된 수신자에게 알림 메시지를 보냅니다. 이 기능은 인터넷에 연결하려면 잠금 장치가 필요합니다.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "리마인더를 가능하게 한 후, 잠금 배터리가 20%, 10% 및 5% 미만일 때, 시스템은 지정된 수신자에게 미리 알림 메시지를 보낼 것이다.", + "未开门时间": "문을 열지 않는 일", + "添加和使用面容开锁时:": "잠금 해제시 얼굴 추가 및 사용:", + "关锁": "닫기 자물쇠", + "功能": "기능", + "配件": "부품", + "云存": "클라우드 스토리지", + "本地": "이 지역", + "3天滚动储存": "3 일 롤링 저장", + "去升级": "지금 업그레이드", + "下载列表": "다운로드 목록", + "已下载": "다운로드", + "全部视频": "모든 동영상", + "已为本设备免费提供3大滚动视频储存服务": "이 장치에는 세 가지 스크롤 비디오 저장 서비스가 무료로 제공되었습니다.", + "视频播放": "비디오 재생", + "全选": "모두", + "请选择要删除的视频": "삭제할 비디오를 선택하십시오.", + "请选择要下载的视频": "다운로드 할 비디오를 선택하십시오.", + "欢迎使用": "사용하는 환영", + "用户协议和隐私政策概要": "사용자 계약 및 개인 정보 보호 정책 요약", + "协议概要": "프로토콜 요약", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "이 응용 프로그램을 사용해 주셔서 감사합니다. 우리는 귀하의 개인 정보 및 개인 정보 보호를 매우 중요하게 생각합니다. 이 제품을 사용하기 전에 신중하게 읽으십시오.", + "《用户协议》": "사용자 약관", + "和": "과", + "《隐私政策》": "《 개인정보 보호정책 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "의 전체 내용. \"동의\" 를 클릭하면 모든 조건에 동의하고 수락합니다. 동의하지 않기로 선택하면 제품과 서비스를 사용할 수 없으며 응용 프로그램을 종료합니다.", + "不同意": "동의하지 않음", + "同意": "동의", + "该功能是高级功能,请开通后再使用": "이것은 고급 기능입니다. 먼저 활성화하십시오.", + "常用程序": "일반적인 프로그램", + "该锁已被重置": "잠금 장치가 재설정되었습니다.", + "需要访问读写权限才能使用手动升级固件": "펌웨어를 수동으로 업그레이드하려면 읽기 및 쓰기 권한에 대한 액세스가 필요합니다.", + "错误D固件,请选择正确的文件": "잘못된 펌웨어, 올바른 파일을 선택하십시오.", + "非SYD固件,请选择正确的文件": "비 SYD 펌웨어, 올바른 파일을 선택하십시오", + "文件校验失败 0x01": "파일 확인 실패 0x01", + "解析元数据失败,请选择正确的文件": "메타데이터를 구문 분석하지 못했습니다. 올바른 파일을 선택하십시오.", + "文件校验失败 0x02": "파일 확인 실패 0x02", + "文件校验失败 0x03": "파일 확인 실패 0x03", + "固件升级完成": "펌웨어 업그레이드 완료", + "记录": "기록", + "开通高级功能后才可以对锁进行管理": "자물쇠를 관리하기 위해 먼저 고급 기능을 활성화하십시오.", + "去开通": "활성화", + "实名认证": "실명 인증", + "当前剩余数量": "남은", + "购买": "구매", + "实名认证为付费功能,请购买后再使用": "실명 인증은 유료 기능이므로 구매 후 사용하십시오.", + "密码不一致哦": "암호가 일치하지 않습니다.", + "退出添加": "추가 종료", + "管理员已满": "관리자 전체", + "用户已满": "사용자가 가득 찼습니다.", + "锁上面添加指纹已满": "자물쇠에 지문 추가 가득", + "指纹已存在": "지문이 이미 존재합니다.", + "锁上面添加人脸已满": "위의 잠금 추가 얼굴이 가득 찼습니다.", + "人脸已存在": "얼굴은 이미 존재합니다.", + "锁上面添加卡已满": "위의 잠금 추가 카드가 가득 찼습니다.", + "卡已存在": "이미 존재하는 카드", + "锁上面添加密码已满": "위의 잠금 추가 암호가 가득 찼습니다.", + "密码已存在": "동일한 암호가 이미 존재합니다. 다른 암호를 선택하십시오.", + "请输入密码": "비밀번호를 입력하십시오", + "暂无密码,无需重置": "비밀번호 없음, 재설정 필요 없음", + "真实姓名": "실명", + "身份证号": "ID 번호", + "请输入真实姓名": "실명을 입력하십시오.", + "请输入身份证号": "ID 번호를 입력하십시오.", + "请输入身份证号和真实姓名": "ID 번호와 실명을 입력하십시오.", + "点击返回设备配对": "다시 장치 페어링 탭", + "无法连接?尝试升级": "연결할 수 없습니까? 업그레이드 시도", + "固件升级提示": "펌웨어 업그레이드 프롬프트", + "请先获取固件文件到手机本地,再选择升级": "먼저 로컬 전화로 펌웨어 파일을 얻은 다음 업그레이드를 선택하십시오.", + "固件升级中": "펌웨어가 업그레이드되고 있습니다.", + "取消升级": "업그레이드 취소", + "固件传输中": "운송 중인 펌웨어", + "关闭": "끄기", + "传输中'": "운송 중", + "操作记录": "기록", + "修改姓名": "이름 편집", + "传输中": "운송 중", + "发送人": "에 의해 발행", + "发送时间": "시간 발행", + "钥匙详情": "Ekey 정보", + "姓名": "이름", + "发送": "보내기", + "请确认姓名全名和身份证号码是否正确": "전체 이름과 ID 번호가 올바른지 확인하십시오.", + "传输期间请勿离开当前页面": "전송 중에 현재 페이지를 떠나지 마십시오.", + "机型": "모델", + "硬件版本": "하드웨어 버전", + "固件版本": "펌웨어 버전", + "手动升级": "수동 업그레이드", + "设备连接中...": "장치 연결...", + "未避免异常情况,请在门打开时升级": "피할 수없는 예외, 문이 열려있을 때 업그레이드하십시오", + "钥匙无效": "키가 잘못되었습니다.", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "자물쇠에 연결할 수 없습니다. 휴대 전화의 Blutooth를 다시 시작하고 다시 시도하십시오.", + "如果是全自动锁,请使屏幕变亮": "완전 자동 잠금 장치 인 경우 화면을 밝게 만드십시오.", + "正在尝试闭锁……": "잠그려. 기다려주세요...", + "清空记录": "명확한 기록", + "是否要删除操作记录?": "레코드를 계속 삭제합니까?", + "被删除的记录不能恢复": "삭제 후 레코드를 복구 할 수 없습니다.", + "全部事件": "모든 이벤트", + "开锁事件": "이벤트 잠금 해제", + "异常事件": "비정상적인 이벤트", + "门铃事件": "초인종 이벤트", + "视频事件": "비디오 이벤트", + "请开启蓝牙": "블루투스를 켜주세요", + "请选择有效日": "효과적인 날을 선택하십시오", + "公司名字长度不能小于 6 ": "회사 이름의 길이는 6 보다 작을 수 없습니다.", + "已是最新版本": "업데이트 없음", + "新建短信模版": "크레타 SMS 템플릿", + "新建邮件模版": "Creat 이메일 템플릿", + "自定义短信模版": "SMS 템플릿", + "自定义邮件模版": "이메일 템플릿", + "名称": "이름", + "星星锁": "스타 잠금", + "无考勤记录": "기록 없음", + "大家干劲十足": "모두가 제 시간에 온다", + "工作时长未出炉": "근무 시간 없음", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "국가/지역의 선택은 데이터 보안에 영향을 미칩니다. 현재 알바니아를 선택하셨습니다. 진행하기 전에 확인하십시오.", + "确认国家或地区": "국가/지역 확인", + "我知道了": "그것을 얻었다", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "중요한 업데이트를 받으려면 '확인' 을 클릭하고 설정에서 알림을 활성화하십시오.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "전원을 켜면 잠금 장치의 설정 키를 길게 눌러 전원을 다시 켜고 APP로 다시 추가 할 수 있습니다.", + "已有": "현재", + "新增": "새로운", + "账号格式错误": "나쁜 형식", + "接收者信息为空": "수신자 정보가 비어 있습니다.", + "请输入时间(秒)": "시간을 입력하십시오 (초)", + "加载数据失败": "데이터를로드하지 못했습니다.", + "重试": "다시 시도", + "升级中,是否退出": "업그레이드하는 동안 종료 여부", + "下一步": "다음", + "公寓": "아파트", + "个人用户": "개인", + "星寓": "스타 아파트", + "账号": "계정", + "请输入手机号或email": "전화 번호 또는 이메일", + "请输入星寓管理员的账号": "스타 아파트 관리자의 계정을 입력하십시오.", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "선택한 잠금 장치의 모든 데이터는 수신자에게 영구적으로 전송됩니다.", + "暂不支持跨平台转移,敬请期待": "크로스 플랫폼 전송은 당분간 지원되지 않습니다. 기대하십시오.", + "移除坏锁": "결함/손상된 잠금 장치를 휴지통으로 이동", + "转移确认": "전송 확인", + "本次共转移": "이번에는 총", + "把智能锁": "스마트 잠금", + "确认": "OK", + "移除成功": "성공적으로 제거", + "转移成功": "이적 성공", + "该已锁被删除": "잠겨 삭제됩니다.", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "권한있는 관리자는 자신이 만든 암호, 전자 키 및 etccened 만 관리 할 수 있습니다.", + "添加授权管理员": "관리자 만들기", + "导出记录": "수출 기록", + "选择时间段": "기간 선택", + "导出": "수출", + "批量导出": "배치 수출", + "读取记录": "레코드 새로 고침", + "设备": "장치", + "消息": "메시지", + "智能分析": "지능형 분석", + "精准识别设备事件,过滤无效信息": "장치 이벤트를 정확하게 식별하고 잘못된 정보를 필터링", + "系统设置": "시스템 설정", + "系统的全局配置在此项内进行设置": "이 항목에서 시스템의 글로벌 구성이 설정됩니다.", + "导出操作记录": "수출 기록", + "立即查看": "보기", + "导出成功": "성공적으로 수출", + "发送钥匙": "Ekey 보내기", + "进度": "요금", + "失败": "실패", + "人脸详情": "얼굴 세부 사항", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "누군가가 문 앞에서 약 1.5 미터를 감지하면 얼굴 인식 잠금 해제가 자동으로 시작됩니다.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "누군가가 문 앞에서 약 0.8 미터를 감지하면 얼굴 인식 잠금 해제가 자동으로 시작됩니다.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "누군가가 문 앞에서 0.5 미터 정도 감지되면 얼굴 인식 잠금 해제가 자동으로 시작됩니다.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "감지 거리가 꺼져 있으므로 얼굴 인식 잠금 해제를 수행하려면 키보드의 모든 키를 수동으로 터치해야합니다.", + "防误开已打开,开锁后": "실수 방지 오프닝이 켜지고 잠금 해제 후", + "秒内不可使用面容开锁": "얼굴 잠금 해제는 몇 초 안에 사용할 수 없습니다.", + "掌静脉": "팜 정맥", + "添加掌静脉": "손바닥 정맥 추가", + "胁迫掌静脉": "강제 손바닥 정맥", + "请不要将胁迫掌静脉用于日常开锁": "매일 잠금 해제를 위해 강제 야자 정맥을 사용하지 마십시오.", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "자물쇠에 연결, 자연스럽게 손바닥을 열어, 손바닥이 카메라를 향하고 있습니다", + "掌静脉详情": "팜 정맥 세부 사항", + "掌静脉号": "팜 정맥 번호", + "蓝牙未打开,请到设置里面打开蓝牙": "블루투스가 켜지지 않았습니다. 설정에서 블루투스를 켜십시오.", + "删除用户时,会将用户拥有的钥匙一起删除。": "사용자가 삭제 된 경우 사용자와 관련된 모든 전자 키도 삭제됩니다.", + "配置网络": "네트워크 구성", + "你好": "안녕하세요", + "成功": "성공", + "类型选择": "유형 선택", + "请选择要使用哪种类型": "사용할 유형을 선택하십시오.", + "系统邮件(推荐)": "시스템 이메일 (추천)", + "系统短信(推荐)": "시스템 SMS (권장)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "이 앱에서 이메일이 전송됩니다. 먼저 이메일 패키지를 구입하십시오.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS는이 앱에서 전송됩니다. 먼저 이메일 패키지를 구입하십시오.", + "个人邮件": "개인 이메일", + "个人短信": "개인 SMS", + "邮件将从你的个人邮箱发给用户": "이메일은 개인 이메일 계정에서 전송됩니다.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS 메시지는 개인 전화 번호에서 전송됩니다. 통신 사업자에게 지불합니다.", + "为了更好地应用体验,请确定权限": "더 나은 응용 프로그램 경험을 위해 권한을 확인하십시오.", + "您第一次拒绝权限,请确定权限": "처음으로 허가를 거부 한 경우 허가를 확인하십시오.", + "您第二次拒绝权限,请去应用设置开启权限": "두 번째로 허가를 거부 한 경우 응용 프로그램 설정으로 이동하여 권한을 활성화하십시오.", + "去应用市场": "앱 스토어로 이동", + "温馨提示": "따뜻한 프롬프트", + "关闭应用": "응용 프로그램 닫기", + "开启微信接收报警消息需要先关注": "경보 메시지를 받기 위해 WeChat을 열려면", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat 공개 계정, QR 코드를 저장하고 WeChat을 사용하여 설정을 스캔합니다.", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "실명 인증은 유료 기능이므로 잠금 관리자에게 연락하여 구매하고 사용하십시오.", + "位置权限": "위치 권한", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "귀하의 locatian을 사용하도록 앱을 부여하십시오. 그것은 BLE 잠금 및 게이트웨이를 스캔하는 데 사용됩니다.", + "相机/相册权限": "카메라/앨범 권한", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "스토리지에서 사진과 파일을 읽고 쓸 수있는 앱을 부여하십시오.", + "点击选择": "클릭하여 선택합니다.", + "微信": "위챗", + "朋友圈": "순간", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "웨이보", + "FaceBook": "페이스북", + "链接": "링크", + "今天": "오늘", + "密码错误": "잘못된 암호", + "网络中断": "네트워크 중단", + "钥匙不存在": "키가 존재하지 않습니다.", + "钥匙过期": "키 만료", + "钥匙已存在": "키가 이미 존재", + "密码失效": "유효하지 않은 암호", + "门锁时间异常": "도어 잠금 시간 이상", + "APP(手机)未联网": "APP (휴대 전화) 가 인터넷에 연결되어 있지 않습니다.", + "数据不存在": "데이터가 존재하지 않습니다.", + "待接收": "받은", + "已冻结": "냉동", + "已删除": "삭제됨", + "未知": "알 수 없음", + "拖动下方滑块完成拼图": "슬라이더를 올바른 위치로 드래그하십시오.", + "验证成功": "검증 성공", + "验证失败": "검증 실패", + "向右拖动滑块填充拼图": "슬라이더를 오른쪽으로 드래그하여 퍼즐을 채 웁니다.", + "请先获取到位置信息哦": "먼저 위치 정보를 얻으십시오.", + "请选择国家": "국가를 선택하세요", + "获取锁信息": "잠금 정보 얻기", + "锁数据异常,请重试": "데이터 잠금이 비정상입니다. 다시 시도하십시오.", + "连接设备中...": "장치 연결...", + "把锁": "자물쇠", + "条": "스트립", + "封": "씰", + "次": "시간", + "支付成功": "성공 지불", + "查看详情": "세부 정보 보기", + "请输入模板名称": "템플릿 이름을 입력하십시오.", + "模版类型": "유형", + "再返回一次退出": "다시 종료", + "请先添加锁": "먼저 자물쇠를 추가하십시오.", + "可视对讲": "비주얼 인터콤", + "详细日志": "자세한 로그", + "已复制到剪切板": "복사", + "拍照": "사진", + "从相册选择": "앨범에서 선택", + "选择问题": "질문을 선택하십시오.", + "确认长度不足8位": "8 자리 미만의 길이 확인", + "新密码长度不足8位": "새 암호 길이 8 자리 미만", + "两次密码不一致": "암호 불일치. 다시 시도하십시오", + "请点击获取验证码,验证码将发送到": "확인 코드를 받으십시오. 코드는", + "切换": "스위치", + "验证": "확인", + "验证成功,账号已删除": "확인 성공, 계정 삭제", + "该密码不是自定义密码,无法修改": "이 암호는 사용자 지정 암호가 아니며 수정할 수 없습니다.", + "请选择设备要关联哪些姓名": "장치가 연결되어야 하는 이름을 선택하십시오.", + "请选择姓名要关联哪些设备": "이름을 연결해야하는 장치를 선택하십시오.", + "确定要移除所选中的坏锁吗?": "오작동하는 자물쇠를 제거합니까?", + "邮件通知": "이메일을 통해 알림", + "短信通知": "SMS를 통해 알림", + "您好,您的授权管理员生成成功": "안녕하세요, 공인 관리자가 성공적으로 생성되었습니다.", + "请输入接收者姓名": "여기에 입력하십시오.", + "版本更新": "버전 업데이트", + "下次再说": "다음 시간", + "配网成功": "네트워크 배포 성공", + "配网失败": "네트워크 배포 실패", + "该锁的无线键盘都将被删除": "이 잠금에 대한 모든 무선 키패드는 삭제됩니다.", + "实时画面": "실시간 사진", + "适合门口较为安全的环境。": "문에 비교적 안전한 환경에 적합합니다.", + "仅发生特定事件才录像,并可查看实时画面。": "특정 이벤트 만 기록되고 실시간 사진을 볼 수 있습니다.", + "一般情况下,满电可使用7-8个月": "정상적인 상황에서는 7-8 개월 동안 완전히 충전 될 때 사용할 수 있습니다.", + "有人逗留或发生特定事件才录像,可随时查看": "누군가 체류하거나 특정 이벤트가 기록되며 언제든지 볼 수 있습니다.", + "实时画面。": "실시간 사진.", + "一般情况下,满电可使用5~6个月。": "정상적인 상황에서는 5 ~ 6 개월 동안 완전히 충전 될 때 사용할 수 있습니다.", + "适合门口人员复杂、较不安全的环境。": "문에서 복잡하고 상대적으로 안전하지 않은 환경에 적합합니다.", + "有人出现就录像,可随时查看实时画面。": "누군가가 나타날 때 기록하고 언제든지 실시간 사진을 봅니다.", + "一般情况下,满电可使用2~4个月。": "정상적인 상황에서는 2 ~ 4 개월 동안 완전히 충전 될 때 사용할 수 있습니다.", + "根据您家门口实际情况设置录像和实时画面功能。": "귀하의 문에 실제 상황에 따라 비디오 및 실시간 사진 기능을 설정하십시오.", + "可使用时长由具体设置决定。": "사용 기간은 특정 설정에 의해 결정됩니다.", + "查看": "보기", + "有人按门铃或发生": "누군가 초인종을 울리거나", + "异常事件时": "비정상적인 사건", + "不录像": "비디오 없음", + "有人出现、按门铃": "누군가 나타나서 초인종을 울립니다.", + "或发生异常事件时": "또는 비정상적인 사건이 발생", + "逗留达到10秒": "10 초 동안 머물러", + "约1.5米": "약 1.5 미터", + "随时": "언제든지", + "立即录像": "즉시 기록", + "录像时机": "비디오 타이밍", + "有人出现时录像": "누군가가 나타날 때 기록", + "人体侦测距离": "인간 탐지 거리", + "查看实时画面": "실시간 사진보기", + "自定义时间": "맞춤 시간", + "当日": "오늘", + "次日": "다음날", + "自定义时段": "맞춤 기간", + "发生事件时查看": "이벤트가 발생할 때 보기", + "实时查看": "실시간 보기", + "有人在门口出现10秒后开始录像。": "녹음하기 전에 누군가가 10 초 동안 문에 나타납니다.", + "有人按门铃时立即录像。": "누군가가 초인종을 울리면 즉시 기록하십시오.", + "有人出现在门前1.5米范围时启动录像": "누군가가 문 앞에서 1.5 미터 이내에 나타날 때 녹음 시작", + "约0.8米": "약 0.8 미터", + "约3.0米": "약 3.0 미터", + "添加指纹失败": "작업이 실패했습니다.", + "项": "항목", + "播放中": "재생", + "下载": "다운로드", + "暂无下载内容": "다운로드 내용 없음", + "亮度": "밝기", + "音量": "볼륨", + "快进至": "빨리 앞으로", + "快退至": "되감기", + "暂无视频信息": "비디오 정보 없음", + "加载出错": "로드 오류", + "请单人正对门锁,距离一个成年人手臂长度": "문 잠금 장치 앞에 팔 길이로 서십시오.", + "(约0.6米)。": "(약 0.6 미터).", + "保持脸部无遮挡,露出五官。": "얼굴을 방해하지 않고 얼굴 특징을 보여주십시오.", + "准备好了,开始添加": "준비, 추가 시작", + "正在录入中...": "녹음...", + "添加人脸失败": "얼굴 추가 실패", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "재설정 후 자물쇠의 얼굴이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?", + "人脸号": "얼굴 번호", + "虹膜详情": "아이리스 세부 사항", + "虹膜号": "아이리스 번호", + "选择设备类型": "장치 유형 선택", + "照明灯具": "조명기구", + "电动窗帘": "전기 커튼", + "门窗传感器": "문 및 창 센서", + "传感器": "센서", + "清除数据成功": "성공적으로 삭제 된 데이터", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "자물쇠는 인터넷에 연결되어 있지 않으므로 암호, 카드, 지문 및 기타 문 열기 방법의 레코딩을 실시간으로 업로드 할 수 없습니다.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "역사적 기록을 보관해야하는 경우 내보낼 수 있습니다.", + "看不到操作记录,可能原因有": "작업 기록을 볼 수 없음, 가능한 이유", + "操作记录详情": "운영 기록 세부 사항", + "操作时间": "가동 시간", + "此模块功能需要锁联网后设置方可生效": "이 모듈 기능은 잠금을 인터넷에 연결 한 후에 설정해야합니다.", + "用户已存在": "사용자가 이미 존재", + "钥匙数量已到上限": "키의 수가 상한에 도달했습니다.", + "附近没有可用网关": "근처에 사용 가능한 게이트웨이가 없습니다.", + "正在创建安全连接...": "보안 연결 만들기...", + "监视状态下不能发送录音": "모니터링 모드로 녹음을 보낼 수 없습니다.", + "挂断": "끊다", + "监视中暂不能开锁": "모니터링 중에 잠금 해제를 사용할 수 없습니다.", + "长按说话": "언론과 대화", + "松开发送": "보낼 릴리스", + "请输入6位数字开锁密码": "6 자리 잠금 해제 암호를 입력하십시오.", + "请输入开锁密码": "잠금 해제 암호를 입력하십시오.", + "接收者在有效期内可以不限次数使用": "수신자는 유효 기간 내에 무제한 시간 동안 전자 키를 사용할 수 있습니다.", + "接收者可以使用此App开关锁": "수신자는이 응용 프로그램으로 잠금/잠금 해제 할 수 있습니다.", + "单次钥匙有效期为1小时,只能使用一次": "일회성 전자 키는 1 시간 동안 유효하며 한 번만 사용할 수 있습니다.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "수신자는 고정 사이클 시간 내에 무제한 시간 동안 전자 키를 사용할 수 있습니다.", + "获取模板失败": "템플릿을 얻지 못했습니다.", + "微信通知": "WeChat 알림", + "系统短信": "시스템 SMS", + "系统邮件": "시스템 이메일", + "模板": "템플릿", + "新建模版": "템플릿 만들기", + "您好,您的密码是": "안녕하세요, 비밀번호는", + "密码名字": "암호 이름", + "请输入6-9位密码": "6-9 자리 암호를 입력하십시오.", + "设置密码": "암호 설정", + "操作成功,密码为": "성공. 암호는", + "类型:自定义-永久": "유형: 사용자 정의-영구", + "实时播放": "실시간 재생", + "点击对讲": "인터콤으로 클릭", + "长按开锁": "잠금을 해제하기 위해 길게 누르십시오.", + "接听失败": "답변 실패", + "请在锁设置中开启远程开锁": "잠금 설정에서 원격 잠금 해제를 활성화하십시오.", + "接听": "답변", + "截图已保存到相册": "앨범에 저장된 스크린 샷", + "添加遥控": "리모컨 추가", + "已连接到锁,请按遥控": "자물쇠에 연결, 원격 제어를 누르십시오", + "遥控号": "원격 제어 번호", + "遥控详情": "원격 제어 세부 사항", + "照明": "조명", + "退出演示模式": "데모 모드 종료", + "提示:当前界面为展示界面,添加设备后才能继续使用": "팁: 현재 인터페이스는 디스플레이 인터페이스입니다. 장치를 추가 한 후에도 계속 사용할 수 있습니다.", + "门已上锁": "문이 잠겨 있습니다.", + "您的账号在异地登录,如非本人,请尽快修改密码": "계정은 새 장치에서 로그인하는 데 사용되었습니다.", + "开门成功": "문을 성공적으로 엽니 다.", + "开门失败": "문을 열지 못함", + "呼叫提醒": "통화 알림", + "收到来自": "에서 받은", + "锁的呼叫": "잠금 전화", + "加载数据中": "데이터 로딩", + "搜索所有锁类型": "모든 잠금 유형 검색", + "锁电量更新时间": "잠금 배터리 업데이트 시간", + "1月": "1 월", + "2月": "2 월", + "3月": "Mar", + "4月": "Apr", + "5月": "5 월", + "6月": "준", + "7月": "7 월", + "8月": "8 월", + "9月": "9 월", + "10月": "10 월", + "11月": "11 월", + "12月": "12 월", + "热门城市": "뜨거운 도시", + "导出锁数据": "잠금 데이터 내보내기", + "一键开锁": "원 클릭 잠금 해제", + "已开通": "개관", + "编辑员工": "직원 편집", + "一": "하나", + "二": "두", + "三": "세", + "四": "네", + "五": "다섯", + "六": "여섯", + "日": "태양", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?", + "在线": "온라인", + "离线": "오프라인", + "购买记录": "구매 기록", + "使用记录": "사용자 기록", + "失效时间要大于当前时间": "만료 시간은 현재 시간보다 길어야합니다.", + "修改名字": "이름 편집", + "时": "시간", + "分": "분", + "Amazon Alexa": "아마존 알렉사", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexa를 사용하여 잠금 상태를 잠금 해제, 잠금 및 확인할 수 있습니다.", + "支持的国家": "지원되는 국가", + "支持的国家值": "미국, 캐나다, 영국, 호주, 인도, 독일, 프랑스, 이탈리아, 스페인, 일본", + "操作流程": "운영 프로세스", + "操作流程值": "1 스마트 잠금 앱으로 잠금 및 게이트웨이 추가\n\n2 APP에서 잠금 장치의 원격 잠금 해제 기능을 활성화하십시오 (이 기능은 기본적으로 꺼져 있음). 이 옵션이 없으면 잠금 장치가 Alexa를 지원하지 않습니다.\n\n3 Alexa에 기술을 추가하고 스마트 잠금 APP의 계정과 암호로 권한을 부여합니다. 승인이 성공하면 계정에서 장치를 발견 할 수 있습니다.\n\n4 Alexa 앱에서 잠금을 찾아 음성 잠금 해제 기능을 켜고 언어 암호를 설정하십시오.\n\n5 자물쇠는 Alexa를 통해 운영될 수 있습니다", + "Google Home": "구글 홈", + "Action name": "액션 이름", + "ScienerSmart": "ScienerSmart", + "支持的语言": "지원되는 언어", + "英语": "영어", + "Google Home操作流程的值": "1. 잠금 장치 및 게이트웨이를 추가하려면 스마트 잠금 응용 프로그램을 사용하십시오.\n\n2. APP에서 잠금 장치의 원격 잠금 해제 기능을 활성화하십시오 (이 기능은 기본적으로 꺼져 있습니다). 이 옵션이 없으면 잠금 장치가 Google Home을 지원하지 않습니다.\n\n3. Google Home 앱을 설치하고 왼쪽 상단에있는 \"\" 버튼을 클릭하십시오.\n\n4. 설정 페이지에서 \"Google로 작업\" 을 선택하십시오.\n\n5. \"ScienerSmart\" 를 검색하고 스마트 잠금 APP 계정과 암호를 사용하여 권한을 부여하십시오.", + "密码需至少包含数字/字母/字符中的2种组合": "암호에는 숫자, 문자 및 특수 문자 중 2 개 이상이 있어야합니다.", + "已开锁": "잠금 해제", + "已闭锁": "잠긴", + "两次密码不一致哦": "암호가 일치하지 않습니다.", + "中功率": "중간 전력", + "常规使用": "정사이즈 사용", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "게이트웨이의 전원이 켜진 후 5 초 동안 리셋 버튼을 누르고 누르고 표시등이 번갈아 깜박이면 다음 을 클릭하십시오.", + "扫描设备": "스캔 장치", + "删除失败,网关可能已经离线,是否强制删除该数据?": "삭제가 실패했습니다. 게이트웨이가 오프라인 상태일 수 있다. 강제로 데이터 삭제를 하시겠습니까?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_lt.json b/lan/lan_lt.json new file mode 100644 index 00000000..84e203e1 --- /dev/null +++ b/lan/lan_lt.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Žvaigždžių užraktas", + "锁通通": "Lock through", + "点击开锁,长按闭锁": "Palieskite atrakinti, laikykite užrakinti", + "考勤": "Lankomumas", + "考勤设置": "Lankomumo nustatymai", + "电子钥匙": "Ekeys", + "添加卡": "Pridėti kortelę", + "卡号": "Kortelės numeris", + "添加指纹": "Pridėti pirštų atspaudą", + "指纹号": "Pirštų atspaudų numeris", + "遥控": "Nuotolinis", + "添加人脸": "Pridėti veidą", + "门锁日志": "Durų užrakto žurnalas", + "密码号": "Slaptažodžio numeris", + "添加者": "Operatorius", + "添加时间": "Laikas", + "重置": "Reset", + "请输入手机号或者邮箱": "Telefono numeris/El.paštas", + "工作时间": "Darbo laikas", + "工作日设置": "Darbo dienos nustatymas", + "星期一": "Pirmadienis", + "星期二": "Antradienis", + "星期三": "Trečiadienis", + "星期四": "Ketvirtadienis", + "星期五": "Penktadienis", + "星期六": "Šeštadienis", + "星期日": "Sekmadienis", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Saulė", + "群发钥匙": "Siųsti kelis ekeys", + "锁": "Užraktas", + "请添加": "Gavėjas", + "允许远程开锁": "Nuotolinis atrakinimas", + "请输入验证码": "Patikrinimo kodas", + "获取密码": "Generuoti prieigos kodą", + "请给密码命名": "Įveskite šio prieigos kodo pavadinimą", + "密码有限期为6个小时,只能使用一次": "Šis prieigos kodas turi būti naudojamas per 6 valandas nuo dabartinio laiko arba jis bus sustabdytas saugumo sumetimais.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Rankiniu būdu įveskite 6-9 skaitmenis kaip slaptažodį. Galima pridėti telefonu „ bluetooth “šalia užrakto arba nuotoliniu būdu pridėti per vartus", + "获取": "Get", + "添加": "Pridėti", + "删除公司": "Ištrinti įmonę", + "密码详情": "Paskodo informacija", + "修改密码": "Pakeisti prieigos kodą", + "添加虹膜": "Pridėti iris", + "添加门磁": "Durų jutiklis", + "添加无线键盘": "Belaidė klaviatūra", + "添加手掌": "Pridėti palmių", + "请输入员工账号": "Įveskite darbuotojo sąskaitą", + "批量授权锁": "Suteikti kelis spynos", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Įgaliotas administratorius turės daugumos leidimą valdyti šį užraktą.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ši funkcija leidžia nuotoliniu būdu atrakinti \"smart lock\" per vartus. ši funkcija gali būti įjungta arba išjungta tik per \"bluetooth\".", + "排列方式": "Sąrašo tipas", + "早到榜": "Ankstyvasis sąrašas", + "迟到榜": "Vėlyvasis sąrašas", + "当前模式": "Dabartinis režimas", + "勤奋榜": "Darbo kietas sąrašas", + "延迟时间": "Vėlavimo laikas", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Užraktas bus automatiškai užrakinamas po laiko. prašome atrakinti jį vieną kartą pirmą kartą, kad nustatymas būtų prieinamas.", + "时间": "Laikas", + "开始时间": "Pradžios laikas", + "结束时间": "Pabaigos laikas", + "工作时间设置": "Darbo laiko nustatymas", + "常开模式": "Praėjimo režimas", + "常开时间": "Šiuo laikotarpiu", + "常开日期": "Šiomis dienomis", + "添加员工": "Pridėti personalo", + "节假日": "Atostogos", + "打卡方式": "Metodas", + "员工是否有钥匙": "Jau turi ekey", + "上班时间": "Pradžios laikas", + "下班时间": "Uždarymo laikas", + "本周": "Ši savaitė", + "单休": "Vienos dienos savaitgalis", + "双休": "Dviejų dienų savaitgalis", + "单双休": "Vieno-dviejų dienų savaitgalis", + "年": "Metai", + "月": "Mėnuo", + "放假日期": "Atostogos", + "补班日期": "Darbo dienos", + "添加假日": "Pridėti atostogų", + "开始日期": "Pradžios data", + "必填": "Privalomas", + "结束日期": "Pabaigos data", + "日榜": "Kasdien", + "月榜": "Mėnesinis", + "考勤记录": "Įrašai", + "假日信息": "Atostogų info", + "基本信息": "Pagrindai", + "无线键盘": "Belaidė klaviatūra", + "选择无线键盘": "Pridėti klaviatūrą", + "门磁": "Durų jutiklis", + "自动闭锁": "Automatinis užraktas", + "锁声音": "Užrakinti garsą", + "防撬报警": "Tamper alert", + "重置键": "Reset mygtukas", + "锁时间": "Užraktas laikrodis", + "诊断": "Diagnozuoti", + "上传数据": "Įkelti duomenis", + "导入其他锁数据": "Importuoti frome kitą užraktą", + "锁升级": "Programinės įrangos atnaujinimas", + "标记房态": "Kambario statusas", + "开锁提醒": "Atrakinti pranešimą", + "微信二维码": "Atrakinti qr kodas", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Žmonės su elektroniniais raktais gali atidaryti duris nuskaitant šį qr kodą per wechat. Kiekvieno užrakto qr kodas yra skirtingas. Galite jį išspausdinti ir įklijuoti šalia atitinkamos spynos", + "锁编号": "Užrakto numeris", + "电量": "Baterija", + "锁分组": "Užrakto grupė", + "选择分组": "Pasirinkite grupę", + "创建新分组": "Sukurti grupę", + "管理员开锁密码": "Administratoriaus prieigos kodas", + "更新": "Atnaujinimas", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Akumuliatoriaus lygis bus atnaujintas „ gateway “arba telefono „ bluetooth“", + "当屏幕闪烁时,点击下一步": "Spustelėkite toliau, kai klaviatūra mirksi", + "输入*529#或按设置键": "Įveskite README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # arba paspauskite nustatymų klavišą", + "长按重置键2秒": "Paspauskite ir palaikykite reset mygtuką 2 sekundes", + "附近的设备": "Netoliese esanti įranga", + "暂无数据": "Nėra duomenų", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Jūs galėsite gauti durų būseną su durų jutikliu kartu su vartų. tik vienas jutiklis leidžiama susieti su užraktu.", + "开始": "Pradžia", + "全天": "Visos valandos", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Galite nustatyti kelis praėjimo režimo laikotarpius. per nustatytus laikotarpius, užraktas liks atviroje būsenoje po atrakinimo.", + "请选择锁音量": "Pasirinkite užrakinimo garsumą", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Įjungus, išgirsite garsą iš užrakto", + "低": "Žemas", + "较低": "Vidutinio žemumo", + "中": "Vidutinė", + "较高": "Vidutinio aukščio", + "高": "Aukštas", + "开启后,锁被撬动时,会发出报警声": "Įjungus, įjungsite įspėjimą apie tamperį.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Išjungus mygtuką \"reset\" yra išjungtas.", + "校准时间": "Kalibravimo laikas", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnozė yra perskaityti konfigūracijos informaciją spynos viduje ir įkelti ją, kad darbuotojai galėtų analizuoti nesėkmės priežastį", + "上传": "Įkelti", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Įkelti duomenis iš užrakto į serverį. tai gali užtrukti keletą minučių", + "请选择要从哪把锁导入": "Pasirinkite užraktą importuoti iš", + "有新版本": "Turėti naują versiją", + "当前版本": "Dabartinė versija", + "升级": "Atnaujinimas", + "空闲": "Laisvas", + "已入住": "Okupuotas", + "多语言": "Kalbos", + "添加锁": "Pridėti užraktą", + "锁地址": "Užraktas adresas", + "选择锁类型": "Pasirinkite užrakto tipą", + "NFC无源锁": "Nfc pasyvus užraktas", + "添加设备": "Pridėti įrenginį", + "网关": "Vartai", + "客服": "Klientų aptarnavimas", + "设置": "Nustatymai", + "更多设置": "Daugiau nustatyti", + "消息推送": "Pranešimas stumti", + "锁用户管理": "Užrakinti vartotojus", + "拥有的钥匙": "Ekeys susijęs su šiuo vartotoju", + "批量授权": "Institucijų valdymas", + "关联设备": "Susijęs įrenginys", + "关联姓名": "Susijęs vardas", + "转移智能锁": "Perdavimo užraktas", + "选择锁": "Ekrano užraktas", + "接收人信息": "Gavėjas", + "转移网关": "Perdavimo vartai", + "锁屏": "Ekrano užraktas", + "已关闭": "Off", + "已开启": "On", + "开启": "Įjungti", + "确定要开启重置键?": "Toliau įjungti reset mygtuką?", + "确定要关闭重置键?": "Toliau išjungti reset mygtuką?", + "隐藏无效开锁权限": "Paslėpti negaliojančią prieigą", + "APP开锁时需手机连网的锁": "Spynos, reikalaujančios telefono internete", + "增值服务": "Paslaugos", + "关于": "Apie", + "退出": "Atsijungimas", + "删除账号": "Ištrinti sąskaitą", + "个人信息": "Sąskaitos informacija", + "头像": "Avataras", + "昵称": "Pravardė", + "请输入昵称": "Prašome įvesti savo slapyvardį", + "修改昵称": "Pervadinti", + "修改账号": "Redaguoti sąskaitą", + "重置密码": "Atstatyti slaptažodį", + "安全问题": "Saugumo klausimas", + "为了你的账号安全,修改账号前请先使用验证码验证": "Norėdami užtikrinti savo paskyros saugumą, prieš keičiant paskyrą naudokite paskyros slaptažodžio patikrinimą", + "请输入新账号": "Prašome įvesti naują sąskaitą", + "找回密码和登录新设备时,可通过绑定的手机验证": "Įpareigojantis telefono numeris bus naudojamas patvirtinimo kodui gauti.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Privalomas el. laiškas bus naudojamas patvirtinimo kodui gauti.", + "原密码": "Dabartinis slaptažodis", + "新密码": "Naujas slaptažodis", + "确认密码": "Patvirtinti slaptažodį", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Jei telefonas prarastas, galite prisijungti prie naujo telefono atsakant į saugumo klausimus.", + "问题一": "1 klausimas", + "问题二": "2 klausimas", + "问题三": "3 klausimas", + "请输入你的答案": "Prašome įvesti savo atsakymą", + "即将到期": "Galioja netrukus", + "去授权": "Eiti į autorizuoti", + "修改名称": "Redaguoti pavadinimą", + "状态": "Statusas", + "WiFi名称": "Wifi pavadinimas", + "网络MAC": "Tinklo mac", + "网关升级": "Vartų atnaujinimas", + "网关连接的锁": "Užraktas (-ai) prijungtas prie šio vartų", + "信号强": "Stipri", + "选择网关类型": "Pasirinkite vartų tipą", + "添加网关": "Pridėti vartai", + "重新通电": "Vėl prijungti maitinimo", + "指示灯": "Indikatoriaus šviesa", + "选择网关": "Pasirinkite vartai", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g nepalaikomas,. pasirinkite 2.4g wifi.", + "WiFi密码": "Wifi passward", + "请输入WiFi密码": "Įveskite wifi slaptažodį", + "网关名称": "Vartų pavadinimas", + "请输入网关名称": "Įveskite vartų pavadinimą", + "IP地址": "Ip adresas", + "子网掩码": "Potinklio kaukė", + "默认网关": "Numatytasis vartai", + "自动获取DNS服务器地址": "Automatiškai gauti dns serverio adresą", + "首选DNS": "Pageidautina dns", + "备选DNS": "Alternatyvus dns", + "不使用静态IP": "Nėra naudojamas statinis ip", + "使用静态IP": "Naudoti statinį ip", + "请输入IP地址": "Įveskite ip adresą", + "请输入子网掩码": "Įveskite potinklio kaukę", + "请输入默认网关": "Įvesti numatytąjį vartai", + "所有锁": "Visi spynos", + "搜索所有类型的锁": "Nuskaitykite visų tipų spynos", + "门锁": "Durų užraktas", + "挂锁": "Lazdos", + "保险箱锁": "Saugus užraktas", + "智能门禁": "Pažangioji prieigos kontrolė", + "车位锁": "Automobilių stovėjimo užraktas", + "摸亮触摸屏": "Palieskite bet kurį klavišą, kad įjungtumėte klaviatūrą", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Prašome palieskite bet kurį klavišą, kad įjungtumėte užraktą, ir įdėkite jį į poravimo režimą.", + "附近的锁": "Netoli spynos", + "如需修改名字请重新命名,点击确定添加锁": "Jei norite pakeisti pavadinimą, pervadinkite, spustelėkite gerai, kad pridėtumėte užraktą", + "添加锁时,手机必须在锁旁边": "Pridedant užraktą, telefonas turi būti šalia užrakto", + "登录": "Prisijungti", + "注册": "Registro", + "我已阅读并同意": "Aš perskaičiau ir sutikau", + "验证码": "Kodas", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Jūsų slaptažodis turi būti 8-20 simbolių ir turi būti bent dviejų tipų skaičių, raidžių ir simbolių", + "手机": "Telefonas", + "邮箱": "El. paštas", + "请输入邮箱": "Įveskite savo el. laišką", + "国家/地区": "Šalis/regionas", + "你所在的国家/地区": "Jūsų šalis/regionas", + "选择国家/地区": "Pasirinkite savo šalį ar regioną", + "获取验证码": "Gauti kodą", + "商务合作": "Verslas", + "电脑网页版": "Žiniatinklio sistema", + "酒店系统": "Viešbučių sistema", + "说明书网页版": "Vartotojo vadovas", + "高级功能": "Išplėstinė funkcija", + "记录保存": "Įrašų išsaugojimas", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Sms gali būti naudojama siųsti prieigos kodą ir ekey informaciją gavėjui.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "El. laiškas gali būti naudojamas siųsti prieigos kodą ir ekey informaciją gavėjui.", + "购买实名认证提示": "Kai funkcija yra įjungta, norėdami atidaryti programą, turite naudoti pirštų atspaudą, veidą ar paskyros slaptažodį. Nereikia dar kartą patikrinti 3 minutes", + "请选择你希望的实名认证频次": "Pasirinkite norimą tikrojo vardo autentifikavimo dažnį", + "仅首次": "Pirmą kartą", + "每日一次": "Kartą per dieną", + "每周一次": "Kartą per savaitę", + "每月一次": "Kartą per mėnesį", + "当前状态": "Dabartinė būsena", + "试用中": "Teismo metu", + "高级功能权益内容": "Išplėstinės funkcijos", + "短信模板": "Sms šablonas", + "邮件模板": "El. pašto šablonas", + "发卡工具": "Kortelės koduotojas", + "购买高级功能须知": "Pranešimas", + "购买高级功能提示": "Daugiau pažangių funkcijų yra kuriama, ir jei jums reikia jų, esate kviečiami atidaryti paslaugą pagal spynos skaičius. Pažangios funkcijos yra prieinamos tik savo spynos. Jei esate įgaliotas administratorius, susisiekite su viršutiniu užrakto administratoriumi, kad atidarytumėte paslaugą", + "免费体验": "Nemokamas bandymas", + "立即开通": "Atidaryti dabar", + "购买短信": "Pirkti sms", + "购买邮件": "Pirkti elektroninį laišką", + "购买实名认证次数": "Įsigykite tikrojo vardo autentifikavimo kartus", + "开通高级功能": "Įjungti išplėstinę funkciją", + "选择套餐": "Pasirinkite paketą", + "支付方式": "Mokėjimo būdas", + "支付宝": "Alipay", + "去支付": "Mokėti", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Jums leidžiama apibrėžti žinutę patys. jis naudojamas siųsti informaciją apie slaptažodį ir ekey kitiems.", + "高级功能仅能用于你自己的锁": "Išplėstinė funkcija gali būti taikoma tik savo spynos.", + "新建模板": "Sukurti šablonas", + "类型": "Tipas", + "模版内容": "Šablono turinys", + "预览": "Peržiūra", + "房间名": "Kambarys", + "预计产生短信条数": "Apskaičiuoti pranešimų segmentai", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ši funkcija leidžia paslėpti tam tikrą laiką negaliojančius slaptažodžius, ekeys, korteles ir pirštų atspaudus.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Vartotojo telefonas turi būti internete atrakinti šiuos pasirinktus spynos su app.", + "配置WiFi": "Wifi konfigūravimas", + "请输入WiFi名字": "Prašome įvesti wifi pavadinimą", + "WiFi配网": "Wifi paskirstymo tinklas", + "胁迫卡": "Streso kortelė", + "员工是否有密码": "Jau turi slaptažodį", + "员工是否有卡": "Jau turi kortelę", + "员工是否有指纹": "Jau nustatykite pirštų atspaudą", + "获取钥匙": "Gauti raktą", + "获取卡": "Gauti kortelę", + "获取指纹": "Gauti pirštų atspaudą", + "安全验证": "Tapatybės patikrinimas", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Visa jūsų paskyros informacija bus pašalinta iš platformos visam laikui ir jų negalima atkurti. ar norite ištrinti?", + "监控": "Monitorius", + "视频日志": "Vaizdo žurnalas", + "开门器": "Durų atidarytuvas", + "面容开锁": "Veidas atrakinamas", + "开门方向设置": "Atidarymo kryptis nustatytas", + "电机功率设置": "Motorpower nustatymas", + "开锁时是否需联网": "Jei internetas reikalingas atrakinant", + "选择要加入分组的锁": "Pasirinkite spynos pridėti prie šios grupės", + "锁数量": "Užraktų skaičius", + "小米IOT平台": "Xiaomi iot platforma", + "面容开锁设置": "Veidas atblokuoja nustatytas", + "感应距离": "Jutimo atstumas", + "防误开": "Užkirsti kelią neteisingai atidaryti", + "防误开已关闭,关门后仍可使用面容开锁": "Užkirsti kelią klaidingai buvo uždarytas, po uždarymo durų vis dar gali naudoti veidą atrakinti", + "添加和使用面容开锁时": "Pridėti ir naudoti veidą, kai atrakinama", + "添加和使用面容开锁时提示": "\n1, pabandykite išlaikyti vieną asmenį priešais durų operaciją;\n2, prašome stovėti priešais durų užraktą apie 0,5 ~ 0,8 metrų, nukreiptas į durų užraktą;\n3. prašome išlaikyti savo veidą be kliūčių ir atskleisti savo veido bruožus;\n4. kai veido atpažinimas yra nenormalus, galite paliesti bet kurį skaitmeninės klaviatūros klavišą, kad iš naujo paleistumėte veido atpažinimą rankiniu būdu.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Prašome atidžiai pasirinkti variklio galią, atsižvelgiant į faktinę durų užrakto situaciją:", + "小功率:": "Miniwatt:", + "耗电少": "Mažiau energijos suvartojimo", + "大功率": "Didelės galios:", + "大功率提示": "Jei užrakto liežuvis negali būti atitrauktas paprastai, kai atrakinimo, arba reikia vairuoti", + "开门方向设置提示": "Prašome atidžiai pasirinkti kryptį atidaryti savo namų duris (jei pasirinksite neteisingą kryptį, negalėsite tinkamai atidaryti ir uždaryti duris):", + "左开": "Atidaryti kairėje", + "右开": "Atidaryti dešinėn", + "判断方法:": "Atsakymai:", + "判断方法内容": "Vyras stovėjo už namo, priešais įėjimo duris.", + "录像时段": "Vaizdo lizdas", + "密码": "Paskodai", + "卡": "Kortai", + "指纹": "Pirštų atspaudas", + "人脸": "Veidas", + "配件商城": "Lock mall", + "公司名称": "Įmonės pavadinimas", + "请输入公司名字": "Įveskite įmonės pavadinimą", + "提示": "Užuomina", + "是否删除?": "Ar ištrinti?", + "员工信息": "Personalo informacija", + "员工": "Personalas", + "打卡方式无效": "Nepasiekiamas", + "中国": "Kinija", + "选择钥匙": "Pasirinkite ekey", + "编辑": "Redaguoti", + "无": "Ne", + "有": "Taip", + "请输入姓名": "Prašome įvesti vardą", + "获取人脸": "Gauti veidus", + "选择密码": "Pasirinkite slaptažodį", + "选择卡": "Pasirinkite kortelę", + "选择指纹": "Pasirinkite pirštų atspaudą", + "选择人脸": "Pasirinkite veidą", + "员工是否有人脸": "Ar darbuotojas turi veidą", + "同时删除员工钥匙": "Ištrinti jo/jos ekey", + "删除": "Delet", + "确定要删除员工吗?": "Ištrinti šį darbuotoją", + "月统计": "Mėnesio statistika", + "迟到": "Vėlai", + "早退": "Išvykti anksti", + "未打卡": "Nėra įrašo", + "钥匙将在": "Šis ekey baigiasi", + "天后失效": "Diena (ai)", + "电量更新时间:": "Akumuliatoriaus atnaujinimo laikas:", + "新增配件": "Pridėti", + "钥匙不可用": "Raktas nėra", + "正在开锁中...": "Atrakinimas...", + "你的钥匙": "Jūsų raktas", + "常开模式启动!长按闭锁": "Pradėtas atidaryti režimas! Ilgas paspauskite užrakinti", + "演示模式": "Demo režimas", + "请先同意用户协议及隐私政策": "Pirmiausia sutikite su vartotojo sutartimi ir privatumo politika", + "用户协议": "Vartotojo sąlygos", + "隐私政策": "Privatumo politika", + "注册成功": "Registracija sėkminga", + "你所在的": "Jūs esate", + "手机号": "Telefono numeris", + "忘记密码": "Pamiršote slaptažodį", + "重置成功": "Atstatyti sėkmę", + "确定要退出吗?": "Išeiti?", + "功能暂未开放": "Funkcija dar nėra atvira", + "设置成功": "Sėkmingai nustatyti", + "删除成功": "Sėkmingai ištrinti", + "单次": "Vienkartinis", + "永久": "Nuolatinis", + "限时": "Laikas", + "自定义": "Custom", + "清空码": "Ištrinti", + "循环": "Pasikartojantys", + "工作日": "Darbo diena", + "每日": "Kasdien", + "周末": "Savaitgalis", + "确定要删除吗?": "Ištrinti?", + "该锁的密码都将被删除": "Visi šio užrakto prieigos kodai bus ištrinti", + "已过期": "Negaliojantis", + "该锁的电子钥匙都将被删除": "Visi ekeys šio užrakto bus ištrinti", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Ištrinti visus ekeys, susijusius su šiuo ekey. šis žingsnis negali būti atšauktas!", + "删除钥匙会在用户APP连网后生效": "Ekey bus ištrintas", + "有效时间": "Veiksmingas laikas", + "接收者": "Gavėjas", + "仅管理自己创建的用户": "Valdyti tik savo vartotojus", + "远程开锁": "Nuotolinis atrakinimas", + "请输入钥匙名称": "Įveskite rakto pavadinimą", + "修改成功": "Keisti sėkmę", + "冻结": "Freeze", + "解除冻结": "Atšilimas", + "授权": "Autorizuoti", + "取消授权": "Deautorizuoti", + "同时解冻其发送的钥匙": "Atšildyti visus ekeys išduotas šio vartotojo", + "会在用户APP连网后生效": "Šis ekey bus atšildytas, kai vartotojo programa prisijungs prie tinklo", + "同时冻结其发送的钥匙": "Užšaldyti visus ekeys išduotas šio vartotojo", + "冻结会在用户APP连网后生效": "Šis ekey bus užšaldytas, kai vartotojo programa prisijungs prie tinklo", + "取消授权会在用户APP连网后生效": "Vartotojas praras savo/jos leidimus, kai vartotojo programa prisijungs prie tinklo", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Įgaliotas vartotojas turi beveik tuos pačius leidimus, kaip ir užrakto valdytojas (pvz., galimybė siųsti ekeys ir slaptažodžius)", + "失效时间需晚于生效时间": "Galiojimo laikas turi būti vėliau nei įsigaliojimo laikas", + "生效时间需晚于当前时间": "Veiksmingas laikas turi būti vėliau nei dabartinis laikas", + "失效日期需晚于生效日期": "Galiojimo laikas turi būti vėlesnis nei įsigaliojimo data", + "修改有效期": "Keisti laikotarpį", + "生效日期": "Pradžios data", + "失效日期": "Pabaigos data", + "开锁": "Unlock", + "开锁成功": "Atrakinti sėkmę", + "请选择锁": "Prašome pasirinkti spynos", + "请选择接收者": "Prašome pasirinkti imtuvą", + "请选择有效期": "Prašome pasirinkti galiojimo laikotarpį", + "请选择发送方式": "Prašome pasirinkti siuntimo metodą", + "请选择结束时间": "Prašome pasirinkti pabaigos laiką", + "完成": "Užbaigtas", + "有效日": "Ciklas įjungtas", + "发送成功": "Siųsti sėkmę", + "请选择开始时间": "Prašome pasirinkti pradžios laiką", + "选择用户": "Pasirinkite gavėjus", + "已选中": "Pasirinkta", + "确定": "Ok", + "请选择要发送的锁": "Prašome pasirinkti spynos", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "„ Face real-name “autentifikavimas reiškia vartotojo poreikį patikrinti jo veidą prieš atrakinant telefono programą, o patikrinimą galima atrakinti.", + "分享": "Dalintis", + "请输入接收者账号": "Prašome įvesti imtuvo sąskaitą", + "接收者号码未注册,请重新发送": "Imtuvo numeris nėra registruotas, prašome pakartoti", + "是否发送电子钥匙给未注册账号": "Ar norite siųsti ekey į naują sąskaitą", + "取消": "Atšaukti", + "标记成功": "Žymėti sėkmę", + "微信好友": "Wechat draugai", + "短信": "Sms", + "邮件": "El. paštas", + "更多": "Daugiau", + "您好,您的电子钥匙生成成功": "Sveiki, jūsų elektroninis raktas yra sėkmingai sugeneruotas", + "生效时间不能小于当前时间": "Veiksmingas laikas negali būti mažesnis nei dabartinis laikas", + "结束时间不能小于当前时间": "Pabaigos laikas negali būti mažesnis už dabartinį laiką", + "是否为管理员": "Ar tai administratorius", + "已连接到锁,请将卡靠近门锁的读卡区": "Prijungtas. įdėkite kortelę prieš kortelių skaitytuvą", + "尝试连接设备...": "Susisiekimas su užraktu. prašome palaukti...", + "地理位置": "Geografinė padėtis", + "检查以确保以下地址是正确的": "Patikrinkite, kad šis adresas yra teisingas", + "地图加载中,请稍候。。": "Žemėlapis pakraunamas, prašome palaukti...", + "跳过": "Praleisti", + "还未获取到位置信息哦,请耐心等待一下!": "Informacija apie vietą dar nebuvo gauta, prašome palaukti kantriai!", + "请填写信息": "Prašome užpildyti informaciją", + "有效期": "Galiojimo laikotarpis", + "生效时间": "Pradžios laikas", + "失效时间": "Pabaigos laikas", + "上传成功": "Sėkmingai įkelta", + "未生效": "Neaktyvus", + "已生效": "Efektyvus", + "指纹详情": "Pirštų atspaudų informacija", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Jums reikės kelis kartus įdėti pirštą į jutiklį. sekite raginimus...", + "开始添加": "Pradžia", + "请将您的手指按下": "Vieta pirštu ant jutiklio", + "根据提示,抬起手指后再进行下一次指纹采集": "Sekite raginimus... jums reikės pašalinti ir įdėkite pirštą į jutiklį kitam įrašui", + "添加成功": "Pridėti sėkmę", + "更新成功": "Atnaujinti sėkmę", + "搜索": "Paieška", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Po atgalinio nustatymo užrakto kortelė bus ištrinta, ar norite atstatyti?", + "已失效": "Negaliojantis", + "卡详情": "Kortelės informacija", + "请输入": "Prašome įvesti čia", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Išjungus, spyna liks atrakinta visą dieną, kol ji bus rankiniu būdu užrakinta", + "请输入小于或等于60的数字": "Prašome įvesti mažiau nei 60 skaičių", + "操作成功": "Operacija sėkminga", + "管理员密码相同,无需修改": "Administratoriaus slaptažodis yra tas pats ir nereikia keisti", + "请输入6-9位数字": "6-9 skaitmenys ilgio", + "请输入6-9位管理员密码": "Prašome įvesti 6-9 skaitmenų administratoriaus slaptažodį", + "请输入新的管理员密码": "Prašome įvesti naują administratoriaus slaptažodį", + "未分组": "Negrupuotas", + "请输入分组名称": "Sukurti grupę", + "创建成功": "Sukurti sėkmę", + "设置锁分组成功": "Sėkmingai nustatyti užrakto grupę", + "电池1电量": "Baterija 1", + "电池2电量": "Baterija 2", + "电量更新时间": "Akumuliatoriaus atnaujinimo laikas", + "锁电量更新成功": "Užrakinti galios atnaujinimo sėkmė", + "您的钥匙未生效": "Jūsų raktas nėra veiksmingas", + "您的钥匙已冻结": "Jūsų raktas buvo užšaldytas", + "您的钥匙已过期": "Jūsų raktas pasibaigė", + "常开模式开启": "Užraktas yra praėjimo režimu", + "超级管理员": "Super administratorius", + "授权管理员": "Įgaliotas administratorius", + "普通用户": "Paprastas vartotojas", + "余": "Balansas", + "天": "Diena", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Ištrinus užraktą, visa informacija bus ištrinta kartu, ar tikrai norite ištrinti užraktą?", + "请输入登录密码": "Prašome įvesti paraiškos slaptažodį", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Nepavyko ištrinti įrenginio, įsitikinkite, kad prietaisas yra šalia įrenginio, įrenginys nėra prijungtas ir įjungtas įrenginys", + "用户无权限": "Vartotojas neturi leidimo", + "创建公司后,考勤功能才能使用": "Pirmiausia sukurkite įmonę", + "是否删除钥匙?": "Ištrinti šį ekey?", + "邮箱绑定成功": "El. pašto įrišimo sėkmė", + "手机绑定成功": "Mobiliojo telefono įrišimo sėkmė", + "网络访问失败,请检查网络是否正常": "Prašymas nepavyko. tinklo negalimas, prašome patikrinti ir prijungti savo įrenginį prie 3g/4g/wifi", + "清空": "Išvalyti", + "是否清空?": "Aišku?", + "消息详情": "Žinutės informacija", + "创建时间": "Kūrimo laikas", + "管理员详情": "Administratoriaus duomenys", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jei kas nors priverčia jus atidaryti duris, galite naudoti šią kortelę. signalizacijos pranešimas bus išsiųstas administratoriams. norėdami naudoti šią funkciją, įsitikinkite, kad jūsų užraktas yra internete.", + "请不要将胁迫卡用于日常开锁": "Prašome nenaudoti priverstinės kortelės kasdieniam naudojimui.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jei kas nors priverčia jus atidaryti duris, galite naudoti šį pirštų atspaudą. signalizacijos pranešimas bus išsiųstas administratoriams. norėdami naudoti šią funkciją, įsitikinkite, kad jūsų užraktas yra internete.", + "请不要将胁迫指纹用于日常开锁": "Prašome nenaudoti priverstinio pirštų atspaudo kasdieniam naudojimui.", + "创建公司": "Sukurti įmonę", + "公司名称不能超过30个字符": "Įmonės pavadinimas negali viršyti 30 simbolių", + "公司名称不能小于6个字符": "Įmonės pavadinimas negali būti mažesnis nei 6 simbolių", + "WIFI列表": "Wifi sąrašas", + "刷新": "Atnaujinti", + "手动配网": "Rankinis paskirstymo tinklas", + "远距离": "Ilgas atstumas", + "中距离": "Vidutinis atstumas", + "近距离": "Trumpas atstumas", + "锁时间更新成功": "Užrakinimo laiko atnaujinimo sėkmė", + "锁用户": "Užrakinti vartotojus", + "请选择常开日期": "Prašome pasirinkti atvirą datą", + "结束时间不能小于开始时间哦": "Pabaigos laikas negali būti mažesnis nei pradžios laikas", + "介绍": "Mūsų istorija", + "个人信息收集清单": "Asmeninės informacijos rinkimo sąrašas", + "应用权限说明": "Paraiškos leidimo aprašymas", + "第三方信息共享清单": "Trečiųjų šalių informacijos dalijimosi sąrašas", + "请选择您的位置": "Prašome pasirinkti savo vietą", + "请先选择位置": "Pirmiausia pasirinkite vietą", + "管理员密码": "Administratoriaus prieigos kodas", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Jei reikia keisti, įveskite naują administratoriaus slaptažodį (6 skaitmenys), spustelėkite gerai, kad pakeistumėte", + "修改": "Keisti", + "网络摄像头": "Kamera", + "重命名": "Pervadinti", + "分组下的锁将被移到未分组里": "Spynos pagal grupę bus perkeltos į negrupuotas", + "编辑成功": "Redaguoti sėkmę", + "厂商": "Gamintojas", + "型号": "Modelis", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Sugeneravus slaptažodį, prašome jį naudoti vieną kartą, kad būtų galima suaktyvinti prieš 23:59 tą pačią dieną, kitaip jis bus negaliojantis po 0 val. Įjungus slaptažodį, jį galima naudoti neribotą laiką galiojimo laikotarpiu.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Sukūrus slaptažodį, prašome jį naudoti prieš 23:59 tą pačią dieną, kitaip jis bus negaliojantis po 0 val. Išvalomas kodas naudojamas išvalyti visus slaptažodžius, sugeneruotus iki 0 val.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Sukūrus slaptažodį, prašome jį naudoti prieš 23:59 tą pačią dieną, kitaip jis bus negaliojantis po 0 val.", + "清空密码底部提示": "Slaptažodis galioja iki ištuštinimo dienos 23:59 val.", + "相机": "Kamera", + "相册": "Nuotraukos", + "读写": "Saugykla", + "定位": "Vieta", + "需要访问相机权限才能拍照上传文件例如头像上传": "Prieiga prie fotoaparato reikalinga fotografuoti ir įkelti failus, pvz., įkelti profilio vaizdą", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Prieiga prie fotoaparato reikalinga norint įkelti failus ir avatarus naudojant albumo vaizdus", + "需要访问读写权限才能使用本地图片上传头像": "Norint įkelti avatarus naudojant vietinius vaizdus, reikalinga prieiga prie skaitymo ir rašymo leidimų", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Norint naudoti rakto pridėjimo funkciją, reikalinga prieiga prie vietos informacijos", + "申请": "Paraiška", + "权限": "Leidimas", + "不允许": "Neleidžiama", + "允许": "Leidžiama", + "权限被拒绝": "Leidimas atmestas", + "请手动在系统设置中开启": "Prašome rankiniu būdu įjungti jį į sistemos nustatymus", + "权限以继续使用应用": "Leidimas toliau naudoti programą.", + "去设置": "Go set it up", + "当前网络": "Dabartinis tinklas", + "位置信息": "Vietos informacija", + "请输入wifi名称": "Prašome įvesti wifi pavadinimą", + "虹膜": "Iris", + "手掌": "Palmė", + "商城": "Mall", + "我的": "Mano", + "微信公众号推送": "Wechat viešoji sąskaita", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Norėdami atidaryti „ wechat “, kad gautumėte signalizacijos pranešimus, pirmiausia reikia atkreipti dėmesį į „ skye smart lock wechat“ viešąją sąskaitą, įrašykite qr kodą ir naudokite „ wechat “, kad nuskaitytumėte nustatymus.", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Prieiga prie „ bluetooth “leidimų reikalinga norint naudoti rakto pridėties funkcijos vietos informaciją", + "请输入Email": "Įveskite savo el. laišką", + "请输入手机号": "Įveskite savo telefono numerį", + "家人到家": "Šeimos narys atvyko namo", + "添加家人": "Pridėti šeimos narį", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Jei užraktas nėra prijungtas prie interneto, laiku negali būti siunčiami priminimai dėl prieigos kodo, kortelės, pirštų atspaudų ir kitų durų atidarymo būdų.", + "消息提醒": "Priminimas", + "开门通知": "Pranešimas apie atidarymą", + "N天未开门": "N dienų be durų atidarymo", + "门未关好": "Durys nėra uždarytos", + "防拆报警": "Tamper signalizacija", + "低电量提醒": "Žema baterija", + "胁迫开门": "Priverstinis durų atidarymas", + "有人按门铃": "Kažkas skambina durų varpą", + "有人出现在门口": "Kažkas pasirodo prie durų", + "提醒方式": "Priminimo metodas", + "开门方式": "Durų atidarymo metodas", + "请选择": "Prašome pasirinkti", + "家人": "Šeimos narys", + "保存": "Išsaugoti", + "APP推送": "App push", + "管理员": "Administratorius", + "未启用": "Neįjungta", + "已启用": "Įjungta", + "省电模式": "Energijos taupymo režimas", + "逗留抓拍模式": "Išlikti fiksavimo režimas", + "实时监控模式": "Realaus laiko stebėjimo režimas", + "自定义模式": "Pasirinktinis režimas", + "猫眼设置": "Katės akių nustatymas", + "猫眼工作模式": "Cat eye darbo režimas", + "自动亮屏": "Automatinis ryškus ekranas", + "亮屏持续时间": "Ekranas laiku", + "逗留警告": "Buvimo įspėjimas", + "异常警告": "Nenormalus įspėjimas", + "短信提醒": "Sms", + "邮件提醒": "El. paštas", + "N天未开门提醒": "N dienų be durų atidarymo", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Jei kas nors priverčia jus atidaryti užraktą, galite naudoti šį pirštų atspaudą. Signalizacijos pranešimas bus išsiųstas administratoriams. norėdami naudoti šią funkciją, įsitikinkite, kad jūsų užraktas yra internete.", + "胁迫指纹": "Priverstinis pirštų atspaudas", + "指纹列表": "Pirštų atspaudų sąrašas", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Po nustatyto laiko, jei užraktas nebus atidarytas, sistema siunčia priminimo pranešimą nurodytam gavėjui. Ši funkcija reikalauja, kad užraktas būtų prijungtas prie interneto.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Įgalinus priminimą, kai užrakto baterija yra mažesnė nei 20%, 10% ir 5%, sistema siunčia priminimo pranešimą nurodytam gavėjui.", + "未开门时间": "Dienos be durų atidarymo", + "添加和使用面容开锁时:": "Pridėti ir naudoti veidą, kai atrakinama:", + "关锁": "Uždaryti užraktą", + "功能": "Funkcija", + "配件": "Dalys", + "云存": "Debesų saugykla", + "本地": "Ši vietovė", + "3天滚动储存": "3 dienų valcavimo sandėliavimas", + "去升级": "Atnaujinti dabar", + "下载列表": "Atsisiųsti sąrašą", + "已下载": "Atsisiųsta", + "全部视频": "Visi vaizdo įrašai", + "已为本设备免费提供3大滚动视频储存服务": "Šiam įrenginiui nemokamai buvo teikiamos trys slinkties vaizdo saugojimo paslaugos", + "视频播放": "Vaizdo atkūrimas", + "全选": "Visi", + "请选择要删除的视频": "Pasirinkite vaizdo įrašą, kurį norite ištrinti", + "请选择要下载的视频": "Pasirinkite vaizdo įrašą, kurį norite atsisiųsti", + "欢迎使用": "Sveiki atvykę į naudojimą", + "用户协议和隐私政策概要": "Vartotojo susitarimo ir privatumo politikos santrauka", + "协议概要": "Protokolo santrauka", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Dėkojame, kad naudojate šią programą. Mes labai svarbūs jūsų asmeninei informacijai ir privatumo apsaugai. Prieš naudodami šį produktą, prašome atidžiai perskaityti", + "《用户协议》": "Vartotojo sąlygos", + "和": "Ir", + "《隐私政策》": "◆ Privatumo politika", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Visas turinys. Spustelėdami \"sutinku\", jūs sutinkate ir priimate visas sąlygas. Jei nuspręsite nesutikti, negalėsite naudotis mūsų produktais ir paslaugomis ir išeisite iš programos.", + "不同意": "Nesutinka", + "同意": "Sutinku", + "该功能是高级功能,请开通后再使用": "Tai yra išplėstinė funkcija. Pirmiausia įjunkite.", + "常用程序": "Bendros programos", + "该锁已被重置": "Užraktas buvo iš naujo", + "需要访问读写权限才能使用手动升级固件": "Norint rankiniu būdu atnaujinti programinę įrangą, reikia prieigos prie skaitymo ir rašymo leidimų", + "错误D固件,请选择正确的文件": "Neteisinga firmware, prašome pasirinkti teisingą failą", + "非SYD固件,请选择正确的文件": "Ne syd firmware, prašome pasirinkti teisingą failą", + "文件校验失败 0x01": "Failo patikrinimas nepavyko 0x01", + "解析元数据失败,请选择正确的文件": "Nepavyko analizuoti metaduomenų, pasirinkite teisingą failą", + "文件校验失败 0x02": "Failo patikrinimas nepavyko 0x02", + "文件校验失败 0x03": "Failo patikrinimas nepavyko 0x03", + "固件升级完成": "Firmware atnaujinimas baigtas", + "记录": "Įrašai", + "开通高级功能后才可以对锁进行管理": "Pirmiausia įjunkite išplėstinę funkciją, kad galėtumėte valdyti spynos.", + "去开通": "Įjungti", + "实名认证": "Tikrojo vardo autentiškumas", + "当前剩余数量": "Likę", + "购买": "Pirkti", + "实名认证为付费功能,请购买后再使用": "Tikrojo vardo autentifikavimas yra mokamos funkcijos, prašome jį naudoti po pirkimo", + "密码不一致哦": "Slaptažodžiai yra nenuoseklūs", + "退出添加": "Mesti pridėti", + "管理员已满": "Admin pilnas", + "用户已满": "Vartotojas yra pilnas", + "锁上面添加指纹已满": "Pridėti pirštų atspaudą prie užrakto yra pilnas", + "指纹已存在": "Pirštų atspaudas jau egzistuoja.", + "锁上面添加人脸已满": "Užrakinti virš pridėti veidą yra pilnas", + "人脸已存在": "Veidas jau egzistuoja", + "锁上面添加卡已满": "Užrakinti virš pridėti kortelę yra pilnas", + "卡已存在": "Kortelė jau egzistuoja", + "锁上面添加密码已满": "Užrakinti aukščiau pridėti slaptažodį yra pilnas", + "密码已存在": "Identiškas prieigos kodas jau egzistuoja. prašome pasirinkti kitą", + "请输入密码": "Prašome įvesti slaptažodį", + "暂无密码,无需重置": "Nėra slaptažodžio, nereikia atstatyti", + "真实姓名": "Tikrasis vardas", + "身份证号": "Id numeris", + "请输入真实姓名": "Prašome įvesti savo tikrąjį vardą", + "请输入身份证号": "Prašome įvesti savo id numerį", + "请输入身份证号和真实姓名": "Prašome įvesti savo id numerį ir tikrąjį vardą", + "点击返回设备配对": "Bakstelėkite atgal į įrenginio porą", + "无法连接?尝试升级": "Negalima prisijungti? bandymas atnaujinti", + "固件升级提示": "Programinės įrangos atnaujinimo raginimas", + "请先获取固件文件到手机本地,再选择升级": "Prašome pirmiausia gauti programinės įrangos failą į vietinį telefoną, o tada pasirinkite atnaujinti", + "固件升级中": "Programinė įranga yra atnaujinamas", + "取消升级": "Atšaukti atnaujinimą", + "固件传输中": "Firmware in transit", + "关闭": "Išjungti", + "传输中'": "Tranzitu", + "操作记录": "Įrašai", + "修改姓名": "Redaguoti pavadinimą", + "传输中": "Tranzitu", + "发送人": "Išleido", + "发送时间": "Išduotas laikas", + "钥匙详情": "Ekey info", + "姓名": "Vardas", + "发送": "Siųsti", + "请确认姓名全名和身份证号码是否正确": "Prašome patvirtinti, kad vardas ir id numeris yra teisingi", + "传输期间请勿离开当前页面": "Perkėlimo metu nepalikite dabartinio puslapio", + "机型": "Modeliai", + "硬件版本": "Aparatinės versijos", + "固件版本": "Firmware versija", + "手动升级": "Rankinis atnaujinimas", + "设备连接中...": "Įrenginys jungiantis...", + "未避免异常情况,请在门打开时升级": "Neišvengiamos išimtys, prašome atnaujinti, kai durys yra atviros", + "钥匙无效": "Raktas yra negaliojantis", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Negalima prisijungti prie užrakto. prašome iš naujo paleisti telefono blutooth ir bandykite dar kartą.", + "如果是全自动锁,请使屏幕变亮": "Jei tai yra visiškai automatinis užraktas, prašome padaryti ekraną ryškesnį", + "正在尝试闭锁……": "Bandant užrakinti. prašome palaukti...", + "清空记录": "Išvalyti įrašus", + "是否要删除操作记录?": "Toliau ištrinti įrašus?", + "被删除的记录不能恢复": "Įrašus negalima atkurti po ištrynimo.", + "全部事件": "Visi renginiai", + "开锁事件": "Atrakinti įvykis", + "异常事件": "Nenormalus įvykis", + "门铃事件": "Durų varpo renginys", + "视频事件": "Video renginys", + "请开启蓝牙": "Prašome įjungti bluetooth", + "请选择有效日": "Prašome pasirinkti veiksmingą dieną", + "公司名字长度不能小于 6 ": "Įmonės pavadinimo ilgis negali būti mažesnis nei 6", + "已是最新版本": "Nėra atnaujinimų", + "新建短信模版": "Sukurti sms šabloną", + "新建邮件模版": "Sukurti el. pašto šabloną", + "自定义短信模版": "Sms šablonas", + "自定义邮件模版": "El. pašto šablonas", + "名称": "Vardas", + "星星锁": "Žvaigždžių užraktas", + "无考勤记录": "Nėra įrašų", + "大家干劲十足": "Visi ateina laiku", + "工作时长未出炉": "Nėra darbo laiko", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Šalies/regiono pasirinkimas turės įtakos duomenų saugumui. jūs šiuo metu pasirinkote albaniją, prašome patvirtinti prieš pradedant.", + "确认国家或地区": "Patvirtinti šalį/regioną", + "我知道了": "Got it", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Norėdami gauti svarbius atnaujinimus, spustelėkite „ ok “ir įjunkite pranešimus nustatymuose.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Po įjungimo galite vėl įjungti ilgai paspausdami nustatymo klavišą ant užrakto ir vėl pridėdami jį su programa", + "已有": "Srovė", + "新增": "Nauja", + "账号格式错误": "Blogas formatas", + "接收者信息为空": "Gavėjo informacija yra tuščia", + "请输入时间(秒)": "Prašome įvesti laiką (sek)", + "加载数据失败": "Nepavyko įkelti duomenų", + "重试": "Pabandykite dar kartą", + "升级中,是否退出": "Atnaujinimo metu, ar išeiti", + "下一步": "Kitas", + "公寓": "Butas", + "个人用户": "Asmeniniai", + "星寓": "Star apartment", + "账号": "Paskyra", + "请输入手机号或email": "Telefono numeris arba el. paštas", + "请输入星寓管理员的账号": "Prašome įvesti „ star apartment “administratoriaus sąskaitą", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Visi pasirinkto užrakto (-ų) duomenys bus visam laikui perduoti gavėjui.", + "暂不支持跨平台转移,敬请期待": "Kryžminis perkėlimas šiuo metu nepalaikomas, laukiame jo", + "移除坏锁": "Perkelti sugedusios/pažeistos spynos į šiukšlių", + "转移确认": "Patvirtinti perkėlimą", + "本次共转移": "Šį kartą iš viso", + "把智能锁": "Smart lock", + "确认": "Ok", + "移除成功": "Sėkmingai pašalinti", + "转移成功": "Perkėlimo sėkmė", + "该已锁被删除": "Užrakinta ištrinta", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Įgaliotas administratorius gali valdyti tik pats sukurtus pasų kodus, „ ekeys “ir „ etccreated“.", + "添加授权管理员": "Sukurti administratorių", + "导出记录": "Eksporto įrašai", + "选择时间段": "Pasirinkite laikotarpį", + "导出": "Eksporto", + "批量导出": "Paketo eksportas", + "读取记录": "Atnaujinti įrašus", + "设备": "Įtaisas", + "消息": "Pranešimai", + "智能分析": "Intelektuali analizė", + "精准识别设备事件,过滤无效信息": "Tiksliai nustatyti įrenginio įvykius ir filtruoti nepagrįstą informaciją", + "系统设置": "Sistemos nustatymai", + "系统的全局配置在此项内进行设置": "Visuotinė sistemos konfigūracija yra nustatyta šiame elemente", + "导出操作记录": "Eksporto įrašai", + "立即查看": "Peržiūrėti", + "导出成功": "Sėkmingai eksportuotas", + "发送钥匙": "Send ekey", + "进度": "Ratas", + "失败": "Nepavyko", + "人脸详情": "Veido detalės", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Kai kas nors jaučiamas apie 1,5 metrų priešais duris, veido atpažinimo atrakinimas bus automatiškai pradėtas.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Kai kažkas jaučiamas apie 0,8 metrų priešais duris, veido atpažinimo atrakinimas bus automatiškai pradėtas.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Kai kas nors jaučia apie 0,5 metrų priešais duris, veido atpažinimo atrakinimas bus automatiškai pradėtas.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Jutimo atstumas buvo išjungtas, jums reikia rankiniu būdu paliesti bet kurį klaviatūros klavišą atlikti veido atpažinimo atrakinimo.", + "防误开已打开,开锁后": "Anti-klaida atidarymas buvo įjungtas, ir po atrakinimo", + "秒内不可使用面容开锁": "Veido atrakinimas negali būti naudojamas per kelias sekundes", + "掌静脉": "Palmių vena", + "添加掌静脉": "Pridėti palmių veną", + "胁迫掌静脉": "Priverstinė palmių vena", + "请不要将胁迫掌静脉用于日常开锁": "Prašome nenaudoti prievartos palmių venų kasdien atrakinimui", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Prijungtas prie užrakto, natūraliai atidarykite delną, delnas yra nukreiptas į kamerą", + "掌静脉详情": "Palmių venų detalės", + "掌静脉号": "Palmių venų skaičius", + "蓝牙未打开,请到设置里面打开蓝牙": "„ Bluetooth “nėra įjungtas, įjunkite „ bluetooth“ nustatymuose", + "删除用户时,会将用户拥有的钥匙一起删除。": "Jei vartotojas yra ištrintas, bet kuris su vartotoju susijęs ekeys taip pat bus ištrintas.", + "配置网络": "Konfigūruoti tinklą", + "你好": "Sveiki", + "成功": "Sėkmingas", + "类型选择": "Type select", + "请选择要使用哪种类型": "Prašome pasirinkti, kuris tipas naudoti", + "系统邮件(推荐)": "Sistemos el. paštas (rekomenduojama)", + "系统短信(推荐)": "Sms sistema (rekomenduojama)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "El. laiškas bus siunčiamas iš šios programos. pirmiausia pirkite elektroninio pašto paketą.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Sms bus išsiųstas iš šios programos. pirkite el. pašto paketą pirmiausia.", + "个人邮件": "Asmeninis el. paštas", + "个人短信": "Asmeninė sms", + "邮件将从你的个人邮箱发给用户": "El. paštas bus išsiųstas iš jūsų asmeninės el. pašto paskyros.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Sms žinutė bus siunčiama iš jūsų asmeninio telefono numerio. jūs mokate savo telekomunikacijų operatoriui.", + "为了更好地应用体验,请确定权限": "Dėl geresnės taikymo patirties, prašome patvirtinti leidimus", + "您第一次拒绝权限,请确定权限": "Pirmą kartą atsisakėte leidimo, prašome patvirtinti leidimą", + "您第二次拒绝权限,请去应用设置开启权限": "Antrą kartą atsisakėte leidimo, eikite į paraiškos nustatymus, kad įgalintumėte leidimą", + "去应用市场": "Eiti į \"app store\"", + "温馨提示": "Šiltas raginimas", + "关闭应用": "Uždaryti paraišką", + "开启微信接收报警消息需要先关注": "Norėdami atidaryti „ wechat “, kad gautumėte signalizacijos pranešimus, turite sekti", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat viešoji sąskaita, išsaugoti qr kodą ir naudoti wechat nuskaityti nustatymus", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Tikrojo vardo autentifikavimas yra mokama funkcija, prašome susisiekti su užrakto administratoriumi įsigyti ir naudoti", + "位置权限": "Vietos leidimas", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Prašome suteikti programą naudoti savo vietos. jis naudojamas nuskaityti ble spynos ir vartai.", + "相机/相册权限": "Fotoaparato/albumo leidimas", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Prašome suteikti programą skaityti ir rašyti nuotraukas ir failus iš saugojimo.", + "点击选择": "Spustelėkite pasirinkti", + "微信": "Wechat", + "朋友圈": "Akimirkos", + "QQ": "Qq", + "QQ空间": "Qqzone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Nuoroda", + "今天": "Šiandien", + "密码错误": "Negaliojantis slaptažodis", + "网络中断": "Tinklo nutraukimas", + "钥匙不存在": "Raktas neegzistuoja", + "钥匙过期": "Klavišas pasibaigė", + "钥匙已存在": "Raktas jau egzistuoja", + "密码失效": "Slaptažodis negalioja", + "门锁时间异常": "Durų užrakto laikas nenormalus", + "APP(手机)未联网": "App (mobilusis telefonas) nėra prijungtas prie interneto", + "数据不存在": "Duomenų nėra", + "待接收": "Bereceived", + "已冻结": "Frozen", + "已删除": "Ištrintas", + "未知": "Nežinomas", + "拖动下方滑块完成拼图": "Vilkite slankiklį į teisingą poziciją", + "验证成功": "Patikrinimo sėkmė", + "验证失败": "Patikrinimas nepavyko", + "向右拖动滑块填充拼图": "Vilkite slankiklį į dešinę, kad užpildytumėte galvosūkį", + "请先获取到位置信息哦": "Prašome pirmiausia gauti informaciją apie vietą", + "请选择国家": "Prašome pasirinkti šalį", + "获取锁信息": "Gauti užrakto informaciją", + "锁数据异常,请重试": "Užrakinimo duomenys yra nenormalūs, pabandykite dar kartą", + "连接设备中...": "Prijungti įrenginį...", + "把锁": "Spynos", + "条": "Juostelė", + "封": "Ruonis", + "次": "Laikai", + "支付成功": "Mokėti sėkmė", + "查看详情": "Peržiūrėti detales", + "请输入模板名称": "Prašome įvesti šablono pavadinimą", + "模版类型": "Tipas", + "再返回一次退出": "Vėl išeiti", + "请先添加锁": "Pirmiausia pridėkite užraktą", + "可视对讲": "Visual intercom", + "详细日志": "Detalus žurnalas", + "已复制到剪切板": "Kopijuotas", + "拍照": "Nuotrauka", + "从相册选择": "Rinktis iš albumo", + "选择问题": "Prašome pasirinkti klausimą", + "确认长度不足8位": "Patvirtinti ilgis mažesnis nei 8 skaitmenys", + "新密码长度不足8位": "Naujas slaptažodis ilgis mažesnis nei 8 skaitmenys", + "两次密码不一致": "Slaptažodžio neatitikimas. pabandykite dar kartą", + "请点击获取验证码,验证码将发送到": "Prašome gauti patikrinimo kodą. kodas bus išsiųstas", + "切换": "Jungiklis", + "验证": "Patikrinti", + "验证成功,账号已删除": "Patvirtinimas sėkmingas, paskyra ištrinta", + "该密码不是自定义密码,无法修改": "Šis slaptažodis nėra pasirinktinis slaptažodis ir negali būti pakeistas", + "请选择设备要关联哪些姓名": "Pasirinkite, su kuriais pavadinimais prietaisas turėtų būti susietas", + "请选择姓名要关联哪些设备": "Pasirinkite, su kuriais įrenginiais turėtų būti susietas vardas", + "确定要移除所选中的坏锁吗?": "Pašalinti netinkamą užraktą?", + "邮件通知": "Pranešimas elektroniniu paštu", + "短信通知": "Pranešimas per sms", + "您好,您的授权管理员生成成功": "Sveiki, jūsų įgaliotas administratorius buvo sėkmingai sugeneruotas", + "请输入接收者姓名": "Prašome įvesti čia", + "版本更新": "Versija atnaujinimas", + "下次再说": "Kitas kartas", + "配网成功": "Tinklo paskirstymo sėkmė", + "配网失败": "Tinklo paskirstymas nepavyko", + "该锁的无线键盘都将被删除": "Visi šio užrakto belaidžiai klaviatūros bus ištrinti", + "实时画面": "Realaus laiko nuotrauka", + "适合门口较为安全的环境。": "Tinka santykinai saugioms aplinkoms prie durų.", + "仅发生特定事件才录像,并可查看实时画面。": "Įrašomi tik konkretūs įvykiai ir galima peržiūrėti realaus laiko vaizdą.", + "一般情况下,满电可使用7-8个月": "Normaliomis aplinkybėmis jis gali būti naudojamas 7-8 mėnesius, kai visiškai įkrautas", + "有人逗留或发生特定事件才录像,可随时查看": "Kažkas lieka ar konkretūs įvykiai yra užfiksuoti, ir gali būti žiūrima bet kuriuo metu", + "实时画面。": "Realaus laiko nuotrauka.", + "一般情况下,满电可使用5~6个月。": "Normaliomis aplinkybėmis jis gali būti naudojamas 5 ~ 6 mėnesius, kai jis visiškai įkrautas.", + "适合门口人员复杂、较不安全的环境。": "Tinka sudėtingoms ir santykinai nesaugioms aplinkoms prie durų.", + "有人出现就录像,可随时查看实时画面。": "Įrašyti, kai kas nors pasirodo, ir peržiūrėti realaus laiko paveikslėlį bet kuriuo metu.", + "一般情况下,满电可使用2~4个月。": "Normaliomis aplinkybėmis jis gali būti naudojamas 2 ~ 4 mėnesius, kai jis visiškai įkrautas.", + "根据您家门口实际情况设置录像和实时画面功能。": "Nustatykite vaizdo ir realaus laiko vaizdo funkcijas pagal faktinę situaciją prie jūsų durų.", + "可使用时长由具体设置决定。": "Naudojimo trukmė nustatoma pagal konkrečius nustatymus.", + "查看": "Peržiūrėti", + "有人按门铃或发生": "Kažkas skambina durų varpą arba", + "异常事件时": "Nenormalus įvykis", + "不录像": "Nėra vaizdo", + "有人出现、按门铃": "Kažkas pasirodo, skambina durų varpą", + "或发生异常事件时": "Arba atsiranda nenormalus įvykis", + "逗留达到10秒": "Pasilikti 10 sekundžių", + "约1.5米": "Apie 1,5 metrų", + "随时": "Bet kada", + "立即录像": "Įrašyti iš karto", + "录像时机": "Vaizdo laikas", + "有人出现时录像": "Įrašyti, kai kas nors pasirodo", + "人体侦测距离": "Žmogaus aptikimo atstumas", + "查看实时画面": "Peržiūrėti realaus laiko nuotrauką", + "自定义时间": "Pasirinktinis laikas", + "当日": "Šiandien", + "次日": "Kita diena", + "自定义时段": "Pasirinktinis laikotarpis", + "发生事件时查看": "Peržiūrėti, kai įvykis įvyksta", + "实时查看": "Realaus laiko peržiūra", + "有人在门口出现10秒后开始录像。": "Prieš įrašymą kažkas pasirodo prie durų 10 sekundžių.", + "有人按门铃时立即录像。": "Įrašyti iš karto, kai kas nors skambina durų varpą.", + "有人出现在门前1.5米范围时启动录像": "Pradėkite įrašyti, kai kas nors pasirodo per 1,5 metrų priešais duris", + "约0.8米": "Apie 0,8 metrų", + "约3.0米": "Apie 3,0 metrų", + "添加指纹失败": "Operacija nepavyko.", + "项": "Daiktai", + "播放中": "Grojimas", + "下载": "Atsisiųsti", + "暂无下载内容": "Nėra atsisiuntimo turinio", + "亮度": "Ryškumas", + "音量": "Apimtis", + "快进至": "Greitai į priekį", + "快退至": "Atsukti į", + "暂无视频信息": "Jokios vaizdo informacijos", + "加载出错": "Pakrovimo klaida", + "请单人正对门锁,距离一个成年人手臂长度": "Prašome stovėti priešais durų užraktą vienas, rankos ilgio", + "(约0.6米)。": "(Apie 0,6 metrų).", + "保持脸部无遮挡,露出五官。": "Laikykite savo veidą be kliūčių ir parodykite savo veido bruožus.", + "准备好了,开始添加": "Paruoštas, pradėti pridėti", + "正在录入中...": "Įrašymas...", + "添加人脸失败": "Nepavyko pridėti veido", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Po atkūrimo užrakto veidai bus ištrinti. Ar tikrai norite atstatyti?", + "人脸号": "Veido numeris", + "虹膜详情": "Iris detalės", + "虹膜号": "Rainelės numeris", + "选择设备类型": "Pasirinkite įrenginio tipą", + "照明灯具": "Apšvietimo įrenginiai", + "电动窗帘": "Elektriniai užuolaidos", + "门窗传感器": "Durų ir langų jutiklis", + "传感器": "Jutiklis", + "清除数据成功": "Duomenys sėkmingai išvalyti", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Užraktas nėra prijungtas prie interneto, todėl prieigos kodo, kortelės, pirštų atspaudų ir kitų durų atidarymo būdų atkodavimas negali būti įkeltas realiu laiku.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Jei jums reikia saugoti istorinius įrašus, galite juos eksportuoti.", + "看不到操作记录,可能原因有": "Negalima pamatyti operacijų įrašų, galimų priežasčių", + "操作记录详情": "Operacijos įrašo detalės", + "操作时间": "Operacijos laikas", + "此模块功能需要锁联网后设置方可生效": "Šią modulio funkciją reikia nustatyti po to, kai užraktas yra prijungtas prie interneto, kad įsigaliotų", + "用户已存在": "Vartotojas jau egzistuoja", + "钥匙数量已到上限": "Klavišų skaičius pasiekė viršutinę ribą", + "附近没有可用网关": "Netoliese nėra vartų", + "正在创建安全连接...": "Sukurti saugų ryšį...", + "监视状态下不能发送录音": "Negalima siųsti įrašų stebėjimo režimu", + "挂断": "Pakabinti", + "监视中暂不能开锁": "Atrakinimas nėra stebėjimo metu", + "长按说话": "Paspauskite ir palaikykite kalbėti", + "松开发送": "Išlaisvinti siųsti", + "请输入6位数字开锁密码": "Prašome įvesti 6 skaitmenų atrakinti slaptažodį", + "请输入开锁密码": "Prašome įvesti atrakinti slaptažodį", + "接收者在有效期内可以不限次数使用": "Gavėjai gali naudoti ekeys neribotą laiką galiojimo laikotarpiu.", + "接收者可以使用此App开关锁": "Gavėjas gali užrakinti/atrakinti šią programą.", + "单次钥匙有效期为1小时,只能使用一次": "Vienkartinis ekey galioja vieną valandą ir gali būti naudojamas tik vieną kartą.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Gavėjai gali naudoti ekeys neribotą laiką per nustatytą ciklo laiką.", + "获取模板失败": "Nepavyko gauti šablono", + "微信通知": "Wechat pranešimas", + "系统短信": "Sistemos sms", + "系统邮件": "Sistemos el. paštas", + "模板": "Šablonas", + "新建模版": "Sukurti šabloną", + "您好,您的密码是": "Sveiki, jūsų slaptažodis yra", + "密码名字": "Slaptažodžio pavadinimas", + "请输入6-9位密码": "Prašome įvesti 6-9 skaitmenų slaptažodį", + "设置密码": "Nustatyti slaptažodį", + "操作成功,密码为": "Pavyko. prieigos kodas yra", + "类型:自定义-永久": "Tipas: individualus-nuolatinis", + "实时播放": "Realaus laiko atkūrimas", + "点击对讲": "Spauskite į intercom", + "长按开锁": "Ilgas paspauskite atrakinti", + "接听失败": "Nepavyko atsakyti", + "请在锁设置中开启远程开锁": "Prašome įjungti nuotolinį atrakinimą užrakto nustatymuose", + "接听": "Atsakymas", + "截图已保存到相册": "Ekrano kopija išsaugota albumui", + "添加遥控": "Pridėti nuotolinio valdymo pultą", + "已连接到锁,请按遥控": "Prijungtas prie užrakto, prašome paspausti nuotolinio valdymo pultą", + "遥控号": "Nuotolinio valdymo pultas", + "遥控详情": "Nuotolinio valdymo detalės", + "照明": "Apšvietimas", + "退出演示模式": "Išeiti demo režimas", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Patarimas: dabartinė sąsaja yra ekrano sąsaja. Pridėjus įrenginį, galite toliau jį naudoti", + "门已上锁": "Durys užrakintos", + "您的账号在异地登录,如非本人,请尽快修改密码": "Jūsų paskyra buvo naudojama prisijungti iš naujo įrenginio", + "开门成功": "Atidaryti duris sėkmingai", + "开门失败": "Nepavyko atidaryti durų", + "呼叫提醒": "Skambučio priminimas", + "收到来自": "Gauta iš", + "锁的呼叫": "Užrakto skambutis", + "加载数据中": "Duomenų įkėlimas", + "搜索所有锁类型": "Ieškoti visų užraktų tipų", + "锁电量更新时间": "Užrakinti akumuliatoriaus atnaujinimo laikas", + "1月": "Janas", + "2月": "Vasaris", + "3月": "Mar", + "4月": "Balandžio mėn.", + "5月": "Gegužė", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug.", + "9月": "Rugsėjis", + "10月": "Spalis", + "11月": "Nov.", + "12月": "Dekas", + "热门城市": "Karštieji miestai", + "导出锁数据": "Eksportuoti užrakto duomenis", + "一键开锁": "Vieno paspaudimo atrakinimas", + "已开通": "Atidarytas", + "编辑员工": "Redaguoti darbuotojus", + "一": "Vienas", + "二": "Du", + "三": "Trys", + "四": "Keturi", + "五": "Penki", + "六": "Šeši", + "日": "Saulė", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?", + "在线": "Online", + "离线": "Neprisijungęs", + "购买记录": "Pirkimo įrašas", + "使用记录": "Vartotojo įrašas", + "失效时间要大于当前时间": "Galiojimo laikas turi būti ilgesnis nei dabartinis laikas", + "修改名字": "Redaguoti pavadinimą", + "时": "Valanda", + "分": "Minutė", + "Amazon Alexa": "Amazon alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Galite naudoti alexa atrakinti, užrakinti ir patikrinti užrakto būseną", + "支持的国家": "Remiamos šalys", + "支持的国家值": "Jav, kanada, jungtinė karalystė, australija, indija, vokietija, prancūzija, italija, ispanija, japonija", + "操作流程": "Operacijos procesas", + "操作流程值": "1 pridėkite užraktą ir vartus su \"smart lock\" programa\n\n2 įjungti nuotolinio užrakinimo funkciją programoje (ši funkcija pagal numatytuosius nustatymus išjungta). Jei jūs neturite šią parinktį, užraktas nepalaiko alexa\n\n3 pridėti įgūdžius alexa ir leisti juos su smart lock app paskyrą ir slaptažodį. Po to, kai leidimas bus sėkmingas, galite atrasti įrenginius pagal sąskaitą\n\n4 suraskite alexa programos užraktą, įjunkite balso atrakinimo funkciją ir nustatykite kalbos slaptažodį\n\n5 užraktas gali būti valdomas per alexa", + "Google Home": "„ Google “namai", + "Action name": "Veiksmo pavadinimas", + "ScienerSmart": "Scienersmart", + "支持的语言": "Palaikomos kalbos", + "英语": "Anglų kalba", + "Google Home操作流程的值": "1. naudokite \"smart lock\" programą, kad pridėtumėte spynos ir vartus\n\n2. įjungti nuotolinio užrakinimo funkciją programoje (ši funkcija pagal numatytuosius nustatymus išjungta). Be šios parinkties, užraktas nepalaiko \"google home\"\n\n3. įdiegti \"google home\" programą ir spustelėkite \"\" mygtuką viršutiniame kairiajame kampe\n\n4. nustatymų puslapyje pasirinkite \"dirbti su\" google\"\n\n5. ieškoti \"scienersmart\" ir naudoti \"smart lock\" programos sąskaitą ir slaptažodį autorizuoti", + "密码需至少包含数字/字母/字符中的2种组合": "Slaptažodyje turi būti bent 2 iš šių: skaičiai, raidės ir specialūs simboliai", + "已开锁": "Atrakinta", + "已闭锁": "Užrakinta", + "两次密码不一致哦": "Slaptažodžiai yra nenuoseklūs", + "中功率": "Vidutinės galios", + "常规使用": "Reguliarus naudojimas", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Įjungus vartus, 5 sekundes paspauskite ir palaikykite reset mygtuką ir spustelėkite toliau, kai indikatoriaus lemputė mirksi pakaitomis.", + "扫描设备": "Nuskaitymo įrenginys", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Ištrynimas nepavyko. Vartai gali būti neprisijungę. Ar norite priversti ištrinti duomenis?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_ms.json b/lan/lan_ms.json new file mode 100644 index 00000000..d6b27146 --- /dev/null +++ b/lan/lan_ms.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Kunci bintang", + "锁通通": "Kunci melalui", + "点击开锁,长按闭锁": "Sentuh untuk membuka kunci, tahan untuk mengunci", + "考勤": "Kehadiran", + "考勤设置": "Tetapan kehadiran", + "电子钥匙": "EKeys", + "添加卡": "Tambah kad", + "卡号": "Nombor kad", + "添加指纹": "Tambah cap jari", + "指纹号": "Nombor cap jari", + "遥控": "Jauh", + "添加人脸": "Tambah muka", + "门锁日志": "Log kunci pintu", + "密码号": "Nombor kata laluan", + "添加者": "Pengendali", + "添加时间": "Masa", + "重置": "Set semula", + "请输入手机号或者邮箱": "Nombor telefon/e-mel", + "工作时间": "Masa kerja", + "工作日设置": "Persekitaran hari kerja", + "星期一": "Isnin", + "星期二": "Selasa", + "星期三": "Rabu", + "星期四": "Khamis", + "星期五": "Jumaat", + "星期六": "Sabtu", + "星期日": "Ahad", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Jum", + "周六": "Sat", + "周日": "Matahari", + "群发钥匙": "Hantar pelbagai ekeys", + "锁": "Kunci", + "请添加": "Penerima", + "允许远程开锁": "Buka kunci jauh", + "请输入验证码": "Kod pengesahan", + "获取密码": "Menjana kod laluan", + "请给密码命名": "Masukkan nama untuk kod laluan ini", + "密码有限期为6个小时,只能使用一次": "Kod laluan ini mesti digunakan dalam masa 6 jam dari masa semasa atau ia akan digantung atas sebab-sebab keselamatan. Kod laluan ini hanya boleh digunakan sekali sahaja.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Secara manual masukkan 6-9 digit sebagai kata laluan. Boleh ditambah dengan Bluetooth telefon di sebelah kunci, atau jauh ditambah melalui pintu masuk", + "获取": "Dapatkan", + "添加": "Tambah", + "删除公司": "Hapuskan syarikat", + "密码详情": "Maklumat kod laluan", + "修改密码": "Tukar kod laluan", + "添加虹膜": "Tambah Iris", + "添加门磁": "Sensor pintu", + "添加无线键盘": "Pad kekunci tanpa wayar", + "添加手掌": "Tambah sawit", + "请输入员工账号": "Masukkan akaun pekerja", + "批量授权锁": "Geran berbilang kunci", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Pentadbir yang diberi kuasa akan mempunyai kebenaran majoriti untuk mengendalikan kunci ini.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ciri ini membolehkan anda membuka kunci kunci pintar dari jauh melalui pintu masuk. Ciri ini hanya boleh dihidupkan atau dimatikan melalui Bluetooth.", + "排列方式": "Senarai jenis", + "早到榜": "Senarai awal", + "迟到榜": "Senarai lewat", + "当前模式": "Mod semasa", + "勤奋榜": "Bekerja keras senarai", + "延迟时间": "Masa kelewatan", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Kunci akan dikunci secara automatik selepas masa. Sila buka kunci untuk satu kali pertama untuk membuat tetapan tersedia.", + "时间": "Masa", + "开始时间": "Mulakan masa", + "结束时间": "Masa tamat", + "工作时间设置": "Tetapan masa kerja", + "常开模式": "Laluan mod", + "常开时间": "Dalam tempoh masa ini", + "常开日期": "Pada hari-hari ini", + "添加员工": "Tambah kakitangan", + "节假日": "Percutian", + "打卡方式": "Kaedah", + "员工是否有钥匙": "Sudah ada ekey", + "上班时间": "Masa permulaan", + "下班时间": "Masa tutup", + "本周": "Minggu ni", + "单休": "Hujung minggu sehari", + "双休": "Hujung minggu dua hari", + "单双休": "Hujung minggu satu-dua hari", + "年": "Tahun", + "月": "Bulan", + "放假日期": "Percutian", + "补班日期": "Hari kerja", + "添加假日": "Tambah percutian", + "开始日期": "Tarikh mula", + "必填": "Diperlukan", + "结束日期": "Tarikh akhir", + "日榜": "Setiap hari", + "月榜": "Bulanan", + "考勤记录": "Rekod", + "假日信息": "Maklumat percutian", + "基本信息": "Asas-asas", + "无线键盘": "Pad kekunci tanpa wayar", + "选择无线键盘": "Tambah pad kekunci", + "门磁": "Sensor pintu", + "自动闭锁": "Kunci Auto", + "锁声音": "Kunci bunyi", + "防撬报警": "Amaran bega", + "重置键": "Butang Reset", + "锁时间": "Jam kunci", + "诊断": "Diagnosis", + "上传数据": "Muat naik Data", + "导入其他锁数据": "Import frome kunci lain", + "锁升级": "Kemas kini Firmware", + "标记房态": "Status bilik", + "开锁提醒": "Pemberitahuan buka kunci", + "微信二维码": "Buka kunci kod QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Orang dengan kunci elektronik boleh membuka pintu dengan mengimbas kod QR ini melalui WeChat. Kod QR setiap kunci adalah berbeza. Anda boleh mencetaknya dan tampalkannya di sebelah kunci yang sepadan", + "锁编号": "Nombor kunci", + "电量": "Bateri", + "锁分组": "Kumpulan kunci", + "选择分组": "Pilih kumpulan", + "创建新分组": "Buat kumpulan", + "管理员开锁密码": "Kod laluan Admin", + "更新": "Kemas kini", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Tahap bateri akan dikemas kini oleh gateway atau bluetooth telefon", + "当屏幕闪烁时,点击下一步": "Klik seterusnya apabila pad kekunci berkelip", + "输入*529#或按设置键": "Masukkan README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # atau tekan kekunci tetapan", + "长按重置键2秒": "Tekan dan tahan butang Reset 2 saat", + "附近的设备": "Peralatan berdekatan", + "暂无数据": "Tiada Data", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Anda akan dapat untuk mendapatkan status pintu dengan sensor pintu bersama-sama dengan pintu masuk. Hanya satu sensor dibenarkan untuk mengaitkan dengan kunci.", + "开始": "Mula", + "全天": "Semua jam", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Anda boleh menetapkan pelbagai tempoh masa untuk mod laluan. Dalam tempoh masa yang ditetapkan, kunci akan kekal dalam keadaan terbuka selepas dibuka.", + "请选择锁音量": "Sila pilih jumlah kunci", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Dengan menghidupkan, anda akan mendengar bunyi dari kunci", + "低": "Rendah", + "较低": "Sederhana rendah", + "中": "Sederhana", + "较高": "Sederhana tinggi", + "高": "Tinggi", + "开启后,锁被撬动时,会发出报警声": "Dengan menghidupkan, anda membolehkan amaran TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Dengan mematikan, butang RESET dimatikan.", + "校准时间": "Masa menentukur", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnosis adalah untuk membaca maklumat konfigurasi di dalam kunci dan memuat naiknya supaya kakitangan boleh menganalisis punca kegagalan", + "上传": "Muat naik", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Muat naik data dari kunci ke pelayan. Ia mungkin mengambil masa beberapa minit", + "请选择要从哪把锁导入": "Pilih kunci untuk diimport dari", + "有新版本": "Mempunyai versi baru", + "当前版本": "Versi terkini", + "升级": "Kemas kini", + "空闲": "Kosong", + "已入住": "Diduduki", + "多语言": "Bahasa", + "添加锁": "Tambah kunci", + "锁地址": "Alamat kunci", + "选择锁类型": "Pilih jenis kunci", + "NFC无源锁": "Kunci pasif NFC", + "添加设备": "Tambah peranti", + "网关": "Pintu masuk", + "客服": "Perkhidmatan pelanggan", + "设置": "Tetapan", + "更多设置": "Lebih Set", + "消息推送": "Tolak pemberitahuan", + "锁用户管理": "Pengguna kunci", + "拥有的钥匙": "EKeys yang berkaitan dengan pengguna ini", + "批量授权": "Pengurusan pihak berkuasa", + "关联设备": "Peranti yang berkaitan", + "关联姓名": "Nama yang berkaitan", + "转移智能锁": "Kunci pemindahan", + "选择锁": "Kunci skrin", + "接收人信息": "Penerima", + "转移网关": "Pintu masuk pemindahan", + "锁屏": "Kunci skrin", + "已关闭": "Off", + "已开启": "Pada", + "开启": "Hidupkan", + "确定要开启重置键?": "Teruskan untuk membolehkan butang Reset?", + "确定要关闭重置键?": "Terus mematikan butang Reset?", + "隐藏无效开锁权限": "Sembunyikan akses tidak sah", + "APP开锁时需手机连网的锁": "Kunci yang memerlukan telefon dalam talian", + "增值服务": "Perkhidmatan", + "关于": "Kira-kira", + "退出": "Logout", + "删除账号": "Padam akaun", + "个人信息": "Maklumat akaun", + "头像": "Avatar", + "昵称": "Nama samaran", + "请输入昵称": "Sila masukkan nama samaran anda", + "修改昵称": "Namakan semula", + "修改账号": "Edit akaun", + "重置密码": "Tetapkan semula kata laluan", + "安全问题": "Soalan keselamatan", + "为了你的账号安全,修改账号前请先使用验证码验证": "Untuk keselamatan akaun anda, sila gunakan pengesahan kata laluan akaun sebelum mengubah suai akaun", + "请输入新账号": "Sila masukkan akaun baru", + "找回密码和登录新设备时,可通过绑定的手机验证": "Nombor telefon mengikat akan digunakan untuk menerima kod pengesahan.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "E-mel mengikat akan digunakan untuk menerima kod pengesahan.", + "原密码": "Kata laluan semasa", + "新密码": "Kata laluan baru", + "确认密码": "Sahkan kata laluan", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Sekiranya telefon anda hilang, anda boleh log masuk ke telefon baru dengan menjawab soalan keselamatan.", + "问题一": "Soalan 1", + "问题二": "Soalan 2", + "问题三": "Soalan 3", + "请输入你的答案": "Sila taip jawapan anda", + "即将到期": "Tamat tempoh tidak lama lagi", + "去授权": "Pergi ke kuasa", + "修改名称": "Edit nama", + "状态": "Status", + "WiFi名称": "Nama Wifi", + "网络MAC": "Rangkaian MAC", + "网关升级": "Kemas kini pintu masuk", + "网关连接的锁": "Lock(s) disambungkan ke pintu masuk ini", + "信号强": "Kuat", + "选择网关类型": "Pilih jenis pintu masuk", + "添加网关": "Tambah pintu masuk", + "重新通电": "Sambung semula kuasa", + "指示灯": "Lampu penunjuk", + "选择网关": "Pilih Gateway", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G tidak disokong,. Sila pilih WiFi 2.4G.", + "WiFi密码": "Laluan WiFi", + "请输入WiFi密码": "Masukkan kata laluan WiFi", + "网关名称": "Nama pintu masuk", + "请输入网关名称": "Masukkan nama Gateway", + "IP地址": "Alamat IP", + "子网掩码": "Topeng Subnet", + "默认网关": "Pintu masuk lalai", + "自动获取DNS服务器地址": "Secara automatik mendapatkan alamat pelayan DNS", + "首选DNS": "DNS pilihan", + "备选DNS": "DNS alternatif", + "不使用静态IP": "Tiada IP statik digunakan", + "使用静态IP": "Gunakan IP statik", + "请输入IP地址": "Masukkan alamat IP", + "请输入子网掩码": "Masukkan topeng Subnet", + "请输入默认网关": "Masukkan pintu masuk lalai", + "所有锁": "Semua kunci", + "搜索所有类型的锁": "Imbas semua jenis kunci", + "门锁": "Kunci pintu", + "挂锁": "Mangga", + "保险箱锁": "Kunci selamat", + "智能门禁": "Kawalan akses pintar", + "车位锁": "Kunci tempat letak kereta", + "摸亮触摸屏": "Sentuh sebarang kekunci untuk mengaktifkan pad kekunci", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Sila sentuh sebarang kunci untuk mengaktifkan kunci dan letakkan dalam mod berpasangan. Tekan seterusnya", + "附近的锁": "Kunci berdekatan", + "如需修改名字请重新命名,点击确定添加锁": "Jika anda ingin menukar nama, sila namakan semula, klik OK untuk menambah kunci", + "添加锁时,手机必须在锁旁边": "Apabila menambah kunci, telefon mesti berada di sebelah kunci", + "登录": "Masuk", + "注册": "Daftar", + "我已阅读并同意": "Saya telah membaca dan bersetuju", + "验证码": "Kod", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Kata laluan anda mesti mempunyai 8-20 aksara, dan termasuk sekurang-kurangnya dua jenis nombor, huruf dan simbol", + "手机": "Telefon", + "邮箱": "E-mel", + "请输入邮箱": "Masukkan e-mel anda", + "国家/地区": "Negara/rantau", + "你所在的国家/地区": "Negara/wilayah anda", + "选择国家/地区": "Pilih negara atau wilayah anda", + "获取验证码": "Dapatkan kod", + "商务合作": "Perniagaan", + "电脑网页版": "Sistem Web", + "酒店系统": "Sistem Hotel", + "说明书网页版": "Manual pengguna", + "高级功能": "Fungsi lanjutan", + "记录保存": "Rekod pengekalan", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS boleh digunakan untuk menghantar kod laluan dan maklumat ekey kepada penerima.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mel boleh digunakan untuk menghantar kod laluan dan maklumat ekey kepada penerima.", + "购买实名认证提示": "Selepas fungsi diaktifkan, anda perlu menggunakan cap jari, muka atau kata laluan akaun anda untuk membuka aplikasi. Tidak perlu mengesahkan lagi selama 3 minit", + "请选择你希望的实名认证频次": "Sila pilih kekerapan pengesahan nama sebenar yang anda mahu", + "仅首次": "Buat pertama kalinya", + "每日一次": "Sekali sehari", + "每周一次": "Sekali seminggu", + "每月一次": "Sekali setiap bulan", + "当前状态": "Status semasa", + "试用中": "Dalam perbicaraan", + "高级功能权益内容": "Fungsi lanjutan", + "短信模板": "Templat SMS", + "邮件模板": "Templat e-mel", + "发卡工具": "Pengekod kad", + "购买高级功能须知": "Notis", + "购买高级功能提示": "Ciri-ciri yang lebih maju adalah di bawah pembangunan, dan jika anda memerlukannya, anda dialu-alukan untuk membuka perkhidmatan berdasarkan bilangan kunci. Ciri-ciri canggih hanya tersedia untuk kunci anda sendiri. Jika anda seorang pentadbir yang diberi kuasa, sila hubungi pentadbir atas kunci untuk membuka perkhidmatan", + "免费体验": "Percubaan percuma", + "立即开通": "Buka sekarang", + "购买短信": "Beli SMS", + "购买邮件": "Beli e-mel", + "购买实名认证次数": "Beli masa pengesahan nama sebenar", + "开通高级功能": "Membolehkan fungsi lanjutan", + "选择套餐": "Pilih pakej", + "支付方式": "Cara pembayaran", + "支付宝": "Alipay", + "去支付": "Bayar", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Anda dibenarkan untuk menentukan mesej itu sendiri. Ia digunakan untuk menghantar maklumat kod laluan dan ekey kepada orang lain.", + "高级功能仅能用于你自己的锁": "Fungsi lanjutan hanya boleh digunakan kunci anda sendiri.", + "新建模板": "Creat template", + "类型": "Jenis", + "模版内容": "Kandungan Template", + "预览": "Pratonton", + "房间名": "Bilik", + "预计产生短信条数": "Segmen mesej anggaran", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ciri ini membolehkan anda menyembunyikan kod laluan, kunci, kad, dan cap jari yang tidak sah untuk tempoh masa.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Telefon pengguna diperlukan untuk berada dalam talian untuk membuka kunci kunci terpilih ini dengan aplikasi.", + "配置WiFi": "Mengkonfigurasi WiFi", + "请输入WiFi名字": "Sila masukkan nama Wifi", + "WiFi配网": "Rangkaian pengedaran WiFi", + "胁迫卡": "Kad tekanan", + "员工是否有密码": "Sudah ada kod laluan", + "员工是否有卡": "Sudah ada kad", + "员工是否有指纹": "Sudah menetapkan cap jari", + "获取钥匙": "Dapatkan kunci", + "获取卡": "Dapatkan kad", + "获取指纹": "Dapatkan cap jari", + "安全验证": "Pengesahan identiti", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Semua maklumat akaun anda akan dikeluarkan dari Platform secara kekal dan tidak dapat dipulihkan. Adakah anda ingin memadam?", + "监控": "Monitor", + "视频日志": "Log Video", + "开门器": "Pembuka pintu", + "面容开锁": "Membuka muka", + "开门方向设置": "Set arah pembukaan", + "电机功率设置": "Tetapan MotorPower", + "开锁时是否需联网": "Jika Internet diperlukan apabila membuka kunci", + "选择要加入分组的锁": "Pilih kunci untuk menambah kumpulan ini", + "锁数量": "Kiraan kunci", + "小米IOT平台": "Platform Xiaomi IOT", + "面容开锁设置": "Set kunci muka", + "感应距离": "Jarak penderiaan", + "防误开": "Mencegah pembukaan yang salah", + "防误开已关闭,关门后仍可使用面容开锁": "Mencegah misopening telah ditutup, selepas menutup pintu masih boleh menggunakan buka kunci muka", + "添加和使用面容开锁时": "Tambah dan gunakan muka apabila membuka kunci", + "添加和使用面容开锁时提示": "\n1, sila cuba untuk menjaga orang tunggal di hadapan operasi pintu;\n2, sila berdiri di hadapan kunci pintu kira-kira 0.5 ~ 0.8 meter, menghadap kunci pintu;\n3. Sila pastikan wajah anda tidak terhalang dan mendedahkan ciri-ciri wajah anda;\n4. Apabila pengiktirafan muka tidak normal, anda boleh menyentuh sebarang kekunci pada papan kekunci digital untuk memulakan semula pengiktirafan muka secara manual.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Sila pilih kuasa motor dengan teliti mengikut keadaan sebenar kunci pintu:", + "小功率:": "Miniwatt:", + "耗电少": "Kurang penggunaan kuasa", + "大功率": "Kuasa tinggi:", + "大功率提示": "Jika lidah kunci tidak boleh ditarik balik secara normal apabila membuka kunci, atau perlu didorong", + "开门方向设置提示": "Sila berhati-hati memilih arah untuk membuka pintu rumah anda (jika anda memilih arah yang salah, anda tidak akan dapat membuka dan menutup pintu dengan betul):", + "左开": "Terbuka kiri", + "右开": "Buka kanan", + "判断方法:": "判断方法:", + "判断方法内容": "Lelaki itu berdiri di luar rumah, menghadap pintu masuk.", + "录像时段": "Slot Video", + "密码": "Kod laluan", + "卡": "Kad", + "指纹": "Cap jari", + "人脸": "Muka", + "配件商城": "Kunci pusat membeli-belah", + "公司名称": "Nama syarikat", + "请输入公司名字": "Masukkan nama syarikat", + "提示": "Petunjuk", + "是否删除?": "Sama ada hendak menghapuskan?", + "员工信息": "Maklumat kakitangan", + "员工": "Kakitangan", + "打卡方式无效": "Tidak tersedia", + "中国": "China", + "选择钥匙": "Pilih ekey", + "编辑": "Edit", + "无": "Tidak", + "有": "Ya", + "请输入姓名": "Sila masukkan nama", + "获取人脸": "Mendapat muka", + "选择密码": "Pilih kod laluan", + "选择卡": "Pilih kad", + "选择指纹": "Pilih cap jari", + "选择人脸": "Pilih muka", + "员工是否有人脸": "Sama ada pekerja mempunyai wajah", + "同时删除员工钥匙": "Hapuskan ekey beliau", + "删除": "Delet", + "确定要删除员工吗?": "Hapuskan pekerja ini", + "月统计": "Statistik bulanan", + "迟到": "Lewat", + "早退": "Cuti awal", + "未打卡": "Tiada rekod", + "钥匙将在": "Ekey ini akan tamat tempoh", + "天后失效": "Hari (s)", + "电量更新时间:": "Masa kemas kini bateri:", + "新增配件": "Tambah", + "钥匙不可用": "Kunci tidak tersedia", + "正在开锁中...": "Membuka kunci...", + "你的钥匙": "Kunci anda", + "常开模式启动!长按闭锁": "Mod terbuka bermula! Tekan lama untuk mengunci", + "演示模式": "Mod Demo", + "请先同意用户协议及隐私政策": "Sila bersetuju dengan perjanjian pengguna dan dasar privasi terlebih dahulu", + "用户协议": "Terma-terma pengguna", + "隐私政策": "Dasar privasi", + "注册成功": "Pendaftaran berjaya", + "你所在的": "Anda berada di", + "手机号": "Nombor telefon", + "忘记密码": "Terlupa kata laluan", + "重置成功": "Menetapkan semula kejayaan", + "确定要退出吗?": "Keluar?", + "功能暂未开放": "Fungsi belum buka", + "设置成功": "Sediakan berjaya", + "删除成功": "Hapuskan berjaya", + "单次": "Sekali", + "永久": "Kekal", + "限时": "Masa", + "自定义": "Adat", + "清空码": "Padam", + "循环": "Berulang", + "工作日": "Hari kerja", + "每日": "Setiap hari", + "周末": "Hujung minggu", + "确定要删除吗?": "Hapuskan?", + "该锁的密码都将被删除": "Semua kod laluan untuk kunci ini akan dipadamkan", + "已过期": "Tidak sah", + "该锁的电子钥匙都将被删除": "Semua kunci untuk kunci ini akan dipadamkan", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Padam semua kunci yang berkaitan dengan ekey ini. Langkah ini tidak boleh dibuat asal!", + "删除钥匙会在用户APP连网后生效": "Ekey akan dipadamkan", + "有效时间": "Masa berkesan", + "接收者": "Penerima", + "仅管理自己创建的用户": "Menguruskan pengguna sendiri sahaja", + "远程开锁": "Buka kunci jauh", + "请输入钥匙名称": "Sila masukkan nama utama", + "修改成功": "Mengubah suai kejayaan", + "冻结": "Membekukan", + "解除冻结": "Cairkan", + "授权": "Kuasa", + "取消授权": "De kuasa", + "同时解冻其发送的钥匙": "Cairkan semua ekeys yang dikeluarkan oleh pengguna ini", + "会在用户APP连网后生效": "Ekey ini akan dicairkan apabila aplikasi pengguna menyambung ke rangkaian", + "同时冻结其发送的钥匙": "Membekukan semua ekeys yang dikeluarkan oleh pengguna ini", + "冻结会在用户APP连网后生效": "Ekey ini akan dibekukan apabila aplikasi pengguna menyambung ke rangkaian", + "取消授权会在用户APP连网后生效": "Pengguna akan kehilangan keizinan beliau apabila aplikasi pengguna menyambung ke rangkaian", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Pengguna yang diberi kuasa mempunyai hampir keizinan yang sama seperti pengurus kunci (contohnya. Keupayaan untuk menghantar ekeys dan kod laluan)", + "失效时间需晚于生效时间": "Waktu tamat tempoh mestilah lewat dari masa yang berkesan", + "生效时间需晚于当前时间": "Masa yang berkesan mesti lewat dari masa semasa", + "失效日期需晚于生效日期": "Tarikh tamat tempoh mestilah lewat dari tarikh yang berkesan", + "修改有效期": "Tempoh perubahan", + "生效日期": "Tarikh mula", + "失效日期": "Tarikh akhir", + "开锁": "Buka kunci", + "开锁成功": "Buka kunci kejayaan", + "请选择锁": "Sila pilih kunci", + "请选择接收者": "Sila pilih penerima", + "请选择有效期": "Sila pilih tempoh sah", + "请选择发送方式": "Sila pilih kaedah penghantaran", + "请选择结束时间": "Sila pilih masa akhir", + "完成": "Lengkap", + "有效日": "Kitaran terakhir", + "发送成功": "Hantar kejayaan", + "请选择开始时间": "Sila pilih masa mula", + "选择用户": "Pilih penerima", + "已选中": "Dipilih", + "确定": "OK", + "请选择要发送的锁": "Sila pilih kunci", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Muka pengesahan nama sebenar merujuk kepada keperluan pengguna untuk mengesahkan mukanya sebelum membuka kunci aplikasi telefon, dan pengesahan boleh dikunci.", + "分享": "Kongsi", + "请输入接收者账号": "Sila masukkan akaun penerima", + "接收者号码未注册,请重新发送": "Nombor penerima tidak didaftarkan, sila hantar semula", + "是否发送电子钥匙给未注册账号": "Adakah anda mahu menghantar ekey ke akaun baru", + "取消": "Cancel", + "标记成功": "Kejayaan Mark", + "微信好友": "Rakan-rakan WeChat", + "短信": "SMS", + "邮件": "E-mel", + "更多": "Lagi", + "您好,您的电子钥匙生成成功": "Halo, kunci elektronik anda dihasilkan dengan jayanya", + "生效时间不能小于当前时间": "Masa yang berkesan tidak boleh kurang daripada masa semasa", + "结束时间不能小于当前时间": "Masa akhir tidak boleh kurang daripada masa semasa", + "是否为管理员": "Adakah pentadbir", + "已连接到锁,请将卡靠近门锁的读卡区": "Disambungkan. Letakkan kad terhadap pembaca kad", + "尝试连接设备...": "Menyambung dengan kunci. Sila tunggu...", + "地理位置": "Lokasi geografi", + "检查以确保以下地址是正确的": "Semak untuk pastikan alamat berikut betul", + "地图加载中,请稍候。。": "Peta itu memuatkan, sila tunggu...", + "跳过": "Langkau", + "还未获取到位置信息哦,请耐心等待一下!": "Maklumat lokasi belum diperolehi lagi, sila tunggu dengan sabar!", + "请填写信息": "Sila isi maklumat", + "有效期": "Tempoh sah", + "生效时间": "Mulakan masa", + "失效时间": "Masa tamat", + "上传成功": "Dimuat naik berjaya", + "未生效": "Tidak aktif", + "已生效": "Berkesan", + "指纹详情": "Maklumat cap jari", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Anda akan dikehendaki meletakkan jari anda ke Sensor beberapa kali. Sila ikuti arahan...", + "开始添加": "Mula", + "请将您的手指按下": "Letakkan jari anda pada Sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Ikut arahan... anda akan dikehendaki untuk mengeluarkan dan meletakkan jari anda ke Sensor untuk rekod seterusnya", + "添加成功": "Menambah kejayaan", + "更新成功": "Kemaskini kejayaan", + "搜索": "Cari", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, kad kunci akan dipadamkan, adakah anda mahu menetapkan semula?", + "已失效": "Tidak sah", + "卡详情": "Maklumat kad", + "请输入": "Sila masuk sini", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Dengan mematikan, kunci akan kekal dibuka sepanjang hari sehingga ia dikunci secara manual", + "请输入小于或等于60的数字": "Sila masukkan nombor kurang daripada 60", + "操作成功": "Operasi yang berjaya", + "管理员密码相同,无需修改": "Kata laluan pentadbir adalah sama dan tidak perlu diubah suai", + "请输入6-9位数字": "6-9 digit panjang", + "请输入6-9位管理员密码": "Sila masukkan kata laluan pentadbir 6-9 digit", + "请输入新的管理员密码": "Sila masukkan kata laluan pentadbir baru", + "未分组": "Ungrouped", + "请输入分组名称": "Buat kumpulan", + "创建成功": "Mewujudkan kejayaan", + "设置锁分组成功": "Tetapkan kumpulan kunci berjaya", + "电池1电量": "Bateri 1", + "电池2电量": "Bateri 2", + "电量更新时间": "Masa kemas kini bateri", + "锁电量更新成功": "Kejayaan kemas kini kuasa kunci", + "您的钥匙未生效": "Kunci anda tidak berkesan", + "您的钥匙已冻结": "Kunci anda telah dibekukan", + "您的钥匙已过期": "Kunci anda telah tamat tempoh", + "常开模式开启": "Kunci dalam mod laluan", + "超级管理员": "Admin Super", + "授权管理员": "Admin dibenarkan", + "普通用户": "Pengguna biasa", + "余": "Baki", + "天": "Hari ni", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Selepas memadam kunci, semua maklumat akan dihapuskan bersama-sama, adakah anda pasti anda mahu memadam kunci?", + "请输入登录密码": "Sila masukkan kata laluan permohonan", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Gagal memadam peranti, sila pastikan peranti itu berhampiran peranti, peranti tidak disambungkan, dan peranti dihidupkan", + "用户无权限": "Pengguna tidak mempunyai kebenaran", + "创建公司后,考勤功能才能使用": "Sila buat Company dulu", + "是否删除钥匙?": "Hapuskan ekey ini?", + "邮箱绑定成功": "E-mel mengikat kejayaan", + "手机绑定成功": "Kejayaan mengikat telefon bimbit", + "网络访问失败,请检查网络是否正常": "Permintaan gagal. Rangkaian tidak tersedia, sila semak dan sambungkan peranti anda ke 3G/4G/WIFI", + "清空": "Jelas", + "是否清空?": "Jelas?", + "消息详情": "Maklumat mesej", + "创建时间": "Masa penciptaan", + "管理员详情": "Butiran pentadbir", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jika seseorang memaksa anda untuk membuka pintu, anda boleh menggunakan kad ini. Mesej penggera akan dihantar ke pentadbir. Untuk menggunakan ciri ini, sila pastikan kunci anda dalam talian.", + "请不要将胁迫卡用于日常开锁": "Tolong jangan gunakan kad paksa untuk kegunaan harian.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jika seseorang memaksa anda untuk membuka pintu, anda boleh menggunakan cap jari ini. Mesej penggera akan dihantar ke pentadbir. Untuk menggunakan ciri ini, sila pastikan kunci anda dalam talian.", + "请不要将胁迫指纹用于日常开锁": "Tolong jangan gunakan cap jari paksa untuk kegunaan harian.", + "创建公司": "Buat syarikat", + "公司名称不能超过30个字符": "Nama syarikat tidak boleh melebihi 30 aksara", + "公司名称不能小于6个字符": "Nama syarikat tidak boleh kurang daripada 6 aksara", + "WIFI列表": "Senarai WIFI", + "刷新": "Muat semula", + "手动配网": "Rangkaian pengedaran Manual", + "远距离": "Jarak jauh", + "中距离": "Jarak sederhana", + "近距离": "Jarak pendek", + "锁时间更新成功": "Kunci masa kemaskini kejayaan", + "锁用户": "Pengguna kunci", + "请选择常开日期": "Sila pilih tarikh buka", + "结束时间不能小于开始时间哦": "Masa akhir tidak boleh kurang daripada masa mula", + "介绍": "Cerita kami", + "个人信息收集清单": "Senarai koleksi maklumat peribadi", + "应用权限说明": "Permohonan kebenaran keterangan", + "第三方信息共享清单": "Senarai perkongsian maklumat pihak ketiga", + "请选择您的位置": "Sila pilih lokasi anda", + "请先选择位置": "Sila pilih lokasi dulu", + "管理员密码": "Kod laluan Admin", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Jika anda perlu mengubah suai, sila masukkan kata laluan pentadbir baru (6 digit), klik OK untuk mengubah suai", + "修改": "Ubah suai", + "网络摄像头": "Kamera", + "重命名": "Namakan semula", + "分组下的锁将被移到未分组里": "Kunci di bawah kumpulan akan dipindahkan ke ungrouped", + "编辑成功": "Edit kejayaan", + "厂商": "Pengeluar", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Selepas kata laluan dijana, sila gunakan sekali untuk pengaktifan sebelum 23:59 pada hari yang sama, jika tidak, ia akan menjadi tidak sah selepas pukul 0. Selepas kata laluan diaktifkan, ia boleh digunakan tanpa had dalam tempoh sah.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Selepas kata laluan dijana, sila gunakannya sebelum 23:59 pada hari yang sama, jika tidak, ia akan menjadi tidak sah selepas pukul 0. Kod yang jelas digunakan untuk membersihkan semua kata laluan yang dihasilkan sebelum pukul 0 hari ini.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Selepas kata laluan dijana, sila gunakannya sebelum 23:59 pada hari yang sama, jika tidak, ia akan menjadi tidak sah selepas pukul 0.", + "清空密码底部提示": "Kata laluan adalah sah sehingga 23:59 pada hari mengosongkan", + "相机": "Kamera", + "相册": "Gambar", + "读写": "Simpanan", + "定位": "Lokasi", + "需要访问相机权限才能拍照上传文件例如头像上传": "Akses kepada kamera diperlukan untuk mengambil gambar dan memuat naik fail, seperti memuat naik gambar profil", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Akses kepada kamera diperlukan untuk memuat naik fail dan avatar menggunakan imej album", + "需要访问读写权限才能使用本地图片上传头像": "Akses untuk membaca dan menulis kebenaran diperlukan untuk memuat naik avatar menggunakan imej tempatan", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Akses kepada maklumat lokasi diperlukan untuk menggunakan fungsi tambah utama", + "申请": "Permohonan", + "权限": "Kebenaran", + "不允许": "Tidak dibenarkan", + "允许": "Dibenarkan", + "权限被拒绝": "Kebenaran ditolak", + "请手动在系统设置中开启": "Sila aktifkan secara manual dalam tetapan sistem", + "权限以继续使用应用": "Kebenaran untuk terus menggunakan aplikasi.", + "去设置": "Pergi menetapkannya", + "当前网络": "Rangkaian semasa", + "位置信息": "Maklumat lokasi", + "请输入wifi名称": "Sila masukkan nama wifi", + "虹膜": "Iris", + "手掌": "Sawit", + "商城": "Pusat membeli-belah", + "我的": "Saya", + "微信公众号推送": "Akaun awam Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Untuk membuka wechat untuk menerima mesej penggera, anda perlu memberi perhatian kepada Skye Smart Lock wechat akaun awam terlebih dahulu, sila simpan kod QR dan gunakan wechat untuk mengimbas tetapan", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Akses kepada kebenaran Bluetooth diperlukan untuk menggunakan maklumat lokasi fungsi tambah utama", + "请输入Email": "Masukkan e-mel anda", + "请输入手机号": "Masukkan nombor telefon anda", + "家人到家": "Ahli keluarga tiba di rumah", + "添加家人": "Tambah ahli keluarga", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Sekiranya kunci tidak disambungkan ke Internet, peringatan untuk kod laluan, kad, cap jari, dan kaedah pembukaan pintu lain tidak boleh dihantar tepat pada masanya.", + "消息提醒": "Peringatan", + "开门通知": "Notis pembukaan", + "N天未开门": "N hari tanpa pembukaan pintu", + "门未关好": "Pintu tidak ditutup", + "防拆报警": "Penggera penggera", + "低电量提醒": "Bateri rendah", + "胁迫开门": "Pembukaan pintu paksa", + "有人按门铃": "Seseorang cincin loceng pintu", + "有人出现在门口": "Seseorang muncul di pintu", + "提醒方式": "Kaedah peringatan", + "开门方式": "Kaedah pembukaan pintu", + "请选择": "Sila pilih", + "家人": "Ahli keluarga", + "保存": "Simpan", + "APP推送": "Tolak APP", + "管理员": "Admin", + "未启用": "Tidak diaktifkan", + "已启用": "Diaktifkan", + "省电模式": "Mod penjimatan kuasa", + "逗留抓拍模式": "Tinggal mod tangkap", + "实时监控模式": "Mod pemantauan masa nyata", + "自定义模式": "Mod tersuai", + "猫眼设置": "Tetapan mata kucing", + "猫眼工作模式": "Mod kerja mata kucing", + "自动亮屏": "Skrin terang automatik", + "亮屏持续时间": "Skrin pada masa", + "逗留警告": "Tinggal amaran", + "异常警告": "Amaran yang tidak normal", + "短信提醒": "SMS", + "邮件提醒": "E-mel", + "N天未开门提醒": "N hari tanpa pembukaan pintu", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Jika seseorang memaksa anda membuka kunci, anda boleh menggunakan cap jari ini. Mesej penggera akan dihantar ke pentadbir. Untuk menggunakan ciri ini, sila pastikan kunci anda dalam talian.", + "胁迫指纹": "Cap jari paksa", + "指纹列表": "Senarai cap jari", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Selepas masa yang ditetapkan, jika kunci tidak dibuka, sistem akan menghantar mesej peringatan kepada penerima yang ditetapkan. Fungsi ini memerlukan kunci untuk disambungkan ke internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Selepas membolehkan peringatan, apabila bateri kunci berada di bawah 20%, 10%, dan 5%, sistem akan menghantar mesej peringatan kepada penerima yang ditetapkan.", + "未开门时间": "Hari tanpa pembukaan pintu", + "添加和使用面容开锁时:": "Tambah dan gunakan muka apabila membuka kunci:", + "关锁": "Tutup kunci", + "功能": "Fungsi", + "配件": "Bahagian", + "云存": "Penyimpanan awan", + "本地": "Kawasan ini", + "3天滚动储存": "3 hari penyimpanan rolling", + "去升级": "Naik taraf sekarang", + "下载列表": "Muat turun senarai", + "已下载": "Muat turun", + "全部视频": "Semua video", + "已为本设备免费提供3大滚动视频储存服务": "Tiga perkhidmatan storan video menatal telah disediakan untuk peranti ini secara percuma", + "视频播放": "Main balik Video", + "全选": "Semua", + "请选择要删除的视频": "Sila pilih video yang anda mahu padamkan", + "请选择要下载的视频": "Sila pilih video yang anda mahu muat turun", + "欢迎使用": "Selamat datang untuk digunakan", + "用户协议和隐私政策概要": "Ringkasan perjanjian pengguna dan dasar privasi", + "协议概要": "Ringkasan protokol", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Terima kasih kerana menggunakan aplikasi ini. Kami melampirkan sangat penting untuk maklumat peribadi dan perlindungan privasi anda. Sebelum menggunakan produk ini, sila baca dengan teliti", + "《用户协议》": "Terma-terma pengguna", + "和": "Dan", + "《隐私政策》": "\"Dasar privasi\"", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Kandungan keseluruhan. Dengan mengklik \"Agree\", anda bersetuju dan menerima semua terma. Jika anda memilih untuk tidak bersetuju, anda tidak akan dapat menggunakan produk dan perkhidmatan kami dan akan keluar dari aplikasi.", + "不同意": "Tak setuju", + "同意": "Setuju", + "该功能是高级功能,请开通后再使用": "Ini adalah fungsi lanjutan. Sila membolehkan ia terlebih dahulu.", + "常用程序": "Program-program yang biasa", + "该锁已被重置": "Kunci telah ditetapkan semula", + "需要访问读写权限才能使用手动升级固件": "Akses untuk membaca dan menulis kebenaran diperlukan untuk menaik taraf firmware secara manual", + "错误D固件,请选择正确的文件": "Firmware yang salah, sila pilih fail yang betul", + "非SYD固件,请选择正确的文件": "Firmware bukan SYD, sila pilih fail yang betul", + "文件校验失败 0x01": "Pengesahan fail gagal 0x01", + "解析元数据失败,请选择正确的文件": "Gagal menghuraikan metadata, sila pilih fail yang betul", + "文件校验失败 0x02": "Pengesahan fail gagal 0x02", + "文件校验失败 0x03": "Pengesahan fail gagal 0x03", + "固件升级完成": "Peningkatan Firmware selesai", + "记录": "Rekod", + "开通高级功能后才可以对锁进行管理": "Sila dayakan fungsi lanjutan terlebih dahulu untuk menguruskan kunci.", + "去开通": "Membolehkan", + "实名认证": "Pengesahan nama sebenar", + "当前剩余数量": "Baki", + "购买": "Beli", + "实名认证为付费功能,请购买后再使用": "Pengesahan nama sebenar adalah fungsi berbayar, sila gunakannya selepas pembelian", + "密码不一致哦": "Kata laluan tidak konsisten", + "退出添加": "Berhenti menambah", + "管理员已满": "Admin penuh", + "用户已满": "Pengguna penuh", + "锁上面添加指纹已满": "Tambah cap jari pada kunci penuh", + "指纹已存在": "Cap jari sudah wujud.", + "锁上面添加人脸已满": "Kunci di atas menambah muka penuh", + "人脸已存在": "Muka sudah ada", + "锁上面添加卡已满": "Kunci di atas menambah kad penuh", + "卡已存在": "Kad sudah ada", + "锁上面添加密码已满": "Kunci di atas tambah kata laluan penuh", + "密码已存在": "Kod laluan yang sama sudah ada. Sila pilih yang berbeza", + "请输入密码": "Sila masukkan kata laluan", + "暂无密码,无需重置": "Tiada kata laluan, tidak perlu menetapkan semula", + "真实姓名": "Nama sebenar", + "身份证号": "Nombor ID", + "请输入真实姓名": "Sila masukkan nama sebenar anda", + "请输入身份证号": "Sila masukkan nombor ID anda", + "请输入身份证号和真实姓名": "Sila masukkan nombor ID anda dan nama sebenar", + "点击返回设备配对": "Ketik kembali ke pasangan peranti", + "无法连接?尝试升级": "Tidak dapat menyambung? Naik taraf percubaan", + "固件升级提示": "Peningkatan Firmware segera", + "请先获取固件文件到手机本地,再选择升级": "Sila dapatkan fail firmware ke telefon tempatan terlebih dahulu, dan kemudian pilih naik taraf", + "固件升级中": "Firmware sedang dinaik taraf", + "取消升级": "Batalkan naik taraf", + "固件传输中": "Firmware dalam transit", + "关闭": "Matikan", + "传输中'": "Dalam transit", + "操作记录": "Rekod", + "修改姓名": "Edit nama", + "传输中": "Dalam transit", + "发送人": "Dikeluarkan oleh", + "发送时间": "Masa yang dikeluarkan", + "钥匙详情": "Maklumat ekey", + "姓名": "Nama", + "发送": "Hantar", + "请确认姓名全名和身份证号码是否正确": "Sila sahkan bahawa nama penuh dan nombor ID adalah betul", + "传输期间请勿离开当前页面": "Jangan tinggalkan halaman semasa semasa pemindahan", + "机型": "Model", + "硬件版本": "Versi perkakasan", + "固件版本": "Versi Firmware", + "手动升级": "Naik taraf Manual", + "设备连接中...": "Peranti menyambung...", + "未避免异常情况,请在门打开时升级": "Pengecualian yang tidak dapat dielakkan, sila naik taraf apabila pintu dibuka", + "钥匙无效": "Kunci tidak sah", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Tidak dapat menyambung ke kunci. Sila mulakan semula bluetooth telefon anda dan cuba lagi.", + "如果是全自动锁,请使屏幕变亮": "Jika ia adalah kunci automatik sepenuhnya, sila buat skrin lebih cerah", + "正在尝试闭锁……": "Cuba untuk mengunci. Sila tunggu...", + "清空记录": "Rekod-rekod yang jelas", + "是否要删除操作记录?": "Terus memadam rekod?", + "被删除的记录不能恢复": "Rekod-rekod yang tidak dapat dipulihkan selepas menghapuskan.", + "全部事件": "Semua peristiwa", + "开锁事件": "Membuka acara", + "异常事件": "Peristiwa yang tidak normal", + "门铃事件": "Acara loceng pintu", + "视频事件": "Acara Video", + "请开启蓝牙": "Sila hidupkan Bluetooth", + "请选择有效日": "Sila pilih hari yang berkesan", + "公司名字长度不能小于 6 ": "Panjang nama syarikat tidak boleh kurang daripada 6", + "已是最新版本": "Tiada kemas kini", + "新建短信模版": "Mencipta templat SMS", + "新建邮件模版": "Templat e-mel Creat", + "自定义短信模版": "Templat SMS", + "自定义邮件模版": "Templat e-mel", + "名称": "Nama", + "星星锁": "Kunci bintang", + "无考勤记录": "Tiada rekod", + "大家干劲十足": "Semua orang datang dalam masa", + "工作时长未出炉": "Tiada jam kerja", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Pilihan negara/rantau akan menjejaskan keselamatan data. Anda kini telah memilih Albania, sila sahkan sebelum meneruskan.", + "确认国家或地区": "Mengesahkan negara/rantau", + "我知道了": "Dah dapat", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Untuk menerima kemas kini penting, sila klik 'OK' dan dayakan pemberitahuan dalam tetapan.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Selepas menghidupkan, anda boleh menghidupkan semula kuasa dengan menekan kekunci tetapan lama pada kunci, dan menambah semula dengan aplikasinya", + "已有": "Semasa", + "新增": "Baru", + "账号格式错误": "Format yang buruk", + "接收者信息为空": "Maklumat penerima kosong", + "请输入时间(秒)": "Sila masukkan masa (sec)", + "加载数据失败": "Gagal memuatkan data", + "重试": "Cuba lagi", + "升级中,是否退出": "Semasa naik taraf, sama ada untuk keluar", + "下一步": "Seterusnya", + "公寓": "Apartmen", + "个人用户": "Peribadi", + "星寓": "Apartmen bintang", + "账号": "Akaun", + "请输入手机号或email": "Nombor telefon atau e-mel", + "请输入星寓管理员的账号": "Sila masukkan akaun pentadbir pangsapuri bintang", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Semua data lock(s) yang dipilih akan dipindahkan secara kekal kepada penerima.", + "暂不支持跨平台转移,敬请期待": "Pemindahan silang platform tidak disokong buat masa ini, sila tunggu", + "移除坏锁": "Pindah kunci rosak/rosak ke sampah", + "转移确认": "Sahkan pemindahan", + "本次共转移": "Kali ini sejumlah", + "把智能锁": "Kunci pintar", + "确认": "OK", + "移除成功": "Keluarkan berjaya", + "转移成功": "Kejayaan pemindahan", + "该已锁被删除": "Dikunci yang dihapuskan", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Admin dibenarkan hanya boleh menguruskan kod laluan, ekeys dan etccreated oleh dirinya sendiri.", + "添加授权管理员": "Buat Admin", + "导出记录": "Rekod eksport", + "选择时间段": "Pilih tempoh masa", + "导出": "Eksport", + "批量导出": "Eksport Batch", + "读取记录": "Rekod-rekod segar semula", + "设备": "Peranti", + "消息": "Mesej", + "智能分析": "Analisis pintar", + "精准识别设备事件,过滤无效信息": "Tepat mengenal pasti peristiwa peranti dan menapis maklumat yang tidak sah", + "系统设置": "Tetapan sistem", + "系统的全局配置在此项内进行设置": "Konfigurasi global sistem ditetapkan dalam item ini", + "导出操作记录": "Rekod eksport", + "立即查看": "Lihat", + "导出成功": "Dieksport berjaya", + "发送钥匙": "Hantar ekey", + "进度": "Kadar", + "失败": "Gagal", + "人脸详情": "Butiran muka", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Apabila seseorang merasakan kira-kira 1.5 meter di hadapan pintu, pembukaan pengiktirafan muka akan dimulakan secara automatik.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Apabila seseorang merasakan kira-kira 0.8 meter di hadapan pintu, pembukaan pengiktirafan muka akan dimulakan secara automatik.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Apabila seseorang merasakan kira-kira 0.5 meter di hadapan pintu, pembukaan pengiktirafan muka akan dimulakan secara automatik.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Jarak penderiaan telah dimatikan, anda perlu menyentuh sebarang kekunci secara manual pada papan kekunci untuk melakukan pembukaan pengiktirafan muka.", + "防误开已打开,开锁后": "Pembukaan anti-kesilapan telah dihidupkan, dan selepas membuka kunci", + "秒内不可使用面容开锁": "Membuka muka tidak boleh digunakan dalam beberapa saat", + "掌静脉": "Urat sawit", + "添加掌静脉": "Tambah urat sawit", + "胁迫掌静脉": "Urat sawit dipaksa", + "请不要将胁迫掌静脉用于日常开锁": "Tolong jangan gunakan urat sawit paksaan untuk membuka kunci harian", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Disambungkan ke kunci, sila buka telapak tangan anda secara semulajadi, telapak tangan menghadap kamera", + "掌静脉详情": "Butiran urat sawit", + "掌静脉号": "Nombor urat sawit", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth tidak dihidupkan, sila hidupkan Bluetooth dalam tetapan", + "删除用户时,会将用户拥有的钥匙一起删除。": "Jika pengguna dipadam sebarang ekeys yang berkaitan dengan pengguna juga akan dihapuskan.", + "配置网络": "Konfigurasi rangkaian", + "你好": "Hello", + "成功": "Berjaya", + "类型选择": "Jenis pilih", + "请选择要使用哪种类型": "Sila pilih jenis yang hendak digunakan", + "系统邮件(推荐)": "E-mel sistem (disyorkan)", + "系统短信(推荐)": "SMS sistem (disyorkan)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-mel akan dihantar dari aplikasi ini. Sila beli pakej e-mel terlebih dahulu.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS akan dihantar dari aplikasi ini. Sila beli pakej e-mel terlebih dahulu.", + "个人邮件": "E-mel peribadi", + "个人短信": "SMS peribadi", + "邮件将从你的个人邮箱发给用户": "E-mel akan dihantar dari akaun e-mel peribadi anda.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Mesej SMS akan dihantar dari nombor telefon peribadi anda. Anda membayar kepada pengendali telekom anda.", + "为了更好地应用体验,请确定权限": "Untuk pengalaman aplikasi yang lebih baik, sila sahkan kebenaran", + "您第一次拒绝权限,请确定权限": "Anda menolak kebenaran buat kali pertama, sila sahkan kebenaran", + "您第二次拒绝权限,请去应用设置开启权限": "Anda menolak kebenaran untuk kali kedua, sila pergi ke tetapan aplikasi untuk membolehkan kebenaran", + "去应用市场": "Pergi ke kedai app", + "温馨提示": "Permintaan hangat", + "关闭应用": "Tutup permohonan", + "开启微信接收报警消息需要先关注": "Untuk membuka WeChat untuk menerima mesej penggera, anda perlu mengikuti", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Akaun awam WeChat, simpan kod QR dan gunakan WeChat untuk mengimbas tetapan", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Pengesahan nama sebenar adalah fungsi berbayar, sila hubungi pentadbir kunci untuk membeli dan menggunakan", + "位置权限": "Kebenaran lokasi", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Sila berikan aplikasi untuk menggunakan locatian anda. Ia digunakan untuk mengimbas kunci BLE dan pintu masuk.", + "相机/相册权限": "Kebenaran kamera/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Sila berikan aplikasi untuk membaca dan menulis foto dan fail dari storan.", + "点击选择": "Klik untuk memilih", + "微信": "WeChat", + "朋友圈": "Detik-detik", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "FaceBook", + "链接": "Pautan", + "今天": "Hari ini", + "密码错误": "Kata laluan tidak sah", + "网络中断": "Gangguan rangkaian", + "钥匙不存在": "Key tak ada", + "钥匙过期": "Tamat tempoh utama", + "钥匙已存在": "Kunci sudah ada", + "密码失效": "Kata laluan tidak sah", + "门锁时间异常": "Masa kunci pintu tidak normal", + "APP(手机)未联网": "APP (telefon bimbit) tidak disambungkan ke Internet", + "数据不存在": "Data tidak wujud", + "待接收": "Diterima", + "已冻结": "Beku", + "已删除": "Dihapuskan", + "未知": "Tidak diketahui", + "拖动下方滑块完成拼图": "Seret gelangsar ke kedudukan yang betul", + "验证成功": "Kejayaan pengesahan", + "验证失败": "Pengesahan gagal", + "向右拖动滑块填充拼图": "Seret slider ke kanan untuk mengisi teka-teki", + "请先获取到位置信息哦": "Sila dapatkan maklumat lokasi terlebih dahulu", + "请选择国家": "Sila pilih negara", + "获取锁信息": "Dapatkan maklumat kunci", + "锁数据异常,请重试": "Data kunci tidak normal, sila cuba lagi", + "连接设备中...": "Menyambung peranti...", + "把锁": "Kunci", + "条": "Jalur", + "封": "Meterai", + "次": "Masa", + "支付成功": "Membayar kejayaan", + "查看详情": "Lihat maklumat", + "请输入模板名称": "Sila masukkan nama templat", + "模版类型": "Jenis", + "再返回一次退出": "Keluar lagi", + "请先添加锁": "Sila tambah kunci terlebih dahulu", + "可视对讲": "Interkom Visual", + "详细日志": "Log terperinci", + "已复制到剪切板": "Disalin", + "拍照": "Foto", + "从相册选择": "Pilih daripada album", + "选择问题": "Sila pilih soalan", + "确认长度不足8位": "Sahkan panjang kurang daripada 8 digit", + "新密码长度不足8位": "Panjang kata laluan baru kurang daripada 8 digit", + "两次密码不一致": "Ketidakpadanan kata laluan. Sila cuba lagi", + "请点击获取验证码,验证码将发送到": "Sila dapatkan kod pengesahan. Kod akan dihantar ke", + "切换": "Tukar", + "验证": "Sahkan", + "验证成功,账号已删除": "Pengesahan berjaya, akaun dipadam", + "该密码不是自定义密码,无法修改": "Kata laluan ini bukan kata laluan tersuai dan tidak boleh diubah suai", + "请选择设备要关联哪些姓名": "Sila pilih nama mana peranti harus dikaitkan dengan", + "请选择姓名要关联哪些设备": "Sila pilih peranti mana nama itu harus dikaitkan dengan", + "确定要移除所选中的坏锁吗?": "Keluarkan kunci yang tidak berfungsi?", + "邮件通知": "Maklumkan melalui e-mel", + "短信通知": "Maklumkan melalui SMS", + "您好,您的授权管理员生成成功": "Halo, pentadbir yang diberi kuasa anda telah berjaya dihasilkan", + "请输入接收者姓名": "Sila masuk sini", + "版本更新": "Kemas kini versi", + "下次再说": "Masa depan", + "配网成功": "Kejayaan pengedaran rangkaian", + "配网失败": "Pengedaran rangkaian gagal", + "该锁的无线键盘都将被删除": "Semua papan kekunci tanpa wayar untuk kunci ini akan dipadamkan", + "实时画面": "Gambar masa nyata", + "适合门口较为安全的环境。": "Sesuai untuk persekitaran yang agak selamat di pintu.", + "仅发生特定事件才录像,并可查看实时画面。": "Peristiwa-peristiwa tertentu yang hanya direkodkan dan gambar masa nyata boleh dilihat.", + "一般情况下,满电可使用7-8个月": "Di bawah keadaan biasa, ia boleh digunakan selama 7-8 bulan apabila dicas sepenuhnya", + "有人逗留或发生特定事件才录像,可随时查看": "Seseorang tetap atau peristiwa tertentu direkodkan, dan boleh dilihat pada bila-bila masa", + "实时画面。": "Gambar masa nyata.", + "一般情况下,满电可使用5~6个月。": "Di bawah keadaan biasa, ia boleh digunakan selama 5 ~ 6 bulan apabila dicas sepenuhnya.", + "适合门口人员复杂、较不安全的环境。": "Sesuai untuk persekitaran yang kompleks dan agak tidak selamat di pintu.", + "有人出现就录像,可随时查看实时画面。": "Rekod apabila seseorang muncul, dan melihat gambar masa nyata pada bila-bila masa.", + "一般情况下,满电可使用2~4个月。": "Di bawah keadaan biasa, ia boleh digunakan selama 2 ~ 4 bulan apabila dicas sepenuhnya.", + "根据您家门口实际情况设置录像和实时画面功能。": "Tetapkan fungsi gambar video dan masa nyata mengikut keadaan sebenar di pintu anda.", + "可使用时长由具体设置决定。": "Tempoh penggunaan ditentukan oleh tetapan tertentu.", + "查看": "Lihat", + "有人按门铃或发生": "Seseorang berdering bel pintu atau", + "异常事件时": "Peristiwa yang tidak normal", + "不录像": "Tiada video", + "有人出现、按门铃": "Seseorang muncul, cincin loceng pintu", + "或发生异常事件时": "Atau kejadian yang tidak normal berlaku", + "逗留达到10秒": "Tinggal selama 10 saat", + "约1.5米": "Kira-kira 1.5 meter", + "随时": "Bila-bila masa", + "立即录像": "Rekod dengan serta-merta", + "录像时机": "Masa Video", + "有人出现时录像": "Rekod apabila seseorang muncul", + "人体侦测距离": "Jarak pengesanan manusia", + "查看实时画面": "Lihat gambar masa nyata", + "自定义时间": "Masa adat", + "当日": "Hari ini", + "次日": "Hari berikutnya", + "自定义时段": "Tempoh masa adat", + "发生事件时查看": "Lihat apabila kejadian berlaku", + "实时查看": "Paparan masa nyata", + "有人在门口出现10秒后开始录像。": "Seseorang muncul di pintu selama 10 saat sebelum rakaman.", + "有人按门铃时立即录像。": "Rekod segera apabila seseorang berdering bel pintu.", + "有人出现在门前1.5米范围时启动录像": "Mula merakam apabila seseorang muncul dalam 1.5 meter di hadapan pintu", + "约0.8米": "Kira-kira 0.8 meter", + "约3.0米": "Kira-kira 3.0 meter", + "添加指纹失败": "Operasi gagal.", + "项": "Item", + "播放中": "Bermain", + "下载": "Muat turun", + "暂无下载内容": "Tiada kandungan muat turun", + "亮度": "Kecerahan", + "音量": "Jumlah", + "快进至": "Cepat ke hadapan ke", + "快退至": "Rewind ke", + "暂无视频信息": "Tiada maklumat video", + "加载出错": "Memuatkan ralat", + "请单人正对门锁,距离一个成年人手臂长度": "Sila berdiri di hadapan kunci pintu sahaja, pada panjang lengan", + "(约0.6米)。": "(Kira-kira 0.6 meter).", + "保持脸部无遮挡,露出五官。": "Pastikan wajah anda tidak terhalang dan tunjukkan ciri wajah anda.", + "准备好了,开始添加": "Bersedia, mula menambah", + "正在录入中...": "Rakaman...", + "添加人脸失败": "Gagal menambah muka", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, muka kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?", + "人脸号": "Nombor muka", + "虹膜详情": "Butiran Iris", + "虹膜号": "Nombor Iris", + "选择设备类型": "Pilih jenis peranti", + "照明灯具": "Lekapan lampu", + "电动窗帘": "Langsir elektrik", + "门窗传感器": "Sensor pintu dan tingkap", + "传感器": "Sensor", + "清除数据成功": "Data dibersihkan berjaya", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Kunci tidak disambungkan ke internet, jadi recods kod laluan, kad, cap jari, dan kaedah pembukaan pintu lain tidak boleh dimuat naik dalam masa nyata.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Jika anda perlu menyimpan rekod sejarah, anda boleh mengeksport mereka.", + "看不到操作记录,可能原因有": "Tidak dapat melihat rekod operasi, sebab yang mungkin", + "操作记录详情": "Maklumat rekod operasi", + "操作时间": "Masa operasi", + "此模块功能需要锁联网后设置方可生效": "Fungsi modul ini perlu ditetapkan selepas kunci disambungkan ke Internet untuk berkuatkuasa", + "用户已存在": "Pengguna sudah wujud", + "钥匙数量已到上限": "Bilangan kunci telah mencapai had atas", + "附近没有可用网关": "Terdapat tiada pintu masuk yang berdekatan", + "正在创建安全连接...": "Mewujudkan sambungan selamat...", + "监视状态下不能发送录音": "Tidak boleh menghantar rakaman dalam mod pemantauan", + "挂断": "Hang up", + "监视中暂不能开锁": "Membuka kunci tidak tersedia semasa pemantauan", + "长按说话": "Tekan dan tahan untuk bercakap", + "松开发送": "Lepas hantar", + "请输入6位数字开锁密码": "Sila masukkan kata laluan buka kunci 6 digit", + "请输入开锁密码": "Sila masukkan kata laluan buka kunci", + "接收者在有效期内可以不限次数使用": "Penerima dapat menggunakan ekeys untuk masa yang tidak terhad dalam tempoh sah.", + "接收者可以使用此App开关锁": "Penerima dapat mengunci/membuka kunci oleh aplikasi ini.", + "单次钥匙有效期为1小时,只能使用一次": "Ekey sekali adalah sah selama satu jam dan hanya boleh digunakan sekali.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Penerima dapat menggunakan ekeys untuk masa yang tidak terhad dalam masa kitaran tetap.", + "获取模板失败": "Gagal untuk mendapatkan template", + "微信通知": "Pemberitahuan WeChat", + "系统短信": "Sistem SMS", + "系统邮件": "E-mel sistem", + "模板": "Template", + "新建模版": "Mencipta template", + "您好,您的密码是": "Halo, kata laluan anda", + "密码名字": "Nama kata laluan", + "请输入6-9位密码": "Sila masukkan kata laluan 6-9 digit", + "设置密码": "Tetapkan kata laluan", + "操作成功,密码为": "Berjaya. Kod laluan adalah", + "类型:自定义-永久": "Jenis: adat-kekal", + "实时播放": "Main balik masa nyata", + "点击对讲": "Klik untuk interkom", + "长按开锁": "Tekan lama untuk membuka kunci", + "接听失败": "Gagal menjawab", + "请在锁设置中开启远程开锁": "Sila aktifkan buka kunci jauh dalam tetapan kunci", + "接听": "Jawapan", + "截图已保存到相册": "Screenshot disimpan ke album", + "添加遥控": "Tambah kawalan jauh", + "已连接到锁,请按遥控": "Disambungkan ke kunci, sila tekan kawalan jauh", + "遥控号": "Nombor kawalan jauh", + "遥控详情": "Butiran kawalan jauh", + "照明": "Lampu", + "退出演示模式": "Mod demo keluar", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Petua: antara muka semasa adalah antara muka paparan. Selepas menambah peranti, anda boleh terus menggunakannya", + "门已上锁": "Pintu dikunci", + "您的账号在异地登录,如非本人,请尽快修改密码": "Akaun anda telah digunakan untuk log masuk dari peranti baru", + "开门成功": "Buka pintu dengan jayanya", + "开门失败": "Gagal membuka pintu", + "呼叫提醒": "Peringatan panggilan", + "收到来自": "Diterima dari", + "锁的呼叫": "Kunci panggilan", + "加载数据中": "Memuatkan data", + "搜索所有锁类型": "Cari semua jenis kunci", + "锁电量更新时间": "Kunci masa kemas kini bateri", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Boleh", + "6月": "Jun", + "7月": "Jul", + "8月": "Ogos", + "9月": "Sep", + "10月": "Okt", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Bandar-bandar panas", + "导出锁数据": "Data kunci eksport", + "一键开锁": "Buka kunci satu klik", + "已开通": "Dibuka", + "编辑员工": "Edit kakitangan", + "一": "Satu", + "二": "Dua", + "三": "Tiga", + "四": "Empat", + "五": "Lima", + "六": "Enam", + "日": "Matahari", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?", + "在线": "Dalam talian", + "离线": "Luar talian", + "购买记录": "Rekod pembelian", + "使用记录": "Rekod pengguna", + "失效时间要大于当前时间": "Waktu tamat tempoh mestilah lebih lama daripada masa semasa", + "修改名字": "Edit nama", + "时": "Jam", + "分": "Minit", + "Amazon Alexa": "Alexa Amazon", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Anda boleh menggunakan Alexa untuk membuka kunci, mengunci dan menyemak status kunci", + "支持的国家": "Negara-negara yang disokong", + "支持的国家值": "Amerika syarikat, kanada, UK, Australia, India, jerman, perancis, itali, sepanyol, jepun", + "操作流程": "Proses operasi", + "操作流程值": "1 tambah kunci dan pintu masuk dengan aplikasi kunci pintar\n\n2 membolehkan fungsi membuka kunci kunci dalam aplikasi (fungsi ini dimatikan secara lalai). Jika anda tidak mempunyai pilihan ini, kunci tidak menyokong Alexa\n\n3 tambah kemahiran untuk Alexa dan memberi kuasa kepada mereka dengan akaun dan kata laluan Smart lock APP. Selepas kebenaran berjaya, anda boleh menemui peranti di bawah akaun\n\n4 cari kunci dalam app Alexa, hidupkan fungsi buka kunci suara, dan tetapkan kata laluan bahasa\n\n5 kunci boleh dikendalikan melalui Alexa", + "Google Home": "Rumah Google", + "Action name": "Nama tindakan", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Bahasa yang disokong", + "英语": "Bahasa inggeris", + "Google Home操作流程的值": "1. Gunakan aplikasi kunci pintar untuk menambah kunci dan pintu masuk\n\n2. Dayakan fungsi membuka kunci kunci dalam aplikasi (fungsi ini dimatikan secara lalai). Tanpa pilihan ini, kunci tidak menyokong rumah Google\n\n3. Pasang aplikasi Google Home dan klik butang \"\" di sudut kiri atas\n\n4. Pada halaman tetapan, pilih \"bekerja dengan Google\"\n\n5. Cari \"ScienerSmart\" dan gunakan akaun aplikasi kunci pintar dan kata laluan untuk memberi kuasa", + "密码需至少包含数字/字母/字符中的2种组合": "Kata laluan mesti mengandungi sekurang-kurangnya 2 daripada yang berikut: nombor, huruf, dan aksara khas", + "已开锁": "Dikunci", + "已闭锁": "Dikunci", + "两次密码不一致哦": "Kata laluan tidak konsisten", + "中功率": "Kuasa sederhana", + "常规使用": "Penggunaan biasa", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Selepas pintu masuk dihidupkan, tekan dan tahan butang reset selama 5 saat, dan klik seterusnya apabila lampu penunjuk berkelip bergantian", + "扫描设备": "Imbas peranti", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Pintu masuk mungkin telah pergi di luar talian. Adakah anda mahu memaksa memadam data?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_nl.json b/lan/lan_nl.json new file mode 100644 index 00000000..82ed9aac --- /dev/null +++ b/lan/lan_nl.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Ster slot", + "锁通通": "Vergrendel door", + "点击开锁,长按闭锁": "Aanraken om te ontgrendelen, vasthouden om te vergrendelen", + "考勤": "Aanwezigheid", + "考勤设置": "Aanwezigheidsinstellingen", + "电子钥匙": "EKeys", + "添加卡": "Kaart toevoegen", + "卡号": "Kaartnummer", + "添加指纹": "Vingerafdruk toevoegen", + "指纹号": "Vingerafdruknummer", + "遥控": "Op afstand", + "添加人脸": "Gezicht toevoegen", + "门锁日志": "Deurslot log", + "密码号": "Wachtwoordnummer", + "添加者": "Exploitant", + "添加时间": "Tijd", + "重置": "Reset", + "请输入手机号或者邮箱": "telefoonnummer/e-mail", + "工作时间": "Werktijd", + "工作日设置": "Werkdaginstelling", + "星期一": "Maandag", + "星期二": "Dinsdag", + "星期三": "Woensdag", + "星期四": "Donderdag", + "星期五": "Vrijdag", + "星期六": "Zaterdag", + "星期日": "Zondag", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Ma", + "周二": "Di", + "周三": "Wo", + "周四": "Do", + "周五": "Vrij", + "周六": "Zat", + "周日": "Zon", + "群发钥匙": "Meerdere ekeys verzenden", + "锁": "Vergrendel", + "请添加": "Ontvanger", + "允许远程开锁": "Ontgrendeling op afstand", + "请输入验证码": "Verificatiecode", + "获取密码": "Wachtcode genereren", + "请给密码命名": "Voer een naam in voor deze toegangscode", + "密码有限期为6个小时,只能使用一次": "Deze toegangscode MOET binnen 6 uur na de huidige tijd worden gebruikt, anders wordt deze om veiligheidsredenen OPGESCHORT.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Voer handmatig 6-9 cijfers in als wachtwoord. Kan worden toegevoegd via de telefoon Bluetooth naast het slot, of op afstand toegevoegd via de gateway", + "获取": "Krijg", + "添加": "Toevoegen", + "删除公司": "Bedrijf verwijderen", + "密码详情": "Toegangscode-informatie", + "修改密码": "Toegangscode wijzigen", + "添加虹膜": "Iris toevoegen", + "添加门磁": "Deursensor", + "添加无线键盘": "Draadloos toetsenbord", + "添加手掌": "Palm toevoegen", + "请输入员工账号": "Voer het account van de werknemer in", + "批量授权锁": "Verleen meerdere sloten", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "De geautoriseerde beheerder heeft meerderheidstoestemming om dit slot te bedienen.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Met deze functie kunt u de Smart Lock op afstand ontgrendelen via een gateway. Deze functie kan ALLEEN worden ingeschakeld of uitgeschakeld via Bluetooth.", + "排列方式": "Type lijst", + "早到榜": "Vroege lijst", + "迟到榜": "Late lijst", + "当前模式": "Huidige modus", + "勤奋榜": "Werkende harde lijst", + "延迟时间": "Vertragingstijd", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Het slot wordt na de tijd automatisch vergrendeld. Ontgrendel het eerst een keer om de instelling beschikbaar te maken.", + "时间": "Tijd", + "开始时间": "Starttijd", + "结束时间": "Eindtijd", + "工作时间设置": "Instelling werktijd", + "常开模式": "Passagemodus", + "常开时间": "In deze periode", + "常开日期": "Op deze dagen", + "添加员工": "Personeel toevoegen", + "节假日": "Vakantie", + "打卡方式": "Methode", + "员工是否有钥匙": "Ekey heeft al", + "上班时间": "Starttijd", + "下班时间": "Sluitingstijd", + "本周": "Deze Week", + "单休": "Eendaags weekend", + "双休": "Tweedaags weekend", + "单双休": "Een tweedaags weekend", + "年": "Jaar", + "月": "Maand", + "放假日期": "Vakantie", + "补班日期": "Werkdagen", + "添加假日": "Voeg vakantie toe", + "开始日期": "Startdatum", + "必填": "Vereist", + "结束日期": "Einddatum", + "日榜": "Dagelijks", + "月榜": "Maandelijks", + "考勤记录": "Records", + "假日信息": "Vakantie Info", + "基本信息": "Basics", + "无线键盘": "Draadloos toetsenbord", + "选择无线键盘": "Toetsenbord toevoegen", + "门磁": "Deursensor", + "自动闭锁": "Autovergrendeling", + "锁声音": "Geluid vergrendelen", + "防撬报警": "Tamper Alert", + "重置键": "Reset knop", + "锁时间": "Vergrendel klok", + "诊断": "Diagnose", + "上传数据": "Gegevens uploaden", + "导入其他锁数据": "Importeer frome een ander slot", + "锁升级": "Firmware-update", + "标记房态": "Kamerstatus", + "开锁提醒": "Kennisgeving ontgrendelen", + "微信二维码": "Ontgrendel QR-code", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Mensen met elektronische sleutels kunnen de deur openen door deze QR-code te scannen via WeChat. De QR-code van elk slot is anders. U kunt het afdrukken en plakken naast het bijbehorende slot", + "锁编号": "Vergrendelnummer", + "电量": "Batterij", + "锁分组": "Slot groep", + "选择分组": "Groep selecteren", + "创建新分组": "Creëer een groep", + "管理员开锁密码": "Toegangscode voor beheerders", + "更新": "Update", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Het batterijniveau wordt bijgewerkt door gateway of telefoon bluetooth", + "当屏幕闪烁时,点击下一步": "Klik op Volgende wanneer het toetsenbord knippert", + "输入*529#或按设置键": "Voer README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # in of druk op de toets Instellingen", + "长按重置键2秒": "Druk op en houd de resetknop 2 seconden ingedrukt", + "附近的设备": "Apparatuur in de buurt", + "暂无数据": "Geen gegevens", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "U kunt de deurstatus krijgen met een deursensor samen met een gateway. Slechts één sensor mag associëren met een slot.", + "开始": "Begin", + "全天": "Alle uren", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "U kunt meerdere tijdsperioden instellen voor de passagemodus. Binnen de ingestelde tijdsperioden blijft het slot in een open toestand nadat het is ontgrendeld.", + "请选择锁音量": "Selecteer vergrendelingsvolume", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Door aan te zetten, hoort u het geluid van het slot", + "低": "Laag", + "较低": "Gemiddeld laag", + "中": "Medium", + "较高": "Middelhoog", + "高": "Hoog", + "开启后,锁被撬动时,会发出报警声": "Door aan te zetten, schakel je de TAMPER alert in.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Door uit te schakelen, is de RESET-knop uitgeschakeld.", + "校准时间": "Tijd kalibreren", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnose is om de configuratie-informatie in het slot te lezen en te uploaden zodat het personeel de oorzaak van de storing kan analyseren", + "上传": "Uploaden", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Upload gegevens van lock naar server. Het kan enkele minuten duren", + "请选择要从哪把锁导入": "Selecteer een slot om uit te importeren", + "有新版本": "Heb nieuwe versie", + "当前版本": "Huidige versie", + "升级": "Update", + "空闲": "Leegstaand", + "已入住": "Bezet", + "多语言": "Talen", + "添加锁": "Lock toevoegen", + "锁地址": "Vergrendel adres", + "选择锁类型": "Selecteer slottype", + "NFC无源锁": "NFC passief slot", + "添加设备": "Apparaat toevoegen", + "网关": "Gateway", + "客服": "Klantenservice", + "设置": "Instellingen", + "更多设置": "Meer set", + "消息推送": "Meldingsdruk", + "锁用户管理": "Gebruikers vergrendelen", + "拥有的钥匙": "EKeys geassocieerd met deze gebruiker", + "批量授权": "Autoriteitsbeheer", + "关联设备": "Bijbehorend apparaat", + "关联姓名": "Bijbehorende naam", + "转移智能锁": "Transfer Lock", + "选择锁": "Schermvergrendeling", + "接收人信息": "Ontvanger", + "转移网关": "Transfer Gateway", + "锁屏": "Schermvergrendeling", + "已关闭": "Uit", + "已开启": "Aan", + "开启": "Inschakelen", + "确定要开启重置键?": "Doorgaan met het inschakelen van de Reset-knop?", + "确定要关闭重置键?": "Doorgaan met het uitschakelen van de Reset-knop?", + "隐藏无效开锁权限": "Ongeldige toegang verbergen", + "APP开锁时需手机连网的锁": "Sloten waarvoor online telefoon nodig is", + "增值服务": "Diensten", + "关于": "Over", + "退出": "Uitloggen", + "删除账号": "Account verwijderen", + "个人信息": "Accountgegevens", + "头像": "Avatar", + "昵称": "Nicknaam", + "请输入昵称": "Voer uw bijnaam in", + "修改昵称": "Naam wijzigen", + "修改账号": "Account bewerken", + "重置密码": "Wachtwoord resetten", + "安全问题": "Beveiligingsvraag", + "为了你的账号安全,修改账号前请先使用验证码验证": "Gebruik voor de veiligheid van uw account de verificatie van het accountwachtwoord voordat u het account wijzigt", + "请输入新账号": "Voer het nieuwe account in", + "找回密码和登录新设备时,可通过绑定的手机验证": "Het Binding Phone-nummer wordt gebruikt om de verificatiecode te ontvangen.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "De Binding e-mail zal worden gebruikt om de Verificatiecode te ontvangen.", + "原密码": "Huidig wachtwoord", + "新密码": "Nieuw wachtwoord", + "确认密码": "Wachtwoord bevestigen", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Als uw telefoon verloren is gegaan, kunt u inloggen op een nieuwe telefoon door beveiligingsvragen te beantwoorden.", + "问题一": "Vraag 1", + "问题二": "Vraag 2", + "问题三": "Vraag 3", + "请输入你的答案": "Typ uw antwoord", + "即将到期": "Verloopt binnenkort", + "去授权": "Ga naar autoriseren", + "修改名称": "Naam bewerken", + "状态": "Status", + "WiFi名称": "Wifi naam", + "网络MAC": "Netwerk MAC", + "网关升级": "Gateway-update", + "网关连接的锁": "Slot (en) aangesloten op deze gateway", + "信号强": "Sterk", + "选择网关类型": "Gatewaytype kiezen", + "添加网关": "Gateway toevoegen", + "重新通电": "Verbind de stroom opnieuw", + "指示灯": "Indicatielampje", + "选择网关": "Gateway kiezen", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G wordt niet ondersteund. Selecteer een WiFi van 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "WiFi-wachtwoord invoeren", + "网关名称": "Naam gateway", + "请输入网关名称": "Gatewaynaam invoeren", + "IP地址": "IP-adres", + "子网掩码": "Subnet Masker", + "默认网关": "Standaard gateway", + "自动获取DNS服务器地址": "Krijg automatisch het DNS-serveradres", + "首选DNS": "Geprefereerde DNS", + "备选DNS": "Alternatieve DNS", + "不使用静态IP": "Geen statische IP wordt gebruikt", + "使用静态IP": "Gebruik statische IP", + "请输入IP地址": "IP-adres invoeren", + "请输入子网掩码": "Subnetmasker invoeren", + "请输入默认网关": "Voer de standaardgateway in", + "所有锁": "Alle sloten", + "搜索所有类型的锁": "Scan alle soorten sloten", + "门锁": "Deurslot", + "挂锁": "Hangslot", + "保险箱锁": "Veilig slot", + "智能门禁": "Intelligente toegangscontrole", + "车位锁": "Parkeerslot", + "摸亮触摸屏": "Raak een willekeurige toets aan om het toetsenbord te activeren", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Raak een toets aan om het slot te activeren en zet het in de PAIRING-modus. Druk op Next", + "附近的锁": "Locks in de buurt", + "如需修改名字请重新命名,点击确定添加锁": "Als u de naam wilt wijzigen, wijzigt u de naam, klikt u op OK om vergrendeling toe te voegen", + "添加锁时,手机必须在锁旁边": "Bij het toevoegen van een slot moet de telefoon zich naast het slot bevinden", + "登录": "Inloggen", + "注册": "Registreer", + "我已阅读并同意": "Ik heb gelezen en ingestemd", + "验证码": "Code", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Uw wachtwoord moet 8-20 tekens bevatten en minimaal twee soorten cijfers, letters en symbolen bevatten", + "手机": "Telefoon", + "邮箱": "E-mail", + "请输入邮箱": "Voer uw e-mail in", + "国家/地区": "Land/Regio", + "你所在的国家/地区": "Uw land/regio", + "选择国家/地区": "Kies uw land of regio", + "获取验证码": "Krijg code", + "商务合作": "Zakelijk", + "电脑网页版": "Websysteem", + "酒店系统": "Hotel systeem", + "说明书网页版": "Gebruikershandleiding", + "高级功能": "Geavanceerde functie", + "记录保存": "Records retentie", + "您可通过短信将密码、电子钥匙信息发给接收人。": "De sms kan worden gebruikt om toegangscode en ekey-informatie naar de ontvanger te verzenden.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "De e-mail kan worden gebruikt om toegangscode en ekey-informatie naar de ontvanger te sturen.", + "购买实名认证提示": "Nadat de functie is ingeschakeld, moet u uw vingerafdruk, gezicht of accountwachtwoord gebruiken om de APP te openen. Het is niet nodig om gedurende 3 minuten opnieuw te verifiëren", + "请选择你希望的实名认证频次": "Selecteer de real-name authenticatiefrequentie die u wilt", + "仅首次": "Voor de eerste keer", + "每日一次": "Eenmaal per dag", + "每周一次": "Een keer per week", + "每月一次": "Eens per maand", + "当前状态": "Huidige status", + "试用中": "Op proef", + "高级功能权益内容": "Geavanceerde functies", + "短信模板": "SMS-sjabloon", + "邮件模板": "E-mail sjabloon", + "发卡工具": "Kaart encoder", + "购买高级功能须知": "Kennisgeving", + "购买高级功能提示": "Meer geavanceerde functies zijn in ontwikkeling en als u ze nodig hebt, bent u van harte welkom om de service te openen op basis van het aantal sloten. Geavanceerde functies zijn alleen beschikbaar voor uw eigen sloten. Als u een geautoriseerde beheerder bent, neem dan contact op met de hoogste beheerder van het slot om de service te openen", + "免费体验": "Gratis proefperiode", + "立即开通": "Nu openen", + "购买短信": "Koop SMS", + "购买邮件": "E-mail kopen", + "购买实名认证次数": "Aankoop Real Name Authentication Times", + "开通高级功能": "Geavanceerde functie inschakelen", + "选择套餐": "Pakket kiezen", + "支付方式": "Wijze van betaling", + "支付宝": "Alipay", + "去支付": "Betalen", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "U mag het bericht zelf definiëren. Het wordt gebruikt om informatie van toegangscode en ekey naar anderen te verzenden.", + "高级功能仅能用于你自己的锁": "De geavanceerde functie kan alleen worden toegepast uw eigen sloten.", + "新建模板": "Creat sjabloon", + "类型": "Soort", + "模版内容": "Inhoud sjabloon", + "预览": "Voorbeeld", + "房间名": "Kamer", + "预计产生短信条数": "Geschatte berichtsegmenten", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Met deze functie kunt u toegangscodes, ekeys, kaarten en vingerafdrukken verbergen die gedurende een bepaalde periode ongeldig zijn.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "De telefoon van de gebruiker moet online zijn om deze geselecteerde sloten met APP te ontgrendelen.", + "配置WiFi": "WiFi configureren", + "请输入WiFi名字": "Voer Wifi-naam in", + "WiFi配网": "WiFi-distributienetwerk", + "胁迫卡": "Stresskaart", + "员工是否有密码": "Heeft al Passcode", + "员工是否有卡": "Heeft al Kaart", + "员工是否有指纹": "Stel de vingerafdruk al in", + "获取钥匙": "Krijg de sleutel", + "获取卡": "Krijg kaart", + "获取指纹": "Krijg een vingerafdruk", + "安全验证": "Identiteitsverificatie", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle accountgegevens worden PERMANENT van het Platform verwijderd en kunnen niet worden teruggevonden. Wilt u Verwijderen?", + "监控": "Monitor", + "视频日志": "Videologboek", + "开门器": "Deuropener", + "面容开锁": "Gezicht ontgrendelt", + "开门方向设置": "Openingsrichtingsset", + "电机功率设置": "MotorPower-instelling", + "开锁时是否需联网": "Als Internet vereist is bij het ontgrendelen", + "选择要加入分组的锁": "Selecteer lockS om toe te voegen aan deze groep", + "锁数量": "Lock Count", + "小米IOT平台": "Xiaomi IOT-platform", + "面容开锁设置": "Gezicht ontgrendelt set", + "感应距离": "De afstand detecteren", + "防误开": "Voorkom verkeerd openen", + "防误开已关闭,关门后仍可使用面容开锁": "Voorkomen dat het verkeerd openen is gesloten, na het sluiten van de deur kan nog steeds gezichtsontgrendeling gebruiken", + "添加和使用面容开锁时": "Gezicht toevoegen en gebruiken bij het ontgrendelen", + "添加和使用面容开锁时提示": "\n1, probeer alstublieft een enkele persoon voor de deuroperatie te houden;\n2, ga alstublieft voor het deurslot staan ongeveer 0,5 ~ 0,8 meter, tegenover het deurslot;\n3. Houd uw gezicht onbelemmerd en stel uw gelaatstrekken bloot;\n4. Wanneer gezichtsherkenning abnormaal is, kunt u elke toets op het digitale toetsenbord aanraken om gezichtsherkenning handmatig opnieuw te starten.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Kies het motorvermogen zorgvuldig volgens de werkelijke situatie van het deurslot:", + "小功率:": "Miniwatt:", + "耗电少": "Minder stroomverbruik", + "大功率": "Hoog vermogen:", + "大功率提示": "Als de tong van het slot niet normaal kan worden ingetrokken bij het ontgrendelen, of moet worden gedreven", + "开门方向设置提示": "Kies zorgvuldig de richting om de deur van uw huis te openen (als u de verkeerde richting kiest, kunt u de deur niet goed openen en sluiten):", + "左开": "Links openen", + "右开": "Open rechts", + "判断方法:": "WILLES WEIG:", + "判断方法内容": "De man stond buiten het huis, tegenover de toegangsdeur.", + "录像时段": "Videosleuf", + "密码": "Wachtcodes", + "卡": "Kaarten", + "指纹": "Vingerafdruk", + "人脸": "Gezicht", + "配件商城": "Vergrendel winkelcentrum", + "公司名称": "Bedrijfsnaam", + "请输入公司名字": "Voer Bedrijfsnaam in", + "提示": "Hint", + "是否删除?": "Of u wilt verwijderen?", + "员工信息": "Personeelsinfo", + "员工": "Personeel", + "打卡方式无效": "Niet beschikbaar", + "中国": "China", + "选择钥匙": "Kies ekey", + "编辑": "Bewerken", + "无": "Nee", + "有": "Ja", + "请输入姓名": "Voer een naam in", + "获取人脸": "Gezichten krijgen", + "选择密码": "Kies Toegangscode", + "选择卡": "Kies kaart", + "选择指纹": "Kies vingerafdruk", + "选择人脸": "Gezicht selecteren", + "员工是否有人脸": "Of de werknemer een gezicht heeft", + "同时删除员工钥匙": "Verwijder zijn/haar ekey", + "删除": "Delet", + "确定要删除员工吗?": "Deze werknemer verwijderen", + "月统计": "Maandelijkse statistieken", + "迟到": "Laat", + "早退": "Verlaat vroeg", + "未打卡": "Geen record", + "钥匙将在": "Deze ekey vervalt in", + "天后失效": "Dag (en)", + "电量更新时间:": "Batterij update tijd:", + "新增配件": "Toevoegen", + "钥匙不可用": "Sleutel is niet beschikbaar", + "正在开锁中...": "Ontgrendelen...", + "你的钥匙": "Uw sleutel", + "常开模式启动!长按闭锁": "Open modus gestart! Lange druk om te vergrendelen", + "演示模式": "Demo-modus", + "请先同意用户协议及隐私政策": "Ga eerst akkoord met de gebruikersovereenkomst en het privacybeleid", + "用户协议": "Gebruikersvoorwaarden", + "隐私政策": "Privacybeleid", + "注册成功": "Registratie succesvol", + "你所在的": "Je bent binnen", + "手机号": "Telefoonnummer", + "忘记密码": "Wachtwoord vergeten", + "重置成功": "Succes resetten", + "确定要退出吗?": "Uitgang?", + "功能暂未开放": "Functie is nog niet open", + "设置成功": "Succesvol opgezet", + "删除成功": "Succesvol verwijderen", + "单次": "Eenmalige", + "永久": "Permanent", + "限时": "Getimed", + "自定义": "Aangepast", + "清空码": "Wis", + "循环": "Terugkerend", + "工作日": "Werkdag", + "每日": "Dagelijks", + "周末": "Weekend", + "确定要删除吗?": "Verwijderen?", + "该锁的密码都将被删除": "Alle toegangscodes voor dit slot worden VERWIJDERD", + "已过期": "Ongeldig", + "该锁的电子钥匙都将被删除": "Alle eKeys voor dit slot worden VERWIJDERD", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "VERWIJDEREN Alle ekeys die aan deze ekey zijn gekoppeld. Deze stap kan niet ONGEDAAN zijn!", + "删除钥匙会在用户APP连网后生效": "De ekey wordt VERWIJDERD", + "有效时间": "Effectieve tijd", + "接收者": "Ontvanger", + "仅管理自己创建的用户": "Alleen zijn eigen gebruikers beheren", + "远程开锁": "Ontgrendeling op afstand", + "请输入钥匙名称": "Voer de sleutelnaam in", + "修改成功": "Succes aanpassen", + "冻结": "Bevriezen", + "解除冻结": "Ontdooien", + "授权": "Autoriseren", + "取消授权": "De-autoriseren", + "同时解冻其发送的钥匙": "Ontdooi alle ekeys uitgegeven door deze gebruiker", + "会在用户APP连网后生效": "Deze ekey wordt THAWED wanneer de APP van de gebruiker verbinding maakt met een netwerk", + "同时冻结其发送的钥匙": "Bevries alle ekeys uitgegeven door deze gebruiker", + "冻结会在用户APP连网后生效": "Deze ekey is BEVROREN wanneer de APP van de gebruiker verbinding maakt met een netwerk", + "取消授权会在用户APP连网后生效": "De gebruiker zal zijn/haar machtigingen verliezen wanneer de app van de gebruiker verbinding maakt met een netwerk", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "De geautoriseerde gebruiker heeft bijna dezelfde machtigingen als de LOCK Manager (bijvoorbeeld de mogelijkheid om ekeys en toegangscodes te verzenden)", + "失效时间需晚于生效时间": "De vervaltijd moet later zijn dan de effectieve tijd", + "生效时间需晚于当前时间": "De effectieve tijd moet later zijn dan de huidige tijd", + "失效日期需晚于生效日期": "De vervaldatum moet later zijn dan de ingeleidende datum", + "修改有效期": "Veranderingsperiode", + "生效日期": "Startdatum", + "失效日期": "Einddatum", + "开锁": "Ontgrendel", + "开锁成功": "Ontgrendel succes", + "请选择锁": "Selecteer sloten", + "请选择接收者": "Selecteer de ontvanger", + "请选择有效期": "Selecteer de geldigheidsperiode", + "请选择发送方式": "Selecteer de verzendmethode", + "请选择结束时间": "Selecteer de eindtijd", + "完成": "Compleet", + "有效日": "Fiets aan", + "发送成功": "Succes verzenden", + "请选择开始时间": "Selecteer de starttijd", + "选择用户": "Ontvangers selecteren", + "已选中": "Geselecteerd", + "确定": "OK", + "请选择要发送的锁": "Selecteer sloten", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Face real-name authenticatie verwijst naar de behoefte van de gebruiker om zijn gezicht te verifiëren voordat de telefoon APP wordt ontgrendeld, en de verificatie kan worden ontgrendeld.", + "分享": "Delen", + "请输入接收者账号": "Voer het account van de ontvanger in", + "接收者号码未注册,请重新发送": "Het nummer van de ontvanger is niet geregistreerd, gelieve opnieuw te verzenden", + "是否发送电子钥匙给未注册账号": "Wilt u een ekey naar een nieuwe account sturen", + "取消": "Annuleer", + "标记成功": "Mark succes", + "微信好友": "WeChat vrienden", + "短信": "SMS", + "邮件": "E-mail", + "更多": "Meer", + "您好,您的电子钥匙生成成功": "Hallo, uw elektronische sleutel wordt met succes gegenereerd", + "生效时间不能小于当前时间": "De effectieve tijd kan niet korter zijn dan de huidige tijd", + "结束时间不能小于当前时间": "De eindtijd kan niet korter zijn dan de huidige tijd", + "是否为管理员": "Is het een beheerder", + "已连接到锁,请将卡靠近门锁的读卡区": "Verbonden. Plaats de kaart tegen de kaartlezer", + "尝试连接设备...": "Verbinden met slot. Wacht alstublieft...", + "地理位置": "Geografische locatie", + "检查以确保以下地址是正确的": "Controleer of het volgende adres correct is", + "地图加载中,请稍候。。": "De kaart is aan het laden, wacht alstublieft...", + "跳过": "Sla over", + "还未获取到位置信息哦,请耐心等待一下!": "De locatie-informatie is nog niet verkregen, wacht geduldig!", + "请填写信息": "Vul de informatie in", + "有效期": "Geldigheidsperiode", + "生效时间": "Starttijd", + "失效时间": "Eindtijd", + "上传成功": "Succesvol geüpload", + "未生效": "Inactief", + "已生效": "Effectief", + "指纹详情": "Vingerafdrukinformatie", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "U moet uw vinger meerdere keren naar de sensor plaatsen. Volg de aanwijzingen...", + "开始添加": "Begin", + "请将您的手指按下": "Plaats uw vinger op de sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Volg de aanwijzingen... U moet verwijderen en plaats uw vinger naar de sensor voor volgende record", + "添加成功": "Voeg succes toe", + "更新成功": "Update succes", + "搜索": "Zoeken", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Na het resetten wordt de kaart van het slot verwijderd, wilt u resetten?", + "已失效": "Ongeldig", + "卡详情": "Kaartinformatie", + "请输入": "Voer hier in", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Door uit te schakelen, blijft het slot de hele dag ontgrendeld totdat het handmatig wordt vergrendeld", + "请输入小于或等于60的数字": "Voer een getal van minder dan 60 in", + "操作成功": "Operatie succesvol", + "管理员密码相同,无需修改": "Het beheerderswachtwoord is hetzelfde en hoeft niet te worden gewijzigd", + "请输入6-9位数字": "6-9 cijfers in lengte", + "请输入6-9位管理员密码": "Voer een beheerderswachtwoord van 6-9 cijfers in", + "请输入新的管理员密码": "Voer een nieuw beheerderswachtwoord in", + "未分组": "Niet gegroepeerd", + "请输入分组名称": "Creëer een groep", + "创建成功": "Creëer succes", + "设置锁分组成功": "Stel de slotgroep met succes in", + "电池1电量": "Batterij 1", + "电池2电量": "Batterij 2", + "电量更新时间": "Tijd voor het bijwerken van de batterij", + "锁电量更新成功": "Succes voor het bijwerken van slotvermogen", + "您的钥匙未生效": "Uw sleutel is niet effectief", + "您的钥匙已冻结": "Je sleutel is bevroren", + "您的钥匙已过期": "Uw sleutel is verlopen", + "常开模式开启": "Het slot bevindt zich in de passagemodus", + "超级管理员": "Super admin", + "授权管理员": "Geautoriseerde admin", + "普通用户": "Gewone gebruiker", + "余": "Evenwicht", + "天": "Dag", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Na het verwijderen van het slot, wordt alle informatie samen verwijderd, weet u zeker dat u het slot wilt verwijderen?", + "请输入登录密码": "Voer het wachtwoord van de aanvraag in", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Het apparaat is niet verwijderd, zorg ervoor dat het apparaat zich in de buurt van het apparaat bevindt, dat het apparaat niet is aangesloten en dat het apparaat is ingeschakeld", + "用户无权限": "Gebruiker heeft geen toestemming", + "创建公司后,考勤功能才能使用": "Creëer eerst een bedrijf", + "是否删除钥匙?": "Deze ekey verwijderen?", + "邮箱绑定成功": "Succes voor e-mailbinding", + "手机绑定成功": "Succes voor het binden van mobiele telefoons", + "网络访问失败,请检查网络是否正常": "Verzoek mislukt. Netwerk niet beschikbaar, controleer en verbind uw apparaat met 3G/4G/WIFI", + "清空": "Duidelijk", + "是否清空?": "Duidelijk?", + "消息详情": "Berichtinformatie", + "创建时间": "Creatietijd", + "管理员详情": "Gegevens van de beheerder", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Als iemand u dwingt de deur te openen, kunt u deze kaart gebruiken. Het alarmbericht wordt naar de beheerders gestuurd. Zorg ervoor dat uw slot online is om deze functie te gebruiken.", + "请不要将胁迫卡用于日常开锁": "Gebruik de geforceerde kaart niet voor dagelijks gebruik.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Als iemand je dwingt om de deur te openen, kun je deze vingerafdruk gebruiken. Het alarmbericht wordt naar de beheerders gestuurd. Zorg ervoor dat uw slot online is om deze functie te gebruiken.", + "请不要将胁迫指纹用于日常开锁": "Gebruik de geforceerde vingerafdruk niet voor dagelijks gebruik.", + "创建公司": "Creëer een bedrijf", + "公司名称不能超过30个字符": "De bedrijfsnaam mag niet groter zijn dan 30 tekens", + "公司名称不能小于6个字符": "De bedrijfsnaam mag niet minder zijn dan 6 tekens", + "WIFI列表": "WIFI lijst", + "刷新": "Vernieuwen", + "手动配网": "Handmatig distributienetwerk", + "远距离": "Lange afstand", + "中距离": "Middelgrote afstand", + "近距离": "Korte afstand", + "锁时间更新成功": "Succes voor het bijwerken van de tijd vergrendelen", + "锁用户": "Gebruikers vergrendelen", + "请选择常开日期": "Selecteer de open datum", + "结束时间不能小于开始时间哦": "De eindtijd kan niet korter zijn dan de starttijd", + "介绍": "Ons verhaal", + "个人信息收集清单": "Lijst met het verzamelen van persoonlijke gegevens", + "应用权限说明": "Beschrijving van de aanvraagvergunning", + "第三方信息共享清单": "Lijst voor het delen van informatie door derden", + "请选择您的位置": "Selecteer uw locatie", + "请先选择位置": "Selecteer eerst de locatie", + "管理员密码": "Toegangscode van de beheerder", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Als u wilt wijzigen, voert u een nieuw beheerderswachtwoord in (6 cijfers), klikt u op OK om te wijzigen", + "修改": "Wijzigen", + "网络摄像头": "Camera", + "重命名": "Naam wijzigen", + "分组下的锁将被移到未分组里": "Sloten onder de groep worden verplaatst naar ongegroepeerd", + "编辑成功": "Succes bewerken", + "厂商": "Fabrikant", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Nadat het wachtwoord is gegenereerd, gebruik het dan een keer voor activering vóór 23:59 op dezelfde dag, anders is het na 0 uur ongeldig. Nadat het wachtwoord is geactiveerd, kan het onbeperkt worden gebruikt binnen de geldigheidsperiode.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Nadat het wachtwoord is gegenereerd, gebruikt u het vóór 23:59 op dezelfde dag, anders is het na 0 uur ongeldig. De duidelijke code wordt gebruikt om alle wachtwoorden te wissen die vandaag vóór 0 uur zijn gegenereerd.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Nadat het wachtwoord is gegenereerd, gebruikt u het vóór 23:59 op dezelfde dag, anders is het na 0 uur ongeldig.", + "清空密码底部提示": "Het wachtwoord is geldig tot 23:59 op de dag van legen", + "相机": "Camera", + "相册": "Foto's", + "读写": "Opslag", + "定位": "Locatie", + "需要访问相机权限才能拍照上传文件例如头像上传": "Toegang tot de camera is vereist om foto's te maken en bestanden te uploaden, zoals het uploaden van een profielfoto", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Toegang tot de camera is vereist om bestanden en avatars te uploaden met behulp van albumafbeeldingen", + "需要访问读写权限才能使用本地图片上传头像": "Toegang tot lees-en schrijfrechten is vereist om avatars te uploaden met behulp van lokale afbeeldingen", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Toegang tot locatiegegevens is vereist om de functie Toevoegen te gebruiken", + "申请": "Toepassing", + "权限": "Toestemming", + "不允许": "Niet toegestaan", + "允许": "Toegestaan", + "权限被拒绝": "Toestemming geweigerd", + "请手动在系统设置中开启": "Schakel het handmatig in in de systeeminstellingen", + "权限以继续使用应用": "Toestemming om de applicatie te blijven gebruiken.", + "去设置": "Ga het opzetten", + "当前网络": "Huidig netwerk", + "位置信息": "Locatie informatie", + "请输入wifi名称": "Voer de wifi-naam in", + "虹膜": "Iris", + "手掌": "Palm", + "商城": "Winkelcentrum", + "我的": "Mijn", + "微信公众号推送": "Wechat openbaar account", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Om wechat te openen om alarmberichten te ontvangen, moet u eerst aandacht besteden aan Skye Smart Lock wechat openbare account, sla de QR-code op en gebruik wechat om de instellingen te scannen", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Toegang tot Bluetooth-machtigingen is vereist om de locatie-informatie van de add-sleutelfunctie te gebruiken", + "请输入Email": "Voer uw e-mail in", + "请输入手机号": "Voer uw telefoonnummer in", + "家人到家": "Familielid kwam thuis", + "添加家人": "Familielid toevoegen", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Als het slot niet is verbonden met internet, kunnen herinneringen voor toegangscode, kaart, vingerafdruk en andere methoden voor het openen van deuren niet tijdig worden verzonden.", + "消息提醒": "Herinnering", + "开门通知": "Openingsbericht", + "N天未开门": "N dagen zonder deuropening", + "门未关好": "De deur is niet gesloten", + "防拆报警": "Tamper alarm", + "低电量提醒": "Lage batterij", + "胁迫开门": "Gedwongen deuropening", + "有人按门铃": "Iemand belt aan", + "有人出现在门口": "Er verschijnt iemand aan de deur", + "提醒方式": "Herinneringsmethode", + "开门方式": "Deuropeningsmethode", + "请选择": "Selecteer alstublieft", + "家人": "Familielid", + "保存": "Bespaar", + "APP推送": "APP push", + "管理员": "Admin", + "未启用": "Niet ingeschakeld", + "已启用": "Ingeschakeld", + "省电模式": "Energiebesparende modus", + "逗留抓拍模式": "Blijf vastleggen modus", + "实时监控模式": "Real-time bewakingsmodus", + "自定义模式": "Aangepaste modus", + "猫眼设置": "Cat eye setting", + "猫眼工作模式": "Kat oog werkmodus", + "自动亮屏": "Automatisch helder scherm", + "亮屏持续时间": "Scherm op tijd", + "逗留警告": "Blijf waarschuwen", + "异常警告": "Abnormale waarschuwing", + "短信提醒": "SMS", + "邮件提醒": "E-mail", + "N天未开门提醒": "N dagen zonder deuropening", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Als iemand je dwingt om het slot te openen, kun je deze vingerafdruk gebruiken. Het alarmbericht wordt naar de beheerders gestuurd. Zorg ervoor dat uw slot online is om deze functie te gebruiken.", + "胁迫指纹": "Gedwongen vingerafdruk", + "指纹列表": "Vingerafdruklijst", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Na de ingestelde tijd, als de vergrendeling niet wordt geopend, stuurt het systeem een herinneringsbericht naar de aangewezen ontvanger. Deze functie vereist dat het slot is verbonden met internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Na het inschakelen van de herinnering, wanneer de vergrendelingsbatterij lager is dan 20%, 10% en 5%, stuurt het systeem een herinneringsbericht naar de aangewezen ontvanger.", + "未开门时间": "Dagen zonder deuropening", + "添加和使用面容开锁时:": "Gezicht toevoegen en gebruiken bij het ontgrendelen:", + "关锁": "Dicht slot", + "功能": "Functie", + "配件": "Onderdelen", + "云存": "Cloud opslag", + "本地": "Deze plaats", + "3天滚动储存": "3 dagen rollende opslag", + "去升级": "Nu upgraden", + "下载列表": "Downloadlijst", + "已下载": "Gedownload", + "全部视频": "Alle video's", + "已为本设备免费提供3大滚动视频储存服务": "Er zijn gratis drie scrollende video-opslagdiensten voor dit apparaat geleverd", + "视频播放": "Video afspelen", + "全选": "Allemaal", + "请选择要删除的视频": "Selecteer de video die u wilt verwijderen", + "请选择要下载的视频": "Selecteer de video die u wilt downloaden", + "欢迎使用": "Welkom te gebruiken", + "用户协议和隐私政策概要": "Samenvatting van gebruikersovereenkomst en privacybeleid", + "协议概要": "Samenvatting protocol", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Bedankt voor het gebruik van deze applicatie. Wij hechten veel belang aan uw persoonlijke informatie en privacybescherming. Lees het zorgvuldig voordat u dit product gebruikt", + "《用户协议》": "Gebruikersvoorwaarden", + "和": "En", + "《隐私政策》": "Worpen Privacybeleid'", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "De volledige inhoud van. Door op \"Akkoord\" te klikken, gaat u akkoord en accepteert u alle voorwaarden. Als u ervoor kiest om niet akkoord te gaan, kunt u onze producten en diensten niet gebruiken en verlaat u de applicatie.", + "不同意": "Oneens", + "同意": "Ga akkoord", + "该功能是高级功能,请开通后再使用": "Dit is de geavanceerde functie. Schakel het eerst in.", + "常用程序": "Gemeenschappelijke programma's", + "该锁已被重置": "Het slot is gereset", + "需要访问读写权限才能使用手动升级固件": "Toegang tot lees-en schrijfrechten is vereist om de firmware handmatig te upgraden", + "错误D固件,请选择正确的文件": "Verkeerde firmware, selecteer het juiste bestand", + "非SYD固件,请选择正确的文件": "Non SYD firmware, selecteer het juiste bestand", + "文件校验失败 0x01": "Bestandsverificatie mislukt 0x01", + "解析元数据失败,请选择正确的文件": "Metadata niet parseren, selecteer het juiste bestand", + "文件校验失败 0x02": "Bestandsverificatie mislukt 0x02", + "文件校验失败 0x03": "Bestandsverificatie mislukt 0x03", + "固件升级完成": "Firmware-upgrade voltooid", + "记录": "Records", + "开通高级功能后才可以对锁进行管理": "Schakel eerst de geavanceerde functie in om sloten te beheren.", + "去开通": "Inschakelen", + "实名认证": "Real-name authenticatie", + "当前剩余数量": "Resterende", + "购买": "Kopen", + "实名认证为付费功能,请购买后再使用": "Real-name authenticatie is een betaalde functie, gebruik het na aankoop", + "密码不一致哦": "De wachtwoorden zijn inconsistent", + "退出添加": "Stop met toevoegen", + "管理员已满": "Beheerder vol", + "用户已满": "De gebruiker is vol", + "锁上面添加指纹已满": "Voeg vingerafdruk toe op slot is vol", + "指纹已存在": "De vingerafdruk bestaat al.", + "锁上面添加人脸已满": "Lock boven add face is vol", + "人脸已存在": "Het gezicht bestaat al", + "锁上面添加卡已满": "Vergrendel boven de add-kaart is vol", + "卡已存在": "Kaart bestaat al", + "锁上面添加密码已满": "Vergrendelen boven het wachtwoord toevoegen is vol", + "密码已存在": "Er bestaat al een identieke toegangscode. Kies een andere", + "请输入密码": "Voer het wachtwoord in", + "暂无密码,无需重置": "Geen wachtwoord, geen noodzaak om te resetten", + "真实姓名": "Echte naam", + "身份证号": "ID-nummer", + "请输入真实姓名": "Voer uw echte naam in", + "请输入身份证号": "Voer uw ID-nummer in", + "请输入身份证号和真实姓名": "Voer uw ID-nummer en echte naam in", + "点击返回设备配对": "Tik op Terug naar apparaatkoppeling", + "无法连接?尝试升级": "Kunt u geen verbinding maken? Upgrade geprobeerd", + "固件升级提示": "Firmware upgrade prompt", + "请先获取固件文件到手机本地,再选择升级": "Verkrijg eerst het firmware-bestand naar de lokale telefoon en selecteer vervolgens Upgrade", + "固件升级中": "De firmware wordt geüpgraded", + "取消升级": "De upgrade annuleren", + "固件传输中": "Firmware in doorvoer", + "关闭": "Uitschakelen", + "传输中'": "Op doorreis", + "操作记录": "Records", + "修改姓名": "Naam bewerken", + "传输中": "Op doorreis", + "发送人": "Uitgegeven door", + "发送时间": "Tijd uitgegeven", + "钥匙详情": "Ekey info", + "姓名": "Naam", + "发送": "Verzenden", + "请确认姓名全名和身份证号码是否正确": "Bevestig dat de volledige naam en het ID-nummer correct zijn", + "传输期间请勿离开当前页面": "Verlaat de huidige pagina niet tijdens de overdracht", + "机型": "Modellen", + "硬件版本": "Hardware versie", + "固件版本": "Firmware versie", + "手动升级": "Handmatige upgrade", + "设备连接中...": "Apparaat aansluiten...", + "未避免异常情况,请在门打开时升级": "Onvermijdbare uitzonderingen, upgrade alstublieft wanneer de deur open is", + "钥匙无效": "De sleutel is ongeldig", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Kan geen verbinding maken met het slot. Start de Blutooth van uw telefoon opnieuw op en probeer het opnieuw.", + "如果是全自动锁,请使屏幕变亮": "Als het een volledig automatisch slot is, gelieve het scherm helderder te maken", + "正在尝试闭锁……": "Proberen te vergrendelen. Wacht alsjeblieft...", + "清空记录": "Duidelijke records", + "是否要删除操作记录?": "Doorgaan met het verwijderen van records?", + "被删除的记录不能恢复": "De records kunnen niet worden hersteld na het verwijderen.", + "全部事件": "Alle evenementen", + "开锁事件": "Ontgrendel evenement", + "异常事件": "Abnormale gebeurtenis", + "门铃事件": "Deurbell-evenement", + "视频事件": "Video-evenement", + "请开启蓝牙": "Schakel Bluetooth in", + "请选择有效日": "Selecteer de effectieve dag", + "公司名字长度不能小于 6 ": "De lengte van de bedrijfsnaam mag niet minder zijn dan 6", + "已是最新版本": "Geen updates", + "新建短信模版": "Creat SMS-sjabloon", + "新建邮件模版": "Creat e-mail sjabloon", + "自定义短信模版": "SMS-sjabloon", + "自定义邮件模版": "E-mail sjabloon", + "名称": "Naam", + "星星锁": "Ster slot", + "无考勤记录": "Geen gegevens", + "大家干劲十足": "Iedereen komt op tijd", + "工作时长未出炉": "Geen werktijden", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "De keuze van het land/de regio heeft gevolgen voor de gegevensbeveiliging. U hebt momenteel Albanië geselecteerd, bevestig dit voordat u verder gaat.", + "确认国家或地区": "Land/regio bevestigen", + "我知道了": "Ik heb het", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Om belangrijke updates te ontvangen, klikt u op 'OK' en schakelt u meldingen in de instellingen in.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Nadat u hebt ingeschakeld, kunt u opnieuw inschakelen door lang op de instellingtoets op het slot te drukken en opnieuw toe te voegen met de APP", + "已有": "Huidige", + "新增": "Nieuw", + "账号格式错误": "Slecht formaat", + "接收者信息为空": "De informatie van de ontvanger is leeg", + "请输入时间(秒)": "Voer de tijd in (sec)", + "加载数据失败": "Gegevens zijn mislukt", + "重试": "Probeer het opnieuw", + "升级中,是否退出": "Tijdens de upgrade, of u wilt afsluiten", + "下一步": "Volgende", + "公寓": "Appartement", + "个人用户": "Persoonlijk", + "星寓": "Ster appartement", + "账号": "Rekening", + "请输入手机号或email": "Telefoonnummer of e-mail", + "请输入星寓管理员的账号": "Voer het account van de beheerder van het sterrenappartement in", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Alle gegevens van de geselecteerde vergrendeling (s) worden permanent overgedragen aan de ontvanger.", + "暂不支持跨平台转移,敬请期待": "Cross-platform overdracht wordt voorlopig niet ondersteund, kijk er naar uit", + "移除坏锁": "Verplaats defecte/beschadigde sloten naar prullenbak", + "转移确认": "Overdracht bevestigen", + "本次共转移": "Deze keer een totaal van", + "把智能锁": "Slim slot", + "确认": "OK", + "移除成功": "Met succes verwijderen", + "转移成功": "Overdracht succes", + "该已锁被删除": "De vergrendelde wordt verwijderd", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "De geautoriseerde admin kan alleen toegangscodes, ekeys en etcgemaakt door hemzelf beheren.", + "添加授权管理员": "Admin maken", + "导出记录": "Exportrecords", + "选择时间段": "Selecteer tijdsperiode", + "导出": "Uitvoer", + "批量导出": "Batch export", + "读取记录": "Records vernieuwen", + "设备": "Apparaat", + "消息": "Berichten", + "智能分析": "Intelligente analyses", + "精准识别设备事件,过滤无效信息": "Identificeer nauwkeurig apparaatgebeurtenissen en filter ongeldige informatie uit", + "系统设置": "Systeeminstellingen", + "系统的全局配置在此项内进行设置": "De globale configuratie van het systeem is ingesteld in dit item", + "导出操作记录": "Exportrecords", + "立即查看": "Weergave", + "导出成功": "Succesvol geëxporteerd", + "发送钥匙": "Stuur ekey", + "进度": "Tarief", + "失败": "Mislukt", + "人脸详情": "Gezichtsdetails", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Wanneer iemand ongeveer 1,5 meter voor de deur wordt waargenomen, wordt de ontgrendeling van de gezichtsherkenning automatisch gestart.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Wanneer iemand ongeveer 0,8 meter voor de deur wordt waargenomen, wordt de ontgrendeling van de gezichtsherkenning automatisch gestart.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Wanneer iemand ongeveer 0,5 meter voor de deur wordt waargenomen, wordt de ontgrendeling van de gezichtsherkenning automatisch gestart.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "De detectieafstand is uitgeschakeld, u moet handmatig een toets op het toetsenbord aanraken om gezichtsherkenning uit te voeren.", + "防误开已打开,开锁后": "De anti-foutopening is ingeschakeld en na ontgrendeling", + "秒内不可使用面容开锁": "Gezicht ontgrendelen kan niet binnen enkele seconden worden gebruikt", + "掌静脉": "Palmader", + "添加掌静脉": "Palmader toevoegen", + "胁迫掌静脉": "Gedwongen palmader", + "请不要将胁迫掌静脉用于日常开锁": "Gelieve te gebruiken geen dwang palmaders voor dagelijkse ontgrendeling", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Verbonden met het slot, open alstublieft natuurlijk uw handpalm, de palm is naar de camera gericht", + "掌静脉详情": "Details van de palmader", + "掌静脉号": "Palmader nummer", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth is niet ingeschakeld, schakel Bluetooth in de instellingen", + "删除用户时,会将用户拥有的钥匙一起删除。": "Als een gebruiker wordt VERWIJDERD, worden ekeys die aan de gebruiker zijn gekoppeld ook VERWIJDERD.", + "配置网络": "Netwerk configureren", + "你好": "Hallo", + "成功": "Succesvol", + "类型选择": "Type select", + "请选择要使用哪种类型": "Selecteer welk type u wilt gebruiken", + "系统邮件(推荐)": "Systeem e-mail (aanbevolen)", + "系统短信(推荐)": "Systeem SMS (aanbevolen)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "De e-mail wordt verzonden vanuit deze app. Koop eerst e-mailpakket.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "De SMS wordt verzonden vanuit deze app. Koop eerst e-mailpakket.", + "个人邮件": "Persoonlijke e-mail", + "个人短信": "Persoonlijke sms", + "邮件将从你的个人邮箱发给用户": "De e-mail wordt verzonden vanaf uw persoonlijke e-mailaccount.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Het SMS-bericht wordt verzonden vanaf uw persoonlijke telefoonnummer. U betaalt aan uw telecomoperator.", + "为了更好地应用体验,请确定权限": "Bevestig de machtigingen voor een betere applicatie-ervaring", + "您第一次拒绝权限,请确定权限": "U hebt voor de eerste keer toestemming geweigerd, bevestig de toestemming", + "您第二次拒绝权限,请去应用设置开启权限": "U hebt voor de tweede keer toestemming geweigerd, ga naar de applicatie-instellingen om toestemming in te schakelen", + "去应用市场": "Ga naar de app store", + "温馨提示": "Warme prompt", + "关闭应用": "Sluit de aanvraag", + "开启微信接收报警消息需要先关注": "Om WeChat te openen om alarmberichten te ontvangen, moet u volgen", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat openbare account, sla de QR-code op en gebruik WeChat om de instellingen te scannen", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Real-name authenticatie is een betaalde functie, neem contact op met de slotbeheerder om te kopen en te gebruiken", + "位置权限": "Toestemming voor de locatie", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Geef de app toe om uw locatian te gebruiken. Het wordt gebruikt om BLE-sloten en gateways te scannen.", + "相机/相册权限": "Toestemming voor camera/album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Geef de app toe om foto's en bestanden van Opslag te lezen en te schrijven.", + "点击选择": "Klik om te selecteren", + "微信": "WeChat", + "朋友圈": "Momenten", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "FaceBook", + "链接": "Link", + "今天": "Vandaag", + "密码错误": "Ongeldig wachtwoord", + "网络中断": "Netwerkonderbreking", + "钥匙不存在": "Sleutel bestaat niet", + "钥匙过期": "Sleutel verlopen", + "钥匙已存在": "Sleutel bestaat al", + "密码失效": "Wachtwoord ongeldig", + "门锁时间异常": "Deurslot tijd abnormaal", + "APP(手机)未联网": "APP (mobiele telefoon) is niet verbonden met internet", + "数据不存在": "Gegevens bestaan niet", + "待接收": "Verkregen", + "已冻结": "Bevroren", + "已删除": "Verwijderd", + "未知": "Onbekend", + "拖动下方滑块完成拼图": "Sleep de schuifregelaar naar de juiste positie", + "验证成功": "Verificatie succes", + "验证失败": "Verificatie mislukt", + "向右拖动滑块填充拼图": "Sleep de schuifregelaar naar rechts om de puzzel te vullen", + "请先获取到位置信息哦": "Gelieve eerst de locatiegegevens te krijgen", + "请选择国家": "Selecteer een land", + "获取锁信息": "Vergrendelingsinformatie krijgen", + "锁数据异常,请重试": "Vergrendelingsgegevens zijn abnormaal, probeer het opnieuw", + "连接设备中...": "Apparaat aansluiten...", + "把锁": "Sloten", + "条": "Strip", + "封": "Afdichting", + "次": "Tijden", + "支付成功": "Betaal succes", + "查看详情": "Details bekijken", + "请输入模板名称": "Voer de naam van de sjabloon in", + "模版类型": "Soort", + "再返回一次退出": "Opnieuw afsluiten", + "请先添加锁": "Voeg het slot eerst toe", + "可视对讲": "Visuele intercom", + "详细日志": "Gedetailleerd logboek", + "已复制到剪切板": "Gekopieerd", + "拍照": "Foto", + "从相册选择": "Kies uit album", + "选择问题": "Selecteer een vraag", + "确认长度不足8位": "Bevestig lengte minder dan 8 cijfers", + "新密码长度不足8位": "Nieuwe wachtwoordlengte minder dan 8 cijfers", + "两次密码不一致": "Wachtwoord Mismatch. Probeer het alstublieft opnieuw", + "请点击获取验证码,验证码将发送到": "Zorg voor een verificatiecode. De code wordt verzonden naar", + "切换": "Schakelaar", + "验证": "Verifiëren", + "验证成功,账号已删除": "Verificatie succesvol, account verwijderd", + "该密码不是自定义密码,无法修改": "Dit wachtwoord is geen aangepast wachtwoord en kan niet worden gewijzigd", + "请选择设备要关联哪些姓名": "Selecteer aan welke namen het apparaat moet worden gekoppeld", + "请选择姓名要关联哪些设备": "Selecteer aan welke apparaten de naam moet worden gekoppeld", + "确定要移除所选中的坏锁吗?": "Het defecte slot verwijderen?", + "邮件通知": "Informeer via e-mail", + "短信通知": "Informeer via sms", + "您好,您的授权管理员生成成功": "Hallo, uw geautoriseerde beheerder is succesvol gegenereerd", + "请输入接收者姓名": "Voer hier in", + "版本更新": "Versie-update", + "下次再说": "Volgende keer", + "配网成功": "Het succes van de netwerkdistributie", + "配网失败": "Netwerkdistributie mislukt", + "该锁的无线键盘都将被删除": "Alle draadloze toetsenborden voor dit slot worden VERWIJDERD", + "实时画面": "Real-time foto", + "适合门口较为安全的环境。": "Geschikt voor relatief veilige omgevingen aan de deur.", + "仅发生特定事件才录像,并可查看实时画面。": "Alleen specifieke gebeurtenissen worden opgenomen en het real-time beeld kan worden bekeken.", + "一般情况下,满电可使用7-8个月": "Onder normale omstandigheden kan het 7-8 maanden worden gebruikt wanneer het volledig is opgeladen", + "有人逗留或发生特定事件才录像,可随时查看": "Iemand blijft of specifieke gebeurtenissen worden opgenomen en kan op elk moment worden bekeken", + "实时画面。": "Real-time foto.", + "一般情况下,满电可使用5~6个月。": "Onder normale omstandigheden kan het 5 ~ 6 maanden worden gebruikt wanneer het volledig is opgeladen.", + "适合门口人员复杂、较不安全的环境。": "Geschikt voor complexe en relatief onveilige omgevingen aan de deur.", + "有人出现就录像,可随时查看实时画面。": "Noteer wanneer iemand verschijnt en bekijk de real-time foto op elk gewenst moment.", + "一般情况下,满电可使用2~4个月。": "Onder normale omstandigheden kan het 2 ~ 4 maanden worden gebruikt wanneer het volledig is opgeladen.", + "根据您家门口实际情况设置录像和实时画面功能。": "Stel de video en real-time foto functies volgens de werkelijke situatie bij uw deur.", + "可使用时长由具体设置决定。": "De gebruiksduur wordt bepaald door de specifieke instellingen.", + "查看": "Weergave", + "有人按门铃或发生": "Iemand belt aan of", + "异常事件时": "Abnormale gebeurtenis", + "不录像": "Geen video", + "有人出现、按门铃": "Iemand verschijnt, belt aan", + "或发生异常事件时": "Of er treedt een abnormale gebeurtenis op", + "逗留达到10秒": "Blijf 10 seconden", + "约1.5米": "Ongeveer 1,5 meter", + "随时": "Altijd", + "立即录像": "Neem onmiddellijk op", + "录像时机": "Videotiming", + "有人出现时录像": "Noteer wanneer iemand verschijnt", + "人体侦测距离": "Menselijke detectieafstand", + "查看实时画面": "Bekijk real-time foto", + "自定义时间": "Aangepaste tijd", + "当日": "Vandaag", + "次日": "Volgende dag", + "自定义时段": "Aangepaste tijdsperiode", + "发生事件时查看": "Weergeven wanneer een gebeurtenis plaatsvindt", + "实时查看": "Real-time weergave", + "有人在门口出现10秒后开始录像。": "Er verschijnt 10 seconden lang iemand aan de deur voordat hij opneemt.", + "有人按门铃时立即录像。": "Neem onmiddellijk op wanneer iemand aanbelt.", + "有人出现在门前1.5米范围时启动录像": "Begin met opnemen wanneer iemand binnen 1,5 meter voor de deur verschijnt", + "约0.8米": "Ongeveer 0,8 meter", + "约3.0米": "Ongeveer 3,0 meter", + "添加指纹失败": "De operatie is mislukt.", + "项": "Artikelen", + "播放中": "Spelen", + "下载": "Download", + "暂无下载内容": "Geen downloadinhoud", + "亮度": "Helderheid", + "音量": "Volume", + "快进至": "Snel vooruit naar", + "快退至": "Terugspoelen", + "暂无视频信息": "Geen video-informatie", + "加载出错": "Laadfout", + "请单人正对门锁,距离一个成年人手臂长度": "Ga alsjeblieft alleen voor het deurslot staan, op armlengte", + "(约0.6米)。": "(Ongeveer 0,6 meter).", + "保持脸部无遮挡,露出五官。": "Houd uw gezicht onbelemmerd en laat uw gelaatstrekken zien.", + "准备好了,开始添加": "Klaar, begin met toevoegen", + "正在录入中...": "Opname...", + "添加人脸失败": "Gezicht niet toevoegen", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Na het resetten worden de gezichten van het slot verwijderd. Weet je zeker dat je wilt resetten?", + "人脸号": "Gezichtsnummer", + "虹膜详情": "Iris details", + "虹膜号": "Iris nummer", + "选择设备类型": "Apparaattype selecteren", + "照明灯具": "Verlichtingsarmaturen", + "电动窗帘": "Elektrische gordijnen", + "门窗传感器": "Deur-en raamsensor", + "传感器": "Sensor", + "清除数据成功": "Gegevens met succes gewist", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Het slot is niet verbonden met internet, dus de herschikking van toegangscode, kaart, vingerafdruk en andere methoden voor het openen van deuren kan niet in realtime worden geüpload.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Als u de historische gegevens moet bewaren, kunt u ze exporteren.", + "看不到操作记录,可能原因有": "Kan de operatierecords niet zien, mogelijke redenen", + "操作记录详情": "Details van het operatierecord", + "操作时间": "Operatie tijd", + "此模块功能需要锁联网后设置方可生效": "Deze modulefunctie moet worden ingesteld nadat het slot is verbonden met internet om van kracht te worden", + "用户已存在": "Gebruiker bestaat al", + "钥匙数量已到上限": "Het aantal sleutels heeft de bovengrens bereikt", + "附近没有可用网关": "Er is geen beschikbare gateway in de buurt", + "正在创建安全连接...": "Een veilige verbinding creëren...", + "监视状态下不能发送录音": "Kan geen opnames verzenden in de bewakingsmodus", + "挂断": "Hang op", + "监视中暂不能开锁": "Ontgrendelen is niet beschikbaar tijdens monitoring", + "长按说话": "Druk en houd vast om te spreken", + "松开发送": "Vrijgeven om te verzenden", + "请输入6位数字开锁密码": "Voer een 6-cijferig ontgrendelingswachtwoord in", + "请输入开锁密码": "Voer het ontgrendelingswachtwoord in", + "接收者在有效期内可以不限次数使用": "Ontvangers kunnen de ekeys onbeperkt gebruiken binnen de geldigheidsperiode.", + "接收者可以使用此App开关锁": "Ontvanger kan vergrendelen/ontgrendelen door deze app.", + "单次钥匙有效期为1小时,只能使用一次": "De eenmalige ekey is een uur geldig en kan slechts één keer worden gebruikt.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Ontvangers kunnen de ekeys onbeperkt gebruiken binnen de vaste cyclustijd.", + "获取模板失败": "Het verkrijgen van de sjabloon is mislukt", + "微信通知": "WeChat-melding", + "系统短信": "Systeem SMS", + "系统邮件": "Systeem e-mail", + "模板": "Sjabloon", + "新建模版": "Sjabloon maken", + "您好,您的密码是": "Hallo, uw wachtwoord is", + "密码名字": "Wachtwoord naam", + "请输入6-9位密码": "Voer een wachtwoord van 6-9 cijfers in", + "设置密码": "Wachtwoord instellen", + "操作成功,密码为": "Opgevolgd, de toegangscode is", + "类型:自定义-永久": "Type:Custom-Permanent", + "实时播放": "Real-time afspelen", + "点击对讲": "Klik naar intercom", + "长按开锁": "Druk lang om te ontgrendelen", + "接听失败": "Kan niet antwoorden", + "请在锁设置中开启远程开锁": "Schakel ontgrendeling op afstand in de vergrendelingsinstellingen in", + "接听": "Antwoord", + "截图已保存到相册": "Screenshot opgeslagen op album", + "添加遥控": "Afstandsbediening toevoegen", + "已连接到锁,请按遥控": "Aangesloten op het slot, druk op de afstandsbediening", + "遥控号": "Afstandsbediening nummer", + "遥控详情": "Details van de afstandsbediening", + "照明": "Verlichting", + "退出演示模式": "Verlaat de demo-modus", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tip: De huidige interface is een display-interface. Nadat u het apparaat hebt toegevoegd, kunt u het blijven gebruiken", + "门已上锁": "De deur zit op slot", + "您的账号在异地登录,如非本人,请尽快修改密码": "Uw account is gebruikt om in te loggen vanaf een nieuw apparaat", + "开门成功": "Open de deur met succes", + "开门失败": "Kan de deur niet openen", + "呼叫提醒": "Oproepherinnering", + "收到来自": "Ontvangen van", + "锁的呼叫": "Oproep vergrendelen", + "加载数据中": "Laadgegevens", + "搜索所有锁类型": "Alle soorten vergrendelingen doorzoeken", + "锁电量更新时间": "Vergrendel de updatetijd van de batterij", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Mei", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Oktober", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Hete steden", + "导出锁数据": "Exporteer slotgegevens", + "一键开锁": "Ontgrendeling met één klik", + "已开通": "Geopend", + "编辑员工": "Personeel bewerken", + "一": "Een", + "二": "Twee", + "三": "Drie", + "四": "Vier", + "五": "Vijf", + "六": "Zes", + "日": "Zon", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Aankooprecord", + "使用记录": "Gebruikersrecord", + "失效时间要大于当前时间": "De vervaltijd moet langer zijn dan de huidige tijd", + "修改名字": "Naam bewerken", + "时": "Uur", + "分": "Minuut", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Je kunt Alexa gebruiken om de vergrendelingsstatus te ontgrendelen, vergrendelen en controleren", + "支持的国家": "Ondersteunde landen", + "支持的国家值": "VS, Canada, VK, Australië, India, Duitsland, Frankrijk, Italië, Spanje, Japan", + "操作流程": "Operatie proces", + "操作流程值": "1 Voeg een slot en gateway toe met de Smart Lock APP\n\n2 Schakel de externe ontgrendelingsfunctie van het slot in de APP in (deze functie is standaard uitgeschakeld). Als u deze optie niet hebt, ondersteunt het slot Alexa niet\n\n3 Voeg vaardigheden toe aan Alexa en autoriseer ze met het account en wachtwoord van de Smart Lock APP. Nadat de autorisatie succesvol is, kunt u apparaten ontdekken onder het account\n\n4 Zoek het slot in de Alexa-app, schakel de spraakontgrendelingsfunctie in en stel het taalwachtwoord in\n\n5 Het slot kan worden bediend via Alexa", + "Google Home": "Google Home", + "Action name": "Actienaam", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Ondersteunde talen", + "英语": "Engels", + "Google Home操作流程的值": "1. Gebruik de Smart Lock APP om sloten en gateways toe te voegen\n\n2. Schakel de externe ontgrendelingsfunctie van het slot in de APP in (deze functie is standaard uitgeschakeld). Zonder deze optie ondersteunt het slot Google Home niet\n\n3. Installeer de Google Home APP en klik op de knop \"\" in de linkerbovenhoek\n\n4. Selecteer op de pagina Instellingen \"Werken met Google\"\n\n5. Zoek naar \"ScienerSmart\" en gebruik de smart lock APP-account en het wachtwoord om te autoriseren", + "密码需至少包含数字/字母/字符中的2种组合": "Het wachtwoord moet ten minste 2 van de volgende bevatten: cijfers, letters en speciale tekens", + "已开锁": "Ontgrendeld", + "已闭锁": "Vergrendeld", + "两次密码不一致哦": "De wachtwoorden zijn inconsistent", + "中功率": "Middelgroot vermogen", + "常规使用": "Regelmatig gebruik", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Nadat de gateway is ingeschakeld, houdt u de resetknop 5 seconden ingedrukt en klikt u op Volgende wanneer het indicatielampje afwisselend knippert", + "扫描设备": "Scan apparaat", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Verwijdering is mislukt. De gateway is mogelijk offline gegaan. Wilt u de gegevens forceren verwijderen?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_pl.json b/lan/lan_pl.json new file mode 100644 index 00000000..7ca0add8 --- /dev/null +++ b/lan/lan_pl.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Blokada gwiazdy", + "锁通通": "Zablokuj przez", + "点击开锁,长按闭锁": "Dotknij, aby odblokować, przytrzymaj, aby zablokować", + "考勤": "Obecność", + "考勤设置": "Ustawienia obecności", + "电子钥匙": "EKeys", + "添加卡": "Dodaj kartę", + "卡号": "Numer karty", + "添加指纹": "Dodaj odcisk palca", + "指纹号": "Numer linii papilarnych", + "遥控": "Zdalny", + "添加人脸": "Dodaj Twarz", + "门锁日志": "Kłoda zamka drzwi", + "密码号": "Numer hasła", + "添加者": "Operator", + "添加时间": "Czas", + "重置": "Zresetuj", + "请输入手机号或者邮箱": "Numer telefonu/e-mail", + "工作时间": "Czas pracy", + "工作日设置": "Ustawienie dnia roboczego", + "星期一": "Poniedziałek", + "星期二": "Wtorek", + "星期三": "Środa", + "星期四": "Czwartek", + "星期五": "Piątek", + "星期六": "Sobota", + "星期日": "Niedziela", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Wt", + "周三": "Śr.", + "周四": "Czw", + "周五": "Pt.", + "周六": "Sat", + "周日": "Słońce", + "群发钥匙": "Wyślij wiele ekeyów", + "锁": "Blokada", + "请添加": "Odbiorca", + "允许远程开锁": "Zdalne odblokowanie", + "请输入验证码": "Kod weryfikacyjny", + "获取密码": "Wygeneruj kod dostępu", + "请给密码命名": "Wprowadź nazwę tego kodu dostępu", + "密码有限期为6个小时,只能使用一次": "Ten kod dostępu MUSI BYĆ użyty w ciągu 6 godzin od aktualnego czasu lub zostanie ZAWIESZONY ze względów bezpieczeństwa. Ten kod dostępu może być używany tylko RAZ.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Ręcznie wprowadź 6-9 cyfr jako hasło. Może być dodawany przez telefon Bluetooth obok zamka lub zdalnie dodawany przez bramę", + "获取": "Zdobądź", + "添加": "Dodaj", + "删除公司": "Usuń firmę", + "密码详情": "Informacje o kodzie dostępu", + "修改密码": "Zmień hasło", + "添加虹膜": "Dodaj Iris", + "添加门磁": "Czujnik drzwi", + "添加无线键盘": "Bezprzewodowa klawiatura", + "添加手掌": "Dodaj dłoń", + "请输入员工账号": "Wprowadź konto pracownika", + "批量授权锁": "Przyznaj wiele zamków", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Upoważniony administrator będzie miał większościowe pozwolenie na obsługę tej blokady.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ta funkcja umożliwia zdalnie odblokowanie inteligentnej blokady za pomocą bramki. Tę funkcję można włączyć lub wyłączyć TYLKO przez Bluetooth.", + "排列方式": "Rodzaj listy", + "早到榜": "Wczesna lista", + "迟到榜": "Późna lista", + "当前模式": "Tryb bieżący", + "勤奋榜": "Ciężka lista pracy", + "延迟时间": "Czas opóźnienia", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Blokada zostanie automatycznie zablokowana po upływie czasu. Odblokuj go po raz pierwszy, aby ustawić dostępne ustawienie.", + "时间": "Czas", + "开始时间": "Czas rozpoczęcia", + "结束时间": "Czas zakończenia", + "工作时间设置": "Ustawienie czasu pracy", + "常开模式": "TRYB Przejścia", + "常开时间": "W tym okresie", + "常开日期": "W te dni", + "添加员工": "Dodaj personel", + "节假日": "Wakacje", + "打卡方式": "Metoda", + "员工是否有钥匙": "Już ma ekey", + "上班时间": "Czas rozpoczęcia", + "下班时间": "Czas zamknięcia", + "本周": "W tym tygodniu", + "单休": "Jednodniowy weekend", + "双休": "Dwudniowy weekend", + "单双休": "Jeden-dwudniowy weekend", + "年": "Rok", + "月": "Miesiąc", + "放假日期": "Wakacje", + "补班日期": "Dni pracy", + "添加假日": "Dodaj wakacje", + "开始日期": "Data rozpoczęcia", + "必填": "Wymagane", + "结束日期": "Data zakończenia", + "日榜": "Codziennie", + "月榜": "Co miesiąc", + "考勤记录": "Rekordy", + "假日信息": "Informacje o wakacjach", + "基本信息": "Podstawy", + "无线键盘": "Bezprzewodowa klawiatura", + "选择无线键盘": "Dodaj klawiaturę", + "门磁": "Czujnik drzwi", + "自动闭锁": "Automatyczna blokada", + "锁声音": "Blokada dźwięku", + "防撬报警": "Alert o sabotach", + "重置键": "Przycisk resetowania", + "锁时间": "Zegar blokujący", + "诊断": "Diagnozuj", + "上传数据": "Prześlij dane", + "导入其他锁数据": "Importuj kolejny zamek frome", + "锁升级": "Aktualizacja firmware", + "标记房态": "Status pokoju", + "开锁提醒": "Odblokuj powiadomienie", + "微信二维码": "Odblokuj kod QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Osoby z kluczami elektronicznymi mogą otworzyć drzwi, skanując ten kod QR za pośrednictwem WeChat. Kod QR każdego zamka jest inny. Możesz go wydrukować i wkleić obok odpowiedniego zamka", + "锁编号": "Numer zamka", + "电量": "Akumulator", + "锁分组": "Grupa zamków", + "选择分组": "Wybierz grupę", + "创建新分组": "Utwórz grupę", + "管理员开锁密码": "Hasło administratora", + "更新": "Aktualizacja", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Poziom baterii zostanie zaktualizowany przez bramę lub telefon bluetooth", + "当屏幕闪烁时,点击下一步": "Kliknij dalej, gdy klawiatura miga", + "输入*529#或按设置键": "Wpisz README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # lub naciśnij klawisz Ustawienia", + "长按重置键2秒": "Naciśnij i przytrzymaj przycisk resetowania 2 sekundy", + "附近的设备": "Sprzęt w pobliżu", + "暂无数据": "Brak danych", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Będziesz mógł uzyskać status drzwi za pomocą czujnika drzwi wraz z bramą. Tylko jeden czujnik może łączyć się z zamkiem.", + "开始": "Start", + "全天": "Wszystkie godziny", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Możesz ustawić wiele okresów czasu dla trybu przejścia. W ustawionych okresach czasu blokada pozostanie w stanie otwartym po odblokowaniu.", + "请选择锁音量": "Proszę wybrać głośność blokady", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Włączając się, usłyszysz dźwięk z zamka", + "低": "Niski", + "较低": "Średnio niski", + "中": "Średni", + "较高": "Średnio wysoki", + "高": "Wysoki", + "开启后,锁被撬动时,会发出报警声": "Włącz alarm TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Wyłączając przycisk RESET jest wyłączony.", + "校准时间": "Czas kalibracji", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnoza polega na odczytaniu informacji konfiguracyjnych wewnątrz zamka i przesłaniu ich, aby personel mógł przeanalizować przyczynę awarii", + "上传": "Prześlij", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Przesyłanie danych z blokady na serwer. Może to potrwać kilka minut", + "请选择要从哪把锁导入": "Wybierz blokadę do zaimportowania z", + "有新版本": "Mają nową wersję", + "当前版本": "Aktualna wersja", + "升级": "Aktualizacja", + "空闲": "Wolny", + "已入住": "Zajęte", + "多语言": "Języki", + "添加锁": "Dodaj blokadę", + "锁地址": "Adres blokady", + "选择锁类型": "Wybierz typ blokady", + "NFC无源锁": "Blokada pasywna NFC", + "添加设备": "Dodaj urządzenie", + "网关": "Brama", + "客服": "Obsługa klienta", + "设置": "Ustawienia", + "更多设置": "Więcej Set", + "消息推送": "Powiadomienie push", + "锁用户管理": "Zablokuj użytkowników", + "拥有的钥匙": "EKeys powiązane z tym użytkownikiem", + "批量授权": "Zarządzanie władzami", + "关联设备": "Urządzenie powiązane", + "关联姓名": "Nazwa powiązana", + "转移智能锁": "Blokada transferowa", + "选择锁": "Blokada ekranu", + "接收人信息": "Odbiorca", + "转移网关": "Brama transferowa", + "锁屏": "Blokada ekranu", + "已关闭": "Wyłączony", + "已开启": "Na", + "开启": "Włącz", + "确定要开启重置键?": "Kontynuować włączać przycisk Reset?", + "确定要关闭重置键?": "Kontynuować wyłączanie przycisku Reset?", + "隐藏无效开锁权限": "Ukryj nieprawidłowy dostęp", + "APP开锁时需手机连网的锁": "Zamki wymagające telefonu online", + "增值服务": "Usługi", + "关于": "O", + "退出": "Wylogowanie", + "删除账号": "Usuń konto", + "个人信息": "Informacje o koncie", + "头像": "Avatar", + "昵称": "NickName", + "请输入昵称": "Wpisz swój pseudonim", + "修改昵称": "Zmiana nazwy", + "修改账号": "Edytuj konto", + "重置密码": "Zresetuj hasło", + "安全问题": "Pytanie zabezpieczające", + "为了你的账号安全,修改账号前请先使用验证码验证": "Dla bezpieczeństwa konta, proszę użyć weryfikacji hasła do konta przed modyfikacją konta", + "请输入新账号": "Wprowadź nowe konto", + "找回密码和登录新设备时,可通过绑定的手机验证": "Wiążący numer telefonu zostanie użyty do otrzymania kodu weryfikacyjnego.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Wiążąca wiadomość e-mail zostanie użyta do otrzymania kodu weryfikacyjnego.", + "原密码": "Aktualne hasło", + "新密码": "Nowe hasło", + "确认密码": "Potwierdź hasło", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "W przypadku zgubienia telefonu możesz zalogować się do nowego telefonu, odpowiadając na pytania bezpieczeństwa.", + "问题一": "Pytanie 1", + "问题二": "Pytanie 2", + "问题三": "Pytanie 3", + "请输入你的答案": "Proszę wpisać swoją odpowiedź", + "即将到期": "Wygasa wkrótce", + "去授权": "Przejdź do autoryzacji", + "修改名称": "Edytuj nazwę", + "状态": "Status", + "WiFi名称": "Nazwa Wifi", + "网络MAC": "Sieć MAC", + "网关升级": "Aktualizacja bramy", + "网关连接的锁": "Blokada (y) podłączone do tej bramy", + "信号强": "Silny", + "选择网关类型": "Wybierz typ bramy", + "添加网关": "Dodaj bramę", + "重新通电": "Ponownie podłącz zasilanie", + "指示灯": "Wskaźnik świetlny", + "选择网关": "Wybierz Bramę", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G nie jest obsługiwane, proszę wybrać WiFi 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "Wprowadź hasło WiFi", + "网关名称": "Nazwa bramy", + "请输入网关名称": "Wprowadź nazwę bramy", + "IP地址": "Adres IP", + "子网掩码": "Maska podsieci", + "默认网关": "Domyślna brama", + "自动获取DNS服务器地址": "Automatycznie uzyskaj adres serwera DNS", + "首选DNS": "Preferowany DNS", + "备选DNS": "Alternatywne DNS", + "不使用静态IP": "Żaden statyczny IP nie jest używany", + "使用静态IP": "Użyj statycznego adresu IP", + "请输入IP地址": "Wprowadź adres IP", + "请输入子网掩码": "Wprowadź maskę podsieci", + "请输入默认网关": "Wprowadź domyślną bramę", + "所有锁": "Wszystkie zamki", + "搜索所有类型的锁": "Skanuj wszystkie rodzaje zamków", + "门锁": "Blokada drzwi", + "挂锁": "Kłódka", + "保险箱锁": "Bezpieczny zamek", + "智能门禁": "Inteligentna kontrola dostępu", + "车位锁": "Blokada parkingowa", + "摸亮触摸屏": "Dotknij dowolnego klawisza, aby aktywować klawiaturę", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Dotknij dowolnego klawisza, aby aktywować blokadę i przełącz ją w tryb PAIRING. Naciśnij Dalej", + "附近的锁": "Zamki w pobliżu", + "如需修改名字请重新命名,点击确定添加锁": "Jeśli chcesz zmienić nazwę, proszę zmienić nazwę, kliknij OK, aby dodać blokadę", + "添加锁时,手机必须在锁旁边": "Podczas dodawania blokady telefon musi znajdować się obok zamka", + "登录": "Logowanie", + "注册": "Zarejestruj się", + "我已阅读并同意": "Przeczytałem i zgodziłem się", + "验证码": "Kod", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Twoje hasło musi mieć 8-20 znaków i zawierać co najmniej dwa rodzaje cyfr, liter i symboli", + "手机": "Telefon", + "邮箱": "E-mail", + "请输入邮箱": "Wpisz swój e-mail", + "国家/地区": "Kraj/region", + "你所在的国家/地区": "Twój kraj/region", + "选择国家/地区": "Wybierz swój kraj lub region", + "获取验证码": "Uzyskaj kod", + "商务合作": "Biznes", + "电脑网页版": "System sieciowy", + "酒店系统": "System hotelowy", + "说明书网页版": "Podręcznik użytkownika", + "高级功能": "Zaawansowana funkcja", + "记录保存": "Zachowanie rekordów", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS może służyć do wysyłania hasła i informacji ekey do odbiorcy.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mail może służyć do wysyłania hasła i informacji ekey do odbiorcy.", + "购买实名认证提示": "Po włączeniu funkcji musisz użyć odcisku palca, twarzy lub hasła do konta, aby otworzyć aplikację. Nie ma potrzeby weryfikacji ponownie przez 3 minuty", + "请选择你希望的实名认证频次": "Wybierz żądną częstotliwość uwierzytelniania w imieniu rzeczywistym", + "仅首次": "Po raz pierwszy", + "每日一次": "Raz dziennie", + "每周一次": "Raz w tygodniu", + "每月一次": "Raz na miesiąc", + "当前状态": "Aktualny status", + "试用中": "Na próbę", + "高级功能权益内容": "Zaawansowane funkcje", + "短信模板": "Szablon SMS", + "邮件模板": "Szablon e-mail", + "发卡工具": "Koder karty", + "购买高级功能须知": "Uwaga", + "购买高级功能提示": "Bardziej zaawansowane funkcje są w fazie rozwoju, a jeśli ich potrzebujesz, zapraszamy do otwarcia usługi w oparciu o liczbę zamków. Zaawansowane funkcje są dostępne tylko dla własnych zamków. Jeśli jesteś autoryzowanym administratorem, skontaktuj się z najwyższym administratorem zamka, aby otworzyć usługę", + "免费体验": "Bezpłatna wersja próbna", + "立即开通": "Otwórz teraz", + "购买短信": "Kup SMS", + "购买邮件": "Kup EMail", + "购买实名认证次数": "Kup czasy uwierzytelniania prawdziwych nazwisk", + "开通高级功能": "Włącz funkcję zaawansowaną", + "选择套餐": "Wybierz pakiet", + "支付方式": "Tryb płatności", + "支付宝": "Alipay", + "去支付": "Zapłać", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Możesz samodzielnie zdefiniować wiadomość. Służy do wysyłania informacji o hasle i ekey do innych.", + "高级功能仅能用于你自己的锁": "Zaawansowaną funkcję można zastosować tylko własne zamki.", + "新建模板": "Szablon Creat", + "类型": "Rodzaj", + "模版内容": "Treść szablonu", + "预览": "Podgląd", + "房间名": "Pokój", + "预计产生短信条数": "Szacowane segmenty wiadomości", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ta funkcja umożliwia ukrywanie kodów dostępu, ekeyów, kart i odcisków palców, które są nieważne przez pewien czas.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Telefon użytkownika musi być online, aby odblokować te wybrane zamki za pomocą aplikacji.", + "配置WiFi": "Konfigurowanie WiFi", + "请输入WiFi名字": "Proszę podać nazwę Wifi", + "WiFi配网": "Sieć dystrybucji WiFi", + "胁迫卡": "Karta stresu", + "员工是否有密码": "Już ma kod dostępu", + "员工是否有卡": "Już ma kartę", + "员工是否有指纹": "Już ustaw odcisk palca", + "获取钥匙": "Zdobądź klucz", + "获取卡": "Zdobądź kartę", + "获取指纹": "Odcisk palca", + "安全验证": "Weryfikacja tożsamości", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Wszystkie informacje o koncie zostaną usunięte z platformy i nie będzie można ich odzyskać. Czy chcesz usunąć?", + "监控": "Monitor", + "视频日志": "Dziennik wideo", + "开门器": "Otwieracz do drzwi", + "面容开锁": "Odblokowywanie twarzy", + "开门方向设置": "Zestaw kierunku otwierania", + "电机功率设置": "Ustawienie MotorPower", + "开锁时是否需联网": "Jeśli Internet jest wymagany podczas odblokowywania", + "选择要加入分组的锁": "Wybierz lockS, aby dodać do tej grupy", + "锁数量": "Liczba zamków", + "小米IOT平台": "Platforma Xiaomi IOT", + "面容开锁设置": "Zestaw odblokowania twarzy", + "感应距离": "Odległość wykrywania", + "防误开": "Zapobiegaj niewłaściwym otwieraniem", + "防误开已关闭,关门后仍可使用面容开锁": "Zapobieganie błędnym otwieraniu zostało zamknięte, po zamknięciu drzwi nadal można używać odblokowania twarzy", + "添加和使用面容开锁时": "Dodaj i używaj twarzy podczas odblokowywania", + "添加和使用面容开锁时提示": "\n1, proszę starać się utrzymać jedną osobę przed operacją drzwi;\n2, proszę stanąć przed zamkiem drzwi około 0,5 ~ 0,8 metra, twarzą do zamka drzwi;\n3. Prosimy o zachowanie niezakłóconej twarzy i odsłonięcie rysów twarzy;\n4. Gdy rozpoznawanie twarzy jest nieprawidłowe, możesz dotknąć dowolnego klawisza na klawiaturze cyfrowej, aby ręcznie ponownie uruchomić rozpoznawanie twarzy.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Proszę wybrać moc silnika ostrożnie w zależności od rzeczywistej sytuacji zamka drzwi:", + "小功率:": "Miniwatt:", + "耗电少": "Mniejsze zużycie energii", + "大功率": "Wysokiej mocy:", + "大功率提示": "Jeśli język zamka nie może być normalnie schowany podczas odblokowywania lub musi być napędzany", + "开门方向设置提示": "Proszę starannie wybrać kierunek, aby otworzyć drzwi do domu (jeśli wybierzesz zły kierunek, nie będzie można otworzyć i zamknąć drzwi prawidłowo):", + "左开": "Otwórz po lewej", + "右开": "Otwórz po prawej", + "判断方法:": ":", + "判断方法内容": "Mężczyzna stał przed domem, twarzą do drzwi wejściowych.", + "录像时段": "Gniazdo wideo", + "密码": "Kody dostępu", + "卡": "Karty", + "指纹": "Odcisk palca", + "人脸": "Twarz", + "配件商城": "Zamek handlowy", + "公司名称": "Nazwa firmy", + "请输入公司名字": "Wprowadź nazwę firmy", + "提示": "Podpowiedź", + "是否删除?": "Czy usunąć?", + "员工信息": "Informacje o personelu", + "员工": "Personel", + "打卡方式无效": "Niedostępne", + "中国": "Chiny", + "选择钥匙": "Wybierz ekey", + "编辑": "Edytuj", + "无": "Nie", + "有": "Tak", + "请输入姓名": "Wpisz imię", + "获取人脸": "Zdobywanie twarzy", + "选择密码": "Wybierz kod dostępu", + "选择卡": "Wybierz kartę", + "选择指纹": "Wybierz odcisk palca", + "选择人脸": "Wybierz twarz", + "员工是否有人脸": "Czy pracownik ma twarz", + "同时删除员工钥匙": "Usuń jego/jej ekey", + "删除": "Usuń", + "确定要删除员工吗?": "Usuń tego pracownika", + "月统计": "Miesięczne statystyki", + "迟到": "Późno", + "早退": "Wyjdź wcześnie", + "未打卡": "Brak rekordu", + "钥匙将在": "Ten ekey wygaśnie w", + "天后失效": "Dzień (-y)", + "电量更新时间:": "Czas aktualizacji baterii:", + "新增配件": "Dodaj", + "钥匙不可用": "Klucz nie jest dostępny", + "正在开锁中...": "Odblokowanie...", + "你的钥匙": "Twój klucz", + "常开模式启动!长按闭锁": "Rozpoczął się tryb otwarty! Długie naciśnięcie, aby zablokować", + "演示模式": "Tryb demonstracyjny", + "请先同意用户协议及隐私政策": "Proszę najpierw zgodzić się na umowę użytkownika i politykę prywatności", + "用户协议": "Warunki użytkownika", + "隐私政策": "Polityka prywatności", + "注册成功": "Rejestracja zakończyła się sukcesem", + "你所在的": "Jesteś w", + "手机号": "Numer telefonu", + "忘记密码": "Zapomniałem hasła", + "重置成功": "Zresetuj sukces", + "确定要退出吗?": "Wyjdź?", + "功能暂未开放": "Funkcja nie jest jeszcze otwarta", + "设置成功": "Pomyślna konfiguracja", + "删除成功": "Usuń pomyślnie", + "单次": "Jednorazowo", + "永久": "Stałe", + "限时": "Czas", + "自定义": "Niestandardowe", + "清空码": "Wymaż", + "循环": "Powtarzające się", + "工作日": "Dzień roboczy", + "每日": "Codziennie", + "周末": "Weekend", + "确定要删除吗?": "Usunąć?", + "该锁的密码都将被删除": "Wszystkie kody dostępu do tej blokady zostaną USUWANE", + "已过期": "Nieważne", + "该锁的电子钥匙都将被删除": "Wszystkie eKeys dla tego zamka zostaną USUWANE", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "USUŃ Wszystkie ekeyy powiązane z tym ekey. Ten krok nie może być NIEWYKONANY!", + "删除钥匙会在用户APP连网后生效": "Ekey zostanie USUWANY", + "有效时间": "Efektywny czas", + "接收者": "Odbiorca", + "仅管理自己创建的用户": "Zarządzaj tylko własnymi użytkownikami", + "远程开锁": "Zdalne odblokowanie", + "请输入钥匙名称": "Wprowadź nazwę klucza", + "修改成功": "Zmodyfikuj sukces", + "冻结": "Zamrozić", + "解除冻结": "Odwilż", + "授权": "Autoryzuj", + "取消授权": "Odautoryzuj", + "同时解冻其发送的钥匙": "Odwilż wszystkie ekeys wydane przez tego użytkownika", + "会在用户APP连网后生效": "Ten ekey zostanie WYRAŻONY, gdy aplikacja użytkownika połączy się z siecią", + "同时冻结其发送的钥匙": "Zamrozić wszystkie ekeys wydane przez tego użytkownika", + "冻结会在用户APP连网后生效": "Ten ekey będzie MROŻONY, gdy aplikacja użytkownika połączy się z siecią", + "取消授权会在用户APP连网后生效": "Użytkownik będzie PRZEGLĄDAĆ swoje uprawnienia, gdy aplikacja użytkownika połączy się z siecią", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Upoważniony użytkownik ma prawie takie same uprawnienia jak LOCK Manager (np. Możliwość wysyłania ekeyów i kodów dostępu)", + "失效时间需晚于生效时间": "Czas wygaśnięcia musi być późniejszy niż efektywny czas", + "生效时间需晚于当前时间": "Efektywny czas musi być późniejszy niż obecny czas", + "失效日期需晚于生效日期": "Data wygaśnięcia musi być późniejsza niż data wejścia w życie", + "修改有效期": "Okres zmiany", + "生效日期": "Data rozpoczęcia", + "失效日期": "Data zakończenia", + "开锁": "Odblokuj", + "开锁成功": "Odblokuj sukces", + "请选择锁": "Proszę wybrać zamki", + "请选择接收者": "Proszę wybrać odbiornik", + "请选择有效期": "Proszę wybrać okres ważności", + "请选择发送方式": "Wybierz metodę wysyłania", + "请选择结束时间": "Proszę wybrać czas zakończenia", + "完成": "Kompletny", + "有效日": "Cykl na", + "发送成功": "Wyślij sukces", + "请选择开始时间": "Proszę wybrać czas rozpoczęcia", + "选择用户": "Wybierz odbiorców", + "已选中": "Wybrane", + "确定": "OK", + "请选择要发送的锁": "Proszę wybrać zamki", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Uwierzytelnianie prawdziwych nazw twarzy odnosi się do potrzeby użytkownika, aby zweryfikować jego twarz przed odblokowaniem aplikacji telefonu, a weryfikację można odblokować.", + "分享": "Udostępnij", + "请输入接收者账号": "Wprowadź konto odbiorcy", + "接收者号码未注册,请重新发送": "Numer odbiorcy nie jest zarejestrowany, prosimy o ponowne wykreowanie", + "是否发送电子钥匙给未注册账号": "Czy chcesz wysłać ekey na nowe konto", + "取消": "Anuluj", + "标记成功": "Oznacz sukces", + "微信好友": "Przyjaciele WeChat", + "短信": "SMS", + "邮件": "E-mail", + "更多": "Więcej", + "您好,您的电子钥匙生成成功": "Witaj, twój klucz elektroniczny został pomyślnie wygenerowany", + "生效时间不能小于当前时间": "Efektywny czas nie może być krótszy niż aktualny czas", + "结束时间不能小于当前时间": "Czas zakończenia nie może być krótszy niż aktualny czas", + "是否为管理员": "Czy to administrator", + "已连接到锁,请将卡靠近门锁的读卡区": "Podłączony. Umieść kartę przeciwko czytnikowi kart", + "尝试连接设备...": "Łączenie z zamkiem. Proszę czekać...", + "地理位置": "Położenie geograficzne", + "检查以确保以下地址是正确的": "Sprawdź, czy poniższy adres jest poprawny", + "地图加载中,请稍候。。": "Mapa się ładuje, proszę czekać...", + "跳过": "Pomiń", + "还未获取到位置信息哦,请耐心等待一下!": "Informacje o lokalizacji nie zostały jeszcze uzyskane, proszę cierpliwie czekać!", + "请填写信息": "Proszę podać informacje", + "有效期": "Okres ważności", + "生效时间": "Czas rozpoczęcia", + "失效时间": "Czas zakończenia", + "上传成功": "Przesłane pomyślnie", + "未生效": "Nieaktywny", + "已生效": "Skuteczne", + "指纹详情": "Informacje o odcisku palca", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Będziesz musiał kilkakrotnie umieścić palec w czujniku. Postępuj zgodnie z instrukcjami...", + "开始添加": "Start", + "请将您的手指按下": "Umieść palec na czujniku", + "根据提示,抬起手指后再进行下一次指纹采集": "Postępuj zgodnie z instrukcjami... Będziesz musiał usunąć i umieścić palec w czujniku, aby uzyskać następny rekord", + "添加成功": "Dodaj sukces", + "更新成功": "Aktualizacja sukcesu", + "搜索": "Szukaj", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Po zresetowaniu karta zamka zostanie usunięta, czy chcesz zresetować?", + "已失效": "Nieważne", + "卡详情": "Informacje o karcie", + "请输入": "Proszę wpisać tutaj", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Po wyłączeniu blokada pozostanie odblokowana przez cały dzień, dopóki nie zostanie ręcznie zablokowana", + "请输入小于或等于60的数字": "Proszę wpisać liczbę mniejszą niż 60", + "操作成功": "Operacja zakończyła się sukcesem", + "管理员密码相同,无需修改": "Hasło administratora jest takie samo i nie wymaga modyfikacji", + "请输入6-9位数字": "6-9 cyfr długości", + "请输入6-9位管理员密码": "Wprowadź 6-9-cyfrowe hasło administratora", + "请输入新的管理员密码": "Wprowadź nowe hasło administratora", + "未分组": "Niepogrupowane", + "请输入分组名称": "Utwórz grupę", + "创建成功": "Stwórz sukces", + "设置锁分组成功": "Udało się ustawić grupę zamków", + "电池1电量": "Akumulator 1", + "电池2电量": "Akumulator 2", + "电量更新时间": "Czas aktualizacji baterii", + "锁电量更新成功": "Sukces aktualizacji zasilania blokady", + "您的钥匙未生效": "Twój klucz nie jest skuteczny", + "您的钥匙已冻结": "Twój klucz został zamrożony", + "您的钥匙已过期": "Twój klucz wygasł", + "常开模式开启": "Zamek jest w trybie przejścia", + "超级管理员": "Super admin", + "授权管理员": "Autoryzowany admin", + "普通用户": "Zwykły użytkownik", + "余": "Równowaga", + "天": "Dzień", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Po usunięciu blokady wszystkie informacje zostaną usunięte razem, czy na pewno chcesz usunąć blokadę?", + "请输入登录密码": "Wprowadź hasło aplikacji", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Nie udało się usunąć urządzenia, upewnij się, że urządzenie znajduje się w pobliżu urządzenia, urządzenie nie jest podłączone, a urządzenie jest włączone", + "用户无权限": "Użytkownik nie ma pozwolenia", + "创建公司后,考勤功能才能使用": "Najpierw stwórz firmę", + "是否删除钥匙?": "Usuń tego ekey?", + "邮箱绑定成功": "E-mail wiążący sukces", + "手机绑定成功": "Telefon komórkowy wiążący sukces", + "网络访问失败,请检查网络是否正常": "Żądanie nie powiodło się. Sieć niedostępna, proszę sprawdzić i podłączyć urządzenie do 3G/4G/WIFI", + "清空": "Przezroczysty", + "是否清空?": "Jasne?", + "消息详情": "Informacje o wiadomości", + "创建时间": "Czas tworzenia", + "管理员详情": "Szczegóły administratora", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jeśli ktoś zmusi Cię do otwarcia drzwi, możesz użyć tej karty. Komunikat alarmowy zostanie wysłany do administratorów. Aby skorzystać z tej funkcji, upewnij się, że zamek jest online.", + "请不要将胁迫卡用于日常开锁": "Nie używaj karty wymuszonej do codziennego użytku.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Jeśli ktoś zmusi Cię do otwarcia drzwi, możesz użyć tego odcisku palca. Komunikat alarmowy zostanie wysłany do administratorów. Aby skorzystać z tej funkcji, upewnij się, że zamek jest online.", + "请不要将胁迫指纹用于日常开锁": "Proszę nie używać wymuszonego odcisku palca do codziennego użytku.", + "创建公司": "Stwórz firmę", + "公司名称不能超过30个字符": "Nazwa firmy nie może przekraczać 30 znaków", + "公司名称不能小于6个字符": "Nazwa firmy nie może być mniejsza niż 6 znaków", + "WIFI列表": "Lista WIFI", + "刷新": "Odśwież", + "手动配网": "Ręczna sieć dystrybucji", + "远距离": "Długi dystans", + "中距离": "Średnia odległość", + "近距离": "Krótki dystans", + "锁时间更新成功": "Sukces aktualizacji czasu blokady", + "锁用户": "Zablokuj użytkowników", + "请选择常开日期": "Proszę wybrać datę otwarcia", + "结束时间不能小于开始时间哦": "Czas zakończenia nie może być krótszy niż czas rozpoczęcia", + "介绍": "Nasza historia", + "个人信息收集清单": "Lista zbierania danych osobowych", + "应用权限说明": "Opis pozwolenia na wniosek", + "第三方信息共享清单": "Lista udostępniania informacji osób trzecich", + "请选择您的位置": "Wybierz swoją lokalizację", + "请先选择位置": "Najpierw wybierz lokalizację", + "管理员密码": "Hasła administratora", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Jeśli chcesz zmodyfikować, wprowadź nowe hasło administratora (6 cyfr), kliknij OK, aby zmodyfikować", + "修改": "Modyfikuj", + "网络摄像头": "Aparat fotograficzny", + "重命名": "Zmiana nazwy", + "分组下的锁将被移到未分组里": "Zamki pod grupą zostaną przeniesione do niezgrupowanych", + "编辑成功": "Edytuj sukces", + "厂商": "Producent", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Po wygenerowaniu hasła użyj go raz do aktywacji przed 23:59 tego samego dnia, w przeciwnym razie będzie nieważne po godzinie 0. Po aktywacji hasła można go używać nieograniczonych czasów w okresie ważności.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Po wygenerowaniu hasła użyj go przed 23:59 tego samego dnia, w przeciwnym razie będzie nieważne po godzinie 0. Jasny kod służy do wyczyszczenia wszystkich haseł wygenerowanych dzisiaj przed godziną 0.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Po wygenerowaniu hasła użyj go przed 23:59 tego samego dnia, w przeciwnym razie będzie nieważne po godzinie 0.", + "清空密码底部提示": "Hasło jest ważne do 23:59 w dniu opróżnienia", + "相机": "Kamera", + "相册": "Zdjęcia", + "读写": "Schowek", + "定位": "Lokalizacja", + "需要访问相机权限才能拍照上传文件例如头像上传": "Dostęp do aparatu jest wymagany do robienia zdjęć i przesyłania plików, takich jak przesyłanie zdjęcia profilowego", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Dostęp do aparatu jest wymagany do przesyłania plików i awatarów za pomocą obrazów albumów", + "需要访问读写权限才能使用本地图片上传头像": "Dostęp do uprawnień do odczytu i zapisu jest wymagany do przesyłania awatarów przy użyciu lokalnych obrazów", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Dostęp do informacji o lokalizacji jest wymagany do korzystania z funkcji dodawania klucza", + "申请": "Aplikacja", + "权限": "Pozwolenie", + "不允许": "Niedozwolone", + "允许": "Dozwolone", + "权限被拒绝": "Odmowa pozwolenia", + "请手动在系统设置中开启": "Proszę ręcznie włączyć go w ustawieniach systemu", + "权限以继续使用应用": "Zezwolenie na dalsze korzystanie z aplikacji.", + "去设置": "Idź to skonfigurować", + "当前网络": "Obecna sieć", + "位置信息": "Informacje o lokalizacji", + "请输入wifi名称": "Proszę wpisać nazwę wifi", + "虹膜": "Tęczówka", + "手掌": "Dłoń", + "商城": "Centrum handlowe", + "我的": "Mój", + "微信公众号推送": "Konto publiczne Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Aby otworzyć wechat, aby otrzymywać komunikaty alarmowe, należy najpierw zwrócić uwagę na konto publiczne Wechat Skye Smart Lock, zapisz kod QR i użyj wechat, aby zeskanować Ustawienia", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Dostęp do uprawnień Bluetooth jest wymagany do korzystania z informacji o lokalizacji funkcji dodawania klucza", + "请输入Email": "Wpisz swój e-mail", + "请输入手机号": "Wprowadź swój numer telefonu", + "家人到家": "Członek rodziny wrócił do domu", + "添加家人": "Dodaj członka rodziny", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Jeśli zamek nie jest podłączony do Internetu, przypomnienia o hasle, karcie, odcisku palca i innych metodach otwierania drzwi nie mogą być wysyłane w odpowiednim czasie.", + "消息提醒": "Przypomnienie", + "开门通知": "Ogłoszenie o otwarciu", + "N天未开门": "N dni bez otwierania drzwi", + "门未关好": "Drzwi nie są zamknięte", + "防拆报警": "Alarm saperowy", + "低电量提醒": "Niski poziom baterii", + "胁迫开门": "Wymuszone otwieranie drzwi", + "有人按门铃": "Ktoś dzwoni do drzwi", + "有人出现在门口": "Ktoś pojawia się przy drzwiach", + "提醒方式": "Metoda przypomnienia", + "开门方式": "Metoda otwierania drzwi", + "请选择": "Proszę wybrać", + "家人": "Członek rodziny", + "保存": "Zapisz", + "APP推送": "APP push", + "管理员": "Admin", + "未启用": "Nie włączone", + "已启用": "Włączone", + "省电模式": "Tryb oszczędzania energii", + "逗留抓拍模式": "Pozostań w trybie przechwytywania", + "实时监控模式": "Tryb monitorowania w czasie rzeczywistym", + "自定义模式": "Tryb niestandardowy", + "猫眼设置": "Ustawienie kocie oczy", + "猫眼工作模式": "Tryb pracy kocie oko", + "自动亮屏": "Automatyczny jasny ekran", + "亮屏持续时间": "Ekran na czas", + "逗留警告": "Zachowaj ostrzeżenie", + "异常警告": "Nieprawidłowe ostrzeżenie", + "短信提醒": "SMS", + "邮件提醒": "E-mail", + "N天未开门提醒": "N dni bez otwierania drzwi", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Jeśli ktoś zmusza cię do otwarcia zamka, możesz użyć tego odcisku palca. Wiadomość alarmowa zostanie wysłana do administratorów. Aby skorzystać z tej funkcji, upewnij się, że blokada jest online.", + "胁迫指纹": "Wymuszony odcisk palca", + "指纹列表": "Lista odcisków palców", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Po ustawionym czasie, jeśli blokada nie zostanie otwarta, system wyśle wiadomość z przypomnieniem do wyznaczonego odbiorcy. Ta funkcja wymaga podłączenia blokady do Internetu.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Po włączeniu przypomnienia, gdy bateria zamka jest poniżej 20%, 10% i 5%, system wyśle wiadomość z przypomnieniem do wyznaczonego odbiorcy.", + "未开门时间": "Dni bez otwierania drzwi", + "添加和使用面容开锁时:": "Dodaj i używaj twarzy podczas odblokowywania:", + "关锁": "Zamykanie zamka", + "功能": "Funkcja", + "配件": "Części", + "云存": "Przechowywanie w chmurze", + "本地": "Ta miejscowość", + "3天滚动储存": "3 dni do przechowywania w toczeniu", + "去升级": "Uaktualnij teraz", + "下载列表": "Lista pobranych", + "已下载": "Pobrane", + "全部视频": "Wszystkie filmy", + "已为本设备免费提供3大滚动视频储存服务": "Trzy usługi przewijania wideo zostały udostępniane bezpłatnie dla tego urządzenia", + "视频播放": "Odtwarzanie wideo", + "全选": "Wszystkie", + "请选择要删除的视频": "Wybierz film, który chcesz usunąć", + "请选择要下载的视频": "Wybierz film, który chcesz pobrać", + "欢迎使用": "Zapraszamy do użycia", + "用户协议和隐私政策概要": "Podsumowanie umowy z użytkownikiem i polityki prywatności", + "协议概要": "Podsumowanie protokołu", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Dziękujemy za korzystanie z tej aplikacji. Przywiązujemy dużą wagę do Twoich danych osobowych i ochrony prywatności. Przed użyciem tego produktu, proszę przeczytać go uważnie", + "《用户协议》": "Warunki użytkownika", + "和": "I", + "《隐私政策》": "《 Polityka prywatności w zakresie", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Cała zawartość. Klikając „ Zgadzam się ”, zgadzasz się i akceptujesz wszystkie warunki. Jeśli zdecydujesz się nie zgodzić, nie będziesz mógł korzystać z naszych produktów i usług i wyjdziesz z aplikacji.", + "不同意": "Nie zgadzam się", + "同意": "Zgadzam się", + "该功能是高级功能,请开通后再使用": "To jest funkcja zaawansowana. Najpierw włącz.", + "常用程序": "Wspólne programy", + "该锁已被重置": "Blokada została zresetowana", + "需要访问读写权限才能使用手动升级固件": "Do ręcznej aktualizacji oprogramowania firmowego wymagany jest dostęp do uprawnień do odczytu i zapisu", + "错误D固件,请选择正确的文件": "Niewłaściwe oprogramowanie, proszę wybrać odpowiedni plik", + "非SYD固件,请选择正确的文件": "Non SYD firmware, proszę wybrać odpowiedni plik", + "文件校验失败 0x01": "Weryfikacja pliku nie powiodła się 0x01", + "解析元数据失败,请选择正确的文件": "Nie można przeanalizować metadanych, wybierz właściwy plik", + "文件校验失败 0x02": "Weryfikacja pliku nie powiodła się 0x02", + "文件校验失败 0x03": "Weryfikacja pliku nie powiodła się 0x03", + "固件升级完成": "Aktualizacja oprogramowania układowego zakończona", + "记录": "Rekordy", + "开通高级功能后才可以对锁进行管理": "Najpierw włącz zaawansowaną funkcję do zarządzania blokadami.", + "去开通": "Włącz", + "实名认证": "Uwierzytelnianie nazw rzeczywistych", + "当前剩余数量": "Pozostały", + "购买": "Kup", + "实名认证为付费功能,请购买后再使用": "Uwierzytelnianie rzeczywistej nazwy jest funkcją płatną, użyj go po zakupie", + "密码不一致哦": "Hasła są niespójne", + "退出添加": "Przestań dodawać", + "管理员已满": "Admin pełny", + "用户已满": "Użytkownik jest pełny", + "锁上面添加指纹已满": "Dodaj odcisk palca na zamku jest pełny", + "指纹已存在": "Odcisk już istnieje.", + "锁上面添加人脸已满": "Blokada powyżej dodawania twarzy jest pełna", + "人脸已存在": "Twarz już istnieje", + "锁上面添加卡已满": "Zablokuj powyższą kartę dodawania jest pełna", + "卡已存在": "Karta już istnieje", + "锁上面添加密码已满": "Blokada powyżej dodać hasło jest pełne", + "密码已存在": "Identyczny kod dostępu już istnieje. Wybierz inny", + "请输入密码": "Wprowadź hasło", + "暂无密码,无需重置": "Brak hasła, nie ma potrzeby resetowania", + "真实姓名": "Prawdziwe imię", + "身份证号": "Numer identyfikacyjny", + "请输入真实姓名": "Wpisz swoje prawdziwe imię i nazwisko", + "请输入身份证号": "Wprowadź swój numer identyfikacyjny", + "请输入身份证号和真实姓名": "Wprowadź swój numer identyfikacyjny i prawdziwe imię i nazwisko", + "点击返回设备配对": "Dotknij opcji Powrót do parowania urządzeń", + "无法连接?尝试升级": "Nie możesz się połączyć? Podjęto próbę aktualizacji", + "固件升级提示": "Monit o aktualizację oprogramowania sprzętowego", + "请先获取固件文件到手机本地,再选择升级": "Najpierw uzyskaj plik oprogramowania układowego do lokalnego telefonu, a następnie wybierz opcję Uaktualnij", + "固件升级中": "Oprogramowanie układowe jest aktualizowane", + "取消升级": "Anuluj aktualizację", + "固件传输中": "Firmware w tranzycie", + "关闭": "Wyłącz", + "传输中'": "W tranzycie", + "操作记录": "Rekordy", + "修改姓名": "Edytuj nazwę", + "传输中": "W tranzycie", + "发送人": "Wydane przez", + "发送时间": "Czas wydany", + "钥匙详情": "Ekey Info", + "姓名": "Imię i nazwisko", + "发送": "Wyślij", + "请确认姓名全名和身份证号码是否正确": "Potwierdź, że pełne imię i nazwisko oraz numer identyfikacyjny są poprawne", + "传输期间请勿离开当前页面": "Nie opuszczaj bieżącej strony podczas przesyłania", + "机型": "Modele", + "硬件版本": "Wersja sprzętowa", + "固件版本": "Wersja firmware", + "手动升级": "Ręczna aktualizacja", + "设备连接中...": "Urządzenie łączące...", + "未避免异常情况,请在门打开时升级": "Nieuniknione wyjątki, proszę uaktualnić, gdy drzwi są otwarte", + "钥匙无效": "Klucz jest nieważny", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Nie można połączyć się z blokadą. Uruchom ponownie Blutooth w telefonie i spróbuj ponownie.", + "如果是全自动锁,请使屏幕变亮": "Jeśli jest to w pełni automatyczna blokada, rozjaśnij ekran", + "正在尝试闭锁……": "Próba zamknięcia. Proszę czekać...", + "清空记录": "Wyczyść zapisy", + "是否要删除操作记录?": "Kontynuować usuwanie rekordów?", + "被删除的记录不能恢复": "Rekordów nie można odzyskać po usunięciu.", + "全部事件": "Wszystkie wydarzenia", + "开锁事件": "Odblokuj wydarzenie", + "异常事件": "Nienormalne zdarzenie", + "门铃事件": "Wydarzenie dzwonka", + "视频事件": "Wydarzenie wideo", + "请开启蓝牙": "Proszę włączyć Bluetooth", + "请选择有效日": "Wybierz efektywny dzień", + "公司名字长度不能小于 6 ": "Długość nazwy firmy nie może być mniejsza niż 6", + "已是最新版本": "Brak aktualizacji", + "新建短信模版": "Creat szablon SMS", + "新建邮件模版": "Szablon e-mail Creat", + "自定义短信模版": "Szablon SMS", + "自定义邮件模版": "Szablon e-mail", + "名称": "Imię i nazwisko", + "星星锁": "Blokada gwiazdy", + "无考勤记录": "Brak rekordów", + "大家干劲十足": "Wszyscy przychodzą na czas", + "工作时长未出炉": "Brak godzin pracy", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Wybór kraju/regionu wpłynie na bezpieczeństwo danych. Obecnie wybrałeś Albanię, potwierdź przed kontynuowa niem.", + "确认国家或地区": "Potwierdź kraj/region", + "我知道了": "Mam to", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Aby otrzymywać ważne aktualizacje, kliknij „ OK ”i włącz powiadomienia w ustawieniach.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Po włączeniu możesz ponownie włączyć zasilanie, naciskając długo klawisz ustawień na zamku i ponownie dodać go za pomocą aplikacji", + "已有": "Prąd", + "新增": "Nowy", + "账号格式错误": "Zły format", + "接收者信息为空": "Informacje o odbiorcy są puste", + "请输入时间(秒)": "Proszę wpisać godzinę (sec)", + "加载数据失败": "Nie udało się załadować danych", + "重试": "Spróbuj ponownie", + "升级中,是否退出": "Podczas aktualizacji, czy wyjść", + "下一步": "Następny", + "公寓": "Mieszkanie", + "个人用户": "Osobiste", + "星寓": "Mieszkanie gwiazdy", + "账号": "Konto", + "请输入手机号或email": "Numer telefonu lub e-mail", + "请输入星寓管理员的账号": "Proszę wpisać konto gwiazdowego administratora mieszkania", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Wszystkie dane wybranej blokady zostaną na stałe przeniesione do odbiorcy.", + "暂不支持跨平台转移,敬请期待": "Transfer międzyplatformowy nie jest na razie obsługiwany, proszę na niego czekać", + "移除坏锁": "Przenieś wadliwe/uszkodzone zamki do śmieci", + "转移确认": "Potwierdź przelew", + "本次共转移": "Tym razem w sumie", + "把智能锁": "Inteligentny zamek", + "确认": "OK", + "移除成功": "Usuń pomyślnie", + "转移成功": "Sukces transferu", + "该已锁被删除": "Zablokowany zostaje usunięty", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Upoważniony administrator może zarządzać tylko kodami dostępu, ekeyami i etcutworzonymi przez siebie.", + "添加授权管理员": "Utwórz Admin", + "导出记录": "Rekordy eksportowe", + "选择时间段": "Wybierz okres czasu", + "导出": "Eksport", + "批量导出": "Eksport partii", + "读取记录": "Odśwież rekordy", + "设备": "Urządzenie", + "消息": "Wiadomości", + "智能分析": "Inteligentna analityka", + "精准识别设备事件,过滤无效信息": "Dokładne zidentyfikowanie zdarzeń urządzenia i odfiltrowanie nieprawidłowych informacji", + "系统设置": "Ustawienia systemowe", + "系统的全局配置在此项内进行设置": "Globalna konfiguracja systemu jest ustawiona w tej pozycji", + "导出操作记录": "Rekordy eksportowe", + "立即查看": "Widok", + "导出成功": "Wyeksportowane pomyślnie", + "发送钥匙": "Wyślij ekey", + "进度": "Stawka", + "失败": "Nie powiodło się", + "人脸详情": "Szczegóły twarzy", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Gdy ktoś zostanie wyczuty około 1,5 metra przed drzwiami, odblokowanie rozpoznawania twarzy zostanie automatycznie uruchomione.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Gdy ktoś zostanie wyczuty około 0,8 metra przed drzwiami, odblokowanie rozpoznawania twarzy zostanie automatycznie uruchomione.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Gdy ktoś zostanie wyczuty około 0,5 metra przed drzwiami, odblokowanie rozpoznawania twarzy zostanie automatycznie uruchomione.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Odległość wykrywania została wyłączona, należy ręcznie dotknąć dowolnego klawisza na klawiaturze, aby wykonać odblokowanie rozpoznawania twarzy.", + "防误开已打开,开锁后": "Otwarcie przed błędem zostało włączone i po odblokowaniu", + "秒内不可使用面容开锁": "Odblokowanie twarzy nie może być użyte w ciągu kilku sekund", + "掌静脉": "Żyła palmowa", + "添加掌静脉": "Dodaj żyłę palmową", + "胁迫掌静脉": "Wymuszona żyła palmowa", + "请不要将胁迫掌静脉用于日常开锁": "Proszę nie używać przymusowych żył palmowych do codziennego odblokowywania", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Podłączony do zamka, proszę naturalnie otworzyć dłoń, dłoń jest skierowana w stronę aparatu", + "掌静脉详情": "Szczegóły żyły palmowej", + "掌静脉号": "Liczba żył palmowych", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth nie jest włączony, włącz Bluetooth w ustawieniach", + "删除用户时,会将用户拥有的钥匙一起删除。": "Jeśli Użytkownik zostanie USUWANY, wszelkie ekeyy powiązane z Użytkownikiem również zostaną USUWANE.", + "配置网络": "Skonfiguruj sieć", + "你好": "Witaj", + "成功": "Udany", + "类型选择": "Wybierz typ", + "请选择要使用哪种类型": "Proszę wybrać, jakiego typu użyć", + "系统邮件(推荐)": "System e-mail (zalecane)", + "系统短信(推荐)": "System SMS (zalecany)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Wiadomość e-mail zostanie wysłana z tej aplikacji. Najpierw kup paczkę e-mail.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS zostanie wysłany z tej aplikacji. Najpierw kup paczkę e-mail.", + "个人邮件": "Osobisty adres e-mail", + "个人短信": "Osobisty SMS", + "邮件将从你的个人邮箱发给用户": "E-mail zostanie wysłany z Twojego osobistego konta e-mail.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Wiadomość SMS zostanie wysłana z Twojego osobistego numeru telefonu. Płacisz operatorowi telekomunikacyjemu.", + "为了更好地应用体验,请确定权限": "Aby uzyskać lepsze wrażenia z aplikacji, potwierdź uprawnienia", + "您第一次拒绝权限,请确定权限": "Odmówiłeś pozwolenia po raz pierwszy, proszę potwierdzić pozwolenie", + "您第二次拒绝权限,请去应用设置开启权限": "Odmówiłeś pozwolenia po raz drugi, przejdź do ustawień aplikacji, aby włączyć pozwolenie", + "去应用市场": "Przejdź do sklepu z aplikacjami", + "温馨提示": "Ciepły monit", + "关闭应用": "Zamknij aplikację", + "开启微信接收报警消息需要先关注": "Aby otworzyć WeChat, aby otrzymywać komunikaty alarmowe, musisz postępować zgodnie z", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Konto publiczne WeChat, zapisz kod QR i użyj WeChat, aby zeskanować ustawienia", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Uwierzytelnianie rzeczywistej nazwy jest funkcją płatną, skontaktuj się z administratorem blokady w celu zakupu i używania", + "位置权限": "Pozwolenie na lokalizację", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Proszę przyznać aplikacji do korzystania z lokatian. Służy do skanowania zamków i bram BLE.", + "相机/相册权限": "Pozwolenie na aparat/album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Proszę przyznać aplikacji do czytania i zapisywania zdjęć i plików z pamięci masowej.", + "点击选择": "Kliknij, aby wybrać", + "微信": "WeChat", + "朋友圈": "Chwile", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "FaceBook", + "链接": "Link", + "今天": "Dzisiaj", + "密码错误": "Nieprawidłowe hasło", + "网络中断": "Przerwanie sieci", + "钥匙不存在": "Klucz nie istnieje", + "钥匙过期": "Klucz wygasł", + "钥匙已存在": "Klucz już istnieje", + "密码失效": "Nieważne hasło", + "门锁时间异常": "Nieprawidłowy czas blokady drzwi", + "APP(手机)未联网": "APP (telefon komórkowy) nie jest podłączony do Internetu", + "数据不存在": "Dane nie istnieją", + "待接收": "Pochowany", + "已冻结": "Mrożone", + "已删除": "Usunięty", + "未知": "Nieznane", + "拖动下方滑块完成拼图": "Przeciągnij suwak do właściwej pozycji", + "验证成功": "Sukces weryfikacji", + "验证失败": "Weryfikacja nie powiodła się", + "向右拖动滑块填充拼图": "Przeciągnij suwak w prawo, aby wypełnić zagadkę", + "请先获取到位置信息哦": "Najpierw uzyskaj informacje o lokalizacji", + "请选择国家": "Proszę wybrać kraj", + "获取锁信息": "Uzyskaj informacje o blokadzie", + "锁数据异常,请重试": "Dane blokady są nieprawidłowe, spróbuj ponownie", + "连接设备中...": "Urządzenie łączące...", + "把锁": "Zamki", + "条": "Pasek", + "封": "Uszczelnienie", + "次": "Czasy", + "支付成功": "Zapłać sukces", + "查看详情": "Wyświetl szczegóły", + "请输入模板名称": "Wpisz nazwę szablonu", + "模版类型": "Rodzaj", + "再返回一次退出": "Wyjdź ponownie", + "请先添加锁": "Najpierw dodaj zamek", + "可视对讲": "Wizualny domofon", + "详细日志": "Szczegółowy dziennik", + "已复制到剪切板": "Skopiowane", + "拍照": "Zdjęcie", + "从相册选择": "Wybierz z albumu", + "选择问题": "Proszę wybrać pytanie", + "确认长度不足8位": "Potwierdź długość mniejszą niż 8 cyfr", + "新密码长度不足8位": "Nowe hasło o długości mniejszej niż 8 cyfr", + "两次密码不一致": "Niedopasowanie hasła. Spróbuj ponownie", + "请点击获取验证码,验证码将发送到": "Proszę otrzymać kod weryfikacyjny. Kod zostanie wysłany na", + "切换": "Przełącznik", + "验证": "Zweryfikuj", + "验证成功,账号已删除": "Weryfikacja powiodła się, konto zostało usunięte", + "该密码不是自定义密码,无法修改": "To hasło nie jest niestandardowym hasłem i nie można go modyfikować", + "请选择设备要关联哪些姓名": "Wybierz nazwy, z którymi urządzenie powinno być powiązane", + "请选择姓名要关联哪些设备": "Wybierz urządzenia, z którymi nazwa powinna być powiązana", + "确定要移除所选中的坏锁吗?": "Usunąć wadliwie działającą blokadę?", + "邮件通知": "Powiadom przez e-mail", + "短信通知": "Powiadamiaj przez SMS", + "您好,您的授权管理员生成成功": "Witaj, Twój autoryzowany administrator został pomyślnie wygenerowany", + "请输入接收者姓名": "Proszę wpisać tutaj", + "版本更新": "Aktualizacja wersji", + "下次再说": "Następnym razem", + "配网成功": "Sukces dystrybucji sieci", + "配网失败": "Dystrybucja sieci nie powiodła się", + "该锁的无线键盘都将被删除": "Wszystkie bezprzewodowe klawiatury do tego zamka zostaną USUWANE", + "实时画面": "Obraz w czasie rzeczywistym", + "适合门口较为安全的环境。": "Nadaje się do stosunkowo bezpiecznych środowisk przy drzwiach.", + "仅发生特定事件才录像,并可查看实时画面。": "Nagrywane są tylko określone zdarzenia i można oglądać obraz w czasie rzeczywistym.", + "一般情况下,满电可使用7-8个月": "W normalnych warunkach może być używany przez 7-8 miesięcy po pełnym naładowaniu", + "有人逗留或发生特定事件才录像,可随时查看": "Ktoś zostaje lub określone zdarzenia są rejestrowane i można je oglądać w dowolnym momencie", + "实时画面。": "Obraz w czasie rzeczywistym.", + "一般情况下,满电可使用5~6个月。": "W normalnych warunkach może być używany przez 5 ~ 6 miesięcy po pełnym naładowaniu.", + "适合门口人员复杂、较不安全的环境。": "Nadaje się do złożonych i stosunkowo niebezpiecznych środowisk przy drzwiach.", + "有人出现就录像,可随时查看实时画面。": "Nagrywaj, gdy ktoś się pojawi i wyświetl obraz w czasie rzeczywistym w dowolnym momencie.", + "一般情况下,满电可使用2~4个月。": "W normalnych warunkach może być używany przez 2 ~ 4 miesiące po pełnym naładowaniu.", + "根据您家门口实际情况设置录像和实时画面功能。": "Ustaw funkcje wideo i obrazu w czasie rzeczywistym zgodnie z rzeczywistą sytuacją u twoich drzwi.", + "可使用时长由具体设置决定。": "Czas użytkowania zależy od konkretnych ustawień.", + "查看": "Widok", + "有人按门铃或发生": "Ktoś dzwoni do drzwi lub", + "异常事件时": "Zdarzenie nienormalne", + "不录像": "Brak wideo", + "有人出现、按门铃": "Ktoś pojawia się, dzwoni do drzwi", + "或发生异常事件时": "Lub występuje nienormalne zdarzenie", + "逗留达到10秒": "Zostań przez 10 sekund", + "约1.5米": "Około 1,5 metra", + "随时": "W każdej chwili", + "立即录像": "Zapisz natychmiast", + "录像时机": "Czas wideo", + "有人出现时录像": "Nagrywaj, gdy ktoś się pojawi", + "人体侦测距离": "Odległość wykrywania człowieka", + "查看实时画面": "Zobacz obraz w czasie rzeczywistym", + "自定义时间": "Czas niestandardowy", + "当日": "Dzisiaj", + "次日": "Następnego dnia", + "自定义时段": "Niestandardowy okres czasu", + "发生事件时查看": "Wyświetl, kiedy wystąpi zdarzenie", + "实时查看": "Widok w czasie rzeczywistym", + "有人在门口出现10秒后开始录像。": "Ktoś pojawia się przy drzwiach na 10 sekund przed nagra niem.", + "有人按门铃时立即录像。": "Nagraj natychmiast, gdy ktoś zadzwoni do drzwi.", + "有人出现在门前1.5米范围时启动录像": "Rozpocznij nagrywanie, gdy ktoś pojawi się w odległości 1,5 metra przed drzwiami", + "约0.8米": "Około 0,8 metra", + "约3.0米": "Około 3,0 metrów", + "添加指纹失败": "Operacja nie powiodła się.", + "项": "Przedmioty", + "播放中": "Granie", + "下载": "Pobierz", + "暂无下载内容": "Brak zawartości do pobrania", + "亮度": "Jasność", + "音量": "Głośność", + "快进至": "Szybko do przodu", + "快退至": "Przewiń do", + "暂无视频信息": "Brak informacji wideo", + "加载出错": "Błąd załadunku", + "请单人正对门锁,距离一个成年人手臂长度": "Proszę stanąć przed zamkiem drzwi sam, na wyciągnięcie ręki", + "(约0.6米)。": "(Około 0,6 metra).", + "保持脸部无遮挡,露出五官。": "Trzymaj twarz bez przeszkód i pokazuj rysy twarzy.", + "准备好了,开始添加": "Gotowy, zacznij dodawać", + "正在录入中...": "Nagrywanie...", + "添加人脸失败": "Nie udało się dodać twarzy", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Po zresetowaniu twarze zamka zostaną usunięte. Czy na pewno chcesz zresetować?", + "人脸号": "Numer twarzy", + "虹膜详情": "Szczegóły tęczówki", + "虹膜号": "Numer tęczówki", + "选择设备类型": "Wybierz typ urządzenia", + "照明灯具": "Oprawy oświetleniowe", + "电动窗帘": "Kurtyny elektryczne", + "门窗传感器": "Czujnik drzwi i okien", + "传感器": "Czujnik", + "清除数据成功": "Dane pomyślnie wyczyszczone", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Zamek nie jest podłączony do Internetu, więc nie można przesyłać kodów dostępu, kart, odcisków palców i innych metod otwierania drzwi w czasie rzeczywistym.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Jeśli chcesz zachować zapisy historyczne, możesz je wyeksportować.", + "看不到操作记录,可能原因有": "Nie widzę zapisów operacji, możliwych przyczyn", + "操作记录详情": "Szczegóły dotyczące rekordu operacji", + "操作时间": "Czas operacji", + "此模块功能需要锁联网后设置方可生效": "Ta funkcja modułu musi zostać ustawiona po podłączeniu blokady do Internetu, aby uzyskać efekt", + "用户已存在": "Użytkownik już istnieje", + "钥匙数量已到上限": "Liczba kluczy osiągnęła górny limit", + "附近没有可用网关": "W pobliżu nie ma dostępnej bramy", + "正在创建安全连接...": "Tworzenie bezpiecznego połączenia...", + "监视状态下不能发送录音": "Nie można wysłać nagrań w trybie monitorowania", + "挂断": "Rozłącz się", + "监视中暂不能开锁": "Odblokowanie nie jest dostępne podczas monitorowania", + "长按说话": "Naciśnij i przytrzymaj, aby mówić", + "松开发送": "Wysłanie", + "请输入6位数字开锁密码": "Wprowadź 6-cyfrowe hasło odblokowania", + "请输入开锁密码": "Wprowadź hasło odblokowania", + "接收者在有效期内可以不限次数使用": "Odbiorcy mogą korzystać z ekeys przez nieograniczony czas w okresie ważności.", + "接收者可以使用此App开关锁": "Odbiorca są w stanie zablokować/odblokować przez tę aplikację.", + "单次钥匙有效期为1小时,只能使用一次": "Jednorazowy ekey jest ważny przez JEDNĄ godzinę i może być używany tylko RAZ.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Odbiorcy mogą korzystać z ekeys przez nieograniczony czas w ustalonym czasie cyklu.", + "获取模板失败": "Nie udało się uzyskać szablonu", + "微信通知": "Powiadomienie WeChat", + "系统短信": "System SMS", + "系统邮件": "System e-mail", + "模板": "Szablon", + "新建模版": "Utwórz szablon", + "您好,您的密码是": "Witaj, twoje hasło to", + "密码名字": "Nazwa hasła", + "请输入6-9位密码": "Wprowadź 6-9 cyfrowe hasło", + "设置密码": "Ustaw hasło", + "操作成功,密码为": "Udało się. Kod dostępu to", + "类型:自定义-永久": "Typ: Custom-Permanent", + "实时播放": "Odtwarzanie w czasie rzeczywistym", + "点击对讲": "Kliknij, aby domofon", + "长按开锁": "Długie naciśnięcie, aby odblokować", + "接听失败": "Nie udało się odpowiedzieć", + "请在锁设置中开启远程开锁": "Proszę włączyć zdalne odblokowanie w ustawieniach blokady", + "接听": "Odpowiedź", + "截图已保存到相册": "Zrzut ekranu zapisany do albumu", + "添加遥控": "Dodaj pilota zdalnego sterowania", + "已连接到锁,请按遥控": "Podłączony do blokady, naciśnij pilot zdalnego sterowania", + "遥控号": "Numer zdalnego sterowania", + "遥控详情": "Szczegóły zdalnego sterowania", + "照明": "Oświetlenie", + "退出演示模式": "Wyjście z trybu demonstracyjnego", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Wskazówka: bieżący interfejs jest interfejsem wyświetlacza. Po dodaniu urządzenia możesz nadal z niego korzystać", + "门已上锁": "Drzwi są zamknięte", + "您的账号在异地登录,如非本人,请尽快修改密码": "Twoje konto zostało użyte do logowania z nowego urządzenia", + "开门成功": "Otwórz drzwi z powodzeniem", + "开门失败": "Nie udało się otworzyć drzwi", + "呼叫提醒": "Przypomnienie o połączeniu", + "收到来自": "Otrzymany od", + "锁的呼叫": "Zablokuj połączenie", + "加载数据中": "Ładowanie danych", + "搜索所有锁类型": "Wyszukaj wszystkie typy zamków", + "锁电量更新时间": "Zablokuj czas aktualizacji baterii", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Kwiecień", + "5月": "Maj", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Wrzesień", + "10月": "Paź", + "11月": "Listopad", + "12月": "Dec", + "热门城市": "Gorące miasta", + "导出锁数据": "Eksportuj dane blokady", + "一键开锁": "Odblokowanie jednym kliknięciem", + "已开通": "Otwarty", + "编辑员工": "Edytuj personel", + "一": "Jeden", + "二": "Dwa", + "三": "Trzy", + "四": "Cztery", + "五": "Pięć", + "六": "Sześć", + "日": "Słońce", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Rekord zakupu", + "使用记录": "Rekord użytkownika", + "失效时间要大于当前时间": "Czas wygaśnięcia musi być dłuższy niż aktualny czas", + "修改名字": "Edytuj nazwę", + "时": "Godzina", + "分": "Minuta", + "Amazon Alexa": "Amazonka Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Możesz użyć Alexy, aby odblokować, zablokować i sprawdzić status blokady", + "支持的国家": "Kraje wspierane", + "支持的国家值": "USA, Kanada, Wielka Brytania, Australia, Indie, Niemcy, Francja, Włochy, Hiszpania, Japonia", + "操作流程": "Proces działania", + "操作流程值": "1 Dodaj zamek i bramę za pomocą aplikacji Smart Lock\n\n2 Włącz funkcję zdalnego odblokowania blokady w aplikacji (ta funkcja jest domyślnie wyłączona). Jeśli nie masz tej opcji, zamek nie obsługuje Alexa\n\n3 Dodaj umiejętności do Alexy i autoryzuj je za pomocą konta i hasła aplikacji Smart lock. Po pomyślnym zakończeniu autoryzacji możesz odkryć urządzenia na koncie\n\n4 Zlokalizuj blokadę w aplikacji Alexa, włącz funkcję odblokowywania głosu i ustaw hasło językowe\n\n5 Zamek może być obsługiwany przez Alexa", + "Google Home": "Google Home", + "Action name": "Nazwa działania", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Obsługiwane języki", + "英语": "Angielski", + "Google Home操作流程的值": "1. Użyj aplikacji Smart Lock, aby dodać zamki i bramy\n\n2. Włącz funkcję zdalnego odblokowania blokady w aplikacji (ta funkcja jest domyślnie wyłączona). Bez tej opcji blokada nie obsługuje Google Home\n\n3. Zainstaluj aplikację Google Home i kliknij przycisk „ ”w lewym górnym rogu\n\n4. Na stronie Ustawienia wybierz „ Pracuj z Google”\n\n5. Wyszukaj \"ScienerSmart\" i użyj konta i hasła Smart Lock APP do autoryzacji", + "密码需至少包含数字/字母/字符中的2种组合": "Hasło musi zawierać co najmniej 2 z następujących elementów: cyfry, litery i znaki specjalne", + "已开锁": "Odblokowany", + "已闭锁": "Zamknięty", + "两次密码不一致哦": "Hasła są niespójne", + "中功率": "Średnia moc", + "常规使用": "Regularne stosowanie", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Po włączeniu bramy naciśnij i przytrzymaj przycisk resetowania przez 5 sekund i kliknij przycisk Dalej, gdy wskaźnik miga na przemian", + "扫描设备": "Urządzenie skanujące", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Usunięcie nie powiodło się. Brama mogła zostać wyłączona. Czy chcesz wymusić usunięcie danych?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_pt.json b/lan/lan_pt.json new file mode 100644 index 00000000..5660f8cf --- /dev/null +++ b/lan/lan_pt.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Bloqueio Estrela", + "锁通通": "Bloquear através", + "点击开锁,长按闭锁": "Toque para desbloquear, segure para bloquear", + "考勤": "Presença", + "考勤设置": "Configurações Atendimento", + "电子钥匙": "EKeys", + "添加卡": "Adicionar cartão", + "卡号": "Número do cartão", + "添加指纹": "Adicionar impressões digitais", + "指纹号": "Número do Fingerprint", + "遥控": "Remoto", + "添加人脸": "Adicionar rosto", + "门锁日志": "Porta log bloqueio", + "密码号": "Senha Número", + "添加者": "Operador", + "添加时间": "Tempo", + "重置": "Reiniciar", + "请输入手机号或者邮箱": "Telefone ou Email", + "工作时间": "Tempo trabalho", + "工作日设置": "Configuração do Workday", + "星期一": "Segunda-feira", + "星期二": "Terça-feira", + "星期三": "Quarta-feira", + "星期四": "Quinta-feira", + "星期五": "Sexta-feira", + "星期六": "Sábado", + "星期日": "Domingo", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Seg", + "周二": "Ter", + "周三": "Qua", + "周四": "Qui", + "周五": "Sex", + "周六": "Sentado", + "周日": "Sol", + "群发钥匙": "Enviar vários eKeys", + "锁": "Bloquear", + "请添加": "Destinatário", + "允许远程开锁": "Desbloqueio Remoto", + "请输入验证码": "Código Verificação", + "获取密码": "Gerar senha", + "请给密码命名": "Digite um nome para esta senha", + "密码有限期为6个小时,只能使用一次": "Esta senha DEVE SER usada dentro de 6 horas a partir do horário atual ou será SUSPENDIDA por razões de segurança. Esta senha só pode ser usada UMA VEZ.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Insira manualmente de 6 a 9 dígitos como senha. Pode ser adicionado por telefone Bluetooth ao lado do bloqueio, ou adicionado remotamente através do gateway", + "获取": "Obter", + "添加": "Adicionar", + "删除公司": "Excluir Empresa", + "密码详情": "Informações senha", + "修改密码": "Alterar senha", + "添加虹膜": "Adicionar Iris", + "添加门磁": "Sensor porta", + "添加无线键盘": "Teclado Wireless", + "添加手掌": "Adicionar Palm", + "请输入员工账号": "Digite a conta do funcionário", + "批量授权锁": "Conceda vários bloqueios", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "O administrador autorizado terá permissão majoritária para operar este bloqueio.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Este recurso permite que você desbloqueie o bloqueio inteligente remotamente através de um gateway. Este recurso só pode ser ligado ou desligado via Bluetooth.", + "排列方式": "Tipo lista", + "早到榜": "Lista inicial", + "迟到榜": "Lista tardia", + "当前模式": "Modo atual", + "勤奋榜": "Trabalhando Hard List", + "延迟时间": "Tempo do atraso", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "O bloqueio será bloqueado automaticamente após o tempo. Por favor, desbloqueie-o por uma vez primeiro para disponibilizar a configuração.", + "时间": "Tempo", + "开始时间": "Hora do início", + "结束时间": "Hora final", + "工作时间设置": "Configuração do tempo trabalho", + "常开模式": "MODO DE passagem", + "常开时间": "Neste período de tempo", + "常开日期": "Por estes dias", + "添加员工": "Adicionar equipe", + "节假日": "Férias", + "打卡方式": "Método", + "员工是否有钥匙": "Já tem o Ekey", + "上班时间": "Hora De Início", + "下班时间": "Fechando o tempo", + "本周": "Esta semana", + "单休": "Fim de semana de um dia", + "双休": "Dois dias Weekend", + "单双休": "Weekend de um e dois dias", + "年": "Ano", + "月": "Mês", + "放假日期": "Férias", + "补班日期": "Dias do trabalho", + "添加假日": "Adicionar férias", + "开始日期": "Data Início", + "必填": "Obrigatório", + "结束日期": "Data final", + "日榜": "Diariamente", + "月榜": "Mensal", + "考勤记录": "Registos", + "假日信息": "Informações do feriado", + "基本信息": "Básico", + "无线键盘": "Teclado Wireless", + "选择无线键盘": "Adicionar teclado", + "门磁": "Sensor porta", + "自动闭锁": "Bloqueio automático", + "锁声音": "Bloquear som", + "防撬报警": "Alerta adulteração", + "重置键": "Botão Reset", + "锁时间": "Bloqueio Relógio", + "诊断": "Diagnosticar", + "上传数据": "Carregar dados", + "导入其他锁数据": "Importar frome outro bloqueio", + "锁升级": "Atualização do firmware", + "标记房态": "Status do quarto", + "开锁提醒": "Desbloquear Notificação", + "微信二维码": "Desbloquear Código QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Pessoas com chaves eletrônicas podem abrir a porta digitalizando este código QR através do WeChat. O código QR de cada bloqueio é diferente. Você pode imprimi-lo e colá-lo ao lado do bloqueio correspondente", + "锁编号": "Bloquear Número", + "电量": "Bateria", + "锁分组": "Grupo Bloqueio", + "选择分组": "Selecionar grupo", + "创建新分组": "Criar um Grupo", + "管理员开锁密码": "Código Administrador", + "更新": "Actualizar", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "O nível da bateria será atualizado pelo gateway ou telefone bluetooth", + "当屏幕闪烁时,点击下一步": "Clique próximo quando o teclado pisca", + "输入*529#或按设置键": "Digite README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # ou pressione a tecla Configurações", + "长按重置键2秒": "Pressione e segure o botão Reset 2 segundos", + "附近的设备": "Equipamento Próximo", + "暂无数据": "Sem dados", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Você poderá obter o status da porta com um sensor de porta junto com um gateway. Apenas um sensor pode associar-se a uma fechadura.", + "开始": "Começar", + "全天": "Todos os Horários", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Você pode definir vários períodos para o modo de passagem. Dentro dos períodos definidos, o bloqueio permanecerá em um estado aberto após ser desbloqueado.", + "请选择锁音量": "Por favor selecione bloquear volume", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Ao ligar, você vai ouvir o som do bloqueio", + "低": "Baixa", + "较低": "Médio baixo", + "中": "Médio", + "较高": "Médio alto", + "高": "Alto", + "开启后,锁被撬动时,会发出报警声": "Ao ligar, você habilita o alerta TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Ao desligar, o botão RESET é desativado.", + "校准时间": "Calibrar Tempo", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "O diagnóstico é ler as informações de configuração dentro do bloqueio e carregá-lo para que a equipe possa analisar a causa da falha", + "上传": "Carregar", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Carregar dados do cadeado para o servidor. Pode levar vários minutos", + "请选择要从哪把锁导入": "Selecione um bloqueio para importar de", + "有新版本": "Tenha nova versão", + "当前版本": "Versão Atual", + "升级": "Actualizar", + "空闲": "Vago", + "已入住": "Ocupado", + "多语言": "Línguas", + "添加锁": "Adicionar Bloqueio", + "锁地址": "Bloquear endereço", + "选择锁类型": "Selecione o tipo do fechamento", + "NFC无源锁": "NFC bloqueio passivo", + "添加设备": "Adicionar dispositivo", + "网关": "Gateway", + "客服": "Atendimento Cliente", + "设置": "Configurações", + "更多设置": "Mais Conjunto", + "消息推送": "Notificação push", + "锁用户管理": "Bloquear usuários", + "拥有的钥匙": "EKeys associados a este Usuário", + "批量授权": "Gestão Autoridade", + "关联设备": "Dispositivo associado", + "关联姓名": "Nome associado", + "转移智能锁": "Transferir Bloqueio", + "选择锁": "Bloqueio do ecrã", + "接收人信息": "Destinatário", + "转移网关": "Transferência Gateway", + "锁屏": "Bloqueio tela", + "已关闭": "Desligado", + "已开启": "Em", + "开启": "Ligar", + "确定要开启重置键?": "Continuar a activar o botão Reset?", + "确定要关闭重置键?": "Continuar a desativar o botão Reset?", + "隐藏无效开锁权限": "Ocultar acesso inválido", + "APP开锁时需手机连网的锁": "Fechaduras exigindo telefone online", + "增值服务": "Serviços", + "关于": "Sobre", + "退出": "Sair", + "删除账号": "Apagar Conta", + "个人信息": "Informações Conta", + "头像": "Avatar", + "昵称": "Apelido", + "请输入昵称": "Por favor insira seu apelido", + "修改昵称": "Renomear", + "修改账号": "Editar conta", + "重置密码": "Redefinir senha", + "安全问题": "Segurança Pergunta", + "为了你的账号安全,修改账号前请先使用验证码验证": "Para a segurança da sua conta, use a verificação da senha antes de modificar a conta", + "请输入新账号": "Por favor insira a nova conta", + "找回密码和登录新设备时,可通过绑定的手机验证": "O número do Telefone Vinculativo será usado para receber o Código de Verificação.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "O e-mail vinculativo será usado para receber o Código de Verificação.", + "原密码": "Senha Atual", + "新密码": "Nova senha", + "确认密码": "Confirmar senha", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Caso seu telefone seja perdido, você pode fazer login no novo telefone respondendo a perguntas de segurança.", + "问题一": "Questão 1", + "问题二": "Questão 2", + "问题三": "Pergunta 3", + "请输入你的答案": "Por favor digite Sua Resposta", + "即将到期": "Expira Brevemente", + "去授权": "Ir para autorizar", + "修改名称": "Editar Nome", + "状态": "Situação", + "WiFi名称": "Nome Wifi", + "网络MAC": "Rede MAC", + "网关升级": "Atualização do Gateway", + "网关连接的锁": "Bloqueio (s) ligado a este Gateway", + "信号强": "Forte", + "选择网关类型": "Escolha o tipo do gateway", + "添加网关": "Adicionar Gateway", + "重新通电": "Re Conecte o Poder", + "指示灯": "Luz indicadora", + "选择网关": "Escolha o Gateway", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G não é suportado,. Por favor, selecione um WiFi de 2.4G.", + "WiFi密码": "WiFi Passar", + "请输入WiFi密码": "Digite a senha WiFi", + "网关名称": "Nome do Gateway", + "请输入网关名称": "Digite o Nome do Gateway", + "IP地址": "Endereço IP", + "子网掩码": "Máscara sub-rede", + "默认网关": "Gateway padrão", + "自动获取DNS服务器地址": "Obter automaticamente o endereço do servidor DNS", + "首选DNS": "DNS preferido", + "备选DNS": "DNS alternativo", + "不使用静态IP": "Nenhum IP estático é usado", + "使用静态IP": "Usar IP estático", + "请输入IP地址": "Digite o endereço IP", + "请输入子网掩码": "Digite a máscara sub-rede", + "请输入默认网关": "Digite o Gateway Padrão", + "所有锁": "Todas as fechaduras", + "搜索所有类型的锁": "Analisar todos os tipos de fechaduras", + "门锁": "Fechadura porta", + "挂锁": "Cadeado", + "保险箱锁": "Bloqueio seguro", + "智能门禁": "Controle inteligente do acesso", + "车位锁": "Bloqueio do estacionamento", + "摸亮触摸屏": "Toque em qualquer tecla para ativar o teclado", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Por favor, toque em qualquer tecla para Ativar o Bloqueio e coloque-o no Modo EMPARELHAMENTO.", + "附近的锁": "Fechaduras Próximas", + "如需修改名字请重新命名,点击确定添加锁": "Se você quiser alterar o nome, renomeie, clique em OK para adicionar bloqueio", + "添加锁时,手机必须在锁旁边": "Ao adicionar um bloqueio, o telefone deve estar ao lado do bloqueio", + "登录": "Login", + "注册": "Registo", + "我已阅读并同意": "Já li e concordei", + "验证码": "Código", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Sua senha deve ter de 8 a 20 caracteres e incluir um mínimo de dois tipos de números, letras e símbolos", + "手机": "Telefone", + "邮箱": "Email", + "请输入邮箱": "Digite seu Email", + "国家/地区": "País/Região", + "你所在的国家/地区": "Seu país/região", + "选择国家/地区": "Escolha seu país ou região", + "获取验证码": "Obter Código", + "商务合作": "Negócios", + "电脑网页版": "Sistema Web", + "酒店系统": "Sistema hoteleiro", + "说明书网页版": "Manual do usuário", + "高级功能": "Função avançada", + "记录保存": "Retenção Registros", + "您可通过短信将密码、电子钥匙信息发给接收人。": "O SMS pode ser usado para enviar senha e informações eKey para o destinatário.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "O e-mail pode ser usado para enviar senha e informações eKey para o destinatário.", + "购买实名认证提示": "Depois que a função estiver ativada, você precisará usar sua impressão digital, rosto ou senha da conta para abrir o aplicativo. Não há necessidade de verificar novamente por 3 minutos", + "请选择你希望的实名认证频次": "Selecione por favor a frequência real da autenticação do nome que você quer", + "仅首次": "Pela primeira vez,", + "每日一次": "Uma vez por dia", + "每周一次": "Uma vez por semana", + "每月一次": "Uma vez por mês", + "当前状态": "Status atual", + "试用中": "Em julgamento", + "高级功能权益内容": "Funções avançadas", + "短信模板": "Modelo SMS", + "邮件模板": "Modelo Email", + "发卡工具": "Codificador do cartão", + "购买高级功能须知": "Aviso prévio", + "购买高级功能提示": "Recursos mais avançados estão em desenvolvimento e, se você precisar deles, poderá abrir o serviço com base no número de bloqueios. Recursos avançados estão disponíveis apenas para seus próprios bloqueios. Se você é um administrador autorizado, entre em contato com o administrador superior do bloqueio para abrir o serviço", + "免费体验": "Teste grátis", + "立即开通": "Abrir agora", + "购买短信": "Comprar SMS", + "购买邮件": "Comprar EMail", + "购买实名认证次数": "Comprar Autenticação Nome Real Vezes", + "开通高级功能": "Activar a função Avançada", + "选择套餐": "Escolha o pacote", + "支付方式": "Modo do pagamento", + "支付宝": "Alipay", + "去支付": "Pagar", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Você tem permissão para definir a mensagem por si mesmo. Ele é usado para enviar informações de senha e eKey para os outros.", + "高级功能仅能用于你自己的锁": "A função avançada só pode ser aplicado seus próprios bloqueios.", + "新建模板": "Criar modelo", + "类型": "Tipo", + "模版内容": "Conteúdo do Modelo", + "预览": "Antevisão", + "房间名": "Quarto", + "预计产生短信条数": "Segmentos estimados mensagem", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Este recurso permite que você esconda senhas, chaves, cartões e impressões digitais que são inválidos por um período de tempo.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "O telefone do usuário deve estar on-line para desbloquear esses bloqueios selecionados com o APP.", + "配置WiFi": "Configurar WiFi", + "请输入WiFi名字": "Por favor insira o nome Wifi", + "WiFi配网": "Rede Distribuição WiFi", + "胁迫卡": "Cartão Stress", + "员工是否有密码": "Já tem senha", + "员工是否有卡": "Já tem cartão", + "员工是否有指纹": "Já Definir a Impressão Digital", + "获取钥匙": "Obter chave", + "获取卡": "Obter cartão", + "获取指纹": "Obter impressões digitais", + "安全验证": "Verificação identidade", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Todas as informações da sua conta serão removidas da plataforma PERMANENTEMENTE e não poderão ser recuperadas. Deseja excluir?", + "监控": "Monitore", + "视频日志": "Log Vídeo", + "开门器": "Abridor porta", + "面容开锁": "Rosto desbloqueia", + "开门方向设置": "Conjunto Direção Abertura", + "电机功率设置": "Configuração MotorPower", + "开锁时是否需联网": "Se a Internet é Necessária Ao Desbloquear", + "选择要加入分组的锁": "Selecione lockS para adicionar a este grupo", + "锁数量": "Bloquear Contagem", + "小米IOT平台": "Plataforma Xiaomi IOT", + "面容开锁设置": "Face Desbloqueia Set", + "感应距离": "Detectando a distância", + "防误开": "Impedir abertura errada", + "防误开已关闭,关门后仍可使用面容开锁": "Evitar misopening foi fechado, depois de fechar a porta ainda pode usar o desbloqueio facial", + "添加和使用面容开锁时": "Adicionar e usar rosto ao desbloquear", + "添加和使用面容开锁时提示": "\n1, tente por favor manter uma única pessoa na frente da operação da porta;\n2, por favor, fique na frente da fechadura da porta cerca de 0,5 ~ 0,8 metros, enfrentando a fechadura da porta;\n3. Mantenha por favor sua cara desobstruída e exponha suas características faciais;\n4. Quando o reconhecimento facial é anormal, você pode tocar em qualquer tecla no teclado digital para reiniciar o reconhecimento facial manualmente.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Escolha por favor o poder do motor com cuidado de acordo com a situação real do fechamento da porta:", + "小功率:": "Miniwatt:", + "耗电少": "Menos consumo energético", + "大功率": "De alta potência:", + "大功率提示": "Se a língua do fechamento não pode ser retraída normalmente ao destravar, ou a necessidade de ser conduzida", + "开门方向设置提示": "Por favor, escolha cuidadosamente a direção para abrir a porta da sua casa (se você escolher a direção errada, você não será capaz de abrir e fechar a porta corretamente):", + "左开": "Abrir esquerda", + "右开": "Direita aberta", + "判断方法:": "Aprendizagem:", + "判断方法内容": "O homem ficou do lado de fora da casa diante da porta.", + "录像时段": "Vídeo slot", + "密码": "Códigos", + "卡": "Cartões", + "指纹": "Impressão digital", + "人脸": "Cara", + "配件商城": "Lock Mall", + "公司名称": "Nome Empresa", + "请输入公司名字": "Digite o Nome Empresa", + "提示": "Dica", + "是否删除?": "Quer para excluir?", + "员工信息": "Informação do pessoal", + "员工": "Pessoal", + "打卡方式无效": "Indisponível", + "中国": "China", + "选择钥匙": "Escolha ekey", + "编辑": "Editar", + "无": "Não", + "有": "Sim", + "请输入姓名": "Por favor insira um Nome", + "获取人脸": "Obtendo rostos", + "选择密码": "Escolha a senha", + "选择卡": "Escolha o cartão", + "选择指纹": "Escolher impressão digital", + "选择人脸": "Selecionar rosto", + "员工是否有人脸": "Se o empregado tem um rosto", + "同时删除员工钥匙": "Excluir seu/sua ekey", + "删除": "Delete", + "确定要删除员工吗?": "Excluir este funcionário", + "月统计": "Estatísticas mensais", + "迟到": "Atrasado", + "早退": "Saia cedo", + "未打卡": "Sem registro", + "钥匙将在": "Este ekey irá expirar em", + "天后失效": "Dia (s)", + "电量更新时间:": "Bateria atualizar o tempo:", + "新增配件": "Adicionar", + "钥匙不可用": "A chave não está disponível", + "正在开锁中...": "Destravar...", + "你的钥匙": "Sua chave", + "常开模式启动!长按闭锁": "Modo aberto iniciado! Pressione e segure para bloquear", + "演示模式": "Modo Demo", + "请先同意用户协议及隐私政策": "Favor concordar com o acordo do usuário e política de privacidade primeiro", + "用户协议": "Termos do usuário", + "隐私政策": "Política Privacidade", + "注册成功": "Registo bem sucedido", + "你所在的": "Você está em", + "手机号": "Número Telefone", + "忘记密码": "Esqueceu a senha", + "重置成功": "Redefinir o sucesso", + "确定要退出吗?": "Sair?", + "功能暂未开放": "A função ainda não está aberta", + "设置成功": "Configurar com sucesso", + "删除成功": "Excluir com sucesso", + "单次": "Uma vez", + "永久": "Permanente", + "限时": "Cronometrado", + "自定义": "Personalizado", + "清空码": "Apagar", + "循环": "Recorrente", + "工作日": "Dia do Trabalho", + "每日": "Diariamente", + "周末": "Fim Semana", + "确定要删除吗?": "Apagar?", + "该锁的密码都将被删除": "Todas as senhas para este bloqueio serão DELETADAS", + "已过期": "Inválido", + "该锁的电子钥匙都将被删除": "Todos os eKeys para este bloqueio serão DELETADOS", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Todos os eKeys associados a este eKey. Este Passo não pode ser UNDONE!", + "删除钥匙会在用户APP连网后生效": "O ekey será DELETADO", + "有效时间": "Tempo efetivo", + "接收者": "Destinatário", + "仅管理自己创建的用户": "Gerenciar apenas seus próprios usuários", + "远程开锁": "Desbloqueio remoto", + "请输入钥匙名称": "Por favor insira o nome da chave", + "修改成功": "Modificar o sucesso", + "冻结": "Congelar", + "解除冻结": "Dgelo", + "授权": "Autorizar", + "取消授权": "De-Autorizar", + "同时解冻其发送的钥匙": "Descongelar todas as eKeys emitidas por este usuário", + "会在用户APP连网后生效": "Este ekey será THAWED quando o aplicativo do usuário se conectar a uma rede", + "同时冻结其发送的钥匙": "Congelar todas as eKeys emitidas por este usuário", + "冻结会在用户APP连网后生效": "Este ekey será CONGELADO quando o APP do Usuário se conectar a uma Rede", + "取消授权会在用户APP连网后生效": "O usuário irá perder suas permissões quando o aplicativo do usuário se conectar a uma rede", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "O usuário autorizado tem quase as mesmas permissões que o gerenciador de bloqueio (por exemplo, capacidade de enviar chaves e senhas)", + "失效时间需晚于生效时间": "O tempo de expiração deve ser posterior ao tempo efetivo", + "生效时间需晚于当前时间": "O horário efetivo deve ser posterior ao horário atual", + "失效日期需晚于生效日期": "A data de expiração deve ser posterior à data efetiva", + "修改有效期": "Alterar Período", + "生效日期": "Data Início", + "失效日期": "Data final", + "开锁": "Desbloquear", + "开锁成功": "Desbloquear o sucesso", + "请选择锁": "Por favor selecione fechaduras", + "请选择接收者": "Por favor selecione o receptor", + "请选择有效期": "Por favor selecione período de validade", + "请选择发送方式": "Por favor selecione o método do envio", + "请选择结束时间": "Por favor selecione o tempo final", + "完成": "Completar", + "有效日": "Ciclo em", + "发送成功": "Enviar sucesso", + "请选择开始时间": "Por favor selecione a hora inicial", + "选择用户": "Selecionar destinatários", + "已选中": "Selecionados", + "确定": "OK", + "请选择要发送的锁": "Por favor selecione fechaduras", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "A autenticação de nome real do rosto refere-se à necessidade do usuário de verificar seu rosto antes de desbloquear o aplicativo do telefone, e a verificação pode ser desbloqueada.", + "分享": "Partilhar", + "请输入接收者账号": "Por favor insira a conta do destinatário", + "接收者号码未注册,请重新发送": "O número do receptor não está registrado, por favor reenvie", + "是否发送电子钥匙给未注册账号": "Você quer enviar um e-key para uma nova conta", + "取消": "Cancelar", + "标记成功": "Marcar sucesso", + "微信好友": "Amigos WeChat", + "短信": "SMS", + "邮件": "Email", + "更多": "Mais", + "您好,您的电子钥匙生成成功": "Olá, sua chave eletrônica é gerada com sucesso", + "生效时间不能小于当前时间": "O tempo efetivo não pode ser menor que o tempo atual", + "结束时间不能小于当前时间": "O tempo do fim não pode ser menor que o tempo atual", + "是否为管理员": "É um administrador", + "已连接到锁,请将卡靠近门锁的读卡区": "Conectado. Coloque o cartão contra o leitor", + "尝试连接设备...": "Conectando com Lock. Por favor aguarde...", + "地理位置": "Localização geográfica", + "检查以确保以下地址是正确的": "Verifique se o endereço a seguir está correto", + "地图加载中,请稍候。。": "O mapa está carregando, por favor aguarde...", + "跳过": "Saltar", + "还未获取到位置信息哦,请耐心等待一下!": "As informações de localização ainda não foram obtidas, por favor aguarde pacientemente!", + "请填写信息": "Por favor, preencha as informações", + "有效期": "Período validade", + "生效时间": "Hora do início", + "失效时间": "Hora final", + "上传成功": "Carregado com sucesso", + "未生效": "Inativo", + "已生效": "Eficaz", + "指纹详情": "Informações impressões digitais", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Você será solicitado a colocar o dedo no sensor várias vezes. Por favor, siga as instruções...", + "开始添加": "Começar", + "请将您的手指按下": "Coloque o dedo sobre o sensor", + "根据提示,抬起手指后再进行下一次指纹采集": "Siga as instruções... Você será solicitado a remover e colocar o dedo no sensor para o próximo registro", + "添加成功": "Adicionar sucesso", + "更新成功": "Atualize o sucesso", + "搜索": "Pesquisa", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Após a redefinição, o cartão do bloqueio será excluído, você deseja redefinir?", + "已失效": "Inválido", + "卡详情": "Informação do cartão", + "请输入": "Por favor entre aqui", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Ao desligar, o bloqueio permanecerá desbloqueado o dia todo até que seja bloqueado manualmente", + "请输入小于或等于60的数字": "Por favor insira um número menor que 60", + "操作成功": "Operação bem sucedida", + "管理员密码相同,无需修改": "A senha do administrador é a mesma e não precisa ser modificada", + "请输入6-9位数字": "6-9 Dígitos de comprimento", + "请输入6-9位管理员密码": "Por favor insira uma senha de administrador 6-9 dígitos", + "请输入新的管理员密码": "Por favor insira uma nova senha do administrador", + "未分组": "Desagrupados", + "请输入分组名称": "Criar um Grupo", + "创建成功": "Criar sucesso", + "设置锁分组成功": "Definir o grupo bloqueio com sucesso", + "电池1电量": "Bateria 1", + "电池2电量": "Bateria 2", + "电量更新时间": "Bateria atualização tempo", + "锁电量更新成功": "Bloquear o sucesso atualização do poder", + "您的钥匙未生效": "Sua chave não é eficaz", + "您的钥匙已冻结": "Sua chave foi congelada", + "您的钥匙已过期": "A sua chave expirou", + "常开模式开启": "O bloqueio está no Modo Passagem", + "超级管理员": "Super administrador", + "授权管理员": "Administrador autorizado", + "普通用户": "Utilizador comum", + "余": "Saldo", + "天": "Dia", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Depois de excluir o bloqueio, todas as informações serão excluídas juntas, você tem certeza de que deseja excluir o bloqueio?", + "请输入登录密码": "Por favor insira a senha do aplicativo", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Falha ao excluir o dispositivo, certifique-se de que o dispositivo está perto do dispositivo, o dispositivo não está conectado e o dispositivo está ligado", + "用户无权限": "O usuário não tem permissão", + "创建公司后,考勤功能才能使用": "Por favor crie uma empresa primeiro", + "是否删除钥匙?": "Apagar este Ekey?", + "邮箱绑定成功": "Email sucesso vinculativo", + "手机绑定成功": "Telefone móvel sucesso vinculativo", + "网络访问失败,请检查网络是否正常": "Pedido Falha. Rede indisponível, por favor verifique e conecte seu dispositivo a 3G/4G/WIFI", + "清空": "Limpar", + "是否清空?": "Limpo?", + "消息详情": "Mensagem Info", + "创建时间": "Criação tempo", + "管理员详情": "Detalhes do administrador", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Se alguém o forçar a abrir a porta, poderá usar este cartão. A mensagem de alarme será enviada para os administradores. Para usar esta funcionalidade, certifique-se por favor que o seu cadeado está online.", + "请不要将胁迫卡用于日常开锁": "Por favor, não use o cartão forçado para uso diário.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Se alguém o forçar a abrir a porta, você poderá usar esta impressão digital. A mensagem de alarme será enviada para os administradores. Para usar esta funcionalidade, certifique-se por favor que o seu cadeado está online.", + "请不要将胁迫指纹用于日常开锁": "Por favor, não use a impressão digital forçada para uso diário.", + "创建公司": "Criar uma empresa", + "公司名称不能超过30个字符": "O nome da empresa não pode exceder 30 caracteres", + "公司名称不能小于6个字符": "O nome da empresa não pode ter menos de 6 caracteres", + "WIFI列表": "Lista WIFI", + "刷新": "Atualizar", + "手动配网": "Distribuição manual rede", + "远距离": "Longa distância", + "中距离": "Distância média", + "近距离": "Curta distância", + "锁时间更新成功": "Bloquear tempo atualizar sucesso", + "锁用户": "Bloquear usuários", + "请选择常开日期": "Por favor selecione a data aberta", + "结束时间不能小于开始时间哦": "A hora final não pode ser menor que a hora inicial", + "介绍": "Nossa História", + "个人信息收集清单": "Coleta informações pessoais lista", + "应用权限说明": "Descrição permissão do aplicativo", + "第三方信息共享清单": "Informações do terceiro compartilhando lista", + "请选择您的位置": "Por favor selecione sua localização", + "请先选择位置": "Por favor selecione o local primeiro", + "管理员密码": "Código do administrador", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Se você precisar modificar, digite uma nova senha de administrador (6 dígitos), clique em OK para modificar", + "修改": "Modificar", + "网络摄像头": "Câmera", + "重命名": "Renomear", + "分组下的锁将被移到未分组里": "Bloqueios sob o grupo serão movidos para desagrupados", + "编辑成功": "Editar sucesso", + "厂商": "Fabricante", + "型号": "Modelo", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Depois que a senha for gerada, use-a uma vez para ativação antes das 23:59 no mesmo dia, caso contrário, ela será inválida após as 0 horas. Depois que a senha é ativada, ela pode ser usada ilimitadamente dentro do período de validade.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Depois que a senha for gerada, use-a antes das 23:59 do mesmo dia, caso contrário, ela será inválida após as 0 horas. O código claro é usado para limpar todas as senhas geradas antes das 0 horas hoje.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Depois que a senha for gerada, use-a antes das 23:59 do mesmo dia, caso contrário, ela será inválida após as 0 horas.", + "清空密码底部提示": "A senha é válida até as 23:59 do dia do esvaziamento", + "相机": "Câmera", + "相册": "Fotos", + "读写": "Armazenamento", + "定位": "Localização", + "需要访问相机权限才能拍照上传文件例如头像上传": "O acesso à câmera é necessário para tirar fotos e carregar arquivos, como carregar uma foto de perfil", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Acesso à câmera é necessário para carregar arquivos e avatares usando imagens do álbum", + "需要访问读写权限才能使用本地图片上传头像": "Acesso a permissões de leitura e gravação é necessário para carregar avatares usando imagens locais", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Acesso a informações de localização é necessário para usar a função add key", + "申请": "Aplicação", + "权限": "Permissão", + "不允许": "Não Permitido", + "允许": "Permitido", + "权限被拒绝": "Permissão negada", + "请手动在系统设置中开启": "Por favor habilite-o manualmente nas configurações do sistema", + "权限以继续使用应用": "Permissão para continuar usando o aplicativo.", + "去设置": "Vá configurá-lo", + "当前网络": "Rede atual", + "位置信息": "Informações sobre a localização", + "请输入wifi名称": "Por favor insira o nome do wifi", + "虹膜": "Íris", + "手掌": "Palma", + "商城": "Shopping", + "我的": "Meu", + "微信公众号推送": "Conta pública Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Para abrir o wechat para receber mensagens de alarme, você precisa prestar atenção à conta pública do Skye Smart Lock wechat primeiro, salve o código QR e use o wechat para digitalizar as configurações", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Acesso a permissões Bluetooth é necessário para usar as informações de localização da função adicionar chave", + "请输入Email": "Digite seu Email", + "请输入手机号": "Insira o número do telefone", + "家人到家": "O familiar chegou a casa", + "添加家人": "Adicionar membro família", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Se o cadeado não estiver conectado à Internet, lembretes de senha, cartão, impressão digital e outros métodos de abertura de porta não poderão ser enviados em tempo hábil.", + "消息提醒": "Lembrete", + "开门通知": "Abertura do aviso", + "N天未开门": "N dias sem porta aberta", + "门未关好": "A porta não está fechada", + "防拆报警": "Alarme inviolável", + "低电量提醒": "Bateria fraca", + "胁迫开门": "Abertura forçada porta", + "有人按门铃": "Alguém toca a campainha", + "有人出现在门口": "Alguém aparece na porta", + "提醒方式": "Método do lembrete", + "开门方式": "Porta abrindo método", + "请选择": "Por favor selecione", + "家人": "Membro familiar", + "保存": "Guardar", + "APP推送": "Push APP", + "管理员": "Administrador", + "未启用": "Não habilitado", + "已启用": "Activado", + "省电模式": "Modo economia energia", + "逗留抓拍模式": "Manter o modo captura", + "实时监控模式": "Modo de monitoramento em tempo real", + "自定义模式": "Modo personalizado", + "猫眼设置": "Configuração do olho do gato", + "猫眼工作模式": "Modo trabalho olho gato", + "自动亮屏": "Tela brilhante automática", + "亮屏持续时间": "Tela no tempo", + "逗留警告": "Fique avisando", + "异常警告": "Aviso anormal", + "短信提醒": "SMS", + "邮件提醒": "Email", + "N天未开门提醒": "N dias sem porta aberta", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Se alguém te forçar a abrir o cadeado, você pode usar essa impressão digital. A mensagem de alarme será enviada para os administradores. Para usar este recurso, verifique se o seu bloqueio está online.", + "胁迫指纹": "Impressão digital forçada", + "指纹列表": "Lista impressões digitais", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Após o tempo definido, se o bloqueio não for aberto, o sistema enviará uma mensagem de lembrete ao destinatário designado. Esta função requer que o bloqueio seja conectado à Internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Depois de ativar o lembrete, quando a bateria de bloqueio estiver abaixo de 20%, 10% e 5%, o sistema enviará uma mensagem de lembrete ao destinatário designado.", + "未开门时间": "Dias sem porta aberta", + "添加和使用面容开锁时:": "Adicione e use o Face ao desbloquear:", + "关锁": "Fechar bloqueio", + "功能": "Função", + "配件": "Peças", + "云存": "Armazenamento Cloud", + "本地": "Esta localidade", + "3天滚动储存": "3 dias rolamento armazenamento", + "去升级": "Atualize agora", + "下载列表": "Baixar lista", + "已下载": "Baixado", + "全部视频": "Todos os vídeos", + "已为本设备免费提供3大滚动视频储存服务": "Três serviços de armazenamento de vídeo de rolagem foram fornecidos para este dispositivo gratuitamente", + "视频播放": "Reprodução vídeo", + "全选": "Todos", + "请选择要删除的视频": "Por favor selecione o vídeo que você deseja excluir", + "请选择要下载的视频": "Por favor selecione o vídeo que você deseja baixar", + "欢迎使用": "Bem-vindo ao uso", + "用户协议和隐私政策概要": "Resumo do Acordo do Usuário e Política De Privacidade", + "协议概要": "Resumo do Protocolo", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Obrigado por ter usado este aplicativo. Damos grande importância às suas informações pessoais e proteção à privacidade. Antes de usar este produto, leia atentamente", + "《用户协议》": "Termos do usuário", + "和": "E", + "《隐私政策》": "《 Política De Privacidade 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Todo o conteúdo de. Ao clicar em \"Concordo\", você concorda e aceita todos os termos. Se você optar por não concordar, você não será capaz de usar nossos produtos e serviços e vai sair do aplicativo.", + "不同意": "Discordo", + "同意": "Concordo", + "该功能是高级功能,请开通后再使用": "Esta é a função avançada. Por favor habilite-o primeiro.", + "常用程序": "Programas comuns", + "该锁已被重置": "A fechadura foi reiniciada", + "需要访问读写权限才能使用手动升级固件": "Acesso a permissões de leitura e escrita é necessário para atualizar manualmente o firmware", + "错误D固件,请选择正确的文件": "Firmware errado, por favor selecione o arquivo correto", + "非SYD固件,请选择正确的文件": "Não SYD firmware, por favor selecione o arquivo correto", + "文件校验失败 0x01": "Verificação do arquivo falhou 0x01", + "解析元数据失败,请选择正确的文件": "Falha ao analisar metadados, por favor selecione o arquivo correto", + "文件校验失败 0x02": "Verificação do arquivo falhou 0x02", + "文件校验失败 0x03": "Verificação do arquivo falhou 0x03", + "固件升级完成": "Atualização do firmware concluída", + "记录": "Registos", + "开通高级功能后才可以对锁进行管理": "Por favor habilite a função avançada primeiro para gerenciar bloqueios.", + "去开通": "Activar", + "实名认证": "Autenticação de nome real", + "当前剩余数量": "Restante", + "购买": "Comprar", + "实名认证为付费功能,请购买后再使用": "A autenticação de nome real é uma função paga, use-a após a compra", + "密码不一致哦": "As senhas são inconsistentes", + "退出添加": "Sair adicionando", + "管理员已满": "Admin completo", + "用户已满": "O usuário está cheio", + "锁上面添加指纹已满": "Adicionar impressão digital no bloqueio está cheio", + "指纹已存在": "A impressão digital já existe.", + "锁上面添加人脸已满": "Bloquear acima adicionar rosto está cheio", + "人脸已存在": "O rosto já existe", + "锁上面添加卡已满": "Bloquear acima adicionar cartão está cheio", + "卡已存在": "O cartão já existe", + "锁上面添加密码已满": "Bloquear acima adicionar senha está cheio", + "密码已存在": "Já existe uma senha idêntica. Por favor, escolha uma diferente", + "请输入密码": "Por favor insira a senha", + "暂无密码,无需重置": "Sem senha, sem necessidade de redefinir", + "真实姓名": "Nome verdadeiro", + "身份证号": "Número ID", + "请输入真实姓名": "Por favor introduza o seu nome verdadeiro", + "请输入身份证号": "Por favor introduza o seu número ID", + "请输入身份证号和真实姓名": "Por favor introduza o seu número ID e nome real", + "点击返回设备配对": "Toque Voltar ao emparelhamento do dispositivo", + "无法连接?尝试升级": "Não consegue conectar? Atualização tentada", + "固件升级提示": "Atualização do firmware", + "请先获取固件文件到手机本地,再选择升级": "Por favor, obtenha o arquivo de firmware para o telefone local primeiro e selecione Atualizar", + "固件升级中": "O firmware está sendo atualizado", + "取消升级": "Cancelar a atualização", + "固件传输中": "Firmware em trânsito", + "关闭": "Desligar", + "传输中'": "Em trânsito", + "操作记录": "Registos", + "修改姓名": "Editar Nome", + "传输中": "Em trânsito", + "发送人": "Emitido por", + "发送时间": "Tempo emitido", + "钥匙详情": "Informações do ekey", + "姓名": "Nome", + "发送": "Enviar", + "请确认姓名全名和身份证号码是否正确": "Por favor confirme se o nome completo e o número ID estão corretos", + "传输期间请勿离开当前页面": "Não saia da página atual durante a transferência", + "机型": "Modelos", + "硬件版本": "Versão do hardware", + "固件版本": "Versão do firmware", + "手动升级": "Atualização manual", + "设备连接中...": "Conexão do dispositivo...", + "未避免异常情况,请在门打开时升级": "Exceções inevitáveis, atualize por favor quando a porta está aberta", + "钥匙无效": "A chave é inválida", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Não é possível conectar ao bloqueio. Por favor, reinicie o Blutooth do seu telefone e tente novamente.", + "如果是全自动锁,请使屏幕变亮": "Se é um fechamento totalmente automático, faça por favor a tela mais brilhante", + "正在尝试闭锁……": "Tentando trancar, por favor, espere...", + "清空记录": "Limpar registros", + "是否要删除操作记录?": "Continuar a apagar registos?", + "被删除的记录不能恢复": "Os registros não podem ser recuperados após a exclusão.", + "全部事件": "Todos os eventos", + "开锁事件": "Desbloquear evento", + "异常事件": "Evento anormal", + "门铃事件": "Evento campainha", + "视频事件": "Vídeo evento", + "请开启蓝牙": "Por favor ligue Bluetooth On", + "请选择有效日": "Por favor selecione o dia efetivo", + "公司名字长度不能小于 6 ": "O comprimento do nome da empresa não pode ser inferior a 6", + "已是最新版本": "Sem atualizações", + "新建短信模版": "Criar modelo SMS", + "新建邮件模版": "Criar modelo email", + "自定义短信模版": "Modelo SMS", + "自定义邮件模版": "Modelo do email", + "名称": "Nome", + "星星锁": "Bloqueio estrela", + "无考勤记录": "Sem registros", + "大家干劲十足": "Todos chegam a tempo", + "工作时长未出炉": "Sem horas trabalho", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "A escolha do país/região afetará a segurança dos dados. Você selecionou a Albânia, confirme antes de prosseguir.", + "确认国家或地区": "Confirmar país/região", + "我知道了": "Entendi", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Para receber atualizações importantes, clique em 'OK' e ative as notificações nas configurações.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Depois de ligar, você pode re-ligar por muito tempo pressionando a tecla de configuração no bloqueio, e re-adicioná-lo com o APP", + "已有": "Atual", + "新增": "Novo", + "账号格式错误": "Formato ruim", + "接收者信息为空": "As informações do destinatário estão vazias", + "请输入时间(秒)": "Por favor insira a hora (seg)", + "加载数据失败": "Falha ao carregar dados", + "重试": "Tente novamente", + "升级中,是否退出": "Durante a atualização, se deve sair", + "下一步": "Próximo", + "公寓": "Apartamento", + "个人用户": "Pessoal", + "星寓": "Apartamento Star", + "账号": "Conta", + "请输入手机号或email": "Telefone ou Email", + "请输入星寓管理员的账号": "Por favor, insira a conta do administrador do apartamento estrela", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Todos os dados do cadeado (s) selecionado (s) serão transferidos permanentemente para o destinatário.", + "暂不支持跨平台转移,敬请期待": "A transferência entre plataformas não é suportada por enquanto, por favor, aguarde", + "移除坏锁": "Mover fechaduras defeituosas/danificadas para o lixo", + "转移确认": "Confirmar transferência", + "本次共转移": "Desta vez um total de", + "把智能锁": "Bloqueio inteligente", + "确认": "OK", + "移除成功": "Remover com sucesso", + "转移成功": "Transferir sucesso", + "该已锁被删除": "O bloqueado é excluído", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "O administrador autorizado só pode gerenciar senhas, eKeys e etccreated por si mesmo.", + "添加授权管理员": "Criar administrador", + "导出记录": "Exportar registros", + "选择时间段": "Selecione o período", + "导出": "Exportação", + "批量导出": "Exportação lote", + "读取记录": "Atualizar Registros", + "设备": "Dispositivo", + "消息": "Mensagens", + "智能分析": "Análise inteligente", + "精准识别设备事件,过滤无效信息": "Identifique com precisão eventos do dispositivo e filtre informações inválidas", + "系统设置": "Configurações do sistema", + "系统的全局配置在此项内进行设置": "A configuração global do sistema é definida neste item", + "导出操作记录": "Exportar registros", + "立即查看": "Ver", + "导出成功": "Exportado com sucesso", + "发送钥匙": "Enviar ekey", + "进度": "Taxa", + "失败": "Falha", + "人脸详情": "Detalhes do rosto", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Quando alguém é detectado cerca de 1,5 metros na frente da porta, o desbloqueio do reconhecimento facial será iniciado automaticamente.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Quando alguém é detectado cerca de 0,8 metros na frente da porta, o desbloqueio do reconhecimento facial será iniciado automaticamente.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Quando alguém é detectado cerca de 0,5 metros na frente da porta, o desbloqueio do reconhecimento facial será iniciado automaticamente.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "A distância de detecção foi desligada, você precisa tocar manualmente em qualquer tecla do teclado para realizar o desbloqueio do reconhecimento facial.", + "防误开已打开,开锁后": "A abertura anti-erro foi ligada e, após o desbloqueio", + "秒内不可使用面容开锁": "O desbloqueio facial não pode ser usado em segundos", + "掌静脉": "Veia palma", + "添加掌静脉": "Adicionar palma veia", + "胁迫掌静脉": "Veia palmar forçada", + "请不要将胁迫掌静脉用于日常开锁": "Por favor, não use palma coerção veias para desbloqueio diário", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Conectado ao fechamento, abra naturalmente sua palma, a palma está enfrentando a câmera", + "掌静脉详情": "Detalhes Palm veia", + "掌静脉号": "Palm veia número", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth não está ligado, por favor, ligue o Bluetooth nas configurações", + "删除用户时,会将用户拥有的钥匙一起删除。": "Se um usuário for apagado, quaisquer eKeys associadas ao usuário também serão apagadas.", + "配置网络": "Configurar rede", + "你好": "Olá", + "成功": "Sucesso", + "类型选择": "Tipo selecionar", + "请选择要使用哪种类型": "Por favor seleccione o tipo a utilizar", + "系统邮件(推荐)": "Email do sistema (recomendado)", + "系统短信(推荐)": "Sistema SMS (Recomendado)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "O e-mail será enviado a partir deste App.Please comprar pacote de e-mail primeiro.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "O SMS será enviado a partir deste App.Please comprar e-mail pacote primeiro.", + "个人邮件": "Email pessoal", + "个人短信": "SMS pessoais", + "邮件将从你的个人邮箱发给用户": "O email será enviado da sua conta de email pessoal.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "A mensagem SMS será enviada do seu número de telefone pessoal. Você paga ao seu operador de telecomunicações.", + "为了更好地应用体验,请确定权限": "Para uma melhor experiência do aplicativo, por favor confirme as permissões", + "您第一次拒绝权限,请确定权限": "Você recusou a permissão pela primeira vez, por favor confirme a permissão", + "您第二次拒绝权限,请去应用设置开启权限": "Você recusou a permissão pela segunda vez, vá para as configurações do aplicativo para ativar a permissão", + "去应用市场": "Ir para a App Store", + "温馨提示": "Prompt quente", + "关闭应用": "Fechar a aplicação", + "开启微信接收报警消息需要先关注": "Para abrir o WeChat para receber mensagens de alarme, você precisa seguir", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Conta pública do WeChat, salve o código QR e use o WeChat para digitalizar as configurações", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "A autenticação de nome real é uma função paga, entre em contato com o administrador do bloqueio para comprar e usar", + "位置权限": "Localização permissão", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Por favor, conceda o aplicativo para usar seu locatian.It é usado para digitalizar bloqueios BLE e gateways.", + "相机/相册权限": "Permissão Camera/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Por favor conceda o aplicativo para ler e escrever fotos e arquivos do armazenamento.", + "点击选择": "Clique para selecionar", + "微信": "WeChat", + "朋友圈": "Momentos", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Ligação", + "今天": "Hoje", + "密码错误": "Senha inválida", + "网络中断": "Interrupção rede", + "钥匙不存在": "A chave não existe", + "钥匙过期": "Chave expirada", + "钥匙已存在": "A chave já existe", + "密码失效": "Senha inválida", + "门锁时间异常": "Porta bloquear tempo anormal", + "APP(手机)未联网": "APP (telefone celular) não está conectado à Internet", + "数据不存在": "Dados não existem", + "待接收": "Sejam Recebidos", + "已冻结": "Congelados", + "已删除": "Suprimido", + "未知": "Desconhecido", + "拖动下方滑块完成拼图": "Arraste o controle deslizante para a posição correta", + "验证成功": "Verificação do sucesso", + "验证失败": "A verificação falhou", + "向右拖动滑块填充拼图": "Arraste o controle deslizante para a direita para preencher o quebra-cabeça", + "请先获取到位置信息哦": "Por favor obter as informações de localização primeiro", + "请选择国家": "Por favor selecione um país", + "获取锁信息": "Obter informações do bloqueio", + "锁数据异常,请重试": "Bloquear dados é anormal, por favor tente novamente", + "连接设备中...": "Ligar o dispositivo...", + "把锁": "Fechaduras", + "条": "Tira", + "封": "Selo", + "次": "Vezes", + "支付成功": "Pague o sucesso", + "查看详情": "Ver detalhes", + "请输入模板名称": "Por favor insira o nome do modelo", + "模版类型": "Tipo", + "再返回一次退出": "Sair novamente", + "请先添加锁": "Por favor adicione o cadeado primeiro", + "可视对讲": "Intercomunicador visual", + "详细日志": "Registo detalhado", + "已复制到剪切板": "Copiado", + "拍照": "Foto", + "从相册选择": "Escolha do álbum", + "选择问题": "Por favor selecione uma pergunta", + "确认长度不足8位": "Confirmar comprimento inferior a 8 dígitos", + "新密码长度不足8位": "Nova senha comprimento inferior a 8 dígitos", + "两次密码不一致": "Password Mismatch. Por favor tente novamente", + "请点击获取验证码,验证码将发送到": "Por favor, obtenha um código de verificação. O código será enviado para", + "切换": "Mudar", + "验证": "Verificar", + "验证成功,账号已删除": "Verificação bem sucedida, conta excluída", + "该密码不是自定义密码,无法修改": "Esta senha não é uma senha personalizada e não pode ser modificada", + "请选择设备要关联哪些姓名": "Por favor selecione quais nomes o dispositivo deve ser associado com", + "请选择姓名要关联哪些设备": "Por favor selecione a quais dispositivos o nome deve ser associado", + "确定要移除所选中的坏锁吗?": "Remover a fechadura defeituosa?", + "邮件通知": "Notificar por email", + "短信通知": "Notificar via SMS", + "您好,您的授权管理员生成成功": "Olá, seu administrador autorizado foi gerado com sucesso", + "请输入接收者姓名": "Por favor entre aqui", + "版本更新": "Atualização versão", + "下次再说": "Próxima vez", + "配网成功": "Distribuição sucesso rede", + "配网失败": "Distribuição rede falhou", + "该锁的无线键盘都将被删除": "Todos os teclados sem fio para este bloqueio serão DELETADOS", + "实时画面": "Imagem em tempo real", + "适合门口较为安全的环境。": "Adequado para ambientes relativamente seguros na porta.", + "仅发生特定事件才录像,并可查看实时画面。": "Apenas eventos específicos são registrados e a imagem em tempo real pode ser visualizada.", + "一般情况下,满电可使用7-8个月": "Em circunstâncias normais, pode ser usado por 7-8 meses quando carregado inteiramente", + "有人逗留或发生特定事件才录像,可随时查看": "Alguém permanece ou eventos específicos são registrados, e pode ser visto a qualquer momento", + "实时画面。": "Imagem em tempo real.", + "一般情况下,满电可使用5~6个月。": "Em circunstâncias normais, pode ser usado por 5 ~ 6 meses quando carregado inteiramente.", + "适合门口人员复杂、较不安全的环境。": "Adequado para ambientes complexos e relativamente inseguros na porta.", + "有人出现就录像,可随时查看实时画面。": "Grave quando alguém aparece e veja a imagem em tempo real a qualquer momento.", + "一般情况下,满电可使用2~4个月。": "Em circunstâncias normais, pode ser usado por 2 ~ 4 meses quando carregado inteiramente.", + "根据您家门口实际情况设置录像和实时画面功能。": "Defina as funções de vídeo e imagem em tempo real de acordo com a situação real à sua porta.", + "可使用时长由具体设置决定。": "A duração do uso é determinada pelas configurações específicas.", + "查看": "Ver", + "有人按门铃或发生": "Alguém toca a campainha ou", + "异常事件时": "Evento anormal", + "不录像": "Nenhum vídeo", + "有人出现、按门铃": "Alguém aparece, toca a campainha", + "或发生异常事件时": "Ou um evento anormal ocorre", + "逗留达到10秒": "Fique por 10 segundos", + "约1.5米": "Aproximadamente 1,5 medidores", + "随时": "Sempre", + "立即录像": "Gravar imediatamente", + "录像时机": "Tempo video", + "有人出现时录像": "Gravar quando alguém aparece", + "人体侦测距离": "Distância detecção humana", + "查看实时画面": "Ver imagem em tempo real", + "自定义时间": "Tempo personalizado", + "当日": "Hoje", + "次日": "Dia seguinte", + "自定义时段": "Período personalizado", + "发生事件时查看": "Ver quando ocorre um evento", + "实时查看": "Vista em tempo real", + "有人在门口出现10秒后开始录像。": "Alguém aparece na porta por 10 segundos antes de gravar.", + "有人按门铃时立即录像。": "Grave imediatamente quando alguém tocar a campainha.", + "有人出现在门前1.5米范围时启动录像": "Comece a gravar quando alguém aparecer dentro de 1,5 metros na frente da porta", + "约0.8米": "Aproximadamente 0,8 medidores", + "约3.0米": "Aproximadamente 3,0 medidores", + "添加指纹失败": "A operação falhou.", + "项": "Itens", + "播放中": "Jogando", + "下载": "Descarregar", + "暂无下载内容": "Sem baixar conteúdo", + "亮度": "Brilho", + "音量": "Volume", + "快进至": "Avanço rápido para", + "快退至": "Rebobinar para", + "暂无视频信息": "Nenhuma informação do vídeo", + "加载出错": "Carregando erro", + "请单人正对门锁,距离一个成年人手臂长度": "Por favor, fique na frente da fechadura da porta sozinho, no comprimento de um braço", + "(约0.6米)。": "(Aproximadamente 0,6 metros).", + "保持脸部无遮挡,露出五官。": "Mantenha seu rosto desobstruído e mostre suas características faciais.", + "准备好了,开始添加": "Pronto, comece a adicionar", + "正在录入中...": "Gravando...", + "添加人脸失败": "Falha ao adicionar face", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Após a redefinição, as faces do bloqueio serão excluídas. Tens a certeza que queres reiniciar?", + "人脸号": "Número do rosto", + "虹膜详情": "Iris detalhes", + "虹膜号": "Número Iris", + "选择设备类型": "Selecione o tipo do dispositivo", + "照明灯具": "Luminárias", + "电动窗帘": "Cortinas elétricas", + "门窗传感器": "Sensor porta e janela", + "传感器": "Sensor", + "清除数据成功": "Dados apagados com sucesso", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "O bloqueio não está conectado à Internet, portanto, os recodificadores de senha, cartão, impressão digital e outros métodos de abertura de porta não podem ser carregados em tempo real.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Se você precisa manter os registros históricos, você pode exportá-los.", + "看不到操作记录,可能原因有": "Impossível ver os registros da operação, possíveis razões", + "操作记录详情": "Detalhes do registro operação", + "操作时间": "Tempo operação", + "此模块功能需要锁联网后设置方可生效": "Esta função do módulo precisa de ser ajustado depois que o fechamento é conectado ao Internet para tomar o efeito", + "用户已存在": "O usuário já existe", + "钥匙数量已到上限": "O número de chaves atingiu o limite superior", + "附近没有可用网关": "Não há um gateway disponível próximo", + "正在创建安全连接...": "Criando uma conexão segura...", + "监视状态下不能发送录音": "Impossível enviar gravações no modo monitoramento", + "挂断": "Desligue", + "监视中暂不能开锁": "O desbloqueio não está disponível durante o monitoramento", + "长按说话": "Pressione e segure para falar", + "松开发送": "Liberação para enviar", + "请输入6位数字开锁密码": "Por favor insira uma senha de desbloqueio de 6 dígitos", + "请输入开锁密码": "Por favor digite a senha do desbloqueio", + "接收者在有效期内可以不限次数使用": "Os destinatários podem usar as eKeys por tempos ilimitados dentro do período de validade.", + "接收者可以使用此App开关锁": "O destinatário é capaz de bloquear/desbloquear por este aplicativo.", + "单次钥匙有效期为1小时,只能使用一次": "A chave única é válida por UMA hora e só pode ser usada UMA VEZ.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Os destinatários podem usar as eKeys por tempos ilimitados dentro do tempo de ciclo fixo.", + "获取模板失败": "Falha ao obter o modelo", + "微信通知": "Notificação WeChat", + "系统短信": "Sistema SMS", + "系统邮件": "Email do sistema", + "模板": "Modelo", + "新建模版": "Criar modelo", + "您好,您的密码是": "Olá, sua senha é", + "密码名字": "Nome senha", + "请输入6-9位密码": "Por favor insira uma senha de 6 a 9 dígitos", + "设置密码": "Definir senha", + "操作成功,密码为": "Sucedido. A senha é", + "类型:自定义-永久": "Tipo: Personalizado-Permanente", + "实时播放": "Reprodução em tempo real", + "点击对讲": "Clique para interfone", + "长按开锁": "Pressione longamente para desbloquear", + "接听失败": "Falha ao responder", + "请在锁设置中开启远程开锁": "Por favor habilite o desbloqueio remoto nas configurações de bloqueio", + "接听": "Responder", + "截图已保存到相册": "Imagem salva no álbum", + "添加遥控": "Adicionar controle remoto", + "已连接到锁,请按遥控": "Conectado ao fechamento, pressione por favor o controlo a distância", + "遥控号": "Número do controle remoto", + "遥控详情": "Detalhes do controle remoto", + "照明": "Iluminação", + "退出演示模式": "Sair do modo demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Dica: A interface atual é uma interface gráfica. Após adicionar o dispositivo, você pode continuar a usá-lo", + "门已上锁": "A porta está trancada", + "您的账号在异地登录,如非本人,请尽快修改密码": "Sua conta foi usada para fazer login de um novo dispositivo", + "开门成功": "Abra a porta com sucesso", + "开门失败": "Falha ao abrir a porta", + "呼叫提醒": "Chamada lembrete", + "收到来自": "Recebido de", + "锁的呼叫": "Bloquear chamada", + "加载数据中": "Carregando dados", + "搜索所有锁类型": "Pesquisar todos os tipos bloqueio", + "锁电量更新时间": "Bloquear bateria atualização tempo", + "1月": "Jan", + "2月": "Fev", + "3月": "Mar", + "4月": "Abr", + "5月": "Maio", + "6月": "Junho", + "7月": "Jul", + "8月": "Agosto", + "9月": "Set", + "10月": "Outubro", + "11月": "Novembro", + "12月": "Dez", + "热门城市": "Cidades quentes", + "导出锁数据": "Exportar dados do bloqueio", + "一键开锁": "Desbloqueio com um clique", + "已开通": "Aberto", + "编辑员工": "Editar a equipe", + "一": "Um", + "二": "Dois", + "三": "Três", + "四": "Quatro", + "五": "Cinco", + "六": "Seis", + "日": "Sol", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Comprar registro", + "使用记录": "Registro do usuário", + "失效时间要大于当前时间": "O tempo de expiração deve ser maior que o tempo atual", + "修改名字": "Editar nome", + "时": "Hora", + "分": "Minuto", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Você pode usar Alexa para desbloquear, bloquear e verificar o status do bloqueio", + "支持的国家": "Países suportados", + "支持的国家值": "EUA, Canadá, Reino Unido, Austrália, Índia, Alemanha, França, Itália, Espanha, Japão", + "操作流程": "Operação processo", + "操作流程值": "1 Adicione um cadeado e gateway com o aplicativo Smart lock\n\n2 Ative a função de desbloqueio remoto do bloqueio no aplicativo (esta função está desativada por padrão). Se você não tiver essa opção, o bloqueio não suporta Alexa\n\n3 Adicione habilidades ao Alexa e autorize-as com a conta e a senha do aplicativo Smart lock. Depois que a autorização for bem-sucedida, você poderá descobrir dispositivos na conta\n\n4 Localize o bloqueio no aplicativo Alexa, ative a função de desbloqueio de voz e defina a senha do idioma\n\n5 O bloqueio pode ser operado através Alexa", + "Google Home": "Casa do Google", + "Action name": "Nome ação", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Idiomas suportados", + "英语": "Português", + "Google Home操作流程的值": "1. Use o aplicativo Smart lock para adicionar bloqueios e gateways\n\n2. Ative a função de desbloqueio remoto do bloqueio no APP (esta função está desativada por padrão). Sem essa opção, o bloqueio não suporta o Google Home\n\n3. Instale o Google Home APP e clique no botão \"\" no canto superior esquerdo\n\n4. Na página Configurações, selecione \"Trabalhar com o Google\"\n\n5. Procure por \"ScienerSmart\" e use a conta e a senha do APP do bloqueio inteligente para autorizar", + "密码需至少包含数字/字母/字符中的2种组合": "A senha deve conter pelo menos 2 dos seguintes elementos: números, letras e caracteres especiais.", + "已开锁": "Desbloqueado", + "已闭锁": "Trancado", + "两次密码不一致哦": "As senhas são inconsistentes", + "中功率": "Potência média", + "常规使用": "Uso regular", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Depois que o gateway estiver ligado, pressione e segure o botão de reset por 5 segundos e clique em Next quando a luz indicadora pisca alternadamente", + "扫描设备": "Digitalizar dispositivo", + "删除失败,网关可能已经离线,是否强制删除该数据?": "A eliminação falhou. O gateway pode ter ficado offline. Você quer forçar a exclusão dos dados?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_ro.json b/lan/lan_ro.json new file mode 100644 index 00000000..18926d79 --- /dev/null +++ b/lan/lan_ro.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Blocare steal", + "锁通通": "Blochează printru", + "点击开锁,长按闭锁": "Atingeți pentru a debloca, ține la blocar", + "考勤": "Participanţa", + "考勤设置": "Configurări de participare", + "电子钥匙": "EKeys", + "添加卡": "Adaugă cart", + "卡号": "Număr card", + "添加指纹": "Adaugă amprentă digitală", + "指纹号": "Numărul amprentelor digitale", + "遥控": "La distanță", + "添加人脸": "Adaugă fața", + "门锁日志": "Jurnalul de blocare a ușii", + "密码号": "Număr parolă", + "添加者": "Operator", + "添加时间": "Timp", + "重置": "Resetează", + "请输入手机号或者邮箱": "Nr. Telefon/Email", + "工作时间": "Timpul de lucru", + "工作日设置": "Setarea zilei de lucru", + "星期一": "Luni.", + "星期二": "Marţi.", + "星期三": "Miercuri:", + "星期四": "Joi", + "星期五": "Vineri.", + "星期六": "Sâmbătă.", + "星期日": "Duminică", + "简写周一": "M", + "简写周二": "T", + "简写周三": "V", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mono", + "周二": "Tue", + "周三": "Căsătorit", + "周四": "Ton", + "周五": "Pe...", + "周六": "Sat", + "周日": "Soarele", + "群发钥匙": "Trimite mai multe ekeys", + "锁": "Blochează", + "请添加": "Destinatar", + "允许远程开锁": "Deblocare la distanță", + "请输入验证码": "Codul de verificare", + "获取密码": "Generează codul de parole", + "请给密码命名": "Introduceți un nume pentru acest parole", + "密码有限期为6个小时,只能使用一次": "Acest passcod trebuie să fie utilizat în termen de 6 ore de la ora curentă sau va fi SUSPENDAT din motive de securitate. Acest passcod poate fi folosit doar ONCE.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Introduceți manual 6-9 cifre ca parolă. Poate fi adăugat prin telefon Bluetooth lângă blocare, sau adăugat la distanţă prin poartă", + "获取": "Du-te!", + "添加": "Adaugă", + "删除公司": "Șterge companie", + "密码详情": "Informații despre cod", + "修改密码": "Modifică codul de cod", + "添加虹膜": "Adaugă iris", + "添加门磁": "Senzor uși", + "添加无线键盘": "Tastatură fără fir", + "添加手掌": "Adaugă palmă", + "请输入员工账号": "Introduceți contul angajatului", + "批量授权锁": "Acordați încuietori multiple", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Administratorul autorizat va avea majoritatea permisiunea de a opera această încuietoare.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Această funcție vă permite să deblocați Smart blocare la distanță prin intermediul unei Gateway. Această funcție poate fi DOAR pornită sau oprită prin Bluetooth.", + "排列方式": "Tip listă", + "早到榜": "Listă timpurie", + "迟到榜": "Listă de întârziere", + "当前模式": "Regim curent", + "勤奋榜": "Listă greu de lucru", + "延迟时间": "Timp de întârziere", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Blocarea se va bloca automat după timp.Vă rugăm să-l deblocați pentru o singură dată pentru a face setarea disponibilă.", + "时间": "Timp", + "开始时间": "Timp de începere", + "结束时间": "Timp de sfârșit:", + "工作时间设置": "Setarea timpului de lucru", + "常开模式": "ANEXA II", + "常开时间": "În această perioadă de timp.", + "常开日期": "În aceste zile", + "添加员工": "Adaugă personalul", + "节假日": "Vacanţă", + "打卡方式": "Metodă", + "员工是否有钥匙": "Deja are EKey", + "上班时间": "Timp de pornire", + "下班时间": "Timpul de închidere", + "本周": "Săptămâna această", + "单休": "Săptămâna de o zi.", + "双休": "Săptămâna de două zile", + "单双休": "O săptămână de două zile.", + "年": "Anul", + "月": "Lună", + "放假日期": "Vacanţă", + "补班日期": "Zile de lucru", + "添加假日": "Adaugă vacanță", + "开始日期": "Data de începere", + "必填": "Necesare", + "结束日期": "Data de sfârșită", + "日榜": "Zilnic", + "月榜": "Lunal", + "考勤记录": "Înregistrare:", + "假日信息": "Informații despre vacanță", + "基本信息": "Bază", + "无线键盘": "Tastatură fără fir", + "选择无线键盘": "Adaugă tastatură", + "门磁": "Senzor uși", + "自动闭锁": "Blocare automată", + "锁声音": "Blochează sunetul.", + "防撬报警": "Alertă TamperName", + "重置键": "Butonul resitează", + "锁时间": "Blochează ceasul", + "诊断": "Diagnostică", + "上传数据": "Încarcă date", + "导入其他锁数据": "Importă dintr-o altă blocare", + "锁升级": "Actualizare FirmwareComment", + "标记房态": "Starea camerei", + "开锁提醒": "Deblocare notificare", + "微信二维码": "Deblocarea codului QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Persoanele cu chei electronice pot deschide uşa prin scanarea acestui cod QR prin WeChat. Codul QR al fiecărei încuietori este diferit. Poţi să-l tipăriţi şi să-l lipiţi lângă blocajul corespunzător.", + "锁编号": "Număr de blocare", + "电量": "Baterie", + "锁分组": "Blochează grupul", + "选择分组": "Selectează grupul", + "创建新分组": "Creează un grup.", + "管理员开锁密码": "Cod de adminComment", + "更新": "Actualizează", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Nivelul bateriei va fi actualizat prin portal sau prin telefon bluetooth", + "当屏幕闪烁时,点击下一步": "Faceți clic pe următorul cînd tastatura clipește", + "输入*529#或按设置键": "Introduceți README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# sau apăsați tasta Setări", + "长按重置键2秒": "Apăsați și ține butonul de resetare 2 secunde", + "附近的设备": "Echipamentul din apropiere", + "暂无数据": "Fără date", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Veți putea obține starea ușii cu un senzor de ușă împreună cu o poartă. Doar un singur senzor este permis să se asocieze cu o blocare.", + "开始": "Pornește", + "全天": "Toate orele", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Puteți seta mai multe perioade de timp pentru modul de trecere.În perioadele de timp stabilite, blocarea va rămâne într-o stare deschisă după deblocare.", + "请选择锁音量": "Alegeți volum blocare", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Dacă porneşti, vei auzi sunetul de la încuietor", + "低": "Scău", + "较低": "Mediu scăzut", + "中": "Mediu", + "较高": "Mediu înalte", + "高": "Înalte", + "开启后,锁被撬动时,会发出报警声": "Pornind, activezi alerta TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Închizând, butonul RESET este dezactivat.", + "校准时间": "Calibrarea timpului", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnosticul este de a citi informaţiile de configurare din interiorul încuietorii şi de încărcare astfel încât personalul să poată analiza cauza eşecului.", + "上传": "Încărcare:", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Încărcarea de date din blocare la server.Poate dura câteva minute", + "请选择要从哪把锁导入": "Alegeți o blocare din care să importăm dintr-o importatoră", + "有新版本": "Au versiune nouă", + "当前版本": "Versiune curentă", + "升级": "Actualizează", + "空闲": "Vacanta", + "已入住": "Ocupat", + "多语言": "Limbile", + "添加锁": "Adaugă blocare", + "锁地址": "Blochează adresa", + "选择锁类型": "Selectează tipul de blocare", + "NFC无源锁": "Blocare pasivă NFC", + "添加设备": "Adaugă dispozitivul", + "网关": "GatewayComment", + "客服": "Serviciul clienţilor", + "设置": "Configurări", + "更多设置": "Mai multe sete", + "消息推送": "Împinge notificare", + "锁用户管理": "Blochează utilizatorii", + "拥有的钥匙": "EKey-uri asociate acestui utilizator", + "批量授权": "Gestiunea autorității", + "关联设备": "Dispozitiv asociat", + "关联姓名": "Nume asociat", + "转移智能锁": "Blocare transfere", + "选择锁": "Blocare ecran", + "接收人信息": "Destinatar", + "转移网关": "Transfer poartă", + "锁屏": "Blocare ecran", + "已关闭": "Opriti", + "已开启": "La început.", + "开启": "Porneşte.", + "确定要开启重置键?": "Continuă pentru a activa butonul Resetare?", + "确定要关闭重置键?": "Continuați să dezactivați butonul Resetare?", + "隐藏无效开锁权限": "Ascunde acces nevalid", + "APP开锁时需手机连网的锁": "Încuietori care necesită telefon online", + "增值服务": "Servicii", + "关于": "Despre", + "退出": "Autentificare", + "删除账号": "Șterge cont", + "个人信息": "Informații cont", + "头像": "Avatar", + "昵称": "NickNameName", + "请输入昵称": "Introduceți porecla dumneavoastră", + "修改昵称": "Redenumește:", + "修改账号": "Editează cont", + "重置密码": "Restaurează parolă", + "安全问题": "Întrebare de securitate", + "为了你的账号安全,修改账号前请先使用验证码验证": "Pentru securitatea contului dumneavoastră, vă rugăm să utilizați verificarea parolei contului înainte de modificarea contului", + "请输入新账号": "Introduceți noul cont", + "找回密码和登录新设备时,可通过绑定的手机验证": "Numărul de telefon de legare va fi folosit pentru a primi Codul de verificare.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "E-mail-ul de legare va fi folosit pentru a primi Codul de verificare.", + "原密码": "Parolă curentă", + "新密码": "Parolă nouă", + "确认密码": "Confirmă parolă", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "În cazul în care telefonul tău este pierdut, vă puteți conecta la telefon nou răspunzând la întrebări de securitate.", + "问题一": "Întrebarea 1", + "问题二": "Întrebarea 2", + "问题三": "Întrebarea 3", + "请输入你的答案": "Vă rugăm să scrieţi răspunsul dumneavoastră", + "即将到期": "Expiră în curând.", + "去授权": "Du-te la autorizare", + "修改名称": "Editează nume", + "状态": "Stare", + "WiFi名称": "Nume WiFi", + "网络MAC": "Rețea MAC", + "网关升级": "Actualizare GatewayComment", + "网关连接的锁": "Blocare (blocare) conectat la această GatewayName", + "信号强": "Puternică", + "选择网关类型": "Alegeți tipul de port", + "添加网关": "Adaugă poartă", + "重新通电": "Reconectează puterea", + "指示灯": "Indicator de lumină", + "选择网关": "Alege port", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G nu este suportat.Vă rugăm să selectați un WiFi de 2.4G.", + "WiFi密码": "WiFi PasswardComment", + "请输入WiFi密码": "Introduceți parola WiFi", + "网关名称": "Nume poartă", + "请输入网关名称": "Introduceți nume GatewayName", + "IP地址": "Adresă IP", + "子网掩码": "Mască subret", + "默认网关": "Gateway implicită", + "自动获取DNS服务器地址": "Obține automat adresa serverului DNS", + "首选DNS": "DNS preferat", + "备选DNS": "DNS alternativă", + "不使用静态IP": "Nu se utilizează nici un IP static", + "使用静态IP": "Utilizează IP static", + "请输入IP地址": "Introduceți adresa IP", + "请输入子网掩码": "Introduceți masca subne", + "请输入默认网关": "Introduceți poarta implicită", + "所有锁": "Toate încuietorile", + "搜索所有类型的锁": "Scanează toate tipurile de blocaje", + "门锁": "Blocarea ușii", + "挂锁": "Lacăt", + "保险箱锁": "Blocare sigură", + "智能门禁": "Controlul inteligent al accesului", + "车位锁": "Încuietoare de parcare", + "摸亮触摸屏": "Atingeți orice tastă pentru a activa tastatură", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Vă rugăm să atingeți orice tastă pentru a activa blocarea și a pus-o în modul PAIRING.", + "附近的锁": "Încuietori din apropiere", + "如需修改名字请重新命名,点击确定添加锁": "Dacă doriți să schimbați numele, vă rugăm să redenumiți, faceți clic pe OK pentru a adăuga blocare", + "添加锁时,手机必须在锁旁边": "Când se adaugă o blocare, telefonul trebuie să fie lângă blocare", + "登录": "Autentificare", + "注册": "Înregistrare", + "我已阅读并同意": "Am citit şi am fost de acord.", + "验证码": "Cod", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Parola trebuie să aibă 8-20 de caractere şi să includă cel puţin două tipuri de numere, litere şi simboluri", + "手机": "Telefon", + "邮箱": "Email", + "请输入邮箱": "Introduceți email", + "国家/地区": "Țara/Regiunea", + "你所在的国家/地区": "Țara/regiunea dumneavoastră", + "选择国家/地区": "Alegeți țara sau regiunea dumneavoastră", + "获取验证码": "Obține cod", + "商务合作": "Afaceri", + "电脑网页版": "Sistem web", + "酒店系统": "Sistemul hotelului", + "说明书网页版": "Manualul utilizatorului", + "高级功能": "Funcție avansată", + "记录保存": "Păstrarea înregistrării", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS-ul poate fi folosit pentru a trimite informaţii de parolă şi EKey către destinatar.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mail-ul poate fi folosit pentru a trimite informaţii de parolă şi EKey către destinatar.", + "购买实名认证提示": "După ce funcția este activată, trebuie să utilizați parola de amprentă, față sau cont pentru a deschide APP. Nu este nevoie de verificare din nou pentru 3 minute", + "请选择你希望的实名认证频次": "Vă rugăm să selectați frecvența de autentificare a numelor reale pe care o doriți", + "仅首次": "Pentru prima dată", + "每日一次": "O dată pe zi", + "每周一次": "O dată pe săptămână", + "每月一次": "O dată pe lună", + "当前状态": "Stare curentă", + "试用中": "Pe judecată", + "高级功能权益内容": "Funcții avansate", + "短信模板": "Șablon SMS", + "邮件模板": "Șablon email", + "发卡工具": "Codar card", + "购买高级功能须知": "Notificare", + "购买高级功能提示": "Caracteristici mai avansate sunt în curs de dezvoltare, iar dacă aveți nevoie de ele, sunteți bineveniți pentru a deschide serviciul pe baza numărului de încuietori. Caracteristicile avansate sunt disponibile doar pentru propriile încuietori. Dacă sunteți un administrator autorizat, vă rugăm să contactați administratorul de încuietoare pentru a deschide serviciul.", + "免费体验": "Proces gratuite", + "立即开通": "Deschide acum", + "购买短信": "Cumpără SMS", + "购买邮件": "Cumpără email", + "购买实名认证次数": "Cumpără nume reale timp de autentificare a numelui", + "开通高级功能": "Activează funcția avansată", + "选择套餐": "Alege pachet", + "支付方式": "Modul de plată", + "支付宝": "Alipay.", + "去支付": "Plata", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Aveți voie să definiți mesajul de către dumneavoastră.Este folosit pentru a trimite informații de parola și ekey altora.", + "高级功能仅能用于你自己的锁": "Funcţia avansată poate fi aplicată doar propriile încuietori.", + "新建模板": "Creează șablon", + "类型": "Tip", + "模版内容": "Conținut șablon", + "预览": "Previzualizare", + "房间名": "Cameră", + "预计产生短信条数": "Segmente de mesaj estimate", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Această funcție vă permite să ascundeți parole", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Telefonul utilizatorului este necesar să fie online pentru a debloca aceste încuietori selectate cu APP.", + "配置WiFi": "Configurare WiFi", + "请输入WiFi名字": "Introduceți nume WiFi", + "WiFi配网": "Rețeaua de distribuție WiFi", + "胁迫卡": "Card de stres", + "员工是否有密码": "Avem deja Passcod", + "员工是否有卡": "Avea deja Card", + "员工是否有指纹": "Definește deja amprenta.", + "获取钥匙": "Obține cheie", + "获取卡": "Obține card", + "获取指纹": "Obține amprent", + "安全验证": "Verificarea identității", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toate informațiile contului dumneavoastră vor fi înlăturate de pe platformă și nu pot fi recuperate. Doriți să ștergeți?", + "监控": "Monitor", + "视频日志": "Jurnal video", + "开门器": "Deschizător de uși", + "面容开锁": "Fața deblochează", + "开门方向设置": "Set de direcție de deschidere", + "电机功率设置": "Setare MotorPowerName", + "开锁时是否需联网": "Dacă Internetul este necesar la deblocarea", + "选择要加入分组的锁": "Selectați blocarea S pentru a adăuga la acest grupă", + "锁数量": "Blochează numărător", + "小米IOT平台": "Xiaomi IOT Platformă", + "面容开锁设置": "Fața deblochează", + "感应距离": "Distanța de senzoriu", + "防误开": "Prevenire deschiderea greșită", + "防误开已关闭,关门后仍可使用面容开锁": "Prevenirea deschidere", + "添加和使用面容开锁时": "Adăugați și folosiți fața la deblocarea", + "添加和使用面容开锁时提示": "\n1, vă rugăm să încercați să păstrați o singură persoană în fața operațiunii ușii;\n2, vă rugăm să stea în fața încuietorii uși aproximativ 0,5~0,8 m, cu fața încuietoare ușa;\n3. Vă rugăm să păstrați fața liber și expuneți caracteristicile faciale;\n4. Atunci când recunoașterea feței este anormală, puteți atinge orice tastă de pe tastatura digitală pentru a restarta recunoașterea feței manual.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Vă rugăm să alegeți puterea motor cu atenție în funcție de situația reală a încuietorii ușii:", + "小功率:": "Miniwatt:", + "耗电少": "Consum redus de energie", + "大功率": "Înaltă putere:", + "大功率提示": "Dacă limba de blocare nu poate fi retrasă în mod normal atunci când se deblochează sau trebuie condusă", + "开门方向设置提示": "Vă rugăm să alegeți cu atenție direcția pentru a deschide ușa de acasă (dacă alegeți direcția greșită, Nu veți putea deschide și închide ușa în mod corespunzător) :", + "左开": "Deschide stânga", + "右开": "Deschide la dreapta", + "判断方法:": "Echipamente:", + "判断方法内容": "Omul stătea în faţa casei, cu faţa la uşa de intrare.", + "录像时段": "Slot video", + "密码": "Coduri", + "卡": "Carduri", + "指纹": "Amprentă digitală", + "人脸": "Fața", + "配件商城": "Blochează mall", + "公司名称": "Numele întreprinderii", + "请输入公司名字": "Introduceți numele companiei", + "提示": "Sugestii", + "是否删除?": "Dacă să se ștergă?", + "员工信息": "Informații privind personalul", + "员工": "Personalul", + "打卡方式无效": "Indivizibil", + "中国": "China", + "选择钥匙": "Alege ekey", + "编辑": "Editare", + "无": "Nu nr.", + "有": "Da", + "请输入姓名": "Introduceți un nume", + "获取人脸": "Obținerea fețelor", + "选择密码": "Alege cod", + "选择卡": "Alege card", + "选择指纹": "Alegeți amprenta digitală", + "选择人脸": "Selectează fața", + "员工是否有人脸": "Dacă angajatul are o față", + "同时删除员工钥匙": "Șterge-i", + "删除": "Șterge", + "确定要删除员工吗?": "Șterge acest angajat", + "月统计": "Statistici lunare", + "迟到": "Tarziu", + "早退": "Pleacă devreme.", + "未打卡": "Fără înregistrare", + "钥匙将在": "Acest ekey va expira.", + "天后失效": "Zi( i)", + "电量更新时间:": "Timpul actualizării bateriei:", + "新增配件": "Adaugă", + "钥匙不可用": "Cheia nu este disponibilă", + "正在开锁中...": "Deblocare...", + "你的钥匙": "Cheia ta.", + "常开模式启动!长按闭锁": "Mod deschis a pornit! Apăsați lung pentru a bloca", + "演示模式": "Mod demo", + "请先同意用户协议及隐私政策": "Vă rugăm să fiți de acord cu acordul de utilizator și politica de confidențialitate întâi", + "用户协议": "Termeni de utilizator", + "隐私政策": "Politica de confidențialitate", + "注册成功": "Înregistrarea reuşită", + "你所在的": "Eşti înăuntru.", + "手机号": "Număr de telefon", + "忘记密码": "Parolă uitată", + "重置成功": "Resetează succesul", + "确定要退出吗?": "Ieşire?", + "功能暂未开放": "Funcția nu este încă deschisă", + "设置成功": "Configurare cu succes", + "删除成功": "Șterge cu succes", + "单次": "O singură dată", + "永久": "Permanent", + "限时": "Timp", + "自定义": "Personalizat", + "清空码": "Ștergă", + "循环": "Recepționare", + "工作日": "Zi de lucru", + "每日": "Zilnic", + "周末": "Săptămâna", + "确定要删除吗?": "Şterge?", + "该锁的密码都将被删除": "Toate codurile pentru această blocare vor fi DELETATE", + "已过期": "Nevalid", + "该锁的电子钥匙都将被删除": "Toate eKey-urile pentru această blocare vor fi DELETATE", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Toate ekeys asociate cu acest ekey.This Step nu poate fi UNDONE!", + "删除钥匙会在用户APP连网后生效": "Echiul va fi eliminat.", + "有效时间": "Timp efectiv", + "接收者": "Destinatar", + "仅管理自己创建的用户": "Gestionați proprii utilizatori doar", + "远程开锁": "Deblocare la distanță", + "请输入钥匙名称": "Introduceți numele cheii", + "修改成功": "Modifică succesul", + "冻结": "Îngheţa", + "解除冻结": "Dezgheță", + "授权": "Autorizare", + "取消授权": "De-autorizare", + "同时解冻其发送的钥匙": "Dezghețați toate ekeys emis de acest utilizator", + "会在用户APP连网后生效": "Acest ekey va fi THAWED atunci când APP utilizatorului se conectează la o rețea", + "同时冻结其发送的钥匙": "Îngheață toate ekeys emis de acest utilizator", + "冻结会在用户APP连网后生效": "Acest ekey va fi FROZEN când APP utilizatorului se conectează la o rețea", + "取消授权会在用户APP连网后生效": "Utilizatorul își va pierde permisiunile atunci când APP-ul utilizatorului se conectează la o rețea", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Utilizatorul autorizat are aproape aceleași permisiuni ca LOCK Manager (eg. Capacitatea de a trimite ekeys și Passcodes)", + "失效时间需晚于生效时间": "Timpul de expirare trebuie să fie mai târziu decât timpul efectiv", + "生效时间需晚于当前时间": "Timpul efectiv trebuie să fie mai târziu decât ora curentă", + "失效日期需晚于生效日期": "Data de expirare trebuie să fie mai târziu decât data de efectuare.", + "修改有效期": "Perioada de schimbare", + "生效日期": "Data de începere", + "失效日期": "Data de sfârșită", + "开锁": "Deblochează", + "开锁成功": "Deblochează succesul", + "请选择锁": "Alegeți blocaje", + "请选择接收者": "Vă rugăm să selectați receptorul", + "请选择有效期": "Alegeți perioada de valabilitate", + "请选择发送方式": "Alegeți metoda de trimitere", + "请选择结束时间": "Alegeți ora de sfârșită", + "完成": "Complete", + "有效日": "Cicluși", + "发送成功": "Trimite succesul.", + "请选择开始时间": "Alegeți ora de începere", + "选择用户": "Alegeți destinatari", + "已选中": "Selectat", + "确定": "Bine.", + "请选择要发送的锁": "Alegeți blocaje", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Autentificarea cu fața nume real se referă la nevoia utilizatorului de a-și verifica fața înainte de a debloca telefonul APP, şi verificarea poate fi deblocată.", + "分享": "Partajă", + "请输入接收者账号": "Introduceți contul receptor", + "接收者号码未注册,请重新发送": "Numărul receptorului nu este înregistrat.", + "是否发送电子钥匙给未注册账号": "Doriți să trimiteți un EKey la un cont nou.", + "取消": "Anulează", + "标记成功": "Marchează succesul", + "微信好友": "Prieteni WeChat", + "短信": "SMS", + "邮件": "Email", + "更多": "Mai mult", + "您好,您的电子钥匙生成成功": "Bună ziua, cheia ta electronică este generată cu succes", + "生效时间不能小于当前时间": "Timpul efectiv nu poate fi mai mic decât timpul curent.", + "结束时间不能小于当前时间": "Timpul de sfârșit nu poate fi mai mic decât timpul curent.", + "是否为管理员": "Este un administrator.", + "已连接到锁,请将卡靠近门锁的读卡区": "Conectat.Placează cardul împotriva cititorului de card", + "尝试连接设备...": "Conectarea cu Lock.Vă rugăm să așteptați...", + "地理位置": "Poziția geografică", + "检查以确保以下地址是正确的": "Verificați dacă următoarea adresă este corectă", + "地图加载中,请稍候。。": "Harta se încarcă, vă rog aşteptaţi...", + "跳过": "Sari", + "还未获取到位置信息哦,请耐心等待一下!": "Informațiile despre locație nu au fost obținute încă, vă rugăm să așteptați cu răbdare!", + "请填写信息": "Vă rugăm să completați informația", + "有效期": "Perioada de valabilitate", + "生效时间": "Timp de începere", + "失效时间": "Timp de sfârșit:", + "上传成功": "Încărcat cu succes", + "未生效": "Inactivat", + "已生效": "Efectiv", + "指纹详情": "Informații despre amprente digitale", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Veţi fi necesar să plasaţi degetul la senzor de mai multe ori.Vă rugăm să urmaţi promptele....", + "开始添加": "Pornește", + "请将您的手指按下": "Pune-ţi degetul pe senzor.", + "根据提示,抬起手指后再进行下一次指纹采集": "Urmaţi prompturile ...Veţi fi necesare pentru a elimina şi plasa degetul la senzor pentru următorul înregistrare", + "添加成功": "Adaugă succesul", + "更新成功": "Actualizează succesul", + "搜索": "Caută", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "După resetare, cartea de blocare va fi ștersă. Doriți să resetați?", + "已失效": "Nevalid", + "卡详情": "Informații card", + "请输入": "Introduceţi aici, vă rog.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Prin întoarcerea off, blocarea va rămâne deblocat toată ziua până când este încuiat manual.", + "请输入小于或等于60的数字": "Introduceți un număr mai mic de 60", + "操作成功": "Operație reușită", + "管理员密码相同,无需修改": "Parola administratorului este aceeași și nu trebuie modificată", + "请输入6-9位数字": "6-9 cifre în lungime", + "请输入6-9位管理员密码": "Introduceți o parolă de administrator 6-9 cifre", + "请输入新的管理员密码": "Introduceți o nouă parolă administratorului", + "未分组": "Negrupate", + "请输入分组名称": "Creează un grup.", + "创建成功": "Creează succesul", + "设置锁分组成功": "Definește cu succes grupul de blocare", + "电池1电量": "Baterie 1", + "电池2电量": "Baterie 2", + "电量更新时间": "Timpul actualizării bateriei", + "锁电量更新成功": "Succes actualizarea puterii de blocare", + "您的钥匙未生效": "Cheia ta nu este eficientă", + "您的钥匙已冻结": "Cheia ta a fost îngheţată.", + "您的钥匙已过期": "Cheia dumneavoastră a expirat", + "常开模式开启": "Blocarea este în modul de trecere.", + "超级管理员": "Super administrare", + "授权管理员": "Administrator autorizat", + "普通用户": "Utilizator obișnuit", + "余": "Sold", + "天": "Ziua", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "După ștergerea blocării, toate informațiile vor fi șterse împreună, sunteți sigur că doriți să ștergeți blocarea?", + "请输入登录密码": "Introduceți parola aplicației", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Eșec la ștergerea dispozitivului, vă rugăm să vă asigurați că dispozitivul este aproape de dispozitiv, dispozitivul nu este conectat, și dispozitivul este pornit.", + "用户无权限": "Utilizatorul nu are permisiunea", + "创建公司后,考勤功能才能使用": "Creați mai întâi o companie", + "是否删除钥匙?": "Șterge acest ekey?", + "邮箱绑定成功": "Succes obligatoriu de email", + "手机绑定成功": "Succesul legat de telefoanele mobile", + "网络访问失败,请检查网络是否正常": "Cerere Eroare.Nețea indisponibila,Vă rugăm să verificați și Conectați dispozitivul la 3G/4G/WIFI", + "清空": "Ștergă", + "是否清空?": "E clar?", + "消息详情": "Informații despre mesaj", + "创建时间": "Timp de creație", + "管理员详情": "Detalii administratorului", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Dacă cineva te obligă să deschizi uşa, poţi folosi cartea asta. Mesajul de alarmă va fi trimis la administratori. Pentru a utiliza această caracteristică, vă rugăm să vă asigurați că blocarea este online.", + "请不要将胁迫卡用于日常开锁": "Vă rugăm să nu folosiţi cardul forţat pentru utilizare zilnică.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Dacă cineva te obligă să deschizi uşa, poţi folosi această amprentă. Mesajul de alarmă va fi trimis la administratori. Pentru a utiliza această caracteristică, vă rugăm să vă asigurați că blocarea este online.", + "请不要将胁迫指纹用于日常开锁": "Vă rugăm să nu folosiţi amprenta pentru utilizare zilnică.", + "创建公司": "Creați o companie", + "公司名称不能超过30个字符": "Numele companiei nu poate depăși 30 de caractere", + "公司名称不能小于6个字符": "Numele companiei nu poate fi mai mic de 6 caractere", + "WIFI列表": "Lista WIFI", + "刷新": "Reîmprospătează", + "手动配网": "Rețeaua de distribuție manuală", + "远距离": "Distanță", + "中距离": "Distanța medie", + "近距离": "Distanță", + "锁时间更新成功": "Succesul actualizării timpului de blocare", + "锁用户": "Blochează utilizatorii", + "请选择常开日期": "Alegeți data deschiderii", + "结束时间不能小于开始时间哦": "Timpul de sfârșit nu poate fi mai mic decât ora de începere", + "介绍": "Povestea noastră", + "个人信息收集清单": "Lista de colectare a informațiilor personale", + "应用权限说明": "Descriere permisiunea aplicației", + "第三方信息共享清单": "Lista de schimb de informații cu părți terțe", + "请选择您的位置": "Alegeți locația dumneavoastră", + "请先选择位置": "Alegeți prima locație", + "管理员密码": "Cod de administrare", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Dacă trebuie să modificaţi, introduceţi o nouă parolă de administrator (6 cifre), faceţi clic pe OK pentru a modifica.", + "修改": "Modifică", + "网络摄像头": "Cameră", + "重命名": "Redenumește:", + "分组下的锁将被移到未分组里": "Încuietorile din grup vor fi mutate la un grup.", + "编辑成功": "Editează succesul.", + "厂商": "Producător", + "型号": "Model:", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "După ce parola este generată, vă rugăm să o folosiți o dată pentru activare înainte de 23:59 în aceeași zi, Altfel va fi invalid după ora 0. După activarea parolei, aceasta poate fi folosită perioade nelimitate în perioada de valabilitate.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "După ce parola este generată, vă rugăm să o folosiţi înainte de 23:59 în aceeaşi zi, altfel va fi invalidă după ora 0. Codul clar este folosit pentru a șterge toate parolele generate înainte de ora 0 astăzi.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "După ce parola este generată, vă rugăm să o folosiţi înainte de 23:59 în aceeaşi zi, altfel va fi invalidă după ora 0.", + "清空密码底部提示": "Parola este valabilă până la 23:59 în ziua golirii", + "相机": "Cameră", + "相册": "Fotografii", + "读写": "Depozitare", + "定位": "Locație", + "需要访问相机权限才能拍照上传文件例如头像上传": "Accesul la cameră este necesar pentru a face fotografii şi a încărca fişiere, cum ar fi încărcarea unei imagini de profil.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Accesul la camere este necesar pentru a încărca fișierele și avatarele folosind imagini de albume", + "需要访问读写权限才能使用本地图片上传头像": "Este necesar accesul la permisiunile de citire și scriere pentru a încărca avatare folosind imagini locale", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Accesul la informațiile de locație este necesar pentru a utiliza funcția de cheie adăugată", + "申请": "Cererea", + "权限": "Permisie", + "不允许": "Nu este permisă", + "允许": "Permite", + "权限被拒绝": "Permisiune respinsă", + "请手动在系统设置中开启": "Activați-l manual în setările sistemului", + "权限以继续使用应用": "Permisiunea de a continua utilizarea aplicației.", + "去设置": "Du-te şi aranjează-l.", + "当前网络": "Rețea curentă", + "位置信息": "Informații privind locația", + "请输入wifi名称": "Introduceți numele wifi", + "虹膜": "Iris", + "手掌": "În palmă", + "商城": "Mall", + "我的": "Ma", + "微信公众号推送": "Căutați contul public.", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Pentru a deschide chat pentru a primi mesaje de alarmă, trebuie să acordați atenție la Skye Smart Lock We chat cont public în primul rând, salvați codul QR și folosiți chat pentru a scana Setările", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Accesul la permisiunile Bluetooth este necesar pentru a utiliza informațiile de locație ale funcției de adăugare cheie", + "请输入Email": "Introduceți email", + "请输入手机号": "Introduceți numărul de telefon dvs.", + "家人到家": "Membrul familiei a ajuns acasă acasă", + "添加家人": "Adaugă membru al familiei", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "În cazul în care blocarea nu este conectată la Internet, amintiri pentru parolă, card, amprenta, și alte metode de deschidere a ușilor nu pot fi trimise în timp util.", + "消息提醒": "Mementor", + "开门通知": "Notificare de deschidere.", + "N天未开门": "N zile fără deschiderea ușii", + "门未关好": "Uşa nu e închisă.", + "防拆报警": "Alarmă TamperName", + "低电量提醒": "Baterie scăzută", + "胁迫开门": "Deschiderea ușilor forțate", + "有人按门铃": "Cineva sună la uşă.", + "有人出现在门口": "Cineva apare la uşă", + "提醒方式": "Metoda reamintire", + "开门方式": "Metoda deschiderii ușii", + "请选择": "Vă rugăm să selectați.", + "家人": "Membru al familiei", + "保存": "Salvează", + "APP推送": "Împinge APP", + "管理员": "Administrație", + "未启用": "Neactivat", + "已启用": "Activat", + "省电模式": "Mod de economisire a puterii", + "逗留抓拍模式": "Regimul de captură", + "实时监控模式": "Mod de monitorizare în timp reală", + "自定义模式": "Regim personalizat", + "猫眼设置": "Separarea ochilor de pisică", + "猫眼工作模式": "Mod de lucru a ochilor pisicilor", + "自动亮屏": "Ecran luminos", + "亮屏持续时间": "Ecran la timp ecran", + "逗留警告": "Rămâi atent.", + "异常警告": "Atenţionare anormală", + "短信提醒": "SMS", + "邮件提醒": "Email", + "N天未开门提醒": "N zile fără deschiderea ușii", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Dacă cineva te forţează să deschizi încuietoarea, poţi folosi această amprentă. Mesajul de alarmă va fi trimis la administratori.TO folosi această funcție, vă rugăm să vă asigurați că blocarea dvs. este online.", + "胁迫指纹": "Amprenta digitală forțată:", + "指纹列表": "Lista amprentelor digitale", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "După timpul stabilit, dacă blocarea nu este deschisă, sistemul va trimite un mesaj de memento către destinatarul desemnat. Această funcție necesită ca blocarea să fie conectată la internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "După ce a activat memento , atunci când bateria de blocare este sub 20%, 10%, și 5%, sistemul va trimite un mesaj de memento destinatarului desemnat.", + "未开门时间": "Zile fără deschiderea uşii", + "添加和使用面容开锁时:": "Adăugați și folosiți Face la deblocare:", + "关锁": "Închide blocare", + "功能": "Funcție", + "配件": "Părți și părți ale acestora", + "云存": "Stocarea norilor", + "本地": "Această localitate:", + "3天滚动储存": "3 zile de păstrare rulare", + "去升级": "Actualizare acumName", + "下载列表": "Lista descărcării", + "已下载": "Descărcat", + "全部视频": "Toate videoclipurile", + "已为本设备免费提供3大滚动视频储存服务": "Pentru acest dispozitiv au fost furnizate trei servicii de stocare video de derulare gratuite", + "视频播放": "Redare videoName", + "全选": "Toate.", + "请选择要删除的视频": "Alegeți videoclipul pe care doriți să o ștergeți.", + "请选择要下载的视频": "Vă rugăm să selectați videoclipul pe care doriți să le descărcați", + "欢迎使用": "Bine aţi venit la folosit", + "用户协议和隐私政策概要": "Rezumatul acordului de utilizator și Politicii de confidențialitate", + "协议概要": "Rezumat al protocolului", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Vă mulțumesc pentru utilizarea acestei aplicații. Acordăm o mare importanţă informaţiilor dvs. personale şi protecţiei vieţii private. Înainte de a utiliza acest produs, vă rugăm să-l citiți cu atenție", + "《用户协议》": "Termeni de utilizator", + "和": "Și", + "《隐私政策》": "Politica de confidențialitate", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Tot conţinutul. Dați clic pe \"Acorde\", sunteți de acord și acceptați toți termenii. Dacă alegeți să nu fiți de acord, nu veți putea utiliza produsele și serviciile noastre și veți ieși din aplicație.", + "不同意": "Dezacord.", + "同意": "De acord.", + "该功能是高级功能,请开通后再使用": "Aceasta este funcţia avansată. Vă rugăm să-l activați mai întâi.", + "常用程序": "Programe comune", + "该锁已被重置": "Încuietoarea a fost resetată", + "需要访问读写权限才能使用手动升级固件": "Accesul la permisiunile de citire și scriere este necesar pentru a actualiza manual firmwaree", + "错误D固件,请选择正确的文件": "Firware greșit, selectați fișierul corect.", + "非SYD固件,请选择正确的文件": "Firware non SYD, selectați fișierul corect.", + "文件校验失败 0x01": "Verificarea fișierului a eșuat 0x1", + "解析元数据失败,请选择正确的文件": "Eroare la analizarea metadatelor, alegeți fișierul corect.", + "文件校验失败 0x02": "Verificarea fișierului a eșuat 0x02", + "文件校验失败 0x03": "Verificarea fișierului a eșuat 0x03", + "固件升级完成": "Upgrade Firmware s-a terminat", + "记录": "Înregistrare:", + "开通高级功能后才可以对锁进行管理": "Activați mai întâi funcția avansată pentru a gestiona încuietorile.", + "去开通": "Activează activitatea", + "实名认证": "Autentificare nume reale", + "当前剩余数量": "Rămâne", + "购买": "Cumpără", + "实名认证为付费功能,请购买后再使用": "Autentificarea cu nume real este o funcție plătită, vă rugăm să o folosiți după achiziția", + "密码不一致哦": "Parolele sunt inconsistente", + "退出添加": "Oprește adăugarea", + "管理员已满": "Admin complete", + "用户已满": "Utilizatorul este plin", + "锁上面添加指纹已满": "Adaugă amprenta pe blocare este completă", + "指纹已存在": "Amprenta există deja.", + "锁上面添加人脸已满": "Blocarea deasupra adăugare fața este plină", + "人脸已存在": "Faţa există deja", + "锁上面添加卡已满": "Blocarea deasupra cardului de adăugare este plină", + "卡已存在": "Cardul există deja", + "锁上面添加密码已满": "Blochează deasupra parolă adăugată este completă", + "密码已存在": "Există deja un PassCod identic.Vă rugăm să alegeți unul diferit", + "请输入密码": "Introduceți parola...", + "暂无密码,无需重置": "Nicio parolă, nu este nevoie de resetare", + "真实姓名": "Nume reale", + "身份证号": "Numărul de identificare", + "请输入真实姓名": "Introduceți numele reale", + "请输入身份证号": "Introduceți numărul de identificare al dvs.", + "请输入身份证号和真实姓名": "Introduceți numărul și numele real.", + "点击返回设备配对": "Atinge înapoi la împerecherea dispozitivului", + "无法连接?尝试升级": "Nu se poate conecta?", + "固件升级提示": "Prompt de upgrade FirmwareName", + "请先获取固件文件到手机本地,再选择升级": "Vă rugăm să obțineți fișierul firmware la telefonul local întâi, și apoi selectați Upgrade.", + "固件升级中": "Firware-ul este în actualizare", + "取消升级": "Anulează actualizarea", + "固件传输中": "Firware în tranzit", + "关闭": "Oprește", + "传输中'": "În tranzit", + "操作记录": "Înregistrare:", + "修改姓名": "Editează nume", + "传输中": "În tranzit", + "发送人": "Emis de către Comisie", + "发送时间": "Ora emisă", + "钥匙详情": "Informații ekey", + "姓名": "Nume:", + "发送": "Trimite", + "请确认姓名全名和身份证号码是否正确": "Vă rugăm să confirmați că numele complet și numărul de identificare sunt corecte", + "传输期间请勿离开当前页面": "Nu părăsi pagina curentă în timpul transferului", + "机型": "Modele", + "硬件版本": "Versiune hardware", + "固件版本": "Versiunea FirmwareName", + "手动升级": "Upgrade manuală", + "设备连接中...": "Conectare dispozitivă...", + "未避免异常情况,请在门打开时升级": "Excepţii inevitabile, vă rugăm să upgradezi când uşa este deschisă.", + "钥匙无效": "Cheia este nevalidă", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Nu am putut conecta la blocare.Vă rugăm să reporniți telefonul Blutooth și încercați din nou.", + "如果是全自动锁,请使屏幕变亮": "Dacă este o blocare complet automată, vă rugăm să faceți ecranul mai luminoasă", + "正在尝试闭锁……": "Încerc să blochezi. Vă rog să aşteptaţi...", + "清空记录": "Curăță înregistrările", + "是否要删除操作记录?": "Continuați să ștergeți înregistrările?", + "被删除的记录不能恢复": "Înregistrările nu pot fi recuperate după ștergere.", + "全部事件": "Toate evenimentele", + "开锁事件": "Deblochează eveniment", + "异常事件": "Evenimente anormale", + "门铃事件": "Eveniment clopotei", + "视频事件": "Eveniment video", + "请开启蓝牙": "Vă rugăm să întoarceţi Bluetooth.", + "请选择有效日": "Alegeți ziua eficientă", + "公司名字长度不能小于 6 ": "Lungimea numelui companiei nu poate fi mai mică de 6", + "已是最新版本": "Fără actualizări", + "新建短信模版": "Creează șablon SMS", + "新建邮件模版": "Creează șablon email", + "自定义短信模版": "Șablon SMS", + "自定义邮件模版": "Șablon email", + "名称": "Nume:", + "星星锁": "Blocare steal", + "无考勤记录": "Nicio înregistrare:", + "大家干劲十足": "Toată lumea vine la timp.", + "工作时长未出炉": "Nu există ore de lucru", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Alegerea ţării/regiunii va afecta securitatea datelor.Aţi selectat în prezent Albania, vă rugăm să confirmaţi înainte de a continua.", + "确认国家或地区": "Confirmați țara/regiunea", + "我知道了": "Am înţeles.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Pentru a primi actualizări importante, vă rugăm să faceți clic pe \"OK\" și activați notificări în setări.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "După pornire, puteți re-foreta apăsați pe mult tasta de setare de pe blocare, și re-add-o cu APP", + "已有": "Curent", + "新增": "Nou", + "账号格式错误": "Format eronat", + "接收者信息为空": "Informațiile destinatarului sunt gole", + "请输入时间(秒)": "Introduceți ora (sec)", + "加载数据失败": "Eroare la încărcarea datelor", + "重试": "Încearcă din nou.", + "升级中,是否退出": "În timpul actualizării, dacă să ieși", + "下一步": "Următorul", + "公寓": "Apartamentul", + "个人用户": "Personal", + "星寓": "Apartament stea", + "账号": "Cont", + "请输入手机号或email": "Număr de telefon sau email", + "请输入星寓管理员的账号": "Introduceți contul administratorului apartamentului steal", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Toate datele de blocare selectate vor fi transferate permanent destinatarului.", + "暂不支持跨平台转移,敬请期待": "Transfer de platformă nu este susținut pentru moment, vă rugăm să așteptați cu nerăbdare", + "移除坏锁": "Mutați încuietori defecte / distruse în gunoi", + "转移确认": "Confirmă transferul", + "本次共转移": "De această dată, un total de lucru", + "把智能锁": "Blocare inteligentă", + "确认": "Bine.", + "移除成功": "Elimină cu succes", + "转移成功": "Succesul transferului", + "该已锁被删除": "Încuiată este ștersă", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Administratorul autorizat poate gestiona doar parolele,ekeys și etccreate de el însuși.", + "添加授权管理员": "Creează administrația", + "导出记录": "Înregistrările export", + "选择时间段": "Alegeți perioada de timp.", + "导出": "Exportă", + "批量导出": "Export pe lot", + "读取记录": "Reîmprospătește înregistrările", + "设备": "Dispozitive", + "消息": "Mesaje", + "智能分析": "Analitică inteligentă", + "精准识别设备事件,过滤无效信息": "Identificați cu exactitate evenimentele dispozitivelor și filtrați informații nevalide", + "系统设置": "Configurări sistemului", + "系统的全局配置在此项内进行设置": "Configurația globală a sistemului este stabilită în acest articol.", + "导出操作记录": "Înregistrările export", + "立即查看": "Vizualizare", + "导出成功": "Exportat cu succes", + "发送钥匙": "Trimite EKEY", + "进度": "Rată", + "失败": "Eșec", + "人脸详情": "Detalii feței", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Când cineva este simțit aproximativ 1,5 metri în fața ușii, deblocarea feței va fi începută automat.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Când cineva este simțit aproximativ 0,8 metri în fața ușii, deblocarea feței va fi începută automat.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Când cineva este simțit aproximativ 0,5 metri în fața ușii, deblocarea feței va fi începută automat.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Distanța de detectare a fost oprită, trebuie să atingeți manual orice tastă de pe tastatură pentru a efectua deblocarea feței.", + "防误开已打开,开锁后": "Deschiderea anti-greşeală a fost pornită, şi după deblocare", + "秒内不可使用面容开锁": "Deblocarea feței nu poate fi utilizată în câteva secunde", + "掌静脉": "Venă de palmieră", + "添加掌静脉": "Se adaugă vena de palmier.", + "胁迫掌静脉": "Vena de palmier forţată", + "请不要将胁迫掌静脉用于日常开锁": "Vă rugăm să nu utilizați vene constrâns palmier pentru deblocare zilnică", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Conectat la blocare, vă rugăm să deschideți în mod natural palma, palma este cu fața camerei de fotografiat.", + "掌静脉详情": "Detalii vena palmă", + "掌静脉号": "Număr vene", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth nu este pornit, vă rugăm să porniți Bluetooth în setările", + "删除用户时,会将用户拥有的钥匙一起删除。": "Dacă un utilizator este DELETET orice ekeys asociat cu Utilizatorul va fi, de asemenea, DELETAT.", + "配置网络": "Configurează rețeaua", + "你好": "Bună.", + "成功": "Reuşită", + "类型选择": "Tip selectează", + "请选择要使用哪种类型": "Alegeți tipul de utilizat", + "系统邮件(推荐)": "E-mail sistem (recomandat)", + "系统短信(推荐)": "Sistem SMS (recomandat)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-mailul va fi trimis de la această aplicație.Vă rugăm să cumpărați pachetul de email mai întâi.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS-ul va fi trimis de la această aplicație.Vă rugăm să cumpărați pachetul de email mai întâi.", + "个人邮件": "Email personale", + "个人短信": "SMS personale", + "邮件将从你的个人邮箱发给用户": "E-mailul va fi trimis din contul tău personal de email.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Mesajul SMS va fi trimis de la numărul dvs. de telefon personal.Ati plati operatorului de telecomunicatii.", + "为了更好地应用体验,请确定权限": "Pentru o experiență mai bună de aplicare, vă rugăm să confirmați permisiunile", + "您第一次拒绝权限,请确定权限": "Ați refuzat permisiunea pentru prima dată, vă rugăm să confirmați permisiunea", + "您第二次拒绝权限,请去应用设置开启权限": "Ați refuzat permisiunea pentru a doua oară, vă rugăm să mergeți la setările aplicației pentru a activa permisiunea", + "去应用市场": "Du-te la magazinul aplicației", + "温馨提示": "Prompt cald", + "关闭应用": "Închide aplicația", + "开启微信接收报警消息需要先关注": "Pentru a deschide WeChat pentru a primi mesaje de alarmă, trebuie să urmăriți:", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat cont public, salvați codul QR și utilizați WeChat pentru a scana setările", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Autentificarea numei reale este o funcție plătită, vă rugăm să contactați administratorul de blocare pentru a cumpăra și folosi.", + "位置权限": "Permisiune locație", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Vă rugăm să acordați aplicației pentru a utiliza locatian dvs...", + "相机/相册权限": "Permisiune pentru camera/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Vă rugăm să acordați Aplicației pentru a citi și scrie fotografii și fișiere din Storage.", + "点击选择": "Clic pentru selectare", + "微信": "WeChat", + "朋友圈": "Momente", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "Weibo.", + "FaceBook": "FacebookComment", + "链接": "Legătură", + "今天": "Azi", + "密码错误": "Parolă nevalidă", + "网络中断": "Întrerupere de rețea", + "钥匙不存在": "Cheia nu există", + "钥匙过期": "Cheia expirată", + "钥匙已存在": "Cheie există deja", + "密码失效": "Parolă nevalidă", + "门锁时间异常": "Timp de blocare a ușii anormale anormale", + "APP(手机)未联网": "APP (telefon mobil) nu este conectat la Internet", + "数据不存在": "Datele nu există", + "待接收": "Să fie primit", + "已冻结": "Congelate", + "已删除": "Șters", + "未知": "Necunoscut", + "拖动下方滑块完成拼图": "Trage glisarul la postura corectă", + "验证成功": "Succesul verificării", + "验证失败": "Verificare eșuată", + "向右拖动滑块填充拼图": "Trageți glisarul în dreapta pentru a umple jocului", + "请先获取到位置信息哦": "Vă rugăm să obțineți mai întâi informațiile despre locație", + "请选择国家": "Alegeți o țară", + "获取锁信息": "Obține informații de blocare", + "锁数据异常,请重试": "Datele de blocare sunt anormale, încercați din nou.", + "连接设备中...": "Dispozitiv de conectare...", + "把锁": "Încuietoare", + "条": "Benzi de bandă", + "封": "Sigiliu", + "次": "Ori", + "支付成功": "Plăti succesul.", + "查看详情": "Vizualizare detalii", + "请输入模板名称": "Introduceți numele șablonului", + "模版类型": "Tip", + "再返回一次退出": "Ieșire din nou.", + "请先添加锁": "Vă rugăm să adăugaţi încuietoarea mai întâi", + "可视对讲": "Intercom vizual", + "详细日志": "Jurnal detaliat", + "已复制到剪切板": "Copiat", + "拍照": "Fotografie", + "从相册选择": "Alegeți din albume", + "选择问题": "Alegeți o întrebăre", + "确认长度不足8位": "Confirmă lungimea mai mică de 8 cifri", + "新密码长度不足8位": "Lungime nouă parolă mai mică de 8 cifre.", + "两次密码不一致": "Parolă greșită.Vă rugăm să încercați din nou.", + "请点击获取验证码,验证码将发送到": "Vă rugăm să obțineți un cod de verificare.Codul va fi trimis la", + "切换": "Comută", + "验证": "Verifică", + "验证成功,账号已删除": "Verificare reușită, cont șterse", + "该密码不是自定义密码,无法修改": "Această parolă nu este o parolă personalizată și nu poate fi modificată", + "请选择设备要关联哪些姓名": "Alegeți numele care trebuie asociat dispozitivul", + "请选择姓名要关联哪些设备": "Alegeți dispozitivele cu care numele ar trebui asociat", + "确定要移除所选中的坏锁吗?": "Să îndepărtezi blocarea defectuoasă?", + "邮件通知": "Notifică prin email", + "短信通知": "Notifică prin SMS", + "您好,您的授权管理员生成成功": "Bună ziua, administratorul dumneavoastră autorizat a fost generat cu succes", + "请输入接收者姓名": "Introduceţi aici, vă rog.", + "版本更新": "Actualizare versiune", + "下次再说": "Data viitoare.", + "配网成功": "Succesul distribuției rețelei", + "配网失败": "Distribuția rețelei a eșuat", + "该锁的无线键盘都将被删除": "Toate tastaturile wireless pentru această încuietoare vor fi răsturnate", + "实时画面": "Imagine în timp reală", + "适合门口较为安全的环境。": "Potrivit pentru medii relativ sigure la ușă.", + "仅发生特定事件才录像,并可查看实时画面。": "Sunt înregistrate doar evenimente specifice și imaginea în timp real poate fi vizualizată.", + "一般情况下,满电可使用7-8个月": "În circumstanțe normale, poate fi utilizat timp de 7-8 luni atunci când este complet încărcat", + "有人逗留或发生特定事件才录像,可随时查看": "Cineva rămâne sau evenimente specifice sunt înregistrate, și pot fi vizualizate în orice moment.", + "实时画面。": "Fotografie în timp real.", + "一般情况下,满电可使用5~6个月。": "În circumstanțe normale, acesta poate fi utilizat pentru 5 ~ 6 luni atunci când este complet încărcat.", + "适合门口人员复杂、较不安全的环境。": "Potrivit pentru medii complexe și relativ nesigure la ușă.", + "有人出现就录像,可随时查看实时画面。": "Înregistrați când apare cineva și vizualizați imaginea în timp real în orice moment.", + "一般情况下,满电可使用2~4个月。": "În circumstanțe normale, acesta poate fi utilizat pentru 2 ~ 4 luni atunci când este complet încărcat.", + "根据您家门口实际情况设置录像和实时画面功能。": "Setați funcțiile video și imagini în timp real în funcție de situația reală la ușa dumneavoastră.", + "可使用时长由具体设置决定。": "Durata de utilizare este determinată de setările specifice.", + "查看": "Vizualizare", + "有人按门铃或发生": "Cineva sună la uşă.", + "异常事件时": "Evenimente anormale", + "不录像": "Fără videoclip", + "有人出现、按门铃": "Cineva apare, sună la uşă.", + "或发生异常事件时": "Sau un eveniment anormal.", + "逗留达到10秒": "Stai 10 secunde", + "约1.5米": "Aproximativ 1,5 metri.", + "随时": "Oricând.", + "立即录像": "Înregistraţi imediat.", + "录像时机": "Sincronizare video", + "有人出现时录像": "Înregistraţi când apare cineva.", + "人体侦测距离": "Distanța de detectare umană", + "查看实时画面": "Vizualizare imagine în timp real", + "自定义时间": "Timp personalizat", + "当日": "Azi", + "次日": "Ziua următoare.", + "自定义时段": "Perioada de timp personalizată", + "发生事件时查看": "Afișează când apare un eveniment", + "实时查看": "Vizualizare în timp realComment", + "有人在门口出现10秒后开始录像。": "Cineva apare la uşă 10 secunde înainte de înregistrare.", + "有人按门铃时立即录像。": "Înregistrează imediat când cineva sună la uşă.", + "有人出现在门前1.5米范围时启动录像": "Începe înregistrarea când cineva apare la 1,5 metri în faţa uşii", + "约0.8米": "Aproximativ 0,8 metri.", + "约3.0米": "Aproximativ 3,0 metri.", + "添加指纹失败": "Operația a eșuat.", + "项": "Elemente", + "播放中": "Joc", + "下载": "Descărcare:", + "暂无下载内容": "Fără conținut descărcare", + "亮度": "Luminozitatea", + "音量": "Volumul", + "快进至": "Repede înainte,", + "快退至": "Derulează înapoi", + "暂无视频信息": "Fără informații video", + "加载出错": "Eroare de încărcare", + "请单人正对门锁,距离一个成年人手臂长度": "Vă rugăm să stați în fața ușii singur, la lungimea unui brat", + "(约0.6米)。": "(Aproximativ 0,6 metri).", + "保持脸部无遮挡,露出五官。": "Ţine-ţi faţa liberă şi arată trăsăturile faciale.", + "准备好了,开始添加": "Gata, începe adăugarea.", + "正在录入中...": "Înregistrarea...", + "添加人脸失败": "Eșec la adăugarea faței", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "După resetare, fețele de blocare vor fi șterse. Sigur doriți să resetați?", + "人脸号": "Numărul feței", + "虹膜详情": "Detalii Iris", + "虹膜号": "Numărul Iris.", + "选择设备类型": "Alegeți tipul dispozitivului", + "照明灯具": "ANEXĂ", + "电动窗帘": "Perdele electrice", + "门窗传感器": "Senzor de ușă și fereastră", + "传感器": "Senzor", + "清除数据成功": "Datele curățate cu succes", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Încuietoarea nu este conectată la internet, aşa că înregistrările de cod, card, amprent, și alte metode de deschidere a ușilor nu pot fi încărcate în timp real.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Dacă trebuie să păstrezi înregistrările istorice, le poţi exporta.", + "看不到操作记录,可能原因有": "Nu pot vedea înregistrările operațiunilor, motive posibile", + "操作记录详情": "Detalii privind înregistrarea operațiunii", + "操作时间": "Timp de funcționare", + "此模块功能需要锁联网后设置方可生效": "Această funcție de modul trebuie setată după ce blocarea este conectată la Internet pentru a intra în vigoare", + "用户已存在": "Utilizatorul există deja", + "钥匙数量已到上限": "Numărul de chei a atins limita superioară", + "附近没有可用网关": "Nu există nici o poartă disponibilă în apropiere", + "正在创建安全连接...": "Crearea unei conexiuni securizate...", + "监视状态下不能发送录音": "Nu s-a putut trimite înregistrări în modul de monitorizare", + "挂断": "Închide.", + "监视中暂不能开锁": "Deblocarea nu este disponibilă în timpul monitorizării", + "长按说话": "Apasă şi ţine să vorbeşti.", + "松开发送": "Eliberați pentru trimitere", + "请输入6位数字开锁密码": "Introduceți o parolă 6 cifre deblocare", + "请输入开锁密码": "Introduceți parola deblocare", + "接收者在有效期内可以不限次数使用": "Destinatari", + "接收者可以使用此App开关锁": "Destinatorul este capabil să blocheze/Deblocare prin această aplicație.", + "单次钥匙有效期为1小时,只能使用一次": "ECEY-O singură dată este valabil pentru o oră şi poate fi utilizat numai ONCE.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Destinatarii sunt capabili să folosească ekeys pentru perioade nelimitate în timpul ciclului fix.", + "获取模板失败": "Eroare la obținerea șablonului", + "微信通知": "Notificare WeChat", + "系统短信": "Sistem SMS", + "系统邮件": "Email de sisteme", + "模板": "Șablon", + "新建模版": "Creează șablon", + "您好,您的密码是": "Bună, parola ta este.", + "密码名字": "Nume parolă", + "请输入6-9位密码": "Introduceți o parolă de 6-9 cifre", + "设置密码": "Setează parolă", + "操作成功,密码为": "Reuşit.Codul de acces is.", + "类型:自定义-永久": "Tip:Permanent personalizat", + "实时播放": "Redare în timp realComment", + "点击对讲": "Faceți clic pentru a interfonal", + "长按开锁": "Apăsați lung pentru deblocare", + "接听失败": "Nu s-a răspuns", + "请在锁设置中开启远程开锁": "Activați deblocarea la distanță în setările de blocare", + "接听": "Răspuns", + "截图已保存到相册": "Captură de ecran salvată pe albume", + "添加遥控": "Adaugă telecomandă", + "已连接到锁,请按遥控": "Conectat la blocare, vă rugăm să apăsați controlul de la distanță.", + "遥控号": "Numărul de control la distanță", + "遥控详情": "Detalii privind controlul la distanță", + "照明": "Iluminare", + "退出演示模式": "Ieșire modul demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Indicație: Interfața curentă este o interfață de afișare. După adăugarea dispozitivului, puteți continua să-l utilizați.", + "门已上锁": "Uşa e încuiată.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Contul dumneavoastră a fost utilizat pentru a autentifica de la un dispozitiv nou", + "开门成功": "Deschide uşa cu succes", + "开门失败": "Eșec la deschiderea ușii", + "呼叫提醒": "Memento", + "收到来自": "Recepție", + "锁的呼叫": "Blochează apelul de apel.", + "加载数据中": "Se încarcă date", + "搜索所有锁类型": "Caută toate tipurile de blocare", + "锁电量更新时间": "Blochează timpul actualizării bateriei", + "1月": "Jan.", + "2月": "Feb", + "3月": "Maro", + "4月": "Apr", + "5月": "Mai:", + "6月": "Jun.", + "7月": "JIL", + "8月": "Aug", + "9月": "Sep", + "10月": "Oct", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Orașe fierbinte", + "导出锁数据": "Exportă datele de blocare", + "一键开锁": "Un singur clic debloca", + "已开通": "Deschis", + "编辑员工": "Editează personalul", + "一": "Unul.", + "二": "Doi", + "三": "Trei", + "四": "Patru", + "五": "Cinci.", + "六": "Șase.", + "日": "Soarele", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?", + "在线": "Online", + "离线": "Deconectat", + "购买记录": "Înregistrarea achiziției", + "使用记录": "Înregistrare utilizator", + "失效时间要大于当前时间": "Timpul de expirare trebuie să fie mai mare decât timpul curent.", + "修改名字": "Editează nume", + "时": "Oră", + "分": "Minute", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Puteți folosi Alexa pentru a debloca, bloca și verifica starea de blocare a statului", + "支持的国家": "Țări sprijinite", + "支持的国家值": "Statele Unite ale Americii, Canada, Marea Britanie, Australia, India, Germania, Franța, Italia, Spania, Japonia", + "操作流程": "Procesul operațional", + "操作流程值": "1 Adăugați o blocare și o poartă cu Smart blocare APP\n\n2 Activați funcția de deblocare la distanță a încuietorii din APP (acesta funcție este oprită implicit). Dacă nu aveți această opțiune, blocarea nu suportă Alexa\n\n3 Adăugați abilități pentru Alexa și autorizați-le cu Smart blocare contul și parola APP. După ce autorizaţia va avea succes, puteţi descoperi dispozitivele sub cont\n\n4 Localizaţi blocarea în aplicaţia Alexa, activaţi funcţia de deblocare vocală, şi setaţi parola limbii\n\n5 Încuietoarea poate fi operată prin Alexa", + "Google Home": "Acasă GoogleName", + "Action name": "Nume acțiune", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Limbi suportate", + "英语": "Engleză", + "Google Home操作流程的值": "1. Utilizați Smart blocare APP pentru a adăuga încuietori și poartă\n\n2. Activaţi funcţia de deblocare la distanţă a blocării din APP (acesta funcţie este oprită în mod implicit). Fără această opțiune, blocarea nu suportă Google Home.\n\n3. Instalați Google Home APP și faceți clic pe butonul \" în colțul din stânga sus.\n\n4. Pe pagina Setări, selectați \"Lucrul cu Google\"\n\n5. Căutați \"ScienerSmart\" și utilizați contul de blocare inteligent APP și parola pentru a autoriza contul de blocare inteligentă", + "密码需至少包含数字/字母/字符中的2种组合": "Parola trebuie să conțină cel puțin 2 dintre următoarele: numere, litere și caractere speciale", + "已开锁": "Deblocat", + "已闭锁": "Blocat", + "两次密码不一致哦": "Parolele sunt inconsistente", + "中功率": "Putere medie", + "常规使用": "Utilizare regulată", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "După ce poarta este pornită, apăsați și țineți butonul de resetare timp de 5 secunde, și faceți clic pe Următor atunci când lumina indicatorului se aprinde alternativ.", + "扫描设备": "Dispozitiv de scanare", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Ștergerea a eșuat. Poarta poate s-a oprit. Doriți să forțați ștergerea datelor?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_ru.json b/lan/lan_ru.json new file mode 100644 index 00000000..5fb8f68b --- /dev/null +++ b/lan/lan_ru.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Звездный замок", + "锁通通": "Блокировка через", + "点击开锁,长按闭锁": "Нажмите, чтобы разблокировать, удерживайте, чтобы заблокировать", + "考勤": "Участники", + "考勤设置": "Параметры посещаемости", + "电子钥匙": "Ekeys", + "添加卡": "Добавить карту", + "卡号": "Номер карты", + "添加指纹": "Добавить отпечаток пальца", + "指纹号": "Номер отпечатка пальца", + "遥控": "Удаленный", + "添加人脸": "Добавить лицо", + "门锁日志": "Дверной замок журнал", + "密码号": "Номер пароля", + "添加者": "Оператор", + "添加时间": "Время", + "重置": "Сбросить", + "请输入手机号或者邮箱": "Номер телефона/Email", + "工作时间": "Время работы", + "工作日设置": "Настройка рабочего дня", + "星期一": "Понедельник", + "星期二": "Вторник", + "星期三": "Среда", + "星期四": "Четверг", + "星期五": "Пятница", + "星期六": "Суббота", + "星期日": "Воскресенье", + "简写周一": "М", + "简写周二": "Т", + "简写周三": "Вт", + "简写周四": "Т", + "简写周五": "Ф", + "简写周六": "С", + "简写周日": "С", + "周一": "Пн", + "周二": "Вт", + "周三": "Срд", + "周四": "Чт", + "周五": "Пт", + "周六": "Сб", + "周日": "Солнце", + "群发钥匙": "Отправить несколько ключей", + "锁": "Блокировка", + "请添加": "Получатель", + "允许远程开锁": "Удаленная разблокировка", + "请输入验证码": "Код проверки", + "获取密码": "Создать пароль", + "请给密码命名": "Введите имя для этого пароля", + "密码有限期为6个小时,只能使用一次": "Этот пароль ДОЛЖЕН БЫТЬ использован в течение 6 часов с текущего времени, иначе он будет ПРИОСТАНОВЛЕНО по соображениям безопасности. Этот пароль можно использовать только РАЗ.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Вручную введите 6-9 цифр в качестве пароля. Может быть добавлен по телефону Bluetooth рядом с замком или удаленно добавлен через шлюз", + "获取": "Получить", + "添加": "Добавить", + "删除公司": "Удалить компанию", + "密码详情": "Пароль Информация", + "修改密码": "Изменить пароль", + "添加虹膜": "Добавить Ирис", + "添加门磁": "Датчик двери", + "添加无线键盘": "Беспроводная клавиатура", + "添加手掌": "Добавить ладонь", + "请输入员工账号": "Войдите в аккаунт сотрудника", + "批量授权锁": "Грант нескольких замков", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Авторизованный администратор будет иметь разрешение большинства для работы с этой блокировкой.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Эта функция позволяет удаленно разблокировать Smart Lock через шлюз. Эту функцию можно включить или выключить ТОЛЬКО через Bluetooth.", + "排列方式": "Тип списка", + "早到榜": "Ранний список", + "迟到榜": "Поздний список", + "当前模式": "Текущий режим", + "勤奋榜": "Рабочий жесткий список", + "延迟时间": "Время задержки", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Замок заблокируется автоматически по истечении времени. Пожалуйста, сначала разблокируйте его один раз, чтобы сделать настройку доступной.", + "时间": "Время", + "开始时间": "Время начала", + "结束时间": "Время окончания", + "工作时间设置": "Настройка рабочего времени", + "常开模式": "РЕЖИМ прохода", + "常开时间": "В этот период времени", + "常开日期": "В эти дни", + "添加员工": "Добавить персонал", + "节假日": "Праздник", + "打卡方式": "Метод", + "员工是否有钥匙": "Уже есть ekey", + "上班时间": "Время начала", + "下班时间": "Время закрытия", + "本周": "Эта неделя", + "单休": "Один день-выходные", + "双休": "Выходные на два дня", + "单双休": "Один-два дня Выходные", + "年": "Год", + "月": "Месяц", + "放假日期": "Праздник", + "补班日期": "Дни работы", + "添加假日": "Добавить праздник", + "开始日期": "Дата начала", + "必填": "Требуется", + "结束日期": "Дата окончания", + "日榜": "Ежедневно", + "月榜": "Ежемесячно", + "考勤记录": "Записи", + "假日信息": "Праздник Информация", + "基本信息": "Основы", + "无线键盘": "Беспроводная клавиатура", + "选择无线键盘": "Добавить клавиатуру", + "门磁": "Датчик двери", + "自动闭锁": "Автоматическая блокировка", + "锁声音": "Блокировка звука", + "防撬报警": "Оповещение о тампере", + "重置键": "Кнопка сброса", + "锁时间": "Блокировка часов", + "诊断": "Диагностика", + "上传数据": "Загрузить данные", + "导入其他锁数据": "Импорт из другого замка", + "锁升级": "Обновление прошивки", + "标记房态": "Статус номера", + "开锁提醒": "Уведомление разблокировки", + "微信二维码": "Разблокировать QR код", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Люди с электронными ключами могут открыть дверь, отсканировав этот QR-код через WeChat. QR-код каждого замка разный. Вы можете распечатать его и вставить рядом с соответствующим замком.", + "锁编号": "Номер замка", + "电量": "Аккумулятор", + "锁分组": "Блокировка группы", + "选择分组": "Выберите группу", + "创建新分组": "Создать группу", + "管理员开锁密码": "Пароль администратора", + "更新": "Обновить", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Уровень заряда батареи будет обновлен шлюзом или телефоном bluetooth.", + "当屏幕闪烁时,点击下一步": "Щелкните дальше, когда клавиатура мигает", + "输入*529#或按设置键": "Введите README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # или нажмите кнопку Настройки", + "长按重置键2秒": "Нажмите и удерживайте кнопку сброса 2 секунды", + "附近的设备": "Соседнее оборудование", + "暂无数据": "Нет данных", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Вы сможете получить статус двери с датчиком двери вместе со шлюзом. Только один датчик может быть связан с замком.", + "开始": "Старт", + "全天": "Все часы", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Вы можете установить несколько периодов времени для режима прохода. В течение установленных периодов времени блокировка останется в открытом состоянии после разблокировки.", + "请选择锁音量": "Пожалуйста выберите громкость блокировки", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Включив, вы услышите звук замка.", + "低": "Низкий", + "较低": "Средний низкий", + "中": "Средний", + "较高": "Средний высокий", + "高": "Высокий", + "开启后,锁被撬动时,会发出报警声": "При включении, вы включите предупреждение TAMPER.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "При выключении кнопка RESET будет отключена.", + "校准时间": "Время калибровки", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Диагноз прочитать данные по конфигурации внутри замка и загрузить его так, что штат сможет проанализировать причину отказа", + "上传": "Загрузить", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Загрузка данных с блокировки на сервер. Это может занять несколько минут", + "请选择要从哪把锁导入": "Выберите блокировку для импорта из", + "有新版本": "Есть новая версия", + "当前版本": "Текущая версия", + "升级": "Обновить", + "空闲": "Вакантные", + "已入住": "Оккупированные", + "多语言": "Языки", + "添加锁": "Добавить блокировку", + "锁地址": "Адрес блокировки", + "选择锁类型": "Выберите тип замка", + "NFC无源锁": "Пассивный замок NFC", + "添加设备": "Добавить устройство", + "网关": "Шлюз", + "客服": "Обслуживание клиентов", + "设置": "Настройки", + "更多设置": "Больше набора", + "消息推送": "Уведомление push", + "锁用户管理": "Блокировка пользователей", + "拥有的钥匙": "EKeys, связанные с этим пользователем", + "批量授权": "Управление органом", + "关联设备": "Связанное устройство", + "关联姓名": "Связанные имя", + "转移智能锁": "Блокировка передачи", + "选择锁": "Блокировка экрана", + "接收人信息": "Получатель", + "转移网关": "Шлюз передачи", + "锁屏": "Блокировка экрана", + "已关闭": "Выкл", + "已开启": "На", + "开启": "Включите", + "确定要开启重置键?": "Продолжить включать кнопку сброса?", + "确定要关闭重置键?": "Продолжить отключать кнопку сброса?", + "隐藏无效开锁权限": "Скрыть недопустимый доступ", + "APP开锁时需手机连网的锁": "Замки требующие телефона онлайн", + "增值服务": "Услуги", + "关于": "О нас", + "退出": "Выход", + "删除账号": "Удалить аккаунт", + "个人信息": "Информация счета", + "头像": "Аватар", + "昵称": "Никимя", + "请输入昵称": "Пожалуйста введите Ваш ник", + "修改昵称": "Переименовать", + "修改账号": "Редактировать аккаунт", + "重置密码": "Сбросить пароль", + "安全问题": "Вопрос безопасности", + "为了你的账号安全,修改账号前请先使用验证码验证": "Для безопасности вашей учетной записи, пожалуйста, используйте проверку пароля учетной записи перед изменением учетной записи", + "请输入新账号": "Пожалуйста, введите новый аккаунт", + "找回密码和登录新设备时,可通过绑定的手机验证": "Связанный номер телефона будет использован для получения проверочного кода.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Обязательное электронное письмо будет использовано для получения кода проверки.", + "原密码": "Текущий пароль", + "新密码": "Новый пароль", + "确认密码": "Подтвердите пароль", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "В случае потери телефона вы можете войти в новый телефон, ответив на вопросы безопасности.", + "问题一": "Вопрос 1", + "问题二": "Вопрос 2", + "问题三": "Вопрос 3", + "请输入你的答案": "Пожалуйста введите Ваш ответ", + "即将到期": "Скоро истекает", + "去授权": "Перейти к авторизации", + "修改名称": "Изменить имя", + "状态": "Статус", + "WiFi名称": "Имя Вифи", + "网络MAC": "Сеть MAC", + "网关升级": "Обновление шлюза", + "网关连接的锁": "Блокировка (ы), подключенная к этому шлюзу", + "信号强": "Сильный", + "选择网关类型": "Выберите тип шлюза", + "添加网关": "Добавить шлюз", + "重新通电": "Re Подключите питание", + "指示灯": "Световой индикатор", + "选择网关": "Выберите шлюз", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G не поддерживается. Выберите Wi-Fi 2,4G.", + "WiFi密码": "WiFi Пассвард", + "请输入WiFi密码": "Введите пароль WiFi", + "网关名称": "Имя шлюза", + "请输入网关名称": "Введите имя шлюза", + "IP地址": "IP адрес", + "子网掩码": "Маска подсети", + "默认网关": "Шлюз по умолчанию", + "自动获取DNS服务器地址": "Автоматически получить адрес DNS-сервера", + "首选DNS": "Предпочтительный DNS", + "备选DNS": "Альтернативный DNS", + "不使用静态IP": "Статический IP-адрес не используется", + "使用静态IP": "Использовать статический IP", + "请输入IP地址": "Введите IP адрес", + "请输入子网掩码": "Введите маску подсети", + "请输入默认网关": "Введите шлюз по умолчанию", + "所有锁": "Все замки", + "搜索所有类型的锁": "Сканирование всех типов замков", + "门锁": "Дверной замок", + "挂锁": "Замок", + "保险箱锁": "Безопасный замок", + "智能门禁": "Интеллектуальный контроль доступа", + "车位锁": "Парковка Замок", + "摸亮触摸屏": "Нажмите любую клавишу, чтобы активировать клавиатуру", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Пожалуйста, коснитесь любой клавиши, чтобы активировать замок и поместить его в режим СОПРЯЖЕНИЯ. Нажмите кнопку Далее", + "附近的锁": "Близлежащие шлюзы", + "如需修改名字请重新命名,点击确定添加锁": "Если вы хотите изменить имя, переименуйте, нажмите OK, чтобы добавить блокировку", + "添加锁时,手机必须在锁旁边": "При добавлении замка телефон должен находиться рядом с замком.", + "登录": "Вход", + "注册": "Регистрация", + "我已阅读并同意": "Я прочитал и согласился", + "验证码": "Код", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Ваш пароль должен содержать 8-20 символов и содержать как минимум два типа цифр, букв и символов.", + "手机": "Телефон", + "邮箱": "Электронная почта", + "请输入邮箱": "Введите свой адрес электронной почты", + "国家/地区": "Страна/Регион", + "你所在的国家/地区": "Ваша страна/регион", + "选择国家/地区": "Выберите свою страну или регион", + "获取验证码": "Получить код", + "商务合作": "Бизнес", + "电脑网页版": "Веб система", + "酒店系统": "Гостиничная система", + "说明书网页版": "Руководство пользователя", + "高级功能": "Расширенная функция", + "记录保存": "Хранение записей", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS можно использовать для отправки пароля и информации ekey получателю.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Электронная почта может использоваться для отправки пароля и информации ekey получателю.", + "购买实名认证提示": "После включения функции вам необходимо использовать свой отпечаток пальца, лицо или пароль учетной записи, чтобы открыть приложение. Нет необходимости проверять еще раз в течение 3 минут", + "请选择你希望的实名认证频次": "Пожалуйста, выберите частоту аутентификации по настоящему имени, которую вы хотите", + "仅首次": "В первый раз", + "每日一次": "Раз в день", + "每周一次": "Раз в неделю", + "每月一次": "Раз в месяц", + "当前状态": "Текущее состояние", + "试用中": "В суде", + "高级功能权益内容": "Расширенные функции", + "短信模板": "Шаблон SMS", + "邮件模板": "Шаблон электронной почты", + "发卡工具": "Кодировщик карт", + "购买高级功能须知": "Уведомление", + "购买高级功能提示": "Более продвинутые функции находятся в стадии разработки, и если они вам нужны, вы можете открыть сервис в зависимости от количества блокировок. Расширенные функции доступны только для ваших собственных замков. Если вы являетесь авторизованным администратором, обратитесь к верхнему администратору блокировки, чтобы открыть сервис", + "免费体验": "Бесплатная пробная версия", + "立即开通": "Открыть сейчас", + "购买短信": "Купить SMS", + "购买邮件": "Купить EMAIL", + "购买实名认证次数": "Время проверки подлинности настоящего имени покупки", + "开通高级功能": "Включить расширенную функцию", + "选择套餐": "Выберите пакет", + "支付方式": "Способ оплаты", + "支付宝": "Alipay", + "去支付": "Оплатить", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Вы можете определить сообщение самостоятельно. Он используется для отправки информации о пароле и ekey другим.", + "高级功能仅能用于你自己的锁": "Усовершенствованная функция может быть применена только вашими собственными замками.", + "新建模板": "Создать шаблон", + "类型": "Тип", + "模版内容": "Содержимое шаблона", + "预览": "Предварительный просмотр", + "房间名": "Комната", + "预计产生短信条数": "Предполагаемые сегменты сообщений", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Эта функция позволяет скрыть коды доступа, ключи, карты и отпечатки пальцев, которые недействительны в течение определенного периода времени.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Телефон пользователя должен быть онлайн, чтобы разблокировать эти выбранные замки с помощью приложения.", + "配置WiFi": "Настройка WiFi", + "请输入WiFi名字": "Пожалуйста введите имя Wifi", + "WiFi配网": "Распределительная сеть WiFi", + "胁迫卡": "Стресс карты", + "员工是否有密码": "Уже есть пароль", + "员工是否有卡": "Уже есть карта", + "员工是否有指纹": "Уже установите отпечаток пальца", + "获取钥匙": "Получить ключ", + "获取卡": "Получить карту", + "获取指纹": "Получить отпечаток пальца", + "安全验证": "Проверка личности", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Вся информация о вашей учетной записи будет удалена с платформы ПОСТОЯННО и не может быть восстановлена. Вы хотите удалить?", + "监控": "Монитор", + "视频日志": "Видео журнал", + "开门器": "Дверь открывалка", + "面容开锁": "Лицо разблокирует", + "开门方向设置": "Набор направления открытия", + "电机功率设置": "Настройка мощности двигателя", + "开锁时是否需联网": "Если требуется Интернет при разблокировке", + "选择要加入分组的锁": "Выберите lockS для добавления в эту группу", + "锁数量": "Количество замков", + "小米IOT平台": "Платформа Xiaomi IOT", + "面容开锁设置": "Лицо разблокирует набор", + "感应距离": "Расстояние срабатывания", + "防误开": "Предотвратить неправильное открытие", + "防误开已关闭,关门后仍可使用面容开锁": "Предотвратить неправильное открытие было закрыто, после закрытия двери все еще можно использовать разблокировку лица", + "添加和使用面容开锁时": "Добавляйте и используйте лицо при разблокировке", + "添加和使用面容开锁时提示": "\n1, пожалуйста, постарайтесь держать одного человека перед дверью;\n2, пожалуйста, встаньте перед дверным замком примерно на 0,5 ~ 0,8 метра, лицом к дверному замку;\n3. Пожалуйста, держите лицо беспрепятственным и выставляйте черты лица;\n4. Когда распознавание лиц является ненормальным, вы можете коснуться любой клавиши на цифровой клавиатуре, чтобы перезапустить распознавание лиц вручную.", + "秒": "С", + "请根据门锁实际情况,请谨慎选择电机功率:": "Пожалуйста, внимательно выбирайте мощность двигателя в соответствии с реальной ситуацией с дверным замком:", + "小功率:": "Миниватт:", + "耗电少": "Меньшее энергопотребление", + "大功率": "Высокая мощность:", + "大功率提示": "Если язычок замка не может быть нормально убран при разблокировке или его нужно вести", + "开门方向设置提示": "Пожалуйста, внимательно выберите направление открытия двери вашего дома (если вы выберете неправильное направление, вы не сможете открыть и закрыть дверь должным образом):", + "左开": "Открыть слева", + "右开": "Открыть справа", + "判断方法:": ":", + "判断方法内容": "Мужчина стоял снаружи дома, лицом к входной двери.", + "录像时段": "Видео слот", + "密码": "Пароли", + "卡": "Карты", + "指纹": "Отпечаток пальца", + "人脸": "Лицо", + "配件商城": "Замок Молл", + "公司名称": "Название компании", + "请输入公司名字": "Введите название компании", + "提示": "Подсказка", + "是否删除?": "Стоит ли удалять?", + "员工信息": "Информация персонала", + "员工": "Персонал", + "打卡方式无效": "Недоступен", + "中国": "Китай", + "选择钥匙": "Выберите ekey", + "编辑": "Редактировать", + "无": "Нет", + "有": "Да", + "请输入姓名": "Пожалуйста, введите имя", + "获取人脸": "Получение лица", + "选择密码": "Выберите пароль", + "选择卡": "Выберите карту", + "选择指纹": "Выберите отпечаток пальца", + "选择人脸": "Выберите лицо", + "员工是否有人脸": "Имеет ли работник лицо", + "同时删除员工钥匙": "Удалить его/ее ekey", + "删除": "Удалить", + "确定要删除员工吗?": "Удалить этого сотрудника", + "月统计": "Ежемесячная статистика", + "迟到": "Поздно", + "早退": "Уйти рано", + "未打卡": "Нет записи", + "钥匙将在": "Срок действия этого ekey истекает через", + "天后失效": "День (ов)", + "电量更新时间:": "Время обновления батареи:", + "新增配件": "Добавить", + "钥匙不可用": "Ключ не доступен", + "正在开锁中...": "Разблокировка...", + "你的钥匙": "Ваш ключ", + "常开模式启动!长按闭锁": "Открытый режим запущен! Длительное нажатие для блокировки", + "演示模式": "Демонстрационный режим", + "请先同意用户协议及隐私政策": "Пожалуйста, сначала примите пользовательское соглашение и политику конфиденциальности", + "用户协议": "Условия пользователя", + "隐私政策": "Политика конфиденциальности", + "注册成功": "Регистрация успешна", + "你所在的": "Вы находитесь в", + "手机号": "Номер телефона", + "忘记密码": "Забыли пароль", + "重置成功": "Успешно сбросить", + "确定要退出吗?": "Выход?", + "功能暂未开放": "Функция еще не открыта", + "设置成功": "Установить успешно", + "删除成功": "Удалить успешно", + "单次": "Один-раз", + "永久": "Постоянные", + "限时": "Сроки", + "自定义": "Таможня", + "清空码": "Стереть", + "循环": "Повторяющиеся", + "工作日": "Рабочий день", + "每日": "Ежедневно", + "周末": "Выходные", + "确定要删除吗?": "Удалить?", + "该锁的密码都将被删除": "Все пароли для этого замка будут УДАЛЕНЫ", + "已过期": "Недопустимый", + "该锁的电子钥匙都将被删除": "Все eKeys для этой блокировки будут УДАЛЕНЫ", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "УДАЛИТЬ все ключи, связанные с этим ключом. Этот шаг не может быть ОТДЕЛЬНО!", + "删除钥匙会在用户APP连网后生效": "Ekey будет УДАЛЕНО", + "有效时间": "Эффективное время", + "接收者": "Получатель", + "仅管理自己创建的用户": "Управляйте только своими пользователями", + "远程开锁": "Удаленная разблокировка", + "请输入钥匙名称": "Пожалуйста, введите имя ключа", + "修改成功": "Изменить успех", + "冻结": "Заморозить", + "解除冻结": "Оттепель", + "授权": "Авторизовать", + "取消授权": "Де-авторизация", + "同时解冻其发送的钥匙": "Разморозить все ключи, выпущенные этим пользователем", + "会在用户APP连网后生效": "Этот ekey будет оттачиваться, когда приложение пользователя подключается к сети.", + "同时冻结其发送的钥匙": "Замораживание всех ключей, выпущенных этим пользователем", + "冻结会在用户APP连网后生效": "Этот ekey будет ЗАМОРОЖЕНО, когда приложение пользователя подключается к сети.", + "取消授权会在用户APP连网后生效": "Пользователь будет СЛУШАТЬ свои разрешения, когда приложение пользователя подключается к сети.", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Авторизованный пользователь имеет почти те же права, что и менеджер LOCK (например, Возможность отправки ключей и паролей).", + "失效时间需晚于生效时间": "Время истечения должно быть позже, чем эффективное время", + "生效时间需晚于当前时间": "Время действия должно быть позже, чем текущее время", + "失效日期需晚于生效日期": "Дата истечения срока действия должна быть позже даты вступления в силу", + "修改有效期": "Период изменения", + "生效日期": "Дата начала", + "失效日期": "Дата окончания", + "开锁": "Разблокировать", + "开锁成功": "Успешная разблокировка", + "请选择锁": "Пожалуйста выберите замки", + "请选择接收者": "Пожалуйста, выберите приемник", + "请选择有效期": "Пожалуйста, выберите срок действия", + "请选择发送方式": "Пожалуйста, выберите способ отправки", + "请选择结束时间": "Пожалуйста, выберите время окончания", + "完成": "Завершить", + "有效日": "Цикл на", + "发送成功": "Отправить успех", + "请选择开始时间": "Пожалуйста, выберите время начала", + "选择用户": "Выберите получателей", + "已选中": "Выбрано", + "确定": "Нормально", + "请选择要发送的锁": "Пожалуйста выберите замки", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Аутентификация по настоящему имени лица относится к необходимости пользователя проверить свое лицо перед разблокировкой приложения телефона, и проверка может быть разблокирована.", + "分享": "Поделиться", + "请输入接收者账号": "Пожалуйста, введите учетную запись получателя", + "接收者号码未注册,请重新发送": "Номер получателя не зарегистрирован, отправьте его повторно.", + "是否发送电子钥匙给未注册账号": "Вы хотите отправить ekey на новый аккаунт", + "取消": "Отменить", + "标记成功": "Отметить успех", + "微信好友": "Друзья WeChat", + "短信": "СМС", + "邮件": "Электронная почта", + "更多": "Больше", + "您好,您的电子钥匙生成成功": "Здравствуйте, ваш электронный ключ успешно сгенерирован", + "生效时间不能小于当前时间": "Эффективное время не может быть меньше текущего времени", + "结束时间不能小于当前时间": "Время окончания не может быть меньше текущего времени", + "是否为管理员": "Является ли он администратором", + "已连接到锁,请将卡靠近门锁的读卡区": "Подключено. Положите карту на устройство чтения карт.", + "尝试连接设备...": "Подключение с помощью замка. Подождите...", + "地理位置": "Географическое положение", + "检查以确保以下地址是正确的": "Убедитесь, что следующий адрес правильный", + "地图加载中,请稍候。。": "Карта загружается, пожалуйста, подождите...", + "跳过": "Пропустить", + "还未获取到位置信息哦,请耐心等待一下!": "Информация о местоположении еще не получена, пожалуйста, подождите терпеливо!", + "请填写信息": "Пожалуйста, заполните информацию", + "有效期": "Срок действия", + "生效时间": "Время начала", + "失效时间": "Время окончания", + "上传成功": "Успешно загружено", + "未生效": "Неактивный", + "已生效": "Эффективный", + "指纹详情": "Информация отпечатков пальцев", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Вам необходимо будет несколько раз подставить палец к датчике. Пожалуйста, следуйте инструкциям...", + "开始添加": "Старт", + "请将您的手指按下": "Положите палец на датчик", + "根据提示,抬起手指后再进行下一次指纹采集": "Следуйте инструкциям... Вам необходимо будет удалить и положить палец на датчик для следующей записи", + "添加成功": "Добавить успех", + "更新成功": "Обновление успешно", + "搜索": "Поиск", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "После сброса карта блокировки будет удалена, вы хотите сбросить?", + "已失效": "Недопустимый", + "卡详情": "Информация карты", + "请输入": "Пожалуйста введите здесь", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "При выключении блокировка будет оставаться разблокированной весь день, пока не будет заблокирована вручную.", + "请输入小于或等于60的数字": "Пожалуйста, введите число меньше 60", + "操作成功": "Операция успешна", + "管理员密码相同,无需修改": "Пароль администратора такой же, и его не нужно изменять", + "请输入6-9位数字": "6-9 цифр в длину", + "请输入6-9位管理员密码": "Пожалуйста, введите пароль администратора из 6-9 цифр", + "请输入新的管理员密码": "Пожалуйста, введите новый пароль администратора", + "未分组": "Несгруппированные", + "请输入分组名称": "Создать группу", + "创建成功": "Создать успех", + "设置锁分组成功": "Успешно установить группу блокировки", + "电池1电量": "Батарея 1", + "电池2电量": "Аккумулятор 2", + "电量更新时间": "Время обновления батареи", + "锁电量更新成功": "Успех обновления питания блокировки", + "您的钥匙未生效": "Ваш ключ не является эффективным", + "您的钥匙已冻结": "Ваш ключ был заморожен", + "您的钥匙已过期": "Срок действия вашего ключа истек", + "常开模式开启": "Замок находится в режиме прохода", + "超级管理员": "Супер админ", + "授权管理员": "Авторизованный администратор", + "普通用户": "Обычный пользователь", + "余": "Баланс", + "天": "День", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "После удаления блокировки вся информация будет удалена вместе, вы уверены, что хотите удалить блокировку?", + "请输入登录密码": "Пожалуйста, введите пароль приложения", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Не удалось удалить устройство, убедитесь, что устройство находится рядом с устройством, устройство не подключено, и устройство включено", + "用户无权限": "Пользователь не имеет разрешения", + "创建公司后,考勤功能才能使用": "Пожалуйста, сначала создайте компанию", + "是否删除钥匙?": "Удалить этот ekey?", + "邮箱绑定成功": "Успех привязки электронной почты", + "手机绑定成功": "Мобильный телефон привязки успех", + "网络访问失败,请检查网络是否正常": "Ошибка запроса. Сеть недоступна, проверьте и подключите свое устройство к 3G/4G/WIFI.", + "清空": "Очистить", + "是否清空?": "Ясно?", + "消息详情": "Сообщение Информация", + "创建时间": "Время создания", + "管理员详情": "Детали администратора", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Если кто-то заставит вас открыть дверь, вы можете использовать эту карту. Тревожное сообщение будет отправлено администрациям. Чтобы использовать эту функцию, убедитесь, что ваш замок находится в режиме онлайн.", + "请不要将胁迫卡用于日常开锁": "Пожалуйста, не используйте принудительную карту для повседневного использования.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Если кто-то заставит вас открыть дверь, вы можете использовать этот отпечаток пальца. Тревожное сообщение будет отправлено администраторов. Чтобы использовать эту функцию, убедитесь, что ваш замок находится в режиме онлайн.", + "请不要将胁迫指纹用于日常开锁": "Пожалуйста, не используйте принудительный отпечаток пальца для повседневного использования.", + "创建公司": "Создать компанию", + "公司名称不能超过30个字符": "Название компании не может превышать 30 символов", + "公司名称不能小于6个字符": "Название компании не может быть менее 6 символов", + "WIFI列表": "Список wifi", + "刷新": "Обновить", + "手动配网": "Ручная распределительная сеть", + "远距离": "Длинные расстояния", + "中距离": "Среднее расстояние", + "近距离": "Короткое расстояние", + "锁时间更新成功": "Блокировка успешного обновления времени", + "锁用户": "Блокировка пользователей", + "请选择常开日期": "Пожалуйста, выберите дату открытия", + "结束时间不能小于开始时间哦": "Время окончания не может быть меньше времени начала", + "介绍": "Наша история", + "个人信息收集清单": "Список сбора личной информации", + "应用权限说明": "Описание разрешения приложения", + "第三方信息共享清单": "Список обмена информацией третьих сторон", + "请选择您的位置": "Пожалуйста выберите ваше местоположение", + "请先选择位置": "Пожалуйста, сначала выберите местоположение", + "管理员密码": "Пароль администратора", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Если вам нужно изменить, введите новый пароль администратора (6 цифр), нажмите OK, чтобы изменить", + "修改": "Изменить", + "网络摄像头": "Камера", + "重命名": "Переименовать", + "分组下的锁将被移到未分组里": "Блокировки под группой будут перемещены в разгруппированные", + "编辑成功": "Редактировать успешно", + "厂商": "Изготовитель", + "型号": "Модель", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "После создания пароля используйте его один раз для активации до 23:59 в тот же день, иначе он будет недействителен после 0 часов. После активации пароля, его можно использовать неограниченное количество раз в течение срока действия.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "После создания пароля используйте его до 23:59 того же дня, иначе он будет недействителен после 0 часов. Очистить код используется для очистки всех паролей, сгенерированных до 0 часов сегодня.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "После создания пароля используйте его до 23:59 того же дня, иначе он будет недействителен после 0 часов.", + "清空密码底部提示": "Пароль действителен до 23:59 в день опорожнения", + "相机": "Камера", + "相册": "Фотографии", + "读写": "Хранение", + "定位": "Местоположение", + "需要访问相机权限才能拍照上传文件例如头像上传": "Доступ к камере необходим для съемки фотографий и загрузки файлов, таких как загрузка изображения профиля", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Доступ к камере необходим для загрузки файлов и аватаров с использованием изображений альбома", + "需要访问读写权限才能使用本地图片上传头像": "Для загрузки аватаров с использованием локальных образов требуется доступ к разрешениям на чтение и запись", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Для использования функции добавления ключа требуется доступ к информации о местоположении", + "申请": "Применение", + "权限": "Разрешение", + "不允许": "Не разрешено", + "允许": "Разрешено", + "权限被拒绝": "Разрешение отклонено", + "请手动在系统设置中开启": "Пожалуйста, включите его вручную в системных настройках", + "权限以继续使用应用": "Разрешение на продолжение использования приложения.", + "去设置": "Перейти настроить его", + "当前网络": "Текущая сеть", + "位置信息": "Информация о местоположении", + "请输入wifi名称": "Пожалуйста, введите имя Wi-Fi", + "虹膜": "Ирис", + "手掌": "Ладонь", + "商城": "Торговый центр", + "我的": "Мой", + "微信公众号推送": "Публичный аккаунт Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Чтобы открыть WeChat для получения тревожных сообщений, вам необходимо сначала обратить внимание на общедоступную учетную запись WeChat Skye Smart Lock, сохраните QR-код и используйте WeChat для сканирования настроек.", + "蓝牙": "Блютуз", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Доступ к разрешениям Bluetooth требуется для использования информации о местоположении функции добавления ключа", + "请输入Email": "Введите свой адрес электронной почты", + "请输入手机号": "Введите свой номер телефона", + "家人到家": "Член семьи вернулся домой", + "添加家人": "Добавить члена семьи", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Если замок не подключен к Интернету, напоминания о пароле, карте, отпечатке пальца и других способах открытия дверей не могут быть отправлены своевременно.", + "消息提醒": "Напоминание", + "开门通知": "Вступительное уведомление", + "N天未开门": "N дней без открытия двери", + "门未关好": "Дверь не закрывается", + "防拆报警": "Сигнализация несанкционированного доступа", + "低电量提醒": "Низкая батарея", + "胁迫开门": "Принудительное открытие двери", + "有人按门铃": "Кто-то звонит в дверной звонок", + "有人出现在门口": "Кто-то появляется у двери", + "提醒方式": "Метод напоминания", + "开门方式": "Метод открытия двери", + "请选择": "Пожалуйста выберите", + "家人": "Член семьи", + "保存": "Сохранить", + "APP推送": "Толчок приложения", + "管理员": "Администратор", + "未启用": "Не включено", + "已启用": "Включено", + "省电模式": "Режим экономии энергии", + "逗留抓拍模式": "Оставайтесь в режиме захвата", + "实时监控模式": "Режим мониторинга в реальном времени", + "自定义模式": "Пользовательский режим", + "猫眼设置": "Установка кошачьего глаза", + "猫眼工作模式": "Режим работы кошачий глаз", + "自动亮屏": "Автоматический яркий экран", + "亮屏持续时间": "Экран на времени", + "逗留警告": "Оставайтесь предупреждением", + "异常警告": "Аномальное предупреждение", + "短信提醒": "СМС", + "邮件提醒": "Электронная почта", + "N天未开门提醒": "N дней без открытия двери", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Если кто-то заставит вас открыть замок, вы можете использовать этот отпечаток пальца. Тревожное сообщение будет отправлено администраторов. Чтобы использовать эту функцию, убедитесь, что ваша блокировка находится в режиме онлайн.", + "胁迫指纹": "Принудительный отпечаток пальца", + "指纹列表": "Список отпечатков пальцев", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "По истечении установленного времени, если замок не будет открыт, система отправит сообщение с напоминанием назначенному получателю. Эта функция требует подключения замка к Интернету.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "После включения напоминания, когда батарея замка ниже 20%, 10% и 5%, система отправит сообщение с напоминанием назначенному получателю.", + "未开门时间": "Дней без открытия дверей", + "添加和使用面容开锁时:": "Добавьте и используйте Face при разблокировке:", + "关锁": "Закрыть замок", + "功能": "Функция", + "配件": "Детали", + "云存": "Облачное хранилище", + "本地": "Эта местность", + "3天滚动储存": "3 дня прокатного хранения", + "去升级": "Обновить сейчас", + "下载列表": "Скачать список", + "已下载": "Загружено", + "全部视频": "Все видео", + "已为本设备免费提供3大滚动视频储存服务": "Для этого устройства бесплатно предоставлены три услуги по хранению видео с прокруткой.", + "视频播放": "Воспроизведение видео", + "全选": "Все", + "请选择要删除的视频": "Пожалуйста, выберите видео, которое вы хотите удалить", + "请选择要下载的视频": "Пожалуйста, выберите видео, которое вы хотите загрузить", + "欢迎使用": "Добро пожаловать в использование", + "用户协议和隐私政策概要": "Краткое изложение Пользовательского соглашения и Политики конфиденциальности", + "协议概要": "Краткое описание протокола", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Благодарим вас за использование этого приложения. Мы придаем большое значение вашей личной информации и защите конфиденциальности. Перед использованием этого продукта внимательно прочтите его.", + "《用户协议》": "Условия пользователя", + "和": "И", + "《隐私政策》": "《 Политика конфиденциальности 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Весь контент. Нажимая «Согласен», вы соглашаетесь и принимаете все условия. Если вы решите не соглашаться, вы не сможете использовать наши продукты и услуги и выйдете из приложения.", + "不同意": "Не согласен", + "同意": "Согласиться", + "该功能是高级功能,请开通后再使用": "Это расширенная функция. Пожалуйста, сначала включите его.", + "常用程序": "Общие программы", + "该锁已被重置": "Блокировка была сброшена", + "需要访问读写权限才能使用手动升级固件": "Для обновления прошивки вручную требуется доступ к разрешениям на чтение и запись", + "错误D固件,请选择正确的文件": "Неправильная прошивка, выберите правильный файл", + "非SYD固件,请选择正确的文件": "Прошивка без SYD, выберите правильный файл", + "文件校验失败 0x01": "Ошибка проверки файла 0x01", + "解析元数据失败,请选择正确的文件": "Не удалось разобрать метаданные, выберите правильный файл", + "文件校验失败 0x02": "Ошибка проверки файла 0x02", + "文件校验失败 0x03": "Ошибка проверки файла 0x03", + "固件升级完成": "Обновление прошивки завершено", + "记录": "Записи", + "开通高级功能后才可以对锁进行管理": "Пожалуйста, сначала включите расширенные функции для управления замками.", + "去开通": "Включить", + "实名认证": "Аутентификация по реальному имени", + "当前剩余数量": "Оставшиеся", + "购买": "Купить", + "实名认证为付费功能,请购买后再使用": "Аутентификация по реальному имени-платная функция, используйте ее после покупки.", + "密码不一致哦": "Пароли являются несовместимыми", + "退出添加": "Прекратить добавление", + "管理员已满": "Администратор полный", + "用户已满": "Пользователь является полным", + "锁上面添加指纹已满": "Добавление отпечатка пальца на замок заполнено", + "指纹已存在": "Отпечаток уже существует.", + "锁上面添加人脸已满": "Замок выше добавить лицо полно", + "人脸已存在": "Лицо уже существует", + "锁上面添加卡已满": "Замок выше добавления карты заполнен", + "卡已存在": "Карта уже существует", + "锁上面添加密码已满": "Блокировка выше добавления пароля заполнена", + "密码已存在": "Идентичный пароль уже существует. Пожалуйста, выберите другой", + "请输入密码": "Пожалуйста введите пароль", + "暂无密码,无需重置": "Нет пароля, не нужно сбрасывать", + "真实姓名": "Настоящее имя", + "身份证号": "Идентификационный номер", + "请输入真实姓名": "Пожалуйста введите ваше настоящее имя", + "请输入身份证号": "Пожалуйста введите свой идентификационный номер", + "请输入身份证号和真实姓名": "Пожалуйста, введите свой идентификационный номер и настоящее имя", + "点击返回设备配对": "Нажмите Вернуться к сопряжению устройств", + "无法连接?尝试升级": "Не удается подключиться? Попытка обновления", + "固件升级提示": "Подсказка обновления прошивки", + "请先获取固件文件到手机本地,再选择升级": "Сначала получите файл прошивки на локальный телефон, а затем выберите Обновить.", + "固件升级中": "Прошивка обновляется", + "取消升级": "Отменить обновление", + "固件传输中": "Прошивка в пути", + "关闭": "Выключить", + "传输中'": "В пути", + "操作记录": "Записи", + "修改姓名": "Изменить имя", + "传输中": "В пути", + "发送人": "Выпущено в", + "发送时间": "Время выпуска", + "钥匙详情": "Информация об EKEY", + "姓名": "Имя", + "发送": "Отправить", + "请确认姓名全名和身份证号码是否正确": "Пожалуйста, подтвердите, что полное имя и идентификационный номер верны.", + "传输期间请勿离开当前页面": "Не оставляйте текущую страницу во время переноса", + "机型": "Модели", + "硬件版本": "Версия оборудования", + "固件版本": "Версия прошивки", + "手动升级": "Обновление вручную", + "设备连接中...": "Подключение устройства...", + "未避免异常情况,请在门打开时升级": "Неизбежные исключения, пожалуйста, обновите, когда дверь открыта", + "钥匙无效": "Ключ недействителен", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Не удалось подключиться к блокировке. Перезагрузите Bluetooth вашего телефона и повторите попытку.", + "如果是全自动锁,请使屏幕变亮": "Если это полностью автоматическая блокировка, сделайте экран ярче", + "正在尝试闭锁……": "Пытаюсь заблокировать. Пожалуйста, подождите...", + "清空记录": "Очистить записи", + "是否要删除操作记录?": "Продолжить удалять записи?", + "被删除的记录不能恢复": "Записи не могут быть восстановлены после удаления.", + "全部事件": "Все события", + "开锁事件": "Разблокировать событие", + "异常事件": "Аномальное событие", + "门铃事件": "Событие дверного звонка", + "视频事件": "Видео событие", + "请开启蓝牙": "Пожалуйста, включите Bluetooth", + "请选择有效日": "Пожалуйста, выберите эффективный день", + "公司名字长度不能小于 6 ": "Длина названия компании не может быть меньше 6", + "已是最新版本": "Нет обновлений", + "新建短信模版": "Создать шаблон SMS", + "新建邮件模版": "Создать шаблон электронной почты", + "自定义短信模版": "Шаблон смс", + "自定义邮件模版": "Шаблон электронной почты", + "名称": "Имя", + "星星锁": "Звездный замок", + "无考勤记录": "Нет записей", + "大家干劲十足": "Каждый приходит во время", + "工作时长未出炉": "Нет рабочих часов", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Выбор страны/региона повлияет на безопасность данных. Вы выбрали Албанию, пожалуйста, подтвердите, прежде чем продолжить.", + "确认国家或地区": "Подтверждение страны/региона", + "我知道了": "Получил это", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Чтобы получать важные обновления, нажмите «ОК» и включите уведомления в настройках.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "После включения вы можете повторно включить, долго нажимая кнопку настройки на замке, и повторно добавить его с помощью приложения.", + "已有": "Текущий", + "新增": "Новый", + "账号格式错误": "Плохой формат", + "接收者信息为空": "Информация о получателе пуста", + "请输入时间(秒)": "Пожалуйста, введите время (сек)", + "加载数据失败": "Не удалось загрузить данные", + "重试": "Попробуйте снова", + "升级中,是否退出": "Во время обновления, выходить ли", + "下一步": "Далее", + "公寓": "Квартира", + "个人用户": "Личный", + "星寓": "Звездная квартира", + "账号": "Счет", + "请输入手机号或email": "Номер телефона или электронная почта", + "请输入星寓管理员的账号": "Пожалуйста, введите учетную запись администратора звездной квартиры", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Все данные выбранного замка (ов) будут переданы получателю на постоянной основе.", + "暂不支持跨平台转移,敬请期待": "Кросс-платформенная передача в настоящее время не поддерживается, пожалуйста, с нетерпением ждем ее.", + "移除坏锁": "Переместить неисправные/поврежденные замки в корзину", + "转移确认": "Подтвердить перевод", + "本次共转移": "На этот раз в общей сложности", + "把智能锁": "Умный замок", + "确认": "Нормально", + "移除成功": "Удалить успешно", + "转移成功": "Успешная передача", + "该已锁被删除": "Заблокированный будет удален", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Авторизованный администратор может управлять только паролями, ключами и т. Д., Созданными им самим.", + "添加授权管理员": "Создать администратора", + "导出记录": "Экспорт записей", + "选择时间段": "Выберите период времени", + "导出": "Экспорт", + "批量导出": "Пакетный экспорт", + "读取记录": "Обновить записи", + "设备": "Устройство", + "消息": "Сообщения", + "智能分析": "Интеллектуальная аналитика", + "精准识别设备事件,过滤无效信息": "Точная идентификация событий устройства и отфильтрация недопустимой информации", + "系统设置": "Системные настройки", + "系统的全局配置在此项内进行设置": "Глобальная конфигурация системы устанавливается в этом пункте", + "导出操作记录": "Экспорт записей", + "立即查看": "Посмотреть", + "导出成功": "Экспортировано успешно", + "发送钥匙": "Отправить ekey", + "进度": "Оценить", + "失败": "Ошибка", + "人脸详情": "Детали лица", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Когда кто-то будет обнаружен примерно в 1,5 метрах перед дверью, автоматически начнется разблокировка распознавания лиц.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Когда кто-то будет обнаружен на расстоянии около 0,8 метра перед дверью, автоматически начнется разблокировка распознавания лиц.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Когда кто-то будет обнаружен примерно на 0,5 метра перед дверью, автоматически начнется разблокировка распознавания лиц.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Расстояние срабатывания отключено, вам нужно вручную коснуться любой клавиши на клавиатуре, чтобы выполнить разблокировку распознавания лиц.", + "防误开已打开,开锁后": "Открытие защиты от ошибок было включено, и после разблокировки", + "秒内不可使用面容开锁": "Разблокировку лица нельзя использовать в течение нескольких секунд", + "掌静脉": "Вены ладони", + "添加掌静脉": "Добавить вену ладони", + "胁迫掌静脉": "Принудительная вена ладони", + "请不要将胁迫掌静脉用于日常开锁": "Пожалуйста, не используйте принуждение вен ладони для ежедневной разблокировки", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Подключен к замку, пожалуйста, естественно откройте ладонь, ладонь обращена к камере", + "掌静脉详情": "Детали вен ладони", + "掌静脉号": "Число вен ладони", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth не включен, включите Bluetooth в настройках", + "删除用户时,会将用户拥有的钥匙一起删除。": "Если Пользователь УДАЛЕНО, любые ekeys, связанные с Пользователем, также будут УДАЛЕНЫ.", + "配置网络": "Настройка сети", + "你好": "Здравствуйте", + "成功": "Успешно", + "类型选择": "Выбор типа", + "请选择要使用哪种类型": "Пожалуйста, выберите какой тип использовать", + "系统邮件(推荐)": "Системная электронная почта (рекомендуется)", + "系统短信(推荐)": "Система SMS (рекомендуется)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Письмо будет отправлено из этого приложения. Пожалуйста, сначала купите пакет электронной почты.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS будет отправлено из этого приложения. Пожалуйста, сначала купите пакет электронной почты.", + "个人邮件": "Личная электронная почта", + "个人短信": "Персональные SMS", + "邮件将从你的个人邮箱发给用户": "Письмо будет отправлено с вашей личной учетной записи электронной почты.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS-сообщение будет отправлено с вашего личного номера телефона. Вы платите своему оператору связи.", + "为了更好地应用体验,请确定权限": "Для лучшего использования приложения, пожалуйста, подтвердите разрешения", + "您第一次拒绝权限,请确定权限": "Вы отказались от разрешения в первый раз, пожалуйста, подтвердите разрешение", + "您第二次拒绝权限,请去应用设置开启权限": "Вы отказались от разрешения во второй раз, перейдите в настройки приложения, чтобы включить разрешение", + "去应用市场": "Перейти в магазин приложений", + "温馨提示": "Теплая подсказка", + "关闭应用": "Закройте приложение", + "开启微信接收报警消息需要先关注": "Чтобы открыть WeChat для получения тревожных сообщений, вам нужно следовать", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Публичная учетная запись WeChat, сохраните QR-код и используйте WeChat для сканирования настроек", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Аутентификация по реальному имени является платной функцией, пожалуйста, свяжитесь с администратором блокировки, чтобы приобрести и использовать", + "位置权限": "Разрешение местоположения", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Пожалуйста, предоставьте приложению использовать ваш локатиан. Он используется для сканирования замков и шлюзов BLE.", + "相机/相册权限": "Разрешение камеры/альбома", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Пожалуйста, предоставьте приложению возможность читать и записывать фотографии и файлы из хранилища.", + "点击选择": "Нажмите для выбора", + "微信": "Вечат", + "朋友圈": "Моменты", + "QQ": "QQ", + "QQ空间": "Qqzone", + "微博": "Вэйбо", + "FaceBook": "Фейсбук", + "链接": "Ссылка", + "今天": "Сегодня", + "密码错误": "Неверный пароль", + "网络中断": "Прерывание сети", + "钥匙不存在": "Ключ не существует", + "钥匙过期": "Ключ истек", + "钥匙已存在": "Ключ уже существует", + "密码失效": "Недопустимый пароль", + "门锁时间异常": "Время замка двери анормалное", + "APP(手机)未联网": "Приложение (мобильный телефон) не подключено к Интернету", + "数据不存在": "Данные не существуют", + "待接收": "Получено", + "已冻结": "Замороженные", + "已删除": "Удалено", + "未知": "Неизвестно", + "拖动下方滑块完成拼图": "Перетащите ползунок в правильное положение", + "验证成功": "Успешная проверка", + "验证失败": "Ошибка проверки", + "向右拖动滑块填充拼图": "Перетащите ползунок вправо, чтобы заполнить головоломку", + "请先获取到位置信息哦": "Пожалуйста, сначала получите информацию о местоположении", + "请选择国家": "Пожалуйста, выберите страну", + "获取锁信息": "Получить информацию блокировки", + "锁数据异常,请重试": "Блокировка данных ненормальная, попробуйте еще раз", + "连接设备中...": "Подключение устройства...", + "把锁": "Замки", + "条": "Полоска", + "封": "Печать", + "次": "Раз", + "支付成功": "Оплатить успешно", + "查看详情": "Посмотреть детали", + "请输入模板名称": "Пожалуйста введите название шаблона", + "模版类型": "Тип", + "再返回一次退出": "Выходи снова", + "请先添加锁": "Пожалуйста, сначала добавьте замок", + "可视对讲": "Визуальный домофон", + "详细日志": "Подробный журнал", + "已复制到剪切板": "Скопировано", + "拍照": "Фото", + "从相册选择": "Выбрать из альбома", + "选择问题": "Пожалуйста, выберите вопрос", + "确认长度不足8位": "Подтвердите длину менее 8 цифр", + "新密码长度不足8位": "Длина нового пароля менее 8 цифр", + "两次密码不一致": "Несоответствие пароля. Пожалуйста, попробуйте еще раз", + "请点击获取验证码,验证码将发送到": "Пожалуйста, получите код подтверждения. Код будет отправлен на", + "切换": "Переключатель", + "验证": "Проверить", + "验证成功,账号已删除": "Проверка прошла успешно, аккаунт удален", + "该密码不是自定义密码,无法修改": "Этот пароль не является пользовательским паролем и не может быть изменен", + "请选择设备要关联哪些姓名": "Пожалуйста, выберите, с которыми должно быть связано устройство", + "请选择姓名要关联哪些设备": "Выберите, с каким устройством должно быть связано имя", + "确定要移除所选中的坏锁吗?": "Снять неисправный замок?", + "邮件通知": "Уведомление по электронной почте", + "短信通知": "Уведомление через SMS", + "您好,您的授权管理员生成成功": "Здравствуйте. ваш авторизованный администратор был успешно сгенерирован", + "请输入接收者姓名": "Пожалуйста введите здесь", + "版本更新": "Обновление версии", + "下次再说": "Следующий раз", + "配网成功": "Успех распространения сети", + "配网失败": "Ошибка распространения сети", + "该锁的无线键盘都将被删除": "Все беспроводные клавиатуры для этой блокировки будут УДАЛЕНЫ.", + "实时画面": "Изображение в реальном времени", + "适合门口较为安全的环境。": "Подходит для относительно безопасных условий у двери.", + "仅发生特定事件才录像,并可查看实时画面。": "Записываются только конкретные события, и изображение в реальном времени можно просматривать.", + "一般情况下,满电可使用7-8个月": "При нормальных обстоятельствах его можно использовать в течение 7-8 месяцев при полной зарядке.", + "有人逗留或发生特定事件才录像,可随时查看": "Кто-то остается или конкретные события записываются и могут быть просмотрены в любое время", + "实时画面。": "Изображение в реальном времени.", + "一般情况下,满电可使用5~6个月。": "При нормальных обстоятельствах его можно использовать в течение 5-6 месяцев при полной зарядке.", + "适合门口人员复杂、较不安全的环境。": "Подходит для сложных и относительно небезопасных условий у двери.", + "有人出现就录像,可随时查看实时画面。": "Записывайте, когда кто-то появляется, и просматривайте изображение в реальном времени в любое время.", + "一般情况下,满电可使用2~4个月。": "При нормальных обстоятельствах его можно использовать в течение 2-4 месяцев при полной зарядке.", + "根据您家门口实际情况设置录像和实时画面功能。": "Настройте функции видео и изображения в реальном времени в соответствии с реальной ситуацией у вашей двери.", + "可使用时长由具体设置决定。": "Продолжительность использования определяется конкретными настройками.", + "查看": "Посмотреть", + "有人按门铃或发生": "Кто-то звонит в дверь или", + "异常事件时": "Ненормальное событие", + "不录像": "Нет видео", + "有人出现、按门铃": "Кто-то появляется, звонит в дверь", + "或发生异常事件时": "Или происходит ненормальное событие", + "逗留达到10秒": "Оставайтесь на 10 секунд", + "约1.5米": "Около 1,5 метра", + "随时": "Любое время", + "立即录像": "Запись немедленно", + "录像时机": "Время видео", + "有人出现时录像": "Запись когда кто-то появляется", + "人体侦测距离": "Расстояние обнаружения человека", + "查看实时画面": "Просмотр изображения в реальном времени", + "自定义时间": "Пользовательское время", + "当日": "Сегодня", + "次日": "Следующий день", + "自定义时段": "Пользовательский период времени", + "发生事件时查看": "Просмотр, когда происходит событие", + "实时查看": "Просмотр в реальном времени", + "有人在门口出现10秒后开始录像。": "Кто-то появляется у двери в течение 10 секунд перед записью.", + "有人按门铃时立即录像。": "Записывайте сразу же, когда кто-то звонит в дверной звонок.", + "有人出现在门前1.5米范围时启动录像": "Начните запись, когда кто-то появляется в пределах 1,5 метров перед дверью", + "约0.8米": "Около 0,8 метра", + "约3.0米": "Около 3,0 метра", + "添加指纹失败": "Операция не удалась.", + "项": "Предметы", + "播放中": "Играть", + "下载": "Загрузить", + "暂无下载内容": "Нет загрузки контента", + "亮度": "Яркость", + "音量": "Объем", + "快进至": "Быстро вперед к", + "快退至": "Перемотать к", + "暂无视频信息": "Нет видео информации", + "加载出错": "Ошибка загрузки", + "请单人正对门锁,距离一个成年人手臂长度": "Пожалуйста, встаньте перед дверным замком в одиночку, на расстояние вытянутой руки.", + "(约0.6米)。": "(Около 0,6 метра).", + "保持脸部无遮挡,露出五官。": "Держите лицо беспрепятственным и показывайте черты лица.", + "准备好了,开始添加": "Готово, начните добавлять", + "正在录入中...": "Запись...", + "添加人脸失败": "Не удалось добавить лицо", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "После сброса грани замка будут удалены. Вы уверены, что хотите сбросить?", + "人脸号": "Номер лица", + "虹膜详情": "Детали ириса", + "虹膜号": "Число радужки", + "选择设备类型": "Выберите тип устройства", + "照明灯具": "Осветительные приборы", + "电动窗帘": "Электрические шторы", + "门窗传感器": "Датчик двери и окна", + "传感器": "Датчик", + "清除数据成功": "Данные успешно очищены", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Замок не подключен к Интернету, поэтому записи кода доступа, карты, отпечатка пальца и других методов открытия двери не могут быть загружены в режиме реального времени.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Если вам нужно сохранить исторические записи, вы можете экспортировать их.", + "看不到操作记录,可能原因有": "Не удается увидеть записи операций, возможные причины", + "操作记录详情": "Детали записи операции", + "操作时间": "Время операции", + "此模块功能需要锁联网后设置方可生效": "Эта функция модуля должна быть настроена после подключения блокировки к Интернету, чтобы она вступила в силу.", + "用户已存在": "Пользователь уже существует", + "钥匙数量已到上限": "Количество ключей достигло верхнего предела", + "附近没有可用网关": "Поблизости нет доступного шлюза", + "正在创建安全连接...": "Создание безопасного соединения...", + "监视状态下不能发送录音": "Невозможно отправить записи в режиме мониторинга", + "挂断": "Повесить вверх", + "监视中暂不能开锁": "Разблокировка недоступна во время мониторинга", + "长按说话": "Нажмите и удерживайте, чтобы говорить", + "松开发送": "Отпустите для отправки", + "请输入6位数字开锁密码": "Пожалуйста, введите 6-значный пароль для разблокировки", + "请输入开锁密码": "Пожалуйста, введите пароль разблокировки", + "接收者在有效期内可以不限次数使用": "Получатели могут использовать ekeys неограниченное количество раз в течение срока действия.", + "接收者可以使用此App开关锁": "Получатель может заблокировать/разблокировать с помощью этого приложения.", + "单次钥匙有效期为1小时,只能使用一次": "Одноразовый электронный ключ действителен в течение ОДНОГО часа и может использоваться только ОДИН РАЗ.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Получатели могут использовать ekeys неограниченное количество раз в течение фиксированного времени цикла.", + "获取模板失败": "Не удалось получить шаблон", + "微信通知": "Уведомление WeChat", + "系统短信": "Система СМС", + "系统邮件": "Системная почта", + "模板": "Шаблон", + "新建模版": "Создать шаблон", + "您好,您的密码是": "Здравствуйте, ваш пароль", + "密码名字": "Имя пароля", + "请输入6-9位密码": "Пожалуйста, введите пароль из 6-9 цифр", + "设置密码": "Установить пароль", + "操作成功,密码为": "Успешно. Пароль есть", + "类型:自定义-永久": "Тип: Таможня-постоянный", + "实时播放": "Воспроизведение в реальном времени", + "点击对讲": "Нажмите на домофон", + "长按开锁": "Длительное нажатие для разблокировки", + "接听失败": "Не удалось ответить", + "请在锁设置中开启远程开锁": "Пожалуйста, включите удаленную разблокировку в настройках блокировки.", + "接听": "Ответ", + "截图已保存到相册": "Скриншот сохранен в альбом", + "添加遥控": "Добавить пульт дистанционного управления", + "已连接到锁,请按遥控": "Подключен к замку, нажмите на пульт дистанционного управления", + "遥控号": "Номер дистанционного управления", + "遥控详情": "Детали дистанционного управления", + "照明": "Освещение", + "退出演示模式": "Выйти из демонстрационного режима", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Чаевые: Текущий интерфейс является интерфейсом дисплея. После добавления устройства вы можете продолжать его использовать", + "门已上锁": "Дверь заперта", + "您的账号在异地登录,如非本人,请尽快修改密码": "Ваша учетная запись использовалась для входа с нового устройства", + "开门成功": "Открытие двери успешно", + "开门失败": "Не удалось открыть дверь", + "呼叫提醒": "Напоминание звонка", + "收到来自": "Получено от", + "锁的呼叫": "Блокировка вызова", + "加载数据中": "Загрузка данных", + "搜索所有锁类型": "Поиск всех типов замков", + "锁电量更新时间": "Блокировка времени обновления батареи", + "1月": "Янв", + "2月": "Фев", + "3月": "Мар", + "4月": "Апрель", + "5月": "Мая", + "6月": "Июнь", + "7月": "Июль", + "8月": "Август", + "9月": "Сен", + "10月": "Окт", + "11月": "Нояб", + "12月": "Декабрь", + "热门城市": "Горячие города", + "导出锁数据": "Экспорт данных блокировки", + "一键开锁": "Разблокировка в один клик", + "已开通": "Открыто", + "编辑员工": "Редактировать персонал", + "一": "Один", + "二": "Два", + "三": "Три", + "四": "Четыре", + "五": "Пять", + "六": "Шесть", + "日": "Солнце", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?", + "在线": "Онлайн", + "离线": "Оффлайн", + "购买记录": "Запись покупки", + "使用记录": "Запись пользователя", + "失效时间要大于当前时间": "Время истечения должно быть больше, чем текущее время", + "修改名字": "Изменить имя", + "时": "Час", + "分": "Минута", + "Amazon Alexa": "Амазон Алекса", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Вы можете использовать Alexa для разблокировки, блокировки и проверки состояния блокировки.", + "支持的国家": "Поддерживаемые страны", + "支持的国家值": "США, Канада, Великобритания, Австралия, Индия, Германия, Франция, Италия, Испания, Япония", + "操作流程": "Процесс операции", + "操作流程值": "1 Добавьте замок и шлюз с помощью приложения Smart Lock\n\n2 Включите функцию удаленной разблокировки замка в приложении (эта функция отключена по умолчанию). Если у вас нет этой опции, блокировка не поддерживает Alexa.\n\n3 Добавьте навыки в Alexa и авторизуйтесь с помощью учетной записи и пароля приложения Smart Lock. После успешной авторизации вы можете обнаружить устройства под учетной записью.\n\n4 Найдите замок в приложении Alexa, включите функцию голосовой разблокировки и установите языковой пароль.\n\n5 Замок можно управлять через Alexa", + "Google Home": "Гугл Главная", + "Action name": "Название действия", + "ScienerSmart": "Сайенсмарт", + "支持的语言": "Поддерживаемые языки", + "英语": "Английский", + "Google Home操作流程的值": "1. Используйте приложение Smart Lock для добавления замков и шлюзов.\n\n2. Включите функцию удаленной разблокировки замка в приложении (эта функция отключена по умолчанию). Без этой опции блокировка не поддерживает Google Home.\n\n3. Установите приложение Google Home и нажмите кнопку «» в верхнем левом углу.\n\n4. На странице настроек выберите «Работа с Google»\n\n5. Найдите «ScienerSmart» и используйте учетную запись приложения Smart Lock и пароль для авторизации.", + "密码需至少包含数字/字母/字符中的2种组合": "Пароль должен содержать не менее 2 из следующих символов: цифры, буквы и специальные символы.", + "已开锁": "Разблокирован", + "已闭锁": "Заперт", + "两次密码不一致哦": "Пароли являются несовместимыми", + "中功率": "Средняя мощность", + "常规使用": "Регулярное использование", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "После включения шлюза нажмите и удерживайте кнопку сброса в течение 5 секунд и нажмите «Далее», когда индикатор попеременно начнет мигать.", + "扫描设备": "Устройство сканирования", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Ошибка удаления. Возможно, шлюз ушел в автономный режим. Хотите ли вы принудительно удалить данные?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_sk.json b/lan/lan_sk.json new file mode 100644 index 00000000..f1d7df2d --- /dev/null +++ b/lan/lan_sk.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Star lock", + "锁通通": "Zamknúť cez", + "点击开锁,长按闭锁": "Dotyk odomknúť, držať na uzamknutie", + "考勤": "Navštevovanie", + "考勤设置": "Nastavenia návštevnosti", + "电子钥匙": "Ekeys", + "添加卡": "Pridať kartu", + "卡号": "Číslo karty", + "添加指纹": "Pridať odtlačok prstov", + "指纹号": "Číslo odtlačkov prstov", + "遥控": "Vzdialený", + "添加人脸": "Pridať tvár", + "门锁日志": "Zámok dverí log", + "密码号": "Číslo hesla", + "添加者": "Operátor", + "添加时间": "Čas", + "重置": "Reset", + "请输入手机号或者邮箱": "Telefónne číslo/Email", + "工作时间": "Pracovný čas", + "工作日设置": "Nastavenie pracovného dňa", + "星期一": "Pondelok", + "星期二": "Utorok", + "星期三": "Streda", + "星期四": "Štvrtok", + "星期五": "Piatok", + "星期六": "Sobota", + "星期日": "Nedeľa", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Sun", + "群发钥匙": "Odoslať viac ekeys", + "锁": "Zámok", + "请添加": "Príjemca", + "允许远程开锁": "Vzdialené odomknutie", + "请输入验证码": "Verifikačný kód", + "获取密码": "Generovať prístupový kód", + "请给密码命名": "Zadajte názov pre tento prístupový kód", + "密码有限期为6个小时,只能使用一次": "Tento prístupový kód musí byť použitý do 6 hodín od aktuálneho času alebo bude pozastavený z bezpečnostných dôvodov. tento prístupový kód môže byť použitý len raz.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Manuálne zadajte 6-9 číslic ako heslo. Môže byť pridaný telefónom bluetooth vedľa zámku, alebo diaľkovo pridaný cez bránu", + "获取": "Get", + "添加": "Pridať", + "删除公司": "Odstrániť spoločnosť", + "密码详情": "Heslo info", + "修改密码": "Zmena prístupového kódu", + "添加虹膜": "Pridať iris", + "添加门磁": "Snímač dverí", + "添加无线键盘": "Bezdrôtová klávesnica", + "添加手掌": "Pridať dlaň", + "请输入员工账号": "Zadajte účet zamestnanca", + "批量授权锁": "Udeliť viacnásobné zámky", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Oprávnený správca bude mať väčšinové povolenie na prevádzku tohto zámku.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Táto funkcia umožňuje odomknúť inteligentný zámok na diaľku cez bránu. táto funkcia je možné zapnúť alebo vypnúť iba cez bluetooth.", + "排列方式": "Typ zoznamu", + "早到榜": "Raný zoznam", + "迟到榜": "Neskorý zoznam", + "当前模式": "Aktuálny režim", + "勤奋榜": "Pracovné tvrdý zoznam", + "延迟时间": "Čas oneskorenia", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Zámok sa automaticky uzamkne po čase. prosím, odomknite ho na jeden čas najprv, aby bolo nastavenie k dispozícii.", + "时间": "Čas", + "开始时间": "Čas štartu", + "结束时间": "Koncový čas", + "工作时间设置": "Nastavenie pracovného času", + "常开模式": "Režim prechodu", + "常开时间": "V tomto časovom období", + "常开日期": "V týchto dňoch", + "添加员工": "Pridať zamestnancov", + "节假日": "Dovolenka", + "打卡方式": "Metóda", + "员工是否有钥匙": "Už má ekey", + "上班时间": "Čas štartu", + "下班时间": "Čas zatvárania", + "本周": "Tento týždeň", + "单休": "Jednodňový víkend", + "双休": "Dvojdňový víkend", + "单双休": "Jednodňový víkend", + "年": "Rok", + "月": "Mesiac", + "放假日期": "Dovolenka", + "补班日期": "Pracovné dni", + "添加假日": "Pridať dovolenku", + "开始日期": "Dátum štartu", + "必填": "Požadované", + "结束日期": "Koncový dátum", + "日榜": "Denne", + "月榜": "Mesačník", + "考勤记录": "Records", + "假日信息": "Dovolenka info", + "基本信息": "Základy", + "无线键盘": "Bezdrôtová klávesnica", + "选择无线键盘": "Pridať klávesnicu", + "门磁": "Snímač dverí", + "自动闭锁": "Automatické uzamknutie", + "锁声音": "Lock sound", + "防撬报警": "Pohotovosť", + "重置键": "Tlačidlo reset", + "锁时间": "Zámkové hodiny", + "诊断": "Diagnostikovať", + "上传数据": "Nahrať dáta", + "导入其他锁数据": "Import frome ďalší zámok", + "锁升级": "Aktualizácia firmvéru", + "标记房态": "Stav miestnosti", + "开锁提醒": "Odomknúť oznámenie", + "微信二维码": "Odomknúť qr kód", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Ľudia s elektronickými kľúčmi môžu otvoriť dvere skenovaním tohto qr kódu cez wechat. Qr kód každého zámku je iný. Môžete ho vytlačiť a vložiť ho vedľa príslušného zámku", + "锁编号": "Číslo zámku", + "电量": "Batéria", + "锁分组": "Skupina zámkov", + "选择分组": "Vyberte skupinu", + "创建新分组": "Vytvoriť skupinu", + "管理员开锁密码": "Prihlasovací kód admin", + "更新": "Aktualizácia", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Úroveň batérie bude aktualizovaná bránou alebo telefónom bluetooth", + "当屏幕闪烁时,点击下一步": "Kliknite na ďalšie, keď klávesnica bliká", + "输入*529#或按设置键": "Zadajte README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # alebo stlačte tlačidlo nastavenia", + "长按重置键2秒": "Stlačte a podržte tlačidlo reset 2 sekundy", + "附近的设备": "Neďaleké vybavenie", + "暂无数据": "Žiadne údaje", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Môžete získať stav dverí so snímačom dverí spolu s bránou. len jeden snímač je povolené spojovať so zámkom.", + "开始": "Štart", + "全天": "Všetky hodiny", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Môžete nastaviť viacero časových období pre režim prechodu. v nastavených časových periódach zostane zámok po odomknutí v otvorenom stave.", + "请选择锁音量": "Vyberte zväzok zámku", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Zapnutím bude počuť zvuk zo zámku", + "低": "Nízke", + "较低": "Stredne nízka", + "中": "Stredné", + "较高": "Stredne vysoká", + "高": "High", + "开启后,锁被撬动时,会发出报警声": "Zapnutím povolíte výstrahu na manipuláciu.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Vypnutím je tlačidlo reset vypnuté.", + "校准时间": "Čas kalibrácie", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnóza je prečítať informácie o konfigurácii vo vnútri zámku a nahrať ju tak, aby zamestnanci mohli analyzovať príčinu zlyhania", + "上传": "Nahrať", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Nahrať dáta z zámku na server. to môže trvať niekoľko minút", + "请选择要从哪把锁导入": "Vyberte zámok pre import z", + "有新版本": "Mať novú verziu", + "当前版本": "Aktuálna verzia", + "升级": "Aktualizácia", + "空闲": "Prázdne", + "已入住": "Obsadený", + "多语言": "Jazyky", + "添加锁": "Pridať zámok", + "锁地址": "Uzamknúť adresu", + "选择锁类型": "Vyberte typ zámku", + "NFC无源锁": "Nfc pasívny zámok", + "添加设备": "Pridať zariadenie", + "网关": "Brána", + "客服": "Zákaznícky servis", + "设置": "Nastavenia", + "更多设置": "Viac set", + "消息推送": "Oznámenie push", + "锁用户管理": "Zamknúť používateľov", + "拥有的钥匙": "Ekeys spojené s týmto užívateľom", + "批量授权": "Správa orgánov", + "关联设备": "Pridružené zariadenie", + "关联姓名": "Pridružený názov", + "转移智能锁": "Zámok prenosu", + "选择锁": "Zámok obrazovky", + "接收人信息": "Príjemca", + "转移网关": "Transfer gateway", + "锁屏": "Zámok obrazovky", + "已关闭": "Off", + "已开启": "Na", + "开启": "Zapnúť", + "确定要开启重置键?": "Pokračovať na zapnutie tlačidla reset?", + "确定要关闭重置键?": "Pokračovať na vypnutie tlačidla reset?", + "隐藏无效开锁权限": "Skryť neplatný prístup", + "APP开锁时需手机连网的锁": "Zámky vyžadujúce telefón online", + "增值服务": "Služby", + "关于": "O", + "退出": "Odhlásenie", + "删除账号": "Odstrániť účet", + "个人信息": "Informácie o účte", + "头像": "Avatar", + "昵称": "Prezývka", + "请输入昵称": "Zadajte prosím svoju prezývku", + "修改昵称": "Premenovanie", + "修改账号": "Upraviť účet", + "重置密码": "Obnoviť heslo", + "安全问题": "Bezpečnostná otázka", + "为了你的账号安全,修改账号前请先使用验证码验证": "Pre bezpečnosť vášho účtu, prosím, použite overenie hesla účtu pred úpravou účtu", + "请输入新账号": "Zadajte prosím nový účet", + "找回密码和登录新设备时,可通过绑定的手机验证": "Na prijímanie overovacieho kódu sa použije záväzné telefónne číslo.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Záväzný e-mail bude použitý na prijímanie overovacieho kódu.", + "原密码": "Aktuálne heslo", + "新密码": "Nové heslo", + "确认密码": "Potvrdiť heslo", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "V prípade, že váš telefón stratil, môžete sa prihlásiť na nový telefón tým, že odpovedáte na bezpečnostné otázky.", + "问题一": "Otázka 1", + "问题二": "Otázka 2", + "问题三": "Otázka 3", + "请输入你的答案": "Zadajte prosím odpoveď", + "即将到期": "Vyprší čoskoro", + "去授权": "Prejdite na autorizáciu", + "修改名称": "Upraviť názov", + "状态": "Stav", + "WiFi名称": "Wifi názov", + "网络MAC": "Sieťový mac", + "网关升级": "Aktualizácia brány", + "网关连接的锁": "Zámok (y) pripojený k tejto bráne", + "信号强": "Silná", + "选择网关类型": "Vyberte typ brány", + "添加网关": "Pridať bránu", + "重新通电": "Re pripojiť napájanie", + "指示灯": "Indikátorové svetlo", + "选择网关": "Vyberte bránu", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g nie je podporovaný,. vyberte wifi z 2.4g.", + "WiFi密码": "Wifi passward", + "请输入WiFi密码": "Zadajte heslo wifi", + "网关名称": "Názov brány", + "请输入网关名称": "Zadajte názov brány", + "IP地址": "Ip adresa", + "子网掩码": "Maska podsiete", + "默认网关": "Predvolená brána", + "自动获取DNS服务器地址": "Automaticky získať adresu servera dns", + "首选DNS": "Preferované dns", + "备选DNS": "Alternatívne dns", + "不使用静态IP": "Nepoužíva sa statický ip", + "使用静态IP": "Používať statické ip", + "请输入IP地址": "Zadajte ip adresu", + "请输入子网掩码": "Zadajte masku podsiete", + "请输入默认网关": "Zadajte predvolenú bránu", + "所有锁": "Všetky zámky", + "搜索所有类型的锁": "Skenovať všetky typy zámkov", + "门锁": "Zámok dverí", + "挂锁": "Padlock", + "保险箱锁": "Bezpečný zámok", + "智能门禁": "Inteligentné riadenie prístupu", + "车位锁": "Zámok na parkovanie", + "摸亮触摸屏": "Dotknite sa ľubovoľného kľúča pre aktiváciu klávesnice", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Prosím, dotknite sa ľubovoľného kľúča, aby ste aktivovali zámok a vložte ho do režimu párovania.", + "附近的锁": "Neďaleko zámky", + "如需修改名字请重新命名,点击确定添加锁": "Ak chcete zmeniť názov, prosím premenujte, kliknite na tlačidlo ok pre pridanie zámku", + "添加锁时,手机必须在锁旁边": "Pri pridávaní zámku musí byť telefón vedľa zámku", + "登录": "Prihlásenie", + "注册": "Registrácia", + "我已阅读并同意": "Prečítal som a súhlasil", + "验证码": "Kód", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Vaše heslo musí mať 8-20 znakov a obsahuje minimálne dva typy čísel, písmen a symbolov.", + "手机": "Telefón", + "邮箱": "E-mail", + "请输入邮箱": "Zadajte svoj e-mail", + "国家/地区": "Krajina/región", + "你所在的国家/地区": "Vaša krajina/región", + "选择国家/地区": "Vyberte si svoju krajinu alebo región", + "获取验证码": "Získať kód", + "商务合作": "Business", + "电脑网页版": "Webový systém", + "酒店系统": "Hotelový systém", + "说明书网页版": "Príručka používateľa", + "高级功能": "Pokročilá funkcia", + "记录保存": "Uchovávanie záznamov", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Sms môže byť použitý na odosielanie prístupového kódu a ekey informácie príjemcovi.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-mail môže byť použitý na odosielanie prístupového kódu a informácie o ekey príjemcovi.", + "购买实名认证提示": "Po povolení funkcie, musíte použiť svoj odtlačok, tvár alebo heslo účtu pre otvorenie aplikácie. Nie je potrebné znovu overiť po dobu 3 minút", + "请选择你希望的实名认证频次": "Prosím, vyberte požadovanú frekvenciu overovania skutočného mena", + "仅首次": "Prvýkrát", + "每日一次": "Raz denne", + "每周一次": "Raz týždenne", + "每月一次": "Raz za mesiac", + "当前状态": "Aktuálny stav", + "试用中": "Na skúšku", + "高级功能权益内容": "Pokročilé funkcie", + "短信模板": "Sms šablóna", + "邮件模板": "E-mailová šablóna", + "发卡工具": "Kodér karty", + "购买高级功能须知": "Upozornenie", + "购买高级功能提示": "Pokročilejšie funkcie sú vo vývoji, a ak je potrebné, ste vítaní, aby ste otvorili službu na základe počtu zámkov. Pokročilé funkcie sú k dispozícii len pre vaše vlastné zámky. Ak ste autorizovaný správca, kontaktujte horného správcu zámku a otvorte službu", + "免费体验": "Bezplatná skúšobná verzia", + "立即开通": "Otvoriť teraz", + "购买短信": "Kúpiť sms", + "购买邮件": "Kúpiť e-mail", + "购买实名认证次数": "Nákup skutočné meno doby overovania", + "开通高级功能": "Povoliť pokročilú funkciu", + "选择套餐": "Vyberte balík", + "支付方式": "Spôsob platby", + "支付宝": "Alipay", + "去支付": "Platiť", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Je povolené definovať správu sami. používa sa na posielanie informácií o prístupovom kóde a ekey ostatným.", + "高级功能仅能用于你自己的锁": "Pokročilá funkcia môže byť aplikovaná iba vlastné zámky.", + "新建模板": "Šablóna vytvorenia", + "类型": "Typ", + "模版内容": "Obsah šablóny", + "预览": "Náhľad", + "房间名": "Izba", + "预计产生短信条数": "Odhadované segmenty správ", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Táto funkcia umožňuje skryť heslá, ekeys, karty, a odtlačky prstov, ktoré sú neplatné po určitú dobu.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Telefón používateľa je povinný byť online odomknúť tieto vybrané zámky pomocou aplikácie.", + "配置WiFi": "Konfigurácia wifi", + "请输入WiFi名字": "Zadajte prosím wifi názov", + "WiFi配网": "Rozvodná sieť wifi", + "胁迫卡": "Stresová karta", + "员工是否有密码": "Už má prístupový kód", + "员工是否有卡": "Už má kartu", + "员工是否有指纹": "Už nastaviť odtlačok prsta", + "获取钥匙": "Získať kľúč", + "获取卡": "Získať kartu", + "获取指纹": "Získať odtlačok prstov", + "安全验证": "Overenie identity", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Všetky informácie o vašom účte budú natrvalo odstránené z platformy a nemôžu byť obnovené. chcete odstrániť?", + "监控": "Monitor", + "视频日志": "Video log", + "开门器": "Otvárač dverí", + "面容开锁": "Tvár odomkne", + "开门方向设置": "Nastaviť smer otvorenia", + "电机功率设置": "Nastavenie motorového výkonu", + "开锁时是否需联网": "Ak je pri odomknutí potrebný internet", + "选择要加入分组的锁": "Vyberte zámky pre pridanie do tejto skupiny", + "锁数量": "Počet zámkov", + "小米IOT平台": "Xiaomi iot platforma", + "面容开锁设置": "Tvár odomkne nastaviť", + "感应距离": "Vzdialenosť snímania", + "防误开": "Zabrániť nesprávnemu otvoreniu", + "防误开已关闭,关门后仍可使用面容开锁": "Zabrániť chybnému otvoreniu bol zatvorený, po zatvorení dverí môže ešte použiť face odomknúť", + "添加和使用面容开锁时": "Pridajte a použite tvár pri odomknutí", + "添加和使用面容开锁时提示": "\n1, prosím, skúste udržať jednu osobu pred prevádzkou dverí;\n2, prosím, postaviť pred zámkom dverí asi 0,5 ~ 0,8 metrov, s smerom k zámku dverí;\n3. prosím, udržujte svoju tvár bez prekážok a odhaľujte vaše rysy tváre;\n4. keď je rozpoznávanie tváre abnormálne, môžete sa dotknúť ľubovoľného kľúča na digitálnej klávesnici reštartovať ručne rozpoznávanie tváre.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Prosím, vyberte výkon motora starostlivo podľa skutočnej situácie zámku dverí:", + "小功率:": "Miniwatt:", + "耗电少": "Menej spotreby energie", + "大功率": "Vysoký výkon:", + "大功率提示": "Ak zámkový jazyk nemôže byť stiahnutý normálne pri odomknutí, alebo je potrebné riadiť", + "开门方向设置提示": "Prosím, starostlivo vyberte smer otvoriť dvere vášho domova (ak si vyberiete nesprávny smer, nebudete môcť správne otvoriť a zavrieť dvere):", + "左开": "Otvorené vľavo", + "右开": "Otvorené vpravo", + "判断方法:": "Popis:", + "判断方法内容": "Muž stál pred domom, obrátil sa na vstupné dvere.", + "录像时段": "Video slot", + "密码": "Passcodes", + "卡": "Karty", + "指纹": "Odtlačok prstov", + "人脸": "Tvár", + "配件商城": "Lock mall", + "公司名称": "Názov spoločnosti", + "请输入公司名字": "Zadajte názov spoločnosti", + "提示": "Náznak", + "是否删除?": "Či odstrániť?", + "员工信息": "Informácie o zamestnancom", + "员工": "Personál", + "打卡方式无效": "Nedostupné", + "中国": "Čína", + "选择钥匙": "Vyberte si ekey", + "编辑": "Upraviť", + "无": "No", + "有": "Áno", + "请输入姓名": "Zadajte prosím meno", + "获取人脸": "Získanie tváre", + "选择密码": "Vyberte prístupový kód", + "选择卡": "Vyberte kartu", + "选择指纹": "Vyberte odtlačok prstov", + "选择人脸": "Vyberte tvár", + "员工是否有人脸": "Či zamestnanec má tvár", + "同时删除员工钥匙": "Odstrániť jeho/jej ekey", + "删除": "Delet", + "确定要删除员工吗?": "Odstrániť tento zamestnanec", + "月统计": "Mesačné štatistiky", + "迟到": "Late", + "早退": "Odísť čoskoro", + "未打卡": "Žiadny záznam", + "钥匙将在": "Tento ekey skončí v", + "天后失效": "Deň (y)", + "电量更新时间:": "Čas aktualizácie batérie:", + "新增配件": "Pridať", + "钥匙不可用": "Key nie je k dispozícii", + "正在开锁中...": "Odomknutie...", + "你的钥匙": "Váš kľúč", + "常开模式启动!长按闭锁": "Otvorený režim bol zahájený! Dlhý stlačte na zamknutie", + "演示模式": "Demo režim", + "请先同意用户协议及隐私政策": "Súhlaste sa s užívateľskou zmluvou a zásadou ochrany osobných údajov.", + "用户协议": "Používateľské podmienky", + "隐私政策": "Ochrana osobných údajov", + "注册成功": "Registrácia úspešná", + "你所在的": "Ste v", + "手机号": "Telefónne číslo", + "忘记密码": "Zabudnuté heslo", + "重置成功": "Obnoviť úspech", + "确定要退出吗?": "Odchod?", + "功能暂未开放": "Funkcia ešte nie je otvorená", + "设置成功": "Úspešne nastaviť", + "删除成功": "Úspešne odstrániť", + "单次": "Jednorazový", + "永久": "Permanent", + "限时": "Časovaný", + "自定义": "Custom", + "清空码": "Vymazať", + "循环": "Opakujúce sa", + "工作日": "Pracovný deň", + "每日": "Denne", + "周末": "Víkend", + "确定要删除吗?": "Odstrániť?", + "该锁的密码都将被删除": "Všetky prístupové kódy pre tento zámok budú vymazané", + "已过期": "Neplatný", + "该锁的电子钥匙都将被删除": "Všetky ekeys pre tento zámok budú vymazané", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Odstráňte všetky ekeys spojené s týmto ekey. tento krok nemôže byť zrušený!", + "删除钥匙会在用户APP连网后生效": "Ekey bude vymazaný", + "有效时间": "Účinný čas", + "接收者": "Príjemca", + "仅管理自己创建的用户": "Spravovať iba vlastných užívateľov", + "远程开锁": "Vzdialené odomknutie", + "请输入钥匙名称": "Zadajte prosím názov kľúča", + "修改成功": "Upraviť úspech", + "冻结": "Zmraziť", + "解除冻结": "Thaw", + "授权": "Autorizovať", + "取消授权": "Deautorizovať", + "同时解冻其发送的钥匙": "Rozmraziť všetky ekeys vydané týmto užívateľom", + "会在用户APP连网后生效": "Toto ekey bude rozmrazené, keď sa aplikácia používateľa pripojí k sieti", + "同时冻结其发送的钥匙": "Zmraziť všetky ekeys vydané týmto užívateľom", + "冻结会在用户APP连网后生效": "Toto ekey bude zmrazené, keď sa aplikácia užívateľa pripojí k sieti", + "取消授权会在用户APP连网后生效": "Používateľ stráca svoje oprávnenia, keď sa aplikácia používateľa pripojí k sieti", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Autorizovaný používateľ má takmer rovnaké oprávnenia ako správca zámku (napr. schopnosť odosielať ekeys a heslá)", + "失效时间需晚于生效时间": "Lehota musí byť neskoršia ako účinná doba", + "生效时间需晚于当前时间": "Účinný čas musí byť neskorší ako aktuálny čas", + "失效日期需晚于生效日期": "Dátum platnosti musí byť neskorší ako dátum účinnosti", + "修改有效期": "Obdobie zmeny", + "生效日期": "Dátum štartu", + "失效日期": "Koncový dátum", + "开锁": "Odomknúť", + "开锁成功": "Odomknúť úspech", + "请选择锁": "Prosím vyberte zámky", + "请选择接收者": "Prosím vyberte prijímač", + "请选择有效期": "Prosím, vyberte dobu platnosti", + "请选择发送方式": "Prosím, vyberte metódu odosielania", + "请选择结束时间": "Prosím, vyberte koncovú dobu", + "完成": "Kompletné", + "有效日": "Cyklus on", + "发送成功": "Odoslať úspech", + "请选择开始时间": "Prosím, vyberte čas štartu", + "选择用户": "Vyberte príjemcov", + "已选中": "Vybrané", + "确定": "Ok", + "请选择要发送的锁": "Prosím vyberte zámky", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Overovanie vlastného mena face sa týka potreby používateľa overiť jeho tvár pred odomknutím telefónnej aplikácie a overenie môže byť odomknuté.", + "分享": "Zdieľať", + "请输入接收者账号": "Zadajte prosím účet prijímača", + "接收者号码未注册,请重新发送": "Číslo prijímača nie je registrované, prosím opätovne odoslať", + "是否发送电子钥匙给未注册账号": "Chcete poslať ekey na nový účet", + "取消": "Zrušiť", + "标记成功": "Značka úspechu", + "微信好友": "Wechat priatelia", + "短信": "Sms", + "邮件": "E-mail", + "更多": "Viac", + "您好,您的电子钥匙生成成功": "Dobrý deň, váš elektronický kľúč je úspešne generovaný", + "生效时间不能小于当前时间": "Účinný čas nemôže byť menší ako aktuálny čas", + "结束时间不能小于当前时间": "Koncový čas nemôže byť menší ako aktuálny čas", + "是否为管理员": "Je to správca", + "已连接到锁,请将卡靠近门锁的读卡区": "Pripojené. umiestnite kartu proti čítačke kariet", + "尝试连接设备...": "Spojenie s zámkom. prosím počkajte...", + "地理位置": "Geografická poloha", + "检查以确保以下地址是正确的": "Skontrolujte, či je nasledujúca adresa správna", + "地图加载中,请稍候。。": "Mapa je nakladaná, prosím počkajte...", + "跳过": "Preskočiť", + "还未获取到位置信息哦,请耐心等待一下!": "Informácie o mieste zatiaľ neboli získané, prosím, trpezlivo počkajte!", + "请填写信息": "Prosím, vyplňte informácie", + "有效期": "Doba platnosti", + "生效时间": "Čas štartu", + "失效时间": "Koncový čas", + "上传成功": "Úspešne nahrané", + "未生效": "Neaktívny", + "已生效": "Efektívne", + "指纹详情": "Informácie o odtlačkoch prstov", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Budete musieť umiestniť prst na senzor niekoľkokrát. prosím, postupujte podľa pokynov...", + "开始添加": "Štart", + "请将您的手指按下": "Vložte prst na snímač", + "根据提示,抬起手指后再进行下一次指纹采集": "Postupujte podľa pokynov... budete musieť odstrániť a umiestniť prst na snímač pre ďalší záznam", + "添加成功": "Pridať úspech", + "更新成功": "Aktualizovať úspech", + "搜索": "Hľadanie", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Po reštartovaní bude karta zámku vymazaná, chcete reštartovať?", + "已失效": "Neplatný", + "卡详情": "Informácie o karte", + "请输入": "Prosím zadajte tu", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Vypnutím zámku zostane odomknutý celý deň, kým nie je ručne uzamknutý.", + "请输入小于或等于60的数字": "Zadajte číslo menej ako 60", + "操作成功": "Operácia úspešná", + "管理员密码相同,无需修改": "Heslo správcu je rovnaké a nemusí byť upravené", + "请输入6-9位数字": "6-9 číslic v dĺžke", + "请输入6-9位管理员密码": "Zadajte prosím heslo správcu 6-9 číslic", + "请输入新的管理员密码": "Zadajte nové heslo správcu", + "未分组": "Nezoskupené", + "请输入分组名称": "Vytvoriť skupinu", + "创建成功": "Vytvoriť úspech", + "设置锁分组成功": "Úspešne nastaviť skupinu zámku", + "电池1电量": "Batéria 1", + "电池2电量": "Batéria 2", + "电量更新时间": "Čas aktualizácie batérie", + "锁电量更新成功": "Lock napájanie aktualizácie úspech", + "您的钥匙未生效": "Váš kľúč nie je účinný", + "您的钥匙已冻结": "Váš kľúč bol zmrazený", + "您的钥匙已过期": "Váš kľúč vypršal", + "常开模式开启": "Zámok je v režime prechodu", + "超级管理员": "Super admin", + "授权管理员": "Autorizovaný správca", + "普通用户": "Obyčajný užívateľ", + "余": "Zostatok", + "天": "Deň", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Po vymazaní zámku bude všetky informácie vymazané spoločne, ste si istí, že chcete vymazať zámok?", + "请输入登录密码": "Zadajte prosím heslo aplikácie", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Nepodarilo sa odstrániť zariadenie, uistite sa, že zariadenie je v blízkosti zariadenia, zariadenie nie je pripojené a zariadenie je zapnuté", + "用户无权限": "Užívateľ nemá povolenie", + "创建公司后,考勤功能才能使用": "Prosím, vytvorte firmu ako prvý", + "是否删除钥匙?": "Vymazať tento ekey?", + "邮箱绑定成功": "E-mail viazanie úspech", + "手机绑定成功": "Mobilný telefón záväzné úspech", + "网络访问失败,请检查网络是否正常": "Žiadosť zlyhala. sieť nie je k dispozícii, skontrolujte a pripojte zariadenie na 3g/4g/wifi", + "清空": "Vymazať", + "是否清空?": "Čistý?", + "消息详情": "Informácie o správe", + "创建时间": "Čas vytvorenia", + "管理员详情": "Detaily správcu", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ak vás niekto núti otvoriť dvere, môžete použiť túto kartu. poplachová správa bude odoslaná administrátorom. ak chcete použiť túto funkciu, uistite sa, že váš zámok je online.", + "请不要将胁迫卡用于日常开锁": "Prosím, nepoužívajte nútenú kartu pre každodenné použitie.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ak vás niekto núti otvoriť dvere, môžete použiť tento odtlačok. poplachová správa bude odoslaná administrátorom. ak chcete použiť túto funkciu, uistite sa, že je váš zámok online.", + "请不要将胁迫指纹用于日常开锁": "Prosím, nepoužívajte nútený odtlačok prstov pre každodenné použitie.", + "创建公司": "Vytvoriť spoločnosť", + "公司名称不能超过30个字符": "Názov spoločnosti nemôže prekročiť 30 znakov", + "公司名称不能小于6个字符": "Názov spoločnosti nemôže byť menej ako 6 znakov", + "WIFI列表": "Wifi zoznam", + "刷新": "Refresh", + "手动配网": "Manuálna distribučná sieť", + "远距离": "Diaľková vzdialenosť", + "中距离": "Stredná vzdialenosť", + "近距离": "Krátka vzdialenosť", + "锁时间更新成功": "Lock čas aktualizácie úspech", + "锁用户": "Zamknúť používateľov", + "请选择常开日期": "Prosím, vyberte dátum otvorenia", + "结束时间不能小于开始时间哦": "Koncový čas nemôže byť menší ako čas štartu", + "介绍": "Náš príbeh", + "个人信息收集清单": "Zoznam zhromažďovania osobných informácií", + "应用权限说明": "Popis povolenia aplikácie", + "第三方信息共享清单": "Zoznam zdieľania informácií tretích strán", + "请选择您的位置": "Vyberte prosím vašu polohu", + "请先选择位置": "Prosím, vyberte miesto ako prvý", + "管理员密码": "Prihlasovací kód admin", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Ak potrebujete upraviť, zadajte nové heslo správcu (6 číslic), kliknite na tlačidlo ok pre úpravu", + "修改": "Upraviť", + "网络摄像头": "Kamera", + "重命名": "Premenovanie", + "分组下的锁将被移到未分组里": "Zámky pod skupinou budú presunuté do nezoskupených", + "编辑成功": "Upraviť úspech", + "厂商": "Výrobca", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Po vytvorení hesla ho prosím použite raz na aktiváciu pred 23:59 v ten istý deň, inak bude po hodine 0 neplatná. Po aktivácii hesla môže byť použitá neobmedzené časy v rámci platnosti.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Po vytvorení hesla ho prosím použite pred 23:59 v ten istý deň, inak bude po hodine 0 neplatná. Čistý kód sa používa na vymazanie všetkých hesiel vygenerovaných pred 0 hodine dnes.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Po vytvorení hesla ho prosím použite pred 23:59 v ten istý deň, inak bude po hodine 0 neplatná.", + "清空密码底部提示": "Heslo je platné do 23:59 hod. v deň vyprázdňovania", + "相机": "Kamera", + "相册": "Fotografie", + "读写": "Skladovanie", + "定位": "Lokalita", + "需要访问相机权限才能拍照上传文件例如头像上传": "Prístup k fotoaparátu je potrebný na vyhotovenie fotografií a nahrávanie súborov, ako napríklad nahrávanie profilu", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Prístup k fotoaparátu je potrebný pre nahrávanie súborov a avatarov pomocou obrázkov albumu", + "需要访问读写权限才能使用本地图片上传头像": "Pre nahrávanie avatarov pomocou lokálnych obrázkov je potrebný prístup k povoleniam na čítanie a zápis", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Pre použitie funkcie pridať kľúča je potrebný prístup k informáciám o polohe", + "申请": "Aplikácia", + "权限": "Povolenie", + "不允许": "Nie je povolené", + "允许": "Povolené", + "权限被拒绝": "Povolenie odmietnuté", + "请手动在系统设置中开启": "Prosím, ručne ho zapnúť v systémových nastaveniach", + "权限以继续使用应用": "Povolenie pokračovať v používaní aplikácie.", + "去设置": "Go set it up", + "当前网络": "Aktuálna sieť", + "位置信息": "Informácie o mieste", + "请输入wifi名称": "Zadajte prosím názov wifi", + "虹膜": "Iris", + "手掌": "Palm", + "商城": "Mall", + "我的": "My", + "微信公众号推送": "Wechat verejný účet", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Ak chcete otvoriť wechat pre prijímanie poplašných správ, musíte venovať pozornosť skye smart lock wechat verejný účet najprv, prosím, uložiť qr kód a použiť wechat pre skenovanie nastavenia", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Prístup k oprávneniam bluetooth je potrebný na použitie informácií o polohe funkcie pridať kľúča", + "请输入Email": "Zadajte svoj e-mail", + "请输入手机号": "Zadajte vaše telefónne číslo", + "家人到家": "Rodinný člen dorazil domov", + "添加家人": "Pridať rodinného člena", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Ak zámok nie je pripojený k internetu, pripomienky pre heslo, kartu, odtlačok prstov a iné metódy otvárania dverí nemôžu byť odoslané včas.", + "消息提醒": "Pripomenutie", + "开门通知": "Otvorenie oznámenia", + "N天未开门": "N dni bez otvorenia dverí", + "门未关好": "Dvere nie sú uzavreté", + "防拆报警": "Poplašný poplach", + "低电量提醒": "Nízka batéria", + "胁迫开门": "Nútené otváranie dverí", + "有人按门铃": "Niekto zvoní na zvonček", + "有人出现在门口": "Niekto sa objaví pri dverách", + "提醒方式": "Metóda pripomenutia", + "开门方式": "Metóda otvárania dverí", + "请选择": "Vyberte prosím", + "家人": "Rodinný člen", + "保存": "Uložiť", + "APP推送": "App push", + "管理员": "Admin", + "未启用": "Nie je povolené", + "已启用": "Povolené", + "省电模式": "Režim úspory energie", + "逗留抓拍模式": "Zostať režim zachytávania", + "实时监控模式": "Režim monitorovania v reálnom čase", + "自定义模式": "Vlastný režim", + "猫眼设置": "Nastavenie očí mačky", + "猫眼工作模式": "Cat eye pracovný režim", + "自动亮屏": "Automatická jasná obrazovka", + "亮屏持续时间": "Obrazovka v čase", + "逗留警告": "Zostať varovanie", + "异常警告": "Abnormálne varovanie", + "短信提醒": "Sms", + "邮件提醒": "E-mail", + "N天未开门提醒": "N dni bez otvorenia dverí", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Ak vás niekto núti otvoriť zámok, môžete použiť tento odtlačok. Poplachová správa bude odoslaná administrátorom. ak chcete použiť túto funkciu, uistite sa, že je váš zámok online.", + "胁迫指纹": "Nútený odtlačok prstov", + "指纹列表": "Zoznam odtlačkov prstov", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Po nastavenom čase, ak zámok nie je otvorený, systém pošle pripomínajúcu správu určenému príjemcovi. Táto funkcia vyžaduje, aby bol zámok pripojený k internetu.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Po zapnutí pripomenutia, keď je uzamykateľná batéria pod 20%, 10% a 5%, systém pošle pripomínajúcu správu určenému príjemcovi.", + "未开门时间": "Dni bez otvorenia dverí", + "添加和使用面容开锁时:": "Pridajte a použite tvár pri odomknutí:", + "关锁": "Zatvorenie zámku", + "功能": "Funkcia", + "配件": "Časti", + "云存": "Cloud storage", + "本地": "Táto lokalita", + "3天滚动储存": "3 dni valcovanie skladovanie", + "去升级": "Upgrade teraz", + "下载列表": "Zoznam na stiahnutie", + "已下载": "Stiahnuté", + "全部视频": "Všetky videá", + "已为本设备免费提供3大滚动视频储存服务": "Pre toto zariadenie boli bezplatne poskytnuté tri služby scrolling video storage", + "视频播放": "Prehrávanie videa", + "全选": "All", + "请选择要删除的视频": "Prosím, vyberte video, ktoré chcete odstrániť", + "请选择要下载的视频": "Prosím, vyberte video, ktoré chcete stiahnuť", + "欢迎使用": "Vitajte na použitie", + "用户协议和隐私政策概要": "Súhrn užívateľskej zmluvy a zásad ochrany osobných údajov", + "协议概要": "Súhrn protokolu", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Ďakujeme vám za použitie tejto aplikácie. Pripisujeme veľký význam vašim osobným údajom a ochrane súkromia. Pred použitím tohto produktu, prosím, prečítajte si ho starostlivo", + "《用户协议》": "Používateľské podmienky", + "和": "A", + "《隐私政策》": "◆ Ochrana osobných údajov, ochrana súkromia, ochrana súkromia, ochrana osobných údajov, ochrana osobných údajov, ochrany osobných údajov, ochrany osobných údajov, ochrany osobných údajov, ochrany osobných údajov, ochrany osobných údajov, ochrany osobných údajov, ochrany osobných údajov, ochrany osobných údajov a ochrany osobných údajov.", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Celý obsah. Kliknutím na \"súhlasím\" súhlasíte a akceptujete všetky podmienky. Ak sa rozhodnete nesúhlasiť, nebudete môcť využívať naše produkty a služby a aplikáciu ukončíte.", + "不同意": "Nesúhlasím", + "同意": "Súhlasím", + "该功能是高级功能,请开通后再使用": "Toto je pokročilá funkcia. Prosím, zapnite to najskôr.", + "常用程序": "Spoločné programy", + "该锁已被重置": "Zámok bol reset", + "需要访问读写权限才能使用手动升级固件": "Pre manuálne aktualizáciu firmvéru je potrebný prístup k oprávneniam na čítanie a zápis", + "错误D固件,请选择正确的文件": "Nesprávny firmware, vyberte správny súbor", + "非SYD固件,请选择正确的文件": "Non syd firmware, vyberte správny súbor", + "文件校验失败 0x01": "Overenie súboru zlyhalo 0x01", + "解析元数据失败,请选择正确的文件": "Nepodarilo sa analyzovať metadata, prosím vyberte správny súbor", + "文件校验失败 0x02": "Overenie súboru zlyhalo 0x02", + "文件校验失败 0x03": "Overenie súboru zlyhalo 0x03", + "固件升级完成": "Aktualizácia firmvéru dokončená", + "记录": "Records", + "开通高级功能后才可以对锁进行管理": "Prosím povoľte pokročilú funkciu najprv spravovať zámky.", + "去开通": "Povoliť", + "实名认证": "Autentifikácia skutočného mena", + "当前剩余数量": "Zostávajúce", + "购买": "Nakupovanie", + "实名认证为付费功能,请购买后再使用": "Autentifikácia reálneho mena je platená funkcia, prosím, použite ju po nákupe", + "密码不一致哦": "Heslá sú nekonzistentné", + "退出添加": "Prestať pridávať", + "管理员已满": "Admin full", + "用户已满": "Užívateľ je plný", + "锁上面添加指纹已满": "Pridať odtlačok na zámok je plný", + "指纹已存在": "Odtlačok prstov už existuje.", + "锁上面添加人脸已满": "Zamknúť nad pridať tvár je plná", + "人脸已存在": "Tvár už existuje", + "锁上面添加卡已满": "Zamknúť nad pridať kartu je plná", + "卡已存在": "Karta už existuje", + "锁上面添加密码已满": "Zamknúť nad pridať heslo je plný", + "密码已存在": "Rovnaký prístupový kód už existuje. vyberte prosím iný", + "请输入密码": "Zadajte prosím heslo", + "暂无密码,无需重置": "Žiadne heslo, nie je potrebné obnoviť", + "真实姓名": "Skutočné meno", + "身份证号": "Id číslo", + "请输入真实姓名": "Zadajte prosím svoje skutočné meno", + "请输入身份证号": "Zadajte prosím vaše id číslo", + "请输入身份证号和真实姓名": "Zadajte prosím svoje id číslo a skutočné meno", + "点击返回设备配对": "Ťuknite späť na párovanie zariadení", + "无法连接?尝试升级": "Nemôže sa pripojiť? pokus o aktualizáciu", + "固件升级提示": "Výzva pre aktualizáciu firmvéru", + "请先获取固件文件到手机本地,再选择升级": "Prosím, najskôr získať súbor firmvéru do miestneho telefónu a potom vyberte upgrade", + "固件升级中": "Firmware je aktualizovaný", + "取消升级": "Zrušiť upgrade", + "固件传输中": "Firmware v tranzitu", + "关闭": "Vypnúť", + "传输中'": "In transit", + "操作记录": "Records", + "修改姓名": "Upraviť názov", + "传输中": "In transit", + "发送人": "Vydané", + "发送时间": "Vydaný čas", + "钥匙详情": "Ekey info", + "姓名": "Meno", + "发送": "Odoslať", + "请确认姓名全名和身份证号码是否正确": "Potvrďte, že celé meno a id číslo sú správne", + "传输期间请勿离开当前页面": "Počas prenosu nenechávajte aktuálnu stránku", + "机型": "Modely", + "硬件版本": "Hardvérová verzia", + "固件版本": "Verzia firmvéru", + "手动升级": "Ručná aktualizácia", + "设备连接中...": "Pripojenie zariadenia...", + "未避免异常情况,请在门打开时升级": "Nevyhnutné výnimky, prosím aktualizovať, keď je otvorené dvere", + "钥匙无效": "Kľúč je neplatný", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Nie je možné pripojiť k zámku. reštartujte blutooth telefónu a skúste to znova.", + "如果是全自动锁,请使屏幕变亮": "Ak je to plne automatický zámok, prosím, aby sa obrazovka jasnejšia", + "正在尝试闭锁……": "Snaží sa zamknúť. prosím počkajte...", + "清空记录": "Vymazať záznamy", + "是否要删除操作记录?": "Pokračovať v odstraňovaní záznamov?", + "被删除的记录不能恢复": "Záznamy nie je možné obnoviť po vymazaní.", + "全部事件": "Všetky udalosti", + "开锁事件": "Odomknúť udalosť", + "异常事件": "Abnormálna udalosť", + "门铃事件": "Zvonček udalosť", + "视频事件": "Video event", + "请开启蓝牙": "Prosím, zapnite bluetooth", + "请选择有效日": "Prosím, vyberte účinný deň", + "公司名字长度不能小于 6 ": "Dĺžka názvu firmy nemôže byť menšia ako 6", + "已是最新版本": "Žiadne aktualizácie", + "新建短信模版": "Vytvorenie sms šablóna", + "新建邮件模版": "Vytvorenie e-mailovej šablóny", + "自定义短信模版": "Sms šablóna", + "自定义邮件模版": "E-mailová šablóna", + "名称": "Meno", + "星星锁": "Star lock", + "无考勤记录": "Žiadne záznamy", + "大家干劲十足": "Každý prichádza v čase", + "工作时长未出炉": "Žiadne pracovné hodiny", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Výber krajiny/regiónu bude mať vplyv na bezpečnosť údajov. v súčasnosti ste vybrali albánsko, pred pokračovaním potvrďte.", + "确认国家或地区": "Potvrdiť krajinu/región", + "我知道了": "Got it", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Ak chcete získať dôležité aktualizácie, kliknite na 'ok' a povoľte oznámenia v nastaveniach.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Po zapnutí môžete znovu zapnúť dlhým stlačením nastavovacieho tlačidla na zámku a znovu ho pridajte pomocou aplikácie.", + "已有": "Prúd", + "新增": "Nový", + "账号格式错误": "Zlý formát", + "接收者信息为空": "Informácie o príjemcovi sú prázdne", + "请输入时间(秒)": "Zadajte prosím čas (s)", + "加载数据失败": "Načítanie dát sa nezdařilo", + "重试": "Skúste znova", + "升级中,是否退出": "Počas aktualizácie, či vystúpiť", + "下一步": "Ďalšie", + "公寓": "Byt", + "个人用户": "Osobné", + "星寓": "Star apartment", + "账号": "Účet", + "请输入手机号或email": "Telefónne číslo alebo e-mail", + "请输入星寓管理员的账号": "Zadajte prosím účet správcu star apartment", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Všetky údaje z vybraného zámku (ok) budú natrvalo prenesené na príjemcu.", + "暂不支持跨平台转移,敬请期待": "Cross-platform transfer sa zatiaľ nepodporuje, prosím, tešíme sa na to", + "移除坏锁": "Presunúť chybné/poškodené zámky na odpadky", + "转移确认": "Potvrdiť prenos", + "本次共转移": "Tentoraz celkom", + "把智能锁": "Smart lock", + "确认": "Ok", + "移除成功": "Úspešne odstrániť", + "转移成功": "Prenosový úspech", + "该已锁被删除": "Uzamknutý je vymazaný", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Autorizovaný správca môže spravovať iba heslá, ekeys a etccreated sám.", + "添加授权管理员": "Vytvoriť správcu", + "导出记录": "Exportovať záznamy", + "选择时间段": "Vyberte časové obdobie", + "导出": "Export", + "批量导出": "Export šarže", + "读取记录": "Refresh records", + "设备": "Zariadenie", + "消息": "Správy", + "智能分析": "Inteligentná analýza", + "精准识别设备事件,过滤无效信息": "Presne identifikovať udalosti zariadenia a filtrovať neplatné informácie", + "系统设置": "Nastavenia systému", + "系统的全局配置在此项内进行设置": "Globálna konfigurácia systému je nastavená v tejto položke", + "导出操作记录": "Exportovať záznamy", + "立即查看": "Zobraziť", + "导出成功": "Úspešne exportované", + "发送钥匙": "Odoslať ekey", + "进度": "Rate", + "失败": "Zlyhané", + "人脸详情": "Detaily tváre", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Keď je niekto pociťovaný asi 1,5 metra pred dverami, odomknutie rozpoznávania tváre sa automaticky spustí.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Keď je niekto pociťovaný asi 0,8 metrov pred dverami, odomknutie rozpoznávania tváre sa automaticky spustí.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Keď je niekto pociťovaný asi 0,5 metrov pred dverami, odomknutie rozpoznávania tváre sa automaticky spustí.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Vzdialenosť snímania bola vypnutá, musíte sa ručne dotknúť akéhokoľvek klávesu na klávesnici, aby ste vykonali odomknutie rozpoznávania tváre.", + "防误开已打开,开锁后": "Anti-chyba otváranie bolo zapnuté, a po odomknutí", + "秒内不可使用面容开锁": "Odomknutie tváre nie je možné použiť do sekúnd", + "掌静脉": "Dlaňové žily", + "添加掌静脉": "Pridajte dlaňovú žily", + "胁迫掌静脉": "Nútená dlaňová žila", + "请不要将胁迫掌静脉用于日常开锁": "Nepoužívajte nátlakové dlaňové žily na denné odomknutie", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Pripojený k zámku, prosím, prirodzene otvoriť dlaň, dlaň je smerom k kameru", + "掌静脉详情": "Dlaňové žily podrobnosti", + "掌静脉号": "Číslo dlaňovej žily", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth nie je zapnutý, prosím zapnite bluetooth v nastaveniach", + "删除用户时,会将用户拥有的钥匙一起删除。": "Ak je používateľ vymazaný, všetky ekeys spojené s užívateľom budú tiež vymazané.", + "配置网络": "Konfigurácia siete", + "你好": "Hello", + "成功": "Úspešný", + "类型选择": "Typ select", + "请选择要使用哪种类型": "Prosím, vyberte, ktorý typ používať", + "系统邮件(推荐)": "Systémový e-mail (odporúča)", + "系统短信(推荐)": "Sms (odporúča)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-mail bude odoslaný z tejto aplikácie. prosím, kúpiť e-mail balík ako prvý.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Sms bude odoslaná z tejto aplikácie. prosím, kúpiť e-mail balík ako prvý.", + "个人邮件": "Osobný e-mail", + "个人短信": "Osobné sms", + "邮件将从你的个人邮箱发给用户": "E-mail bude odoslaný z vášho osobného e-mailového účtu.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Sms správa bude odoslaná z vášho osobného telefónneho čísla.", + "为了更好地应用体验,请确定权限": "Pre lepšiu aplikačnú skúsenosť, prosím, potvrďte oprávnenia", + "您第一次拒绝权限,请确定权限": "Ste odmietli povolenie prvýkrát, prosím potvrďte povolenie", + "您第二次拒绝权限,请去应用设置开启权限": "Odmietol povolenie po druhýkrát, prejdite do nastavenia aplikácie, aby ste povolili povolenie", + "去应用市场": "Prejsť do app store", + "温馨提示": "Teplá výzva", + "关闭应用": "Zavrieť aplikáciu", + "开启微信接收报警消息需要先关注": "Ak chcete otvoriť wechat na prijímanie poplašných správ, musíte nasledovať", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat verejný účet, uložiť qr kód a použiť wechat pre skenovanie nastavenia", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Autentifikácia reálneho mena je platená funkcia, prosím, kontaktujte správcu zámku na nákup a použitie", + "位置权限": "Povolenie umiestnenia", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Udelte prosím aplikáciu pre používanie vašej lokality. používa sa na skenovanie zámkov a brán.", + "相机/相册权限": "Povolenie kamery/albumu", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Udelte prosím aplikáciu na čítanie a písanie fotografií a súborov z úložiska.", + "点击选择": "Kliknite na výber", + "微信": "Wechat", + "朋友圈": "Momenty", + "QQ": "Qq", + "QQ空间": "Qqzone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Link", + "今天": "Dnes", + "密码错误": "Neplatné heslo", + "网络中断": "Prerušenie siete", + "钥匙不存在": "Klíč neexistuje", + "钥匙过期": "Klíč vypršal", + "钥匙已存在": "Klíč už existuje", + "密码失效": "Heslo neplatné", + "门锁时间异常": "Čas zámku dverí abnormálny", + "APP(手机)未联网": "Aplikácia (mobilný telefón) nie je pripojená k internetu", + "数据不存在": "Údaje neexistujú", + "待接收": "Bereceived", + "已冻结": "Frozen", + "已删除": "Vymazané", + "未知": "Neznámy", + "拖动下方滑块完成拼图": "Pretiahnite posuvník do správnej pozície", + "验证成功": "Úspech overovania", + "验证失败": "Overenie zlyhalo", + "向右拖动滑块填充拼图": "Pretiahnite posuvník vpravo vyplniť puzzle", + "请先获取到位置信息哦": "Prosím, získajte informácie o polohe najskôr", + "请选择国家": "Prosím vyberte krajinu", + "获取锁信息": "Získať informácie o zámku", + "锁数据异常,请重试": "Uzamknúť dáta je abnormálne, skúste znova", + "连接设备中...": "Pripojenie zariadenia...", + "把锁": "Zámky", + "条": "Strih", + "封": "Pečať", + "次": "Times", + "支付成功": "Platiť úspech", + "查看详情": "Zobraziť podrobnosti", + "请输入模板名称": "Zadajte meno šablóny", + "模版类型": "Typ", + "再返回一次退出": "Znovu vystúpiť", + "请先添加锁": "Prosím, najskôr pridajte zámok", + "可视对讲": "Visual intercom", + "详细日志": "Podrobný denník", + "已复制到剪切板": "Kopírované", + "拍照": "Foto", + "从相册选择": "Vyberte si z albumu", + "选择问题": "Prosím vyberte otázku", + "确认长度不足8位": "Potvrdiť dĺžku menej ako 8 číslic", + "新密码长度不足8位": "Nová dĺžka hesla menej ako 8 číslic", + "两次密码不一致": "Heslo nezhody. skúste prosím znova", + "请点击获取验证码,验证码将发送到": "Prosím, získajte verifikačný kód. kód bude odoslaný na", + "切换": "Prepínač", + "验证": "Overiť", + "验证成功,账号已删除": "Overenie úspešné, účet vymazaný", + "该密码不是自定义密码,无法修改": "Toto heslo nie je vlastné heslo a nemôže byť upravené", + "请选择设备要关联哪些姓名": "Vyberte prosím, ktoré mená zariadenie by malo byť priradené", + "请选择姓名要关联哪些设备": "Vyberte prosím, ktoré zariadenia by meno malo byť priradené", + "确定要移除所选中的坏锁吗?": "Odstrániť nefunkčný zámok?", + "邮件通知": "Informovať e-mailom", + "短信通知": "Oznámiť prostredníctvom sms", + "您好,您的授权管理员生成成功": "Dobrý deň, váš autorizovaný správca bol úspešne vytvorený", + "请输入接收者姓名": "Prosím zadajte tu", + "版本更新": "Aktualizácia verzie", + "下次再说": "Next time", + "配网成功": "Úspech distribúcie siete", + "配网失败": "Sieťová distribúcia zlyhala", + "该锁的无线键盘都将被删除": "Všetky bezdrôtové klávesnice pre tento zámok budú vymazané", + "实时画面": "Obraz v reálnom čase", + "适合门口较为安全的环境。": "Vhodné pre relatívne bezpečné prostredie pri dverách.", + "仅发生特定事件才录像,并可查看实时画面。": "Zaznamenávajú sa len konkrétne udalosti a je možné si prezrieť obraz v reálnom čase.", + "一般情况下,满电可使用7-8个月": "Za normálnych okolností môže byť použitý po dobu 7-8 mesiacov pri plnom nabití", + "有人逗留或发生特定事件才录像,可随时查看": "Niekto zostane alebo konkrétne udalosti sú zaznamenané, a môžu byť videné kedykoľvek", + "实时画面。": "Fotka v reálnom čase.", + "一般情况下,满电可使用5~6个月。": "Za normálnych okolností môže byť použitý po dobu 5 ~ 6 mesiacov pri plnom nabití.", + "适合门口人员复杂、较不安全的环境。": "Vhodné pre zložité a relatívne nebezpečné prostredie pri dverách.", + "有人出现就录像,可随时查看实时画面。": "Záznam, keď sa niekto objaví, a zobraziť v reálnom čase obrázok kedykoľvek.", + "一般情况下,满电可使用2~4个月。": "Za normálnych okolností môže byť použitý po dobu 2 ~ 4 mesiacov pri plnom nabití.", + "根据您家门口实际情况设置录像和实时画面功能。": "Nastavte funkciu videa a obrazu v reálnom čase podľa aktuálnej situácie pri dverách.", + "可使用时长由具体设置决定。": "Doba používania je určená konkrétnymi nastaveniami.", + "查看": "Zobraziť", + "有人按门铃或发生": "Niekto zvoní na zvonček alebo", + "异常事件时": "Abnormálna udalosť", + "不录像": "Žiadne video", + "有人出现、按门铃": "Niekto sa objaví, zvoní zvonček", + "或发生异常事件时": "Alebo sa vyskytuje abnormálne udalosti", + "逗留达到10秒": "Pobyt na 10 sekúnd", + "约1.5米": "Asi 1,5 metra", + "随时": "Kedykoľvek", + "立即录像": "Záznam ihneď", + "录像时机": "Načasovanie videa", + "有人出现时录像": "Záznam, keď sa niekto objaví", + "人体侦测距离": "Vzdialenosť detekcie človeka", + "查看实时画面": "Zobraziť obrázok v reálnom čase", + "自定义时间": "Vlastný čas", + "当日": "Dnes", + "次日": "Ďalší deň", + "自定义时段": "Vlastné časové obdobie", + "发生事件时查看": "Zobraziť, kedy sa udalosť vyskytuje", + "实时查看": "Pohľad v reálnom čase", + "有人在门口出现10秒后开始录像。": "Niekto sa objaví pri dverách 10 sekúnd pred nahrávaním.", + "有人按门铃时立即录像。": "Záznam okamžite, keď niekto zvoní na zvonček.", + "有人出现在门前1.5米范围时启动录像": "Začnite nahrávať, keď sa niekto objaví do 1,5 metrov pred dverami", + "约0.8米": "Asi 0,8 metra", + "约3.0米": "Asi 3,0 metrov", + "添加指纹失败": "Operácia zlyhala.", + "项": "Položky", + "播放中": "Hranie", + "下载": "Stiahnuť", + "暂无下载内容": "Žiadny obsah na stiahnutie", + "亮度": "Jasnosť", + "音量": "Zväzok", + "快进至": "Rýchlo dopredu na", + "快退至": "Rewind na", + "暂无视频信息": "Žiadne video informácie", + "加载出错": "Chyba načítania", + "请单人正对门锁,距离一个成年人手臂长度": "Prosím, postaviť pred zámkom dverí sám, pri dĺžke ruky", + "(约0.6米)。": "(Asi 0,6 metra).", + "保持脸部无遮挡,露出五官。": "Udržujte svoju tvár bez prekážok a ukázať svoje rysy tváre.", + "准备好了,开始添加": "Pripravené, začnite pridávať", + "正在录入中...": "Nahrávanie...", + "添加人脸失败": "Zlyhalo pridanie tváre", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Po reštartovaní budú tváre zámku vymazané. Ste si istí, že chcete obnoviť?", + "人脸号": "Číslo tváre", + "虹膜详情": "Iris podrobnosti", + "虹膜号": "Číslo iris", + "选择设备类型": "Vyberte typ zariadenia", + "照明灯具": "Svietidlá", + "电动窗帘": "Elektrické záclony", + "门窗传感器": "Snímač dverí a okien", + "传感器": "Senzor", + "清除数据成功": "Úspešne vymazané dáta", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Zámok nie je pripojený k internetu, takže rekódy prístupového kódu, karty, odtlačkov prstov a iných metód otvárania dverí nemôžu byť nahrané v reálnom čase.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Ak potrebujete, aby historické záznamy, môžete exportovať ich.", + "看不到操作记录,可能原因有": "Nemôže vidieť záznamy operácie, možné dôvody", + "操作记录详情": "Detaily záznamu operácie", + "操作时间": "Čas prevádzky", + "此模块功能需要锁联网后设置方可生效": "Táto funkcia modulu je potrebné nastaviť potom, čo je zámok pripojený k internetu, aby nadobudli účinnosť", + "用户已存在": "Užívateľ už existuje", + "钥匙数量已到上限": "Počet kľúčov dosiahol hornú hranicu", + "附近没有可用网关": "V okolí nie je k dispozícii žiadna brána", + "正在创建安全连接...": "Vytvorenie zabezpečeného pripojenia...", + "监视状态下不能发送录音": "Nemôže odoslať záznamy v režime monitorovania", + "挂断": "Zavesiť", + "监视中暂不能开锁": "Odomknutie nie je k dispozícii počas monitorovania", + "长按说话": "Stlačte a držte sa hovoriť", + "松开发送": "Uvoľnenie pre odoslanie", + "请输入6位数字开锁密码": "Zadajte prosím 6-ciferné odomknúť heslo", + "请输入开锁密码": "Zadajte prosím heslo odomknúť", + "接收者在有效期内可以不限次数使用": "Príjemcovia sú schopní používať ekeys na neobmedzené časy v rámci lehoty.", + "接收者可以使用此App开关锁": "Príjemca sú schopní zamknúť/odomknúť pomocou tejto aplikácie.", + "单次钥匙有效期为1小时,只能使用一次": "Jednorazový ekey je platný jednu hodinu a môže byť použitý len raz.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Príjemcovia sú schopní používať ekeys na neobmedzené časy v rámci pevnej doby cyklu.", + "获取模板失败": "Nepodarilo sa získať šablónu", + "微信通知": "Wechat oznámenie", + "系统短信": "Systém sms", + "系统邮件": "Systémový e-mail", + "模板": "Šablóna", + "新建模版": "Vytvoriť šablónu", + "您好,您的密码是": "Dobrý deň, vaše heslo je", + "密码名字": "Meno hesla", + "请输入6-9位密码": "Zadajte prosím 6-9 číslice heslo", + "设置密码": "Nastaviť heslo", + "操作成功,密码为": "Úspešne. prístupový kód je", + "类型:自定义-永久": "Typ: vlastný-trvalé", + "实时播放": "Prehrávanie v reálnom čase", + "点击对讲": "Kliknite na intercom", + "长按开锁": "Dlhé stlačenie pre odomknutie", + "接听失败": "Zlyhala odpoveď", + "请在锁设置中开启远程开锁": "Prosím povoľte diaľkové odomknutie v nastaveniach zámku", + "接听": "Odpoveď", + "截图已保存到相册": "Snímka uložená do albumu", + "添加遥控": "Pridať diaľkové ovládanie", + "已连接到锁,请按遥控": "Pripojené k zámku, prosím stlačte diaľkové ovládanie", + "遥控号": "Číslo diaľkového ovládania", + "遥控详情": "Diaľkové ovládanie podrobnosti", + "照明": "Osvetlenie", + "退出演示模式": "Exit demo režim", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tip: aktuálne rozhranie je zobrazovacie rozhranie. Po pridaní zariadenia môžete pokračovať v jeho používaní", + "门已上锁": "Dvere sú zamknuté", + "您的账号在异地登录,如非本人,请尽快修改密码": "Váš účet bol použitý na prihlásenie z nového zariadenia", + "开门成功": "Otvorte dvere úspešne", + "开门失败": "Nepodarilo sa otvoriť dvere", + "呼叫提醒": "Upozornenie na volanie", + "收到来自": "Prijaté od", + "锁的呼叫": "Uzamknúť volanie", + "加载数据中": "Načítanie dát", + "搜索所有锁类型": "Vyhľadávanie všetkých typov zámku", + "锁电量更新时间": "Uzamknúť čas aktualizácie batérie", + "1月": "Ján", + "2月": "Febr.", + "3月": "Mar", + "4月": "Dub.", + "5月": "Máj", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Okt", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Hot cities", + "导出锁数据": "Exportovať dáta zámku", + "一键开锁": "Odomknúť jedným kliknutím", + "已开通": "Otvorené", + "编辑员工": "Upraviť zamestnancov", + "一": "One", + "二": "Dva", + "三": "Tri", + "四": "Štyri", + "五": "Päť", + "六": "Šesť", + "日": "Sun", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?", + "在线": "Online", + "离线": "Offline", + "购买记录": "Zápis nákupu", + "使用记录": "Záznam používateľa", + "失效时间要大于当前时间": "Doba vypršania musí byť dlhšia ako aktuálny čas", + "修改名字": "Upraviť názov", + "时": "Hodina", + "分": "Minúta", + "Amazon Alexa": "Amazon alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Môžete použiť alexa odomknúť, zamknúť a skontrolovať stav zámku", + "支持的国家": "Podporované krajiny", + "支持的国家值": "Usa, kanada, veľká británia, austrália, india, nemecko, francúzsko, taliansko, španielsko, japonsko", + "操作流程": "Prevádzkový proces", + "操作流程值": "1 pridajte zámok a bránu s aplikáciou smart lock\n\n2 zapnite funkciu diaľkového odblokovania zámku v aplikácii (táto funkcia je predvolene vypnutá). Ak nemáte túto možnosť, zámok nepodporuje alexa\n\n3 pridajte zručnosti alexa a autorizujte ich pomocou účtu a hesla aplikácie smart lock. Po tom, čo je povolenie úspešné, môžete objaviť zariadenia pod účtom\n\n4 nájdite zámok v aplikácii alexa, zapnite funkciu odomknúť hlas a nastavte heslo jazyka\n\n5 zámok môže byť ovládaný cez alexa", + "Google Home": "Google home", + "Action name": "Názov akcie", + "ScienerSmart": "Scienersmart", + "支持的语言": "Podporované jazyky", + "英语": "Angl.", + "Google Home操作流程的值": "1. použite aplikáciu smart lock na pridanie zámkov a brán\n\n2. povoľte diaľkovú funkciu odblokovania zámku v aplikácii (táto funkcia je predvolene vypnutá). Bez tejto možnosti zámok nepodporuje google home\n\n3. nainštalujte aplikáciu google home a kliknite na tlačidlo \"\" v ľavom hornom rohu\n\n4. na stránke nastavenia vyberte \"práca s google\"\n\n5. vyhľadajte \"scienersmart\" a použite účet aplikácie smart lock a heslo na autorizáciu", + "密码需至少包含数字/字母/字符中的2种组合": "Heslo musí obsahovať najmenej 2 z nasledujúcich: čísla, písmená a špeciálne znaky", + "已开锁": "Odomknuté", + "已闭锁": "Uzamknutý", + "两次密码不一致哦": "Heslá sú nekonzistentné", + "中功率": "Stredný výkon", + "常规使用": "Pravidelné použitie", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Po zapnutí brány stlačte a podržte tlačidlo reset po dobu 5 sekúnd a kliknite na ďalšie, keď indikátorové svetlo záblesky striedavo", + "扫描设备": "Skenovanie zariadenia", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Vymazanie sa nepodarilo. Brána môže ísť offline. Chcete vynútiť odstránenie údajov?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json new file mode 100644 index 00000000..be13221a --- /dev/null +++ b/lan/lan_sr_cyrl.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Звездана брава", + "锁通通": "Закључај кроз", + "点击开锁,长按闭锁": "Додирните за откључавање, држите за закључавање", + "考勤": "Присуство", + "考勤设置": "Подешавања похађања", + "电子钥匙": "еКеис", + "添加卡": "Додај картицу", + "卡号": "Број картице", + "添加指纹": "Додај отисак прста", + "指纹号": "Број отиска прста", + "遥控": "Удаљене", + "添加人脸": "Додај лице", + "门锁日志": "Дневник закључавања врата", + "密码号": "Број лозинке", + "添加者": "Оператор", + "添加时间": "Време", + "重置": "Поништи", + "请输入手机号或者邮箱": "Број телефона/е-маил", + "工作时间": "Радно време", + "工作日设置": "Подешавање радног дана", + "星期一": "Понедељак", + "星期二": "Уторак", + "星期三": "Среда", + "星期四": "Четвртак", + "星期五": "Петак", + "星期六": "Субота", + "星期日": "Субота", + "简写周一": "М", + "简写周二": "Т", + "简写周三": "W", + "简写周四": "Т", + "简写周五": "Ф", + "简写周六": "С", + "简写周日": "С", + "周一": "Мон", + "周二": "Уто", + "周三": "Уранила", + "周四": "Чет", + "周五": "Уреал", + "周六": "Седео", + "周日": "Сунце", + "群发钥匙": "Пошаљи више екеис", + "锁": "Закљуиај", + "请添加": "Примаоца", + "允许远程开锁": "Даљинско откључавање", + "请输入验证码": "Верификациони код", + "获取密码": "Генеришите лозинку", + "请给密码命名": "Унесите име за ову лозинку", + "密码有限期为6个小时,只能使用一次": "Ова лозинка се мора користити у року од 6 сати од тренутног времена или ће бити суспендована из безбедносних разлога. Ова лозинка се може користити само једном.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Ручно унесите 6-9 цифара као лозинку. Може се додати путем телефона Блуетоотх поред браве, или даљински додати преко гатеваи", + "获取": "Добити", + "添加": "Додати", + "删除公司": "Избриши компанију", + "密码详情": "Информације о лозинки", + "修改密码": "Промена шифре", + "添加虹膜": "Додај Ирис", + "添加门磁": "врата сензор", + "添加无线键盘": "Бежична тастатура", + "添加手掌": "Додај Палм", + "请输入员工账号": "Унесите рачун запосленог", + "批量授权锁": "Одобрите више брава", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Овлашћени администратор ће имати већинску дозволу за рад ове браве.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ова функција вам омогућава да откључате Смарт Лоцк даљински преко гатеваи.Тхис функција може да се укључи или искључи преко Блуетоотх-а.", + "排列方式": "Тип листе", + "早到榜": "Рана листа", + "迟到榜": "Касно Листа", + "当前模式": "Тренутни режим", + "勤奋榜": "Напоран Рад Особа списак", + "延迟时间": "Време кашњења", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Закључавање ће се аутоматски закључати након времена. Молимо Вас да га откључате за један пут прво да би подешавање доступно.", + "时间": "Време", + "开始时间": "Време почетка", + "结束时间": "Време завршетка", + "工作时间设置": "Подешавање радног времена", + "常开模式": "Пролаз РЕЖИМ", + "常开时间": "У овом временском периоду", + "常开日期": "Ових дана", + "添加员工": "Додај особље", + "编辑员工": "Уреди особље", + "节假日": "Одмор", + "打卡方式": "Метод", + "员工是否有钥匙": "Већ има екеи", + "上班时间": "Време почетка", + "下班时间": "Време затварања", + "本周": "Ове недеље", + "单休": "Једнодневни викенд", + "双休": "Дводневни викенд", + "单双休": "Једнодневни викенд", + "年": "Године", + "月": "Месеца", + "放假日期": "Одмор", + "补班日期": "Радни дани", + "添加假日": "Додај одмор", + "开始日期": "Датум почетка", + "必填": "Потребне", + "结束日期": "Датум завршетка", + "日榜": "Свакодневно", + "月榜": "Месечни", + "考勤记录": "Записе", + "假日信息": "Информације о одмору", + "基本信息": "Основно", + "无线键盘": "Бежична тастатура", + "选择无线键盘": "Додај тастатуру", + "门磁": "врата сензор", + "自动闭锁": "Аутоматско закључавање", + "锁声音": "Закључај звук", + "防撬报警": "Саблажење Упозорење", + "重置键": "Дугме за ресетовање", + "锁时间": "Закључај сат", + "诊断": "Дијагностиковање", + "上传数据": "Отпремање података", + "导入其他锁数据": "Увоз фроме другу браву", + "锁升级": "Ажурирање фирмвера", + "标记房态": "Статус собе", + "开锁提醒": "Обавештење о откључавању", + "微信二维码": "Откључај КР код", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Људи са електронским кључевима могу отворити врата скенирањем овог КР кода путем ВеЦхат-а. КР код сваке браве је другачији. Можете га одштампати и налепити поред одговарајућег закључавања", + "锁编号": "Број закључавања", + "电量": "Батерије", + "锁分组": "Група за закључавање", + "选择分组": "Изаберите групу", + "创建新分组": "Креирајте групу", + "管理员开锁密码": "Лозинка администратора", + "更新": "Ажурирање", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Ниво батерије ће бити ажуриран од стране гатеваи или телефона блуетоотх", + "当屏幕闪烁时,点击下一步": "Кликните следећи када тастатура трепери", + "输入*529#或按设置键": "Унесите * 529# или притисните тастер Сеттингс", + "长按重置键2秒": "Притисните и држите дугме за ресетовање 2 секунде", + "附近的设备": "Опрема у близини", + "暂无数据": "Нема података", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Моћи ћете да добијете статус врата са сензором врата заједно са гатеваи. Само један сензор је дозвољено да се повеже са бравом.", + "开始": "Старт", + "全天": "Сва времена", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Можете подесити више временских периода за режим пролаза. У одређеним временским периодима, брава ће остати у отвореном стању након откључавања.", + "请选择锁音量": "Молимо Вас да изаберете јачину браве", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Укључивањем , чућете звук из браве", + "低": "Низак", + "较低": "Средње низак", + "中": "Средње јак", + "较高": "Средње висок", + "高": "Високо", + "开启后,锁被撬动时,会发出报警声": "Укључивањем , омогућите неовлашћено упозорење.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Искључивањем , дугме РЕСЕТ је онемогућено.", + "校准时间": "Калибрирајте време", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Дијагноза је да се прочитају информације о конфигурацији унутар браве и отпремите их тако да особље може да анализира узрок неуспеха", + "上传": "Отпремање", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Уплоад података из браве на сервер. То може потрајати неколико минута", + "请选择要从哪把锁导入": "Изаберите браву за увоз из", + "有新版本": "Имају нову верзију", + "当前版本": "Тренутна верзија", + "升级": "Ажурирање", + "空闲": "Празна", + "已入住": "Заузета", + "多语言": "Језика", + "添加锁": "Додај закључавање", + "锁地址": "Адреса за закључавање", + "选择锁类型": "Изаберите тип закључавања", + "NFC无源锁": "НФЦ Пасивно закључавање", + "添加设备": "Додај уређај", + "网关": "Пролаз", + "客服": "Кориснички сервис", + "设置": "Поставке", + "更多设置": "Више сета", + "消息推送": "Обавештење пусх", + "锁用户管理": "Закључај кориснике", + "拥有的钥匙": "еКеис повезан са овим корисником", + "批量授权": "Управљање ауторитетом", + "关联设备": "Придружени уређај", + "关联姓名": "Повезано име", + "转移智能锁": "Пренос Закључавање", + "选择锁": "Закључавање екрана", + "接收人信息": "Примаоца", + "转移网关": "Трансфер Гатеваи", + "锁屏": "Закључавање екрана", + "已关闭": "Искључено", + "已开启": "На", + "开启": "Укључи", + "确定要开启重置键?": "Наставите да омогућите дугме Ресет?", + "确定要关闭重置键?": "Наставите да онемогућите дугме за ресетовање?", + "隐藏无效开锁权限": "Сакриј неважећи приступ", + "APP开锁时需手机连网的锁": "Браве које захтевају телефон на мрежи", + "增值服务": "Услуге", + "关于": "O nama", + "退出": "Одјавити се", + "删除账号": "Избриши налог", + "个人信息": "Информације о налогу", + "头像": "Аватар", + "昵称": "Надимак", + "请输入昵称": "Молимо Вас да унесете свој надимак", + "修改昵称": "Преименујете", + "修改账号": "Уреди налог", + "重置密码": "Поништи лозинку", + "安全问题": "Безбедносно питање", + "为了你的账号安全,修改账号前请先使用验证码验证": "Ради безбедности вашег налога, молимо вас да користите верификацију лозинке налога пре него што измените налог", + "请输入新账号": "Молимо Вас да унесете нови налог", + "找回密码和登录新设备时,可通过绑定的手机验证": "Обавезујући телефонски број ће се користити за примање верификационог кода.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Обавезујућа е-пошта ће се користити за примање верификационог кода.", + "原密码": "Тренутна лозинка", + "新密码": "Нова лозинка", + "确认密码": "Потврди лозинку", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "У случају да је ваш телефон изгубљен, можете се пријавити на нови телефон тако што ћете одговорити на сигурносна питања.", + "问题一": "Питање 1", + "问题二": "Питање 2", + "问题三": "Питање 3", + "请输入你的答案": "Молимо Вас да унесете свој одговор", + "即将到期": "Истиче ускоро", + "去授权": "Иди на ауторизацију", + "修改名称": "Измени име", + "状态": "Статус", + "WiFi名称": "Име и презиме Ви-Фи", + "网络MAC": "Мрежа МАЦ", + "网关升级": "Ажурирање гатеваи", + "网关连接的锁": "Брава (и) повезан са овом Гатеваи", + "信号强": "Јак", + "选择网关类型": "Изаберите Гатеваи Тип", + "添加网关": "Додај Гатеваи", + "重新通电": "Поново прикључите напајање", + "指示灯": "Индикаторска лампица", + "选择网关": "Изаберите Гатеваи", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G није подржан. Молимо Вас да изаберете ВиФи од 2.4G.", + "WiFi密码": "Ви -Фи Пассвард", + "请输入WiFi密码": "Унесите Ви-Фи лозинку", + "网关名称": "Име гатеваи", + "请输入网关名称": "Унесите име гатеваи-а", + "IP地址": "ИП адреса", + "子网掩码": "Маска подмреже", + "默认网关": "Дефаулт Гатеваи", + "自动获取DNS服务器地址": "Аутоматски добијте адресу ДНС сервера", + "首选DNS": "Преферирани ДНС", + "备选DNS": "Алтернативни ДНС", + "不使用静态IP": "Не користи се статичка ИП адреса", + "使用静态IP": "Користите статички ИП", + "请输入IP地址": "Унесите ИП адресу", + "请输入子网掩码": "Унесите маску подмреже", + "请输入默认网关": "Унесите подразумевани гатеваи", + "所有锁": "Све браве", + "搜索所有类型的锁": "Скенирајте све врсте брава", + "门锁": "Закључавање врата", + "挂锁": "Катанац", + "保险箱锁": "Сеф за закључавање", + "智能门禁": "Интелигентна контрола приступа", + "车位锁": "Брава за паркирање", + "摸亮触摸屏": "Додирните било који тастер да бисте активирали тастатуру", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Додирните било који тастер за активирање браве и ставите га у режим упаривања .притисните Следећи", + "附近的锁": "Оближње браве", + "如需修改名字请重新命名,点击确定添加锁": "Ако желите да промените име, молимо вас да преименујете, кликните на дугме ОК да додате браву", + "添加锁时,手机必须在锁旁边": "Приликом додавања браве, телефон мора бити поред браве", + "登录": "Пријављивање", + "注册": "Региструјете", + "我已阅读并同意": "Прочитао сам и сложио се", + "验证码": "Шифру", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Ваша лозинка мора имати 8-20 знакова, и садржи најмање две врсте бројева, слова и симбола", + "手机": "Телефон", + "邮箱": "Е-пошта", + "请输入邮箱": "Унесите своју е-пошту", + "国家/地区": "Земља / Регион", + "你所在的国家/地区": "Ваша земља / регион", + "选择国家/地区": "Изаберите своју земљу или регион", + "获取验证码": "Набавите код", + "商务合作": "Посла", + "电脑网页版": "Веб систем", + "酒店系统": "Хотелски систем", + "说明书网页版": "Упутство за употребу", + "高级功能": "Напредна функција", + "记录保存": "Задржавање записа", + "您可通过短信将密码、电子钥匙信息发给接收人。": "СМС се може користити за слање лозинке и екеи информације примаоцу.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Е -маил се може користити за слање лозинке и екеи информације примаоцу.", + "购买实名认证提示": "Након што је функција омогућена, потребно је да користите отисак прста, лице или лозинку налога да бисте отворили АПП. Нема потребе за поновном верификацијом 3 минута", + "请选择你希望的实名认证频次": "Молимо Вас да изаберете учесталост аутентификације правог имена коју желите", + "仅首次": "По први пут", + "每日一次": "једном дневно", + "每周一次": "једном недељно", + "每月一次": "једном месечно", + "当前状态": "Тренутни статус", + "试用中": "На суђењу", + "高级功能权益内容": "Напредне функције", + "短信模板": "СМС предложак", + "邮件模板": "Шаблон е-поште", + "发卡工具": "Картица енкодер", + "购买高级功能须知": "Приметио", + "购买高级功能提示": "Напредније функције су у развоју, а ако су вам потребне, добродошли сте да отворите услугу на основу броја брава. Напредне функције су доступне само за своје браве. Ако сте овлашћени администратор, молимо вас да контактирате највишег администратора браве да бисте отворили услугу", + "免费体验": "Бесплатна пробна верзија", + "立即开通": "Отвори сада", + "购买短信": "Купи СМС", + "购买邮件": "Купити ЕМаил", + "购买实名认证次数": "Куповина времена за аутентификацију правог имена", + "开通高级功能": "Омогућите напредну функцију", + "选择套餐": "Изаберите пакет", + "支付方式": "Начин плаћања", + "支付宝": "Алипаи", + "去支付": "Плати", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Дозвољено вам је да сами дефинишете поруку. Користи се за слање информација о лозинки и екеи другима.", + "高级功能仅能用于你自己的锁": "Напредна функција може да се примени само своје браве.", + "新建模板": "Креирај шаблон", + "类型": "Тип", + "模版内容": "Садржај шаблона", + "预览": "Преглед", + "房间名": "Соба", + "预计产生短信条数": "Процењени сегменти поруке", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ова функција вам омогућава да сакријете шифре,екеис,картице,и отисци прстију који су неважећи за одређени временски период.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Телефон корисника је обавезан да буде на мрежи за откључавање ових одабраних брава помоћу АПП-а.", + "配置WiFi": "Конфигурисање ВиФи-а", + "请输入WiFi名字": "Молимо Вас да унесете име ВиФи", + "WiFi配网": "Ви -Фи дистрибутивна мрежа", + "胁迫卡": "Стрес картица", + "员工是否有密码": "Већ има лозинку", + "员工是否有卡": "Већ има картицу", + "员工是否有指纹": "Већ подесите отисак прста", + "获取钥匙": "Набавите кључ", + "获取卡": "Набавите картицу", + "获取指纹": "Набавите отисак прста", + "安全验证": "Провера идентитета", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Сви подаци о вашем налогу ће бити трајно уклоњени са платформе и не могу се Рецоверед.До желите да избришете?", + "监控": "Монитор", + "视频日志": "Видео Дневник", + "开门器": "Отварач врата", + "面容开锁": "Откључавање лица", + "开门方向设置": "Отварање Правац Сет", + "电机功率设置": "Подешавање снаге мотора", + "开锁时是否需联网": "Ако је потребан интернет приликом откључавања", + "选择要加入分组的锁": "Изаберите лоцкС да додате у ову групу", + "锁数量": "Број закључавања", + "小米IOT平台": "Ксиаоми ИОТ платформа", + "面容开锁设置": "Сет за откључавање лица", + "感应距离": "Удаљеност сензора", + "防误开": "Спречите погрешно отварање", + "防误开已关闭,关门后仍可使用面容开锁": "Спречите погрешно отварање је затворена, након затварања врата и даље могу да користе откључавање лицем", + "添加和使用面容开锁时": "Додајте и користите лице приликом откључавања", + "添加和使用面容开锁时提示": "\n1 , покушајте да задржите једну особу испред операције врата;\n2 , молимо вас да стојите испред браве на вратима око 0,5 ~ 0,8 метара, окренути према брави врата;\n3 . Молимо вас да држите лице несметано и изложите црте лица;\n4 . Када је препознавање лица ненормално, можете да додирнете било који тастер на дигиталној тастатури да бисте ручно поново покренули препознавање лица.", + "秒": "С", + "请根据门锁实际情况,请谨慎选择电机功率:": "Молимо Вас да пажљиво изаберете снагу мотора у складу са стварном ситуацијом браве врата:", + "小功率:": "миниват:", + "耗电少": "Мања потрошња енергије", + "大功率": "велике снаге:", + "大功率提示": "Ако је брава језик не може да се увуче нормално приликом откључавања, или треба да се вози\nНебо и земља кука, препоручује се да изаберете велику снагу. У овом тренутку, потрошња енергије ће бити\nПовећати.", + "开门方向设置提示": "Молимо вас да пажљиво изаберете правац да отворите врата вашег дома (ако изаберете погрешан смер, нећете моћи да правилно отворите и затворите врата):", + "左开": "Отвори лево", + "右开": "Отвори десно", + "判断方法:": "判断方法:", + "判断方法内容": "Човек је стајао испред куће, окренут према улазним вратима.\nАко је шарка или осовина врата на левој страни, врата остају отворена;\nВрата су десно отворена ако је шарка или осовина на десној страни.\nАко је поставка погрешна, неће се правилно отворити и затворити врата.\nПрепоручује се да управља особље за инсталацију или одржавање.", + "录像时段": "Видео слот", + "密码": "Шифре", + "卡": "Картице", + "指纹": "Отисака прстију", + "人脸": "Лице", + "配件商城": "Лоцк Малл", + "公司名称": "Име и презиме", + "请输入公司名字": "Унесите назив компаније", + "提示": "Савет", + "是否删除?": "Да ли да избришете?", + "员工信息": "Информације о особљу", + "员工": "Особље", + "打卡方式无效": "Недоступна", + "中国": "Кина", + "选择钥匙": "Изабери екеy", + "编辑": "Уређивање", + "无": "Не", + "有": "Да", + "请输入姓名": "Молимо Вас да унесете име", + "获取人脸": "Добијање лица", + "选择密码": "Изаберите шифру", + "选择卡": "Изаберите картицу", + "选择指纹": "Изаберите отисак прста", + "选择人脸": "Изабери лице", + "员工是否有人脸": "Да ли запослени има лице", + "同时删除员工钥匙": "Избришите његов/њен екеи", + "删除": "Претраживање", + "确定要删除员工吗?": "Избриши овог запосленог", + "月统计": "Месечне статистике", + "迟到": "Касно", + "早退": "Отиђите раније", + "未打卡": "Нема записа", + "钥匙将在": "Овај екеи ће истећи у", + "天后失效": "дан(и)", + "电量更新时间:": "Време ажурирања батерије:", + "新增配件": "Додати", + "钥匙不可用": "Кључ није доступан", + "正在开锁中...": "Откључавање...", + "你的钥匙": "Ваш кључ", + "常开模式启动!长按闭锁": "Отворени режим је почео! Дуго притисните да бисте закључали", + "演示模式": "Демо режим", + "请先同意用户协议及隐私政策": "Молимо Вас да се прво сложите са корисничким уговором и политиком приватности", + "用户协议": "Услови коришћења", + "隐私政策": "Политика приватности", + "注册成功": "Регистрација успешна", + "你所在的": "Налазите се у", + "手机号": "Број телефона", + "忘记密码": "Заборављена лозинка", + "重置成功": "Ресетовање успеха", + "确定要退出吗?": "Излаз?", + "功能暂未开放": "Функција још није отворена", + "设置成功": "Успешно подесите", + "删除成功": "Успешно избриши", + "单次": "Једнократно", + "永久": "Трајно", + "限时": "Временско ограничење", + "自定义": "Прилагођене", + "清空码": "Избрисати", + "循环": "Периодичне", + "工作日": "Радни дан", + "每日": "Свакодневно", + "周末": "Викенд", + "确定要删除吗?": "Избришете?", + "该锁的密码都将被删除": "Све лозинке за ову браву ће бити избрисане", + "已过期": "Неважећи", + "该锁的电子钥匙都将被删除": "Сви еКеис за ову браву ће бити избрисани", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "ДЕЛЕТЕ Све екеис у вези са овим екеи. Овај корак се не може поништити!", + "删除钥匙会在用户APP连网后生效": "Екеи ће бити избрисан", + "有效时间": "Ефективно време", + "接收者": "Примаоца", + "仅管理自己创建的用户": "Управљајте само својим корисницима", + "远程开锁": "Даљинско откључавање", + "请输入钥匙名称": "Молимо Вас да унесете име кључа", + "修改成功": "Измените успех", + "冻结": "Замрзни", + "解除冻结": "Одмрзавање", + "授权": "Одобри", + "取消授权": "Скидање ауторизације", + "同时解冻其发送的钥匙": "Одмрзните све екеис издат од стране овог корисника", + "会在用户APP连网后生效": "Овај екеи ће бити ТХАВЕД када се корисничка апликација повеже на мрежу", + "同时冻结其发送的钥匙": "Замрзните све екеис издате од стране овог корисника", + "冻结会在用户APP连网后生效": "Овај екеи ће бити замрзнут када се апликација корисника повеже на мрежу", + "取消授权会在用户APP连网后生效": "Корисник ће изгубити своје дозволе када се корисничка апликација повеже са мрежом", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Овлашћени корисник има скоро иста овлашћења као и ЛОЦК Манагер (нпр. Способност за слање екеис и шифре)", + "失效时间需晚于生效时间": "Време истека мора бити касније од ефективног времена", + "生效时间需晚于当前时间": "Ефективно време мора бити касније од тренутног времена", + "失效日期需晚于生效日期": "Датум истека мора бити каснији од датума ступања на снагу", + "修改有效期": "Период промене", + "生效日期": "Датум почетка", + "失效日期": "Датум завршетка", + "开锁": "Откључавање", + "开锁成功": "Откључавање успеха", + "请选择锁": "Молимо Вас да изаберете браве", + "请选择接收者": "Молимо Вас да изаберете пријемник", + "请选择有效期": "Молимо Вас да изаберете период важења", + "请选择发送方式": "Молимо Вас да изаберете начин слања", + "请选择结束时间": "Молимо Вас да изаберете време завршетка", + "完成": "Довршите", + "有效日": "Циклус на", + "发送成功": "Пошаљи успех", + "请选择开始时间": "Молимо Вас да изаберете време почетка", + "选择用户": "Изаберите примаоце", + "已选中": "Изабрали", + "确定": "У реду", + "请选择要发送的锁": "Молимо Вас да изаберете браве", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Аутентификација правог имена односи се на потребу корисника да потврди своје лице пре откључавања телефона АПП, а верификација се може откључати.", + "分享": "Делите", + "请输入接收者账号": "Молимо Вас да унесете налог пријемника", + "接收者号码未注册,请重新发送": "Број пријемника није регистрован, молимо вас да пошаљете поново", + "是否发送电子钥匙给未注册账号": "Да ли желите да пошаљете екеи на нови налог", + "取消": "Откажи", + "标记成功": "Означите успех", + "微信好友": "ВеЦхат пријатељи", + "短信": "СМС", + "邮件": "Е-пошта", + "更多": "Виље", + "您好,您的电子钥匙生成成功": "Здраво , Ваш електронски кључ је успешно генерисан", + "生效时间不能小于当前时间": "Ефективно време не може бити мање од тренутног времена", + "结束时间不能小于当前时间": "Време завршетка не може бити мање од тренутног времена", + "是否为管理员": "Да ли је то администратор", + "已连接到锁,请将卡靠近门锁的读卡区": "Цоннецтед .Поставите картицу против читача картица", + "尝试连接设备...": "Повезивање са Лоцк.Плеасе сачекајте ...", + "地理位置": "Географски положај", + "检查以确保以下地址是正确的": "Проверите да ли је следећа адреса тачна", + "地图加载中,请稍候。。": "Мапа се учитава, сачекајте...", + "跳过": "Прескочи", + "还未获取到位置信息哦,请耐心等待一下!": "Информације о локацији још увек нису добијене, молимо вас да стрпљиво сачекајте!", + "请填写信息": "Молимо Вас да попуните информације", + "有效期": "Период важења", + "生效时间": "Време почетка", + "失效时间": "Време завршетка", + "上传成功": "Успешно отпремљен", + "未生效": "Неактивни", + "已生效": "Ефективно", + "指纹详情": "Информације о отиску прста", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Од вас ће се тражити да поставите прст на сензор неколико пута. Молимо вас да пратите упутства...", + "开始添加": "Старт", + "请将您的手指按下": "Ставите прст на сензор", + "根据提示,抬起手指后再进行下一次指纹采集": "Пратите упутства... Од вас ће се тражити да уклоните и ставите прст на сензор за следећи запис", + "添加成功": "Додајте успех", + "更新成功": "Успех ажурирања", + "搜索": "Претраге", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Након ресетовања, картица браве ће бити избрисана, да ли желите да ресетујете?", + "已失效": "Неважећи", + "卡详情": "Информације о картици", + "请输入": "Молимо Вас да унесете овде", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Искључивањем , брава ће остати откључана цео дан док се ручно не закључа", + "请输入小于或等于60的数字": "Унесите број мањи од 60", + "操作成功": "Операција успешна", + "管理员密码相同,无需修改": "Лозинка администратора је иста и не треба да се мења", + "请输入6-9位数字": "6 -9 цифара у дужини", + "请输入6-9位管理员密码": "Молимо Вас да унесете 6-9 цифрену лозинку администратора", + "请输入新的管理员密码": "Молимо Вас да унесете нову лозинку администратора", + "未分组": "Разгруписани", + "请输入分组名称": "Креирајте групу", + "创建成功": "Креирајте успех", + "设置锁分组成功": "Успешно подесите групу за закључавање", + "电池1电量": "Батерија 1", + "电池2电量": "Батерија 2", + "电量更新时间": "Време ажурирања батерије", + "锁电量更新成功": "Успех ажурирања за закључавање напајања", + "您的钥匙未生效": "Ваш кључ није ефикасан", + "您的钥匙已冻结": "Ваш кључ је замрзнут", + "您的钥匙已过期": "Ваш кључ је истекао", + "常开模式开启": "Брава је у режиму пролаза", + "超级管理员": "Супер Администратор", + "授权管理员": "Овлашћени администратор", + "普通用户": "Обичан корисник", + "余": "Салдо", + "天": "Дан", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Након брисања браве, све информације ће бити избрисане заједно, да ли сте сигурни да желите да избришете браву?", + "请输入登录密码": "Молимо Вас да унесете лозинку за апликацију", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Нисте успели да избришете уређај, проверите да ли је уређај у близини уређаја, уређај није повезан и да је уређај укључен", + "用户无权限": "Корисник нема дозволу", + "创建公司后,考勤功能才能使用": "Молимо вас да прво креирате компанију", + "是否删除钥匙?": "Избриши овај екеи?", + "邮箱绑定成功": "Успех везивања е-поште", + "手机绑定成功": "Успех везивања мобилног телефона", + "网络访问失败,请检查网络是否正常": "Захтев фаилед.Нетворк није доступан, проверите и повежите уређај са 3G / 4G / ВИФИ", + "清空": "Опозовите избор", + "是否清空?": "Опозовите избор?", + "消息详情": "Информације о поруци", + "创建时间": "Време стварања", + "管理员详情": "Детаљи администратора", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ако вас неко приморава да отворите врата, можете користити ову картицу. Порука аларма ће бити послата администраторима. Да бисте користили ову функцију, проверите да ли је ваша брава на мрежи.", + "请不要将胁迫卡用于日常开锁": "Молимо вас да не користите принудну картицу за свакодневну употребу.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Ако вас неко присиљава да отворите врата, можете користити овај отисак прста. Порука аларма ће бити послата администраторима. Да бисте користили ову функцију, проверите да ли је ваша брава на мрежи.", + "请不要将胁迫指纹用于日常开锁": "Молимо вас да не користите присилни отисак прста за свакодневну употребу.", + "创建公司": "Креирајте компанију", + "公司名称不能超过30个字符": "Назив компаније не може бити дужи од 30 знакова", + "公司名称不能小于6个字符": "Назив компаније не може бити мањи од 6 знакова", + "WIFI列表": "ВИФИ листа", + "刷新": "Освежи", + "手动配网": "За кориснике дистрибутивна мрежа", + "远距离": "Меруградска", + "中距离": "Средње растојање", + "近距离": "Кратка удаљеност", + "锁时间更新成功": "Успех ажурирања времена закључавања", + "锁用户": "Закључавање корисника", + "请选择常开日期": "Молимо Вас да изаберете датум отварања", + "结束时间不能小于开始时间哦": "Време завршетка не може бити мање од времена почетка", + "介绍": "Наша прича", + "个人信息收集清单": "Листа прикупљања личних података", + "应用权限说明": "Опис дозволе за пријаву", + "第三方信息共享清单": "Листа за размену информација треће стране", + "请选择您的位置": "Молимо Вас да изаберете своју локацију", + "请先选择位置": "Прво изаберите локацију", + "管理员密码": "Администраторска лозинка", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Ако је потребно да измените, унесите нову лозинку администратора (6 цифара), кликните на дугме ОК да измените", + "修改": "Измените", + "网络摄像头": "Камеру", + "重命名": "Преименујете", + "分组下的锁将被移到未分组里": "Браве под групом ће бити премештене у негруписано", + "编辑成功": "Успех уређивања", + "厂商": "Произвођача", + "型号": "Модел", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Након што је лозинка генерисана, молимо вас да је користите једном за активацију пре 23:59 истог дана, у супротном ће бити неважећа после 0 сати. Након што је лозинка активирана, може се користити неограничено пута у периоду важења.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Након што се лозинка генерише, молимо вас да је користите пре 23:59 истог дана, у супротном ће бити неважећа након 0 сати. Јасан код се користи за брисање свих лозинки генерисаних пре 0 сати данас.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Након што се лозинка генерише, молимо вас да је користите пре 23:59 истог дана, у супротном ће бити неважећа након 0 сати.", + "清空密码底部提示": "Лозинка важи до 23:59 на дан пражњења\n Празан садржај 1: Све лозинке генерисане пре 0:00 дана (Лозинке генерисане после 0:00 дана не утичу на брисање лозинки и могу наставити да се користе)\nПразан садржај 2: Обриши лозинке Обришите све прилагођене лозинке (коришћене и неискоришћене) одмах након употребе\nДа бисте у потпуности избрисали све лозинке, користите функцију Ресет Алл Пассвордс", + "相机": "Камеру", + "相册": "Фотографије", + "读写": "Складиштење", + "定位": "Локацију", + "需要访问相机权限才能拍照上传文件例如头像上传": "Приступ камери је потребан за снимање фотографија и уплоад фајлова, као што је отпремање слике профила", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Приступ камери је потребан за уплоад фајлова и аватара користећи слике албума", + "需要访问读写权限才能使用本地图片上传头像": "Приступ дозволама за читање и писање је потребан за уплоад аватара користећи локалне слике", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Приступ информацијама о локацији је потребан да бисте користили функцију додавања кључа", + "申请": "Апликације", + "权限": "Дозволу", + "不允许": "Није дозвољено", + "允许": "Дозвољено", + "权限被拒绝": "Дозвола одбијена", + "请手动在系统设置中开启": "Молимо Вас да га ручно омогућите у подешавањима система", + "权限以继续使用应用": "Дозвола за наставак коришћења апликације.", + "去设置": "Иди подесите га", + "当前网络": "Тренутна мрежа", + "位置信息": "Информације о локацији", + "请输入wifi名称": "Молимо Вас да унесете име вифи", + "虹膜": "Ајрис", + "手掌": "длан", + "商城": "Центру", + "我的": "Мој", + "微信公众号推送": "Вецхат јавни налог", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Да бисте отворили вецхат за примање алармних порука, морате обратити пажњу на Скај Смарт Лоцк вецхат јавни рачун прво, молимо вас да сачувате КР код и користите вецхат да скенирате подешавања", + "蓝牙": "Блуетоотх", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Приступ Блуетоотх дозволама је потребан да бисте користили информације о локацији функције додавања кључа", + "请输入Email": "Унесите своју е-пошту", + "请输入手机号": "Унесите свој број телефона", + "家人到家": "Члан породице стигао је кући", + "添加家人": "Додај члана породице", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Ако брава није повезана са Интернетом, подсетници за шифру, картицу, отисак прста и друге начине отварања врата не могу се благовремено послати.", + "消息提醒": "Опомене", + "开门通知": "Најава отварања", + "N天未开门": "Н дана без отварања врата", + "门未关好": "Врата нису затворена", + "防拆报警": "саботод аларма", + "低电量提醒": "Слаба батерија", + "胁迫开门": "Присилно отварање врата", + "有人按门铃": "Неко звони на врата", + "有人出现在门口": "Неко се појављује на вратима", + "提醒方式": "Метод подсетника", + "开门方式": "Начин отварања врата", + "请选择": "Молимо Вас да изаберете", + "家人": "Члан породице", + "保存": "Сачувај", + "APP推送": "АПП гурање", + "管理员": "Администраторског", + "未启用": "Није омогућено", + "已启用": "Омогућен", + "省电模式": "Режим за уштеду енергије", + "逗留抓拍模式": "Останите режим хватања", + "实时监控模式": "Режим праћења у реалном времену", + "自定义模式": "Прилагођени режим", + "猫眼设置": "Подешавање мачјег ока", + "猫眼工作模式": "Цат еие радни режим", + "自动亮屏": "Аутоматски светао екран", + "亮屏持续时间": "Екран на време", + "逗留警告": "Останите упозорење", + "异常警告": "Ненормално упозорење", + "短信提醒": "СМС", + "邮件提醒": "Е-пошта", + "N天未开门提醒": "Н дана без отварања врата", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Ако вас неко приморава да отворите браву, можете користити овај отисак прста. Порука аларма ће бити послата администраторима. Да бисте користили ову функцију, проверите да ли је ваша брава на мрежи.", + "胁迫指纹": "Принудни отисак прста", + "指纹列表": "Листа отисака прстију", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Након одређеног времена, ако се брава не отвори, систем ће послати поруку подсетника одређеном примаоцу. Ова функција захтева да брава буде повезана са интернетом.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Након омогућавања подсетника, када је батерија за закључавање испод 20%, 10% и 5%, систем ће послати поруку подсетника одређеном примаоцу.", + "未开门时间": "Дани без отварања врата", + "添加和使用面容开锁时:": "Додајте и користите Фаце приликом откључавања:", + "关锁": "Затвори закључавање", + "功能": "Функцију", + "配件": "Делове", + "云存": "Складиштење у облаку", + "本地": "Овај локалитет", + "3天滚动储存": "3 дана ваљање складиштење", + "去升级": "Надоградите сада", + "下载列表": "Листа преузимања", + "已下载": "Преузете", + "全部视频": "Сви видео записи", + "已为本设备免费提供3大滚动视频储存服务": "За овај уређај су обезбеђене три услуге складиштења видео записа", + "视频播放": "Репродукција видео записа", + "全选": "Све", + "请选择要删除的视频": "Изаберите видео који желите да избришете", + "请选择要下载的视频": "Изаберите видео који желите да преузмете", + "欢迎使用": "Добродошли у употребу", + "用户协议和隐私政策概要": "Резиме Корисничког уговора и Политике приватности", + "协议概要": "Резиме протокола", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Хвала вам што користите ову апликацију. Придајемо велику важност вашим личним подацима и заштити приватности. Пре употребе овог производа, пажљиво га прочитајте", + "《用户协议》": "Услови коришћења", + "和": "И", + "《隐私政策》": "《Политика приватности》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Цео садржај. Кликом на \"Слажем се\", слажете се и прихватате све услове. Ако одлучите да се не слажете, нећете моћи да користите наше производе и услуге и изаћи ћете из апликације.", + "不同意": "Слоћила", + "同意": "Слаћете", + "该功能是高级功能,请开通后再使用": "Ово је напредна функција. Молимо вас да га прво омогућите.", + "常用程序": "Заједнички програми", + "该锁已被重置": "Брава је ресетована", + "需要访问读写权限才能使用手动升级固件": "Приступ за читање и писање дозволе је потребно за ручно надоградњу фирмваре", + "错误D固件,请选择正确的文件": "Погрешан фирмваре, молимо вас да изаберете исправну датотеку", + "非SYD固件,请选择正确的文件": "Не СИД фирмваре, изаберите исправну датотеку", + "文件校验失败 0x01": "Верификација датотеке није успела 0x01", + "解析元数据失败,请选择正确的文件": "Фаилед то парсе метаподатака, молимо Вас да изаберете исправну датотеку", + "文件校验失败 0x02": "Верификација датотеке није успела 0x02", + "文件校验失败 0x03": "Верификација датотеке није успела 0x03", + "固件升级完成": "Надоградња фирмвера завршена", + "记录": "Записе", + "开通高级功能后才可以对锁进行管理": "Молимо Вас да прво омогућите напредну функцију за управљање браве.", + "去开通": "Омогући", + "实名认证": "Аутентификација правог имена", + "当前剩余数量": "Преостали", + "购买": "Купи", + "实名认证为付费功能,请购买后再使用": "Аутентификација правог имена је плаћена функција, молимо вас да је користите након куповине", + "密码不一致哦": "Лозинке су недоследне", + "退出添加": "Престани да додајеш", + "管理员已满": "Администратор пун", + "用户已满": "Корисник је пун", + "锁上面添加指纹已满": "Додајте отисак прста на брави је пуна", + "指纹已存在": "Отисак прста већ постоји.", + "锁上面添加人脸已满": "Закључавање изнад додавања лица је пуно", + "人脸已存在": "Лице већ постоји", + "锁上面添加卡已满": "Закључај изнад додати картицу је пуна", + "卡已存在": "Картица већ постоји", + "锁上面添加密码已满": "Закључавање изнад додавања лозинке је пуна", + "密码已存在": "Идентична лозинка већ постоји. Молимо Вас да изаберете другу", + "请输入密码": "Молимо Вас да унесете лозинку", + "暂无密码,无需重置": "Нема лозинке, нема потребе за ресетовањем", + "真实姓名": "Право име", + "身份证号": "ИД број", + "请输入真实姓名": "Молимо Вас да унесете своје право име и презиме", + "请输入身份证号": "Молимо Вас да унесете свој ИД број", + "请输入身份证号和真实姓名": "Молимо Вас да унесете свој ИД број и право име", + "点击返回设备配对": "Додирните Назад на упаривање уређаја", + "无法连接?尝试升级": "Не можете да се повежете? Покушај надоградње", + "固件升级提示": "Упит за надоградњу фирмвера", + "请先获取固件文件到手机本地,再选择升级": "Молимо Вас да прво набавите датотеку фирмваре на локалном телефону, а затим изаберите Надоградња", + "固件升级中": "Фирмваре се надограђује", + "取消升级": "Откажите надоградњу", + "固件传输中": "Фирмваре у транзиту", + "关闭": "Угаси", + "传输中'": "У транзиту", + "操作记录": "Записе", + "修改姓名": "Измени име", + "传输中": "У транзиту", + "发送人": "Издао", + "发送时间": "Време издавања", + "钥匙详情": "екеи Информације", + "姓名": "Име", + "发送": "Пољаљи", + "请确认姓名全名和身份证号码是否正确": "Молимо Вас да потврдите да су пуно име и ИД број тачни", + "传输期间请勿离开当前页面": "Не напуштајте тренутну страницу током преноса", + "机型": "Модели", + "硬件版本": "Верзија хардвера", + "固件版本": "Верзија фирмвера", + "手动升级": "Ручна надоградња", + "设备连接中...": "Повезивање уређаја ...", + "未避免异常情况,请在门打开时升级": "Неизбежни изузеци, молимо вас да надоградите када су врата отворена", + "钥匙无效": "Кључ је неважећи", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Није могуће повезати са Лоцк.Плеасе Поново покрените Блутоотх телефона и покушајте поново.", + "如果是全自动锁,请使屏幕变亮": "Ако је потпуно аутоматско закључавање, молимо вас да екран светлији", + "正在尝试闭锁……": "Покушавам да закључам. Молим те сачекај...", + "清空记录": "Обриши записе", + "是否要删除操作记录?": "Наставите да бришете записе?", + "被删除的记录不能恢复": "Записи се не могу опоравити након брисања.", + "全部事件": "Сви догађаји", + "开锁事件": "Откључавање догађаја", + "异常事件": "Ненормалан догађај", + "门铃事件": "Звоно на вратима догађај", + "视频事件": "Видео догађај", + "请开启蓝牙": "Молимо Вас да укључите Блуетоотх", + "请选择有效日": "Молимо Вас да изаберете дан ступања на снагу", + "公司名字长度不能小于 6 ": "Дужина имена компаније не може бити мања од 6", + "已是最新版本": "Нема ажурирања", + "一": "Један", + "二": "Два", + "三": "Три", + "四": "Четири", + "五": "Пет", + "六": "Шест", + "日": "Сунце", + "新建短信模版": "Креирајте СМС шаблон", + "新建邮件模版": "Креирајте шаблон е-поште", + "自定义短信模版": "СМС шаблон", + "自定义邮件模版": "Шаблон е-поште", + "名称": "Име", + "星星锁": "Звезда брава", + "无考勤记录": "Нема записа", + "大家干劲十足": "Свако долази на време", + "工作时长未出炉": "Нема радног времена", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Избор земље / региона ће утицати на безбедност података. Тренутно сте изабрали Албанију, молимо вас да потврдите пре него што наставите.", + "确认国家或地区": "Потврдите земљу / регион", + "我知道了": "Капирам", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Да бисте примали важне исправке, кликните на \"ОК\" и омогућите обавештења у подешавањима.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Након укључивања, можете поново укључити дугим притиском на тастер за подешавање на брави, и поново га додати са АПП", + "已有": "Тренутни", + "新增": "Нови", + "账号格式错误": "Лош формат", + "接收者信息为空": "Информације о примаоцу су празне", + "请输入时间(秒)": "Молимо Вас да унесете време (сец)", + "加载数据失败": "Није успело учитати податке", + "重试": "Покушај поново", + "升级中,是否退出": "Током надоградње, да ли да изађе", + "下一步": "Следежи", + "公寓": "Стан", + "个人用户": "Личне", + "星寓": "Апартман Стар", + "账号": "Налог", + "请输入手机号或email": "Број телефона или е-маил", + "请输入星寓管理员的账号": "Молимо Вас да унесете налог администратора апартмана звезда", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Сви подаци изабране браве (а) ће бити трајно пребачени примаоцу.", + "暂不支持跨平台转移,敬请期待": "Цросс -платформ пренос није подржан за сада, молимо вас да се радујемо томе", + "移除坏锁": "Премештање неисправне / оштећене браве у смеће", + "转移确认": "Потврдите пренос", + "本次共转移": "Овог пута укупно", + "把智能锁": "Паметна брава", + "确认": "У реду", + "移除成功": "Успешно уклоните", + "转移成功": "Успех преноса", + "该已锁被删除": "Закључан је избрисан", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Овлашћени администратор може управљати само лозинкама, екеисима и итд.", + "添加授权管理员": "Креирај администратора", + "导出记录": "Извоз записа", + "选择时间段": "Изаберите временски период", + "导出": "Извоз", + "批量导出": "Серијски извоз", + "读取记录": "Освежите записе", + "设备": "Уређај", + "消息": "Поруке", + "智能分析": "Интелигентна аналитика", + "精准识别设备事件,过滤无效信息": "Тачно идентификујте догађаје уређаја и филтрирајте неважеће информације", + "系统设置": "Подешавања система", + "系统的全局配置在此项内进行设置": "Глобална конфигурација система је постављена у овој ставци", + "导出操作记录": "Извоз записа", + "立即查看": "Приказ", + "导出成功": "Извози успешно", + "发送钥匙": "Пошаљи екеи", + "进度": "Стопа", + "失败": "Није успело", + "人脸详情": "Детаљи о лицу", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Када се неко осети око 1,5 метара испред врата, откључавање препознавања лица ће се аутоматски покренути.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Када се неко осети око 0,8 метара испред врата, откључавање препознавања лица ће се аутоматски покренути.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Када се неко осети око 0,5 метара испред врата, откључавање препознавања лица ће се аутоматски покренути.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Удаљеност сензора је искључена, потребно је ручно додирнути било који тастер на тастатури да бисте извршили откључавање препознавања лица.", + "防误开已打开,开锁后": "Отварање против грешке је укључено, а након откључавања", + "秒内不可使用面容开锁": "Откључавање лица не може се користити у року од неколико секунди", + "掌静脉": "Палм вена", + "添加掌静脉": "Додајте палмину вену", + "胁迫掌静脉": "Принудна дланова вена", + "请不要将胁迫掌静脉用于日常开锁": "Молимо вас да не користите принудне вене палме за свакодневно откључавање", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Повезан са бравом, молим вас природно отворите длан, длан је окренут према камери", + "掌静脉详情": "Детаљи о палминој вени", + "掌静脉号": "Број палминих вена", + "蓝牙未打开,请到设置里面打开蓝牙": "Блуетоотх није укључен, укључите Блуетоотх у подешавањима", + "删除用户时,会将用户拥有的钥匙一起删除。": "Ако је корисник ИЗБРИСАН, било који екеис повезан са корисником ће такође бити ИЗБРИСАН.", + "配置网络": "Конфигуришите мрежу", + "你好": "Здраво", + "成功": "Успешан", + "类型选择": "Тип изаберите", + "请选择要使用哪种类型": "Молимо Вас да изаберете који тип желите да користите", + "系统邮件(推荐)": "Системска е-пошта (препоручено)", + "系统短信(推荐)": "Систем СМС (препоручено)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Е -маил ће бити послат из ове апликације. Молимо купите пакет е-поште први.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "СМС ће бити послат из ове апликације. Молимо купите пакет е-поште први.", + "个人邮件": "Лична адреса е-поште", + "个人短信": "Лични СМС", + "邮件将从你的个人邮箱发给用户": "Е -маил ће бити послат са вашег личног налога е-поште.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "СМС порука ће бити послата са вашег личног броја телефона. Плаћате свом телеком оператеру.", + "为了更好地应用体验,请确定权限": "За боље искуство апликације, молимо Вас да потврдите дозволе", + "您第一次拒绝权限,请确定权限": "Одбили сте дозволу по први пут, молимо вас да потврдите дозволу", + "您第二次拒绝权限,请去应用设置开启权限": "Одбили сте дозволу по други пут, идите на подешавања апликације да бисте омогућили дозволу", + "去应用市场": "Иди у продавницу апликација", + "温馨提示": "Топла подстицај", + "关闭应用": "Затворите апликацију", + "开启微信接收报警消息需要先关注": "Да бисте отворили ВеЦхат за примање алармних порука, морате да пратите", + "微信公众号,请保存二维码并使用微信扫一扫设置": "ВеЦхат јавни налог, сачувајте КР код и користите ВеЦхат за скенирање поставки", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Аутентификација правог имена је плаћена функција, обратите се администратору браве за куповину и коришћење", + "位置权限": "Дозвола за локацију", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Молимо Вас да одобрите апликацију да користите свој лоцатиан. Користи се за скенирање БЛЕ браве и гатеваи.", + "相机/相册权限": "Дозвола за камеру / албум", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Молимо Вас да одобрите апликацију за читање и писање фотографија и датотека из складишта.", + "点击选择": "Кликните да бисте изабрали", + "微信": "Ћаскање", + "朋友圈": "Тренутака", + "QQ": "ОМИЉЕНО", + "QQ空间": "ОМИЉЕНО", + "微博": "Фејсбук", + "FaceBook": "Фејсбук", + "链接": "Везу", + "今天": "Данас", + "密码错误": "Неисправна лозинка", + "网络中断": "Прекид мреже", + "钥匙不存在": "Кључ не постоји", + "钥匙过期": "Кључ истекао", + "钥匙已存在": "Кључ већ постоји", + "密码失效": "Лозинка неважећа", + "门锁时间异常": "Време закључавања врата ненормално", + "APP(手机)未联网": "АПП (мобилни телефон) није повезан са Интернетом", + "数据不存在": "Подаци не постоје", + "待接收": "Претраживање", + "已冻结": "Смрзнуте", + "已删除": "Избрисане", + "未知": "Непознат", + "拖动下方滑块完成拼图": "Превуците клизач у исправан положај", + "验证成功": "Успех верификације", + "验证失败": "Верификација није успела", + "向右拖动滑块填充拼图": "Превуците клизач удесно да бисте попунили слагалицу", + "请先获取到位置信息哦": "Молимо Вас да прво информације о локацији", + "请选择国家": "Молимо Вас да изаберете земљу", + "获取锁信息": "Добити информације о закључавању", + "锁数据异常,请重试": "Закључавање података је ненормално, покушајте поново", + "连接设备中...": "Повезивање уређаја ...", + "把锁": "Браве", + "条": "Стриптиз", + "封": "Пеиат", + "次": "Пута", + "支付成功": "Плати успех", + "查看详情": "Погледај детаље", + "请输入模板名称": "Унесите назив шаблона", + "模版类型": "Тип", + "再返回一次退出": "Изађите поново", + "请先添加锁": "Молимо вас да прво додате браву", + "可视对讲": "Визуелни интерфон", + "详细日志": "Детаљан дневник", + "已复制到剪切板": "Копира", + "拍照": "Фотографија", + "从相册选择": "Изаберите из албума", + "选择问题": "Молимо Вас да изаберете питање", + "确认长度不足8位": "Потврдите дужину мању од 8 цифара", + "新密码长度不足8位": "Нова лозинка дужина мања од 8 цифара", + "两次密码不一致": "Неусклађеност лозинке.Молимо вас да покушате поново", + "请点击获取验证码,验证码将发送到": "Молимо Вас да добијете верификациони код. Код ће бити послат на", + "切换": "Пребаците", + "验证": "Проверите", + "验证成功,账号已删除": "Верификација успешна, налог избрисан", + "该密码不是自定义密码,无法修改": "Ова лозинка није прилагођена лозинка и не може се мењати", + "请选择设备要关联哪些姓名": "Молимо Вас да изаберете са којим именима уређај треба да буде повезан", + "请选择姓名要关联哪些设备": "Молимо Вас да изаберете које уређаје име треба да буде повезано са", + "确定要移除所选中的坏锁吗?": "Уклоните неисправну браву?", + "邮件通知": "Обавести путем е-поште", + "短信通知": "Обавестите путем СМС-а", + "您好,您的授权管理员生成成功": "Здраво , ваш овлашћени администратор је успешно генерисан", + "请输入接收者姓名": "Молимо Вас да унесете овде", + "版本更新": "Ажурирање верзије", + "下次再说": "Следећи пут", + "配网成功": "Успех мрежне дистрибуције", + "配网失败": "Мрежна дистрибуција није успела", + "该锁的无线键盘都将被删除": "Све бежичне тастатуре за ову браву ће бити избрисане", + "实时画面": "Слика у реалном времену", + "适合门口较为安全的环境。": "Погодан за релативно сигурна окружења на вратима.", + "仅发生特定事件才录像,并可查看实时画面。": "Снимају се само одређени догађаји и слика у реалном времену се може гледати.", + "一般情况下,满电可使用7-8个月": "У нормалним околностима, може се користити за 7-8 месеци када је потпуно напуњен", + "有人逗留或发生特定事件才录像,可随时查看": "Неко остаје или се бележе одређени догађаји и могу се видети у било ком тренутку", + "实时画面。": "Слика у реалном времену.", + "一般情况下,满电可使用5~6个月。": "У нормалним околностима, може се користити за 5 ~ 6 месеци када је потпуно напуњен.", + "适合门口人员复杂、较不安全的环境。": "Погодан за сложена и релативно несигурна окружења на вратима.", + "有人出现就录像,可随时查看实时画面。": "Снимите када се неко појави и погледајте слику у реалном времену у било ком тренутку.", + "一般情况下,满电可使用2~4个月。": "У нормалним околностима, може се користити за 2 ~ 4 месеца када је потпуно напуњен.", + "根据您家门口实际情况设置录像和实时画面功能。": "Подесите видео и функције слике у реалном времену у складу са стварном ситуацијом на вашим вратима.", + "可使用时长由具体设置决定。": "Трајање коришћења одређено је специфичним поставкама.", + "查看": "Приказ", + "有人按门铃或发生": "Неко звони на вратима или", + "异常事件时": "ненормалан догађај", + "不录像": "Нема видео записа", + "有人出现、按门铃": "Неко се појави, звони на вратима", + "或发生异常事件时": "или се догоди ненормалан догађај", + "逗留达到10秒": "Останите 10 секунди", + "约1.5米": "Око 1,5 метара", + "随时": "У било које време", + "立即录像": "Снимите одмах", + "录像时机": "Тајминг видео записа", + "有人出现时录像": "Снимите када се неко појави", + "人体侦测距离": "Људска удаљеност детекције", + "查看实时画面": "Погледај слику у реалном времену", + "自定义时间": "Прилагођено време", + "当日": "Данас", + "次日": "Следећег дана", + "自定义时段": "Прилагођени временски период", + "发生事件时查看": "Погледај када дође до догађаја", + "实时查看": "Приказ у реалном времену", + "有人在门口出现10秒后开始录像。": "Неко се појављује на вратима 10 секунди пре снимања.", + "有人按门铃时立即录像。": "Снимите одмах када неко позвони на врата.", + "有人出现在门前1.5米范围时启动录像": "Почните са снимањем када се неко појави у кругу од 1,5 метара испред врата", + "约0.8米": "Око 0,8 метара", + "约3.0米": "Око 3,0 метара", + "添加指纹失败": "Операција није успела.", + "项": "Ставке", + "播放中": "Игра", + "下载": "Преузимање", + "暂无下载内容": "Нема садржаја за преузимање", + "亮度": "Светлине", + "音量": "Волумен", + "快进至": "Брзо напред до", + "快退至": "Премотавање уназад", + "暂无视频信息": "Нема видео информација", + "加载出错": "Грешка при учитавању", + "请单人正对门锁,距离一个成年人手臂长度": "Молимо вас да стојите испред браве на вратима сами, на дохват руке", + "(约0.6米)。": "(око 0,6 метара).", + "保持脸部无遮挡,露出五官。": "Држите лице несметано и покажите своје црте лица.", + "准备好了,开始添加": "Спремни , почните да додајете", + "正在录入中...": "Снимање...", + "添加人脸失败": "Није успело додати лице", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Након ресетовања, лица браве ће бити избрисана. Да ли сте сигурни да желите да ресетујете?", + "人脸号": "Број лица", + "虹膜详情": "Ирис детаљи", + "虹膜号": "Ирис број", + "选择设备类型": "Изаберите тип уређаја", + "照明灯具": "Расвјетна тијела", + "电动窗帘": "Електричне завесе", + "门窗传感器": "Сензор врата и прозора", + "传感器": "Сензор", + "清除数据成功": "Подаци су успешно обрисани", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Брава није повезана са интернетом, тако да се рецодс шифре, картице, отиска прста и других метода отварања врата не може учитати у реалном времену.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Ако је потребно да задржите историјске записе, можете их извозити.", + "看不到操作记录,可能原因有": "Не могу да видим евиденцију операције, могуће разлоге", + "操作记录详情": "Детаљи о операцији записа", + "操作时间": "Време рада", + "此模块功能需要锁联网后设置方可生效": "Ова функција модула мора бити подешена након што је брава повезана са Интернетом да ступи на снагу", + "用户已存在": "Корисник већ постоји", + "钥匙数量已到上限": "Број тастера је достигао горњу границу", + "附近没有可用网关": "У близини нема доступне капије", + "正在创建安全连接...": "Стварање сигурне везе ...", + "监视状态下不能发送录音": "Не могу да пошаљете снимке у режиму праћења", + "挂断": "Спусти", + "监视中暂不能开锁": "Откључавање није доступно током праћења", + "长按说话": "Притисните и држите да бисте говорили", + "松开发送": "Пуштање за слање", + "请输入6位数字开锁密码": "Унесите 6-цифрену лозинку за откључавање", + "请输入开锁密码": "Молимо Вас да унесете лозинку за откључавање", + "接收者在有效期内可以不限次数使用": "Примаоци могу да користе екеис неограничено време у периоду важења.", + "接收者可以使用此App开关锁": "Прималац је у могућности да закључа / откључа помоћу ове апликације.", + "单次钥匙有效期为1小时,只能使用一次": "Једнократни екеи важи ЈЕДАН сат и може се користити само једном.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Примаоци су у могућности да користе екеис неограничено време у фиксном времену циклуса.", + "获取模板失败": "Фаилед то гет тхе темплате", + "微信通知": "Обавештење о WеЦхат-у", + "系统短信": "Систем СМС", + "系统邮件": "Системска е-пошта", + "模板": "Предложак", + "新建模版": "Креирај предложак", + "您好,您的密码是": "Здраво , ваша лозинка је", + "密码名字": "Име лозинке", + "请输入6-9位密码": "Молимо Вас да унесете 6-9 цифре лозинку", + "设置密码": "Постави лозинку", + "操作成功,密码为": "Успео .Лозинка је", + "类型:自定义-永久": "Тип : Прилагођено-трајно", + "实时播放": "Репродукција у реалном времену", + "点击对讲": "Кликните на интерфон", + "长按开锁": "Дуго притисните за откључавање", + "接听失败": "Није успео да одговори", + "请在锁设置中开启远程开锁": "Молимо Вас да омогућите даљинско откључавање у подешавањима закључавања", + "接听": "Одговорити", + "截图已保存到相册": "Снимак екрана сачуван у албуму", + "添加遥控": "Додај даљински управљач", + "已连接到锁,请按遥控": "Повезан са бравом, притисните даљински управљач", + "遥控号": "Број даљинског управљача", + "遥控详情": "Детаљи даљинског управљача", + "照明": "Осветљење", + "退出演示模式": "Излаз демо режим", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Савет : Тренутни интерфејс је интерфејс за приказ. Након додавања уређаја, можете наставити да га користите", + "门已上锁": "Врата су закључана", + "您的账号在异地登录,如非本人,请尽快修改密码": "Ваш налог је коришћен за пријављивање са новог уређаја", + "开门成功": "Успешно отворите врата", + "开门失败": "Није успео да отвори врата", + "呼叫提醒": "Подсетник за позив", + "收到来自": "Примљено од", + "锁的呼叫": "Закључај позив", + "加载数据中": "Учитавање података", + "搜索所有锁类型": "Претражи све типове закључавања", + "锁电量更新时间": "Време ажурирања батерије за закључавање", + "1月": "Јан", + "2月": "Феб", + "3月": "Мар", + "4月": "Апр", + "5月": "Мај", + "6月": "Дћун", + "7月": "Јул", + "8月": "Ауг", + "9月": "Сеп", + "10月": "Оцт", + "11月": "јул", + "12月": "Дец", + "热门城市": "Врући градови", + "导出锁数据": "Извоз података о закључавању", + "一键开锁": "Откључавање једним кликом", + "已开通": "Отворио", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?", + "在线": "Онлине", + "离线": "Ванмрежне", + "购买记录": "Записник о куповини", + "使用记录": "Кориснички запис", + "失效时间要大于当前时间": "Време истека мора бити дуже од тренутног времена", + "修改名字": "Измени име", + "时": "Сат", + "分": "Минут", + "Amazon Alexa": "амазонка Алека", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Можете користити Алека за откључавање, закључавање и проверу статуса закључавања", + "支持的国家": "Подржане земље", + "支持的国家值": "САД , Канада, Велика Британија, Аустралија, Индија, Немачка, Француска, Италија, Шпанија, Јапан", + "操作流程": "Процес рада", + "操作流程值": "1 Додајте браву и капију са Смарт лоцк АПП\n\n2 Омогућите функцију даљинског откључавања браве у АПП (ова функција је подразумевано искључена). Ако немате ову опцију, брава не подржава Алека\n\n3 Додајте вештине Алека и овлашћују их са налогом и лозинком Смарт Лоцк АПП је. Након што је ауторизација успешна, можете открити уређаје под рачуном\n\n4 Пронађите браву у апликацији Алека, укључите функцију гласовног откључавања и подесите лозинку језика\n\n5 Брава се може управљати преко Алека", + "Google Home": "Гугл почетна страница", + "Action name": "Име акције", + "ScienerSmart": "Српско-хрватски", + "支持的语言": "Подржани језици", + "英语": "Енглески", + "Google Home操作流程的值": "1 . Користите Смарт Лоцк АПП да додате браве и гатеваи\n\n2 . Омогућите функцију даљинског откључавања браве у АПП-у (ова функција је подразумевано искључена). Без ове опције, брава не подржава Гоогле Хоме\n\n3 . Инсталирајте Гоогле Хоме АПП и кликните на дугме \"+\" у горњем левом углу\n\n4 . На страници Подешавања изаберите \"Рад са Гоогле-ом\"\n\n5 . Потражите \"СциенерСмарт\" и користите паметну браву АПП налог и лозинку за ауторизацију", + "密码需至少包含数字/字母/字符中的2种组合": "Лозинка мора да садржи најмање 2 од следећег: бројеве, слова и специјалне знакове", + "已开锁": "Откљуиана", + "已闭锁": "Закљуиана", + "两次密码不一致哦": "Лозинке су недоследне", + "中功率": "Средња снага", + "常规使用": "Редовна употреба", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Након што је гатеваи укључен, притисните и држите дугме за ресетовање за 5 секунди, и кликните Следећи када индикатор трепери наизменично", + "扫描设备": "Уређај за скенирање", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Брисање није успело. Гатеваи је можда отишао ван мреже. Да ли желите да присилите брисање података?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_sv.json b/lan/lan_sv.json new file mode 100644 index 00000000..0a1bbc5b --- /dev/null +++ b/lan/lan_sv.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Stjärnlås", + "锁通通": "Lås genombrott", + "点击开锁,长按闭锁": "Berör för att låsa upp, håll till lås", + "考勤": "Närvaron", + "考勤设置": "Närvaroinställningar", + "电子钥匙": "EKeys", + "添加卡": "Lägg till kort", + "卡号": "Kortnummer", + "添加指纹": "Lägg till fingeravtryk", + "指纹号": "Fingeravtrycksnummer", + "遥控": "Fjärr", + "添加人脸": "Lägg till ansikt", + "门锁日志": "Logg för dörrlås", + "密码号": "Lösenordsnummer", + "添加者": "Operatörer", + "添加时间": "Tid", + "重置": "Återställ", + "请输入手机号或者邮箱": "Telefonnummer/Email", + "工作时间": "Arbetstid", + "工作日设置": "Arbetsdagsinställning", + "星期一": "Måndag", + "星期二": "Tisdag", + "星期三": "Onsdagar", + "星期四": "Torsdag", + "星期五": "Fredag", + "星期六": "Lördag", + "星期日": "Söndag.", + "简写周一": "M", + "简写周二": "T.", + "简写周三": "V", + "简写周四": "T.", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Man", + "周二": "Tie", + "周三": "Nör", + "周四": "Ton", + "周五": "Fritt", + "周六": "Löja", + "周日": "Solan", + "群发钥匙": "Skicka flera ekeys", + "锁": "Låsa", + "请添加": "Mottagare", + "允许远程开锁": "Fjärrlås upplåst", + "请输入验证码": "Kontrollkod", + "获取密码": "Skapa lösenkode", + "请给密码命名": "Ange ett namn på den här lösenkoden", + "密码有限期为6个小时,只能使用一次": "Denna Kod Denna lösenkod kan endast användas en gång.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Skriv in 6-9 siffror som lösenord manuellt. Kan läggas till via telefon Bluetooth bredvid låset, eller på distans läggs till genom gatewayn", + "获取": "Få", + "添加": "Lägg till", + "删除公司": "Ta bort företag", + "密码详情": "Lösenkodinformation", + "修改密码": "Ändra lösenkode", + "添加虹膜": "Lägg till iris", + "添加门磁": "Dörrsensorn", + "添加无线键盘": "Trådlös tangentplats", + "添加手掌": "Lägg till palmer", + "请输入员工账号": "Ange medarbetares konto", + "批量授权锁": "Bevilja flera lås", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Den auktoriserade administratören kommer att ha majoritetsbehörighet att hantera detta lås.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Denna funktion låter dig låsa upp Smart Lås på distans via en Gateway. Denna funktion kan endast slås på eller av via Bluetooth.", + "排列方式": "Listtyp", + "早到榜": "Tidig lista", + "迟到榜": "Försenad lista", + "当前模式": "Nuvarande läge", + "勤奋榜": "Hårdlista", + "延迟时间": "Fördröjningstid", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Låset låser automatiskt efter tiden.Lås upp den en gång först för att göra inställningen tillgänglig.", + "时间": "Tid", + "开始时间": "Starttid", + "结束时间": "Sluttid", + "工作时间设置": "Inställning av arbetstider", + "常开模式": "Passage MODE", + "常开时间": "Under denna tidsperiod", + "常开日期": "På dessa dagar", + "添加员工": "Lägg till personal.", + "节假日": "Semestern", + "打卡方式": "Metod", + "员工是否有钥匙": "Redan har ekey", + "上班时间": "Starttid", + "下班时间": "Stängtid", + "本周": "Denna vecka", + "单休": "Endags helge", + "双休": "Tvådagars helge", + "单双休": "En tvådagars helge", + "年": "År", + "月": "Månader", + "放假日期": "Semestern", + "补班日期": "Arbetsdagar", + "添加假日": "Lägg till semestern", + "开始日期": "Startdatum", + "必填": "Krävs", + "结束日期": "Slutdatum", + "日榜": "Dagligen", + "月榜": "Månadsvis", + "考勤记录": "Arkiv", + "假日信息": "Semesterinformation", + "基本信息": "Grundläggande åtgärder", + "无线键盘": "Trådlös tangentplats", + "选择无线键盘": "Lägg till tangentpap", + "门磁": "Dörrsensorn", + "自动闭锁": "Automatisk låsning", + "锁声音": "Lås ljud", + "防撬报警": "Tamper-varning", + "重置键": "Återställ knappen", + "锁时间": "Lås klocka", + "诊断": "Diagnosar", + "上传数据": "Ladda upp data", + "导入其他锁数据": "Importera från ett annat lås", + "锁升级": "Uppdatering", + "标记房态": "Rumstatus", + "开锁提醒": "Lås upp notifikation", + "微信二维码": "Lås upp QR- koden", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Personer med elektroniska nycklar kan öppna dörren genom att skanna denna QR-kod genom WeChat. QR-koden för varje lås är olika. Du kan skriva ut den och klistra in den bredvid motsvarande lås", + "锁编号": "Låsnummer", + "电量": "BatteriName", + "锁分组": "Lås grupp", + "选择分组": "Välj grupp", + "创建新分组": "Skapa en grupp", + "管理员开锁密码": "Admin- lösenkode", + "更新": "Uppdatera", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Batterinivån uppdateras via gateway eller telefon bluetooth", + "当屏幕闪烁时,点击下一步": "Klicka nästa när knappsatsen blinkar", + "输入*529#或按设置键": "Ange README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529# eller tryck på inställningstangenten", + "长按重置键2秒": "Tryck och håll återställningsknappen 2 sekunder", + "附近的设备": "Utrustning", + "暂无数据": "Inga data", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Du kommer att kunna få dörrstatus med en dörrsensor tillsammans med en gateway. Endast en sensor är tillåten att associera med ett lås.", + "开始": "Start", + "全天": "Alla timmar", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Du kan ställa in flera tidsperioder för passageläge.I de fastställda tidsperioderna kommer låset att förbli öppet efter att ha låsts upp.", + "请选择锁音量": "Välj låsvolym", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Genom att slå på kommer du att höra ljudet från låset", + "低": "Lågt", + "较低": "Medellåg", + "中": "Medelhög", + "较高": "Medelhög", + "高": "Hög", + "开启后,锁被撬动时,会发出报警声": "Genom att aktivera TAMPER-varningen.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Genom att stänga av är knappen RESET inaktiverad.", + "校准时间": "Kalibrera tid", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Diagnos är att läsa konfigurationsinformation inuti låset och ladda upp det så att personalen kan analysera orsaken till felet", + "上传": "Uppladdning", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Ladda upp data från lås till server.Det kan ta flera minuter.", + "请选择要从哪把锁导入": "Välj ett lås att importera från", + "有新版本": "Har ny versionName", + "当前版本": "Nuvarande versionName", + "升级": "Uppdatera", + "空闲": "Lediga", + "已入住": "Upptagen", + "多语言": "Språk", + "添加锁": "Lägg till lås", + "锁地址": "Lås adress", + "选择锁类型": "Välj låstyp", + "NFC无源锁": "NFC Passiv lås", + "添加设备": "Lägg till enhet", + "网关": "Gateway", + "客服": "Kundtjänster", + "设置": "Inställningar", + "更多设置": "Mer inställda", + "消息推送": "Underrättelse tryckning", + "锁用户管理": "Lås användare", + "拥有的钥匙": "EKeys associerade med användaren", + "批量授权": "Myndighetens förvaltning", + "关联设备": "Tillhörande enhet", + "关联姓名": "Tillhörande namn", + "转移智能锁": "Överföringslåsning", + "选择锁": "Skärmlås", + "接收人信息": "Mottagare", + "转移网关": "Överföringslinjen", + "锁屏": "Skärmlås", + "已关闭": "Avstängd", + "已开启": "Från", + "开启": "Sätt på", + "确定要开启重置键?": "Fortsätt att aktivera knappen Återställ?", + "确定要关闭重置键?": "Fortsätt att inaktivera knappen Återställ?", + "隐藏无效开锁权限": "Dölj ogiltig åtkomst", + "APP开锁时需手机连网的锁": "Lås som kräver telefon online.", + "增值服务": "Tjänster", + "关于": "Om:", + "退出": "Utloggning", + "删除账号": "Ta bort konto", + "个人信息": "Kontoinformation", + "头像": "Avatar", + "昵称": "NickNameName", + "请输入昵称": "Ange ditt smeknamn", + "修改昵称": "Byt namn", + "修改账号": "Redigera konto", + "重置密码": "Återställ lösenord", + "安全问题": "Säkerhetsfrågan", + "为了你的账号安全,修改账号前请先使用验证码验证": "För säkerheten på ditt konto, använd lösenord verifiering av kontot innan du ändrar kontot", + "请输入新账号": "Ange det nya kontot", + "找回密码和登录新设备时,可通过绑定的手机验证": "Den bindande telefonen kommer att användas för att få verifieringskoden.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Den bindande e-post kommer att användas för att få verifieringskoden.", + "原密码": "Nuvarande lösenord", + "新密码": "Nytt lösenord", + "确认密码": "Bekräfta lösenord", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Om telefonen är förlorad kan du logga in på ny telefon genom att svara på säkerhetsfrågor.", + "问题一": "Fråga 1", + "问题二": "Fråga 2", + "问题三": "Fråga 3", + "请输入你的答案": "Skriv in ditt svar", + "即将到期": "Utgår snart", + "去授权": "Gå till auktorisera", + "修改名称": "Redigera namn", + "状态": "Status", + "WiFi名称": "Wifi- namn", + "网络MAC": "Nätverksmac", + "网关升级": "Uppdatering", + "网关连接的锁": "Lås anslutna till den här gateway- lås", + "信号强": "Stark", + "选择网关类型": "Välj portaltyp", + "添加网关": "Lägg till gatewe", + "重新通电": "Uppkoppla kraften", + "指示灯": "Indikator Ljus", + "选择网关": "Välj gatewe", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G stöds inte, välj ett WiFi på 2.4G.", + "WiFi密码": "WiFi Passward...", + "请输入WiFi密码": "Skriv in lösenord", + "网关名称": "Gateway-namn", + "请输入网关名称": "Ange gateway-namn", + "IP地址": "IP- adress", + "子网掩码": "Delnätmask", + "默认网关": "Förvald inkörd", + "自动获取DNS服务器地址": "Hämta automatiskt adressen för DNS-servern", + "首选DNS": "Föredragna DNS", + "备选DNS": "Alternativ DNS", + "不使用静态IP": "Ingen statisk IP används", + "使用静态IP": "Använd statisk IP", + "请输入IP地址": "Ange IP- adress", + "请输入子网掩码": "Ange delnätmask", + "请输入默认网关": "Ange standardporten", + "所有锁": "Alla lås", + "搜索所有类型的锁": "Skanna alla typer av lås", + "门锁": "Dörrlås", + "挂锁": "Hänglås", + "保险箱锁": "Säker lås", + "智能门禁": "Intelligent tillträdeskontroll.", + "车位锁": "Parkeringslås", + "摸亮触摸屏": "Rör vid vilken nyckel som helst för att aktivera tangentpaden", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Vänligen rör vid vilken nyckel som helst för att aktivera låset och sätta det i PAIRING Läge.", + "附近的锁": "Närliggande lås", + "如需修改名字请重新命名,点击确定添加锁": "Om du vill ändra namnet, byt namn, klicka på OK för att lägga till lås", + "添加锁时,手机必须在锁旁边": "När du lägger till ett lås måste telefonen vara bredvid låset", + "登录": "Inloggning", + "注册": "Registrer", + "我已阅读并同意": "Jag har läst och samtyckt", + "验证码": "Kod", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Ditt lösenord måste ha 8-20 tecken och innehålla minst två typer av siffror, bokstäver och symboler", + "手机": "Telefonen", + "邮箱": "E- post@ info: whatsthis", + "请输入邮箱": "Skriv in din e- post@ info: whatsthis", + "国家/地区": "Land/region", + "你所在的国家/地区": "Ditt land/region.", + "选择国家/地区": "Välj land eller region.", + "获取验证码": "Hämta kod", + "商务合作": "Företag", + "电脑网页版": "Webbsystem", + "酒店系统": "Hotellsystem", + "说明书网页版": "Användarhandboken", + "高级功能": "Avancerad funktion", + "记录保存": "Lagring av registerinformation", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS kan användas för att skicka lösenkod och ekey information till mottagaren.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-postmeddelandet kan användas för att skicka lösenkod och ekey information till mottagaren.", + "购买实名认证提示": "Efter att funktionen är aktiverad måste du använda ditt fingeravtryck, ansikte eller ditt lösenord för att öppna APP. Det finns ingen anledning att verifiera igen för 3 minuter", + "请选择你希望的实名认证频次": "Välj frekvensen för autentisering med riktiga namn som du vill ha", + "仅首次": "För första gången.", + "每日一次": "En gång om dagen", + "每周一次": "En gång i veckan,", + "每月一次": "En gång i månaden", + "当前状态": "Nuvarande status", + "试用中": "Vid rättegången", + "高级功能权益内容": "Avancerade funktioner", + "短信模板": "SMS- mall", + "邮件模板": "E- postmall", + "发卡工具": "Kortkodare", + "购买高级功能须知": "Meddelanden", + "购买高级功能提示": "Mer avancerade funktioner är under utveckling, och om du behöver dem är du välkommen att öppna tjänsten baserat på antalet lås. Avancerade funktioner är endast tillgängliga för egna lås. Om du är en auktoriserad administratör, kontakta låsets översta administratör för att öppna tjänsten.", + "免费体验": "Fri prövning", + "立即开通": "Öppna nu.", + "购买短信": "Köp SMS", + "购买邮件": "Köp e-post:", + "购买实名认证次数": "Köp Riktiga namn Autentiseringstid", + "开通高级功能": "Aktivera avancerad funktion", + "选择套餐": "Välj paket", + "支付方式": "Betalningssätt", + "支付宝": "Alipaya", + "去支付": "Betalar", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Du får själv definiera meddelandet.Det används för att skicka information om lösenkod och ekey till andra.", + "高级功能仅能用于你自己的锁": "Den avancerade funktionen kan endast användas med egna lås.", + "新建模板": "Skapa mall", + "类型": "Type", + "模版内容": "Mallinnehåll", + "预览": "Förhandsgranskning", + "房间名": "Rum", + "预计产生短信条数": "Uppskattade meddelandesegment", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Denna funktion låter dig dölja lösenkoder, keys, kort och fingeravtryck som är ogiltiga under en tidsperiod.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Användarens telefon måste vara online för att låsa upp dessa valda lås med APP.", + "配置WiFi": "Anpassar WiFi", + "请输入WiFi名字": "Ange Wifi- namn", + "WiFi配网": "Nätverk för distribution av WiFi", + "胁迫卡": "Stresskort", + "员工是否有密码": "Har redan lösenkode", + "员工是否有卡": "Har redan Kort", + "员工是否有指纹": "Ange redan fingeravtrykket", + "获取钥匙": "Hämta nyckel", + "获取卡": "Hämta kort", + "获取指纹": "Hämta fingeravtryk", + "安全验证": "Identitetskontroll", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "All information från dina konto kommer att tas bort från plattformen PERMANENTLYT och kan inte återställas. Vill du ta bort?", + "监控": "Övervakare", + "视频日志": "Videologg", + "开门器": "Dörröppnare", + "面容开锁": "Ansiktet upplåsas", + "开门方向设置": "Öppningsriktning", + "电机功率设置": "Inställning av motorpowerName", + "开锁时是否需联网": "Om Internet krävs vid upplåsning", + "选择要加入分组的锁": "Välj Lås för att lägga till i gruppen.", + "锁数量": "Lås antal", + "小米IOT平台": "Xiaomi IOT-plattformar", + "面容开锁设置": "Ansiktet låser inställde", + "感应距离": "Avseendet", + "防误开": "Förhindra fel öppning", + "防误开已关闭,关门后仍可使用面容开锁": "Förhindra missöppning har stängts, efter stängning av dörren kan fortfarande använda ansikte upplåsning.", + "添加和使用面容开锁时": "Lägg till och använd ansikte vid låsningar", + "添加和使用面容开锁时提示": "\n1, försök att hålla en enda person framför dörrens verksamhet;\n2, vänligen stå framför dörrens lås ca 0,5~0,8 meter, mot dörren lås;\n3. Håll ditt ansikte fritt och exponera dina ansiktsdrag;\n4. När ansiktsigenkänning är onormal, kan du röra vid någon nyckel på det digitala tangentbordet för att starta om ansiktsigenkänning manuellt.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Välj motoreffekten noggrant i enlighet med den faktiska situationen för dörrlåset:", + "小功率:": "Miniwatt:", + "耗电少": "Mindre energiförbrukning", + "大功率": "Hög effekt:", + "大功率提示": "Om låset inte kan dras in normalt vid låsning eller behöver köras.", + "开门方向设置提示": "Välj försiktigt riktning för att öppna dörren till ditt hem (om du väljer fel riktning, du kommer inte att kunna öppna och stänga dörren ordentligt) :", + "左开": "Öppna vänster", + "右开": "Öppna höger", + "判断方法:": "Tåg:", + "判断方法内容": "Mannen stod utanför huset mot entrédörren.", + "录像时段": "Videoplats", + "密码": "Lösenkoder", + "卡": "Kort", + "指纹": "Fingeravtryck", + "人脸": "Ansikte", + "配件商城": "Lås Mall", + "公司名称": "Företagsnamn", + "请输入公司名字": "Ange företagsnamn", + "提示": "Tips", + "是否删除?": "Om det ska tas bort?", + "员工信息": "Personalinformation", + "员工": "Personale", + "打卡方式无效": "Inte tillgänglig", + "中国": "Kina", + "选择钥匙": "Välj ekey", + "编辑": "Redigera", + "无": "Nje", + "有": "JA", + "请输入姓名": "Ange ett namn", + "获取人脸": "Få ansikten", + "选择密码": "Välj lösenkode", + "选择卡": "Välj kort", + "选择指纹": "Välj fingeravtryk", + "选择人脸": "Välj sidan", + "员工是否有人脸": "Om den anställde har ett ansikt", + "同时删除员工钥匙": "Ta bort hans/hennes ekey", + "删除": "Ta bort", + "确定要删除员工吗?": "Ta bort den här medarbetaren", + "月统计": "Månadsstatistik", + "迟到": "Sent", + "早退": "Lämna tidig", + "未打卡": "Inga poster", + "钥匙将在": "Den här ekey kommer att gå ut in", + "天后失效": "Dag(ar)", + "电量更新时间:": "Batteriets uppdateringstid:", + "新增配件": "Lägg till", + "钥匙不可用": "Nyckeln är inte tillgänglig.", + "正在开锁中...": "Lås upp...", + "你的钥匙": "Din nyckel", + "常开模式启动!长按闭锁": "Öppet läge startat! Lås tryckning för att låsa", + "演示模式": "Demoläge", + "请先同意用户协议及隐私政策": "Godkänn först användaröverenskommelsen och sekretesspolicyn", + "用户协议": "Användarvillkor", + "隐私政策": "Integritetspolicy", + "注册成功": "Registrering lyckad", + "你所在的": "Du är med.", + "手机号": "Telefonnummer", + "忘记密码": "Glömt lösenord", + "重置成功": "Återställ framgångsrikt", + "确定要退出吗?": "Utgång?", + "功能暂未开放": "Funktionen är ännu inte öppen.", + "设置成功": "Ställ in med lyckat resultat", + "删除成功": "Ta bort lyckatComment", + "单次": "Engångsgräns", + "永久": "Permanent.", + "限时": "Tidstid", + "自定义": "Egenhet", + "清空码": "Ta bort namn", + "循环": "Återkommande", + "工作日": "Arbetsdagen", + "每日": "Dagligen", + "周末": "Helge", + "确定要删除吗?": "Ta bort?", + "该锁的密码都将被删除": "Alla lösenkoder för detta lås kommer att utlösas.", + "已过期": "Ogiltigt", + "该锁的电子钥匙都将被删除": "Alla eKeys för det här låset kommer att vara borttagna.", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Alla ekeys associerade med denna ekey.Detta steg kan inte vara UNDONE!", + "删除钥匙会在用户APP连网后生效": "Den kommer att utlämnas", + "有效时间": "Effektiv tid", + "接收者": "Mottagare", + "仅管理自己创建的用户": "Hantera endast sina egna användare", + "远程开锁": "Fjärrlåsa upp.", + "请输入钥匙名称": "Skriv in nyckelnamn", + "修改成功": "Ändra framgångsrikt", + "冻结": "Fryst", + "解除冻结": "Tina", + "授权": "Auktorisera", + "取消授权": "Av-godkännande", + "同时解冻其发送的钥匙": "Tina alla ekeys utgivna av den här användaren", + "会在用户APP连网后生效": "Denna ekey kommer att THAWED när Användarens APP ansluts till ett nätverk.", + "同时冻结其发送的钥匙": "Frysa alla ekeys utgivna av den här användaren", + "冻结会在用户APP连网后生效": "Denna ekey kommer att vara FROZEN när Användarens APP ansluts till ett nätverk.", + "取消授权会在用户APP连网后生效": "Användaren kommer att lösa sina behörigheter när Användarens APP ansluts till ett nätverk.", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Den auktoriserade användaren har nästan samma behörigheter som LOCK Manager(eg. Förmåga att skicka ekeys och lösenkoder)", + "失效时间需晚于生效时间": "Utgångstiden ska vara senare än den verkningstid som gäller.", + "生效时间需晚于当前时间": "Tiden i verkan måste vara senare än nuvarande tid", + "失效日期需晚于生效日期": "Utgångsdatumet måste vara senare än gällande datum.", + "修改有效期": "Förändringsperiod", + "生效日期": "Startdatum", + "失效日期": "Slutdatum", + "开锁": "Lås upp.", + "开锁成功": "Lås upp framgångsrikt", + "请选择锁": "Välj lås", + "请选择接收者": "Välj mottagaren", + "请选择有效期": "Välj giltighetstid", + "请选择发送方式": "Välj sändningsmetoden", + "请选择结束时间": "Välj sluttid", + "完成": "Färdiga", + "有效日": "Cykla på...", + "发送成功": "Skicka framgångsrikt", + "请选择开始时间": "Välj starttid.", + "选择用户": "Välj mottagare", + "已选中": "Markerad", + "确定": "Okej.", + "请选择要发送的锁": "Välj lås", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Ansikte riktiga namn autentisering avser användarens behov av att verifiera sitt ansikte innan du låser upp telefonen APP, och verifieringen kan låsas upp.", + "分享": "Dela", + "请输入接收者账号": "Ange mottagarens konto", + "接收者号码未注册,请重新发送": "Mottagarens nummer är inte registrerat, vänligen skicka vidare.", + "是否发送电子钥匙给未注册账号": "Vill du skicka en ekey till ett nytt konto", + "取消": "Avbryt", + "标记成功": "Markera framgångsrikt", + "微信好友": "WeChat- vännerName", + "短信": "SMS", + "邮件": "E- post@ info: whatsthis", + "更多": "Flere", + "您好,您的电子钥匙生成成功": "Hej, din elektroniska nyckel har skapats med framgång.", + "生效时间不能小于当前时间": "Effektiv tid kan inte vara kortare än nuvarande tid", + "结束时间不能小于当前时间": "Sluttiden kan inte vara mindre än den nuvarande tiden", + "是否为管理员": "Är det en administratör?", + "已连接到锁,请将卡靠近门锁的读卡区": "Ansluten. Placera kortet mot kortläsaren.", + "尝试连接设备...": "Ansluta med Lås.Vänta...", + "地理位置": "Geografisk plats", + "检查以确保以下地址是正确的": "Kontrollera att följande adress är korrekt", + "地图加载中,请稍候。。": "Kartan laddas, vänta...", + "跳过": "Hoppa på", + "还未获取到位置信息哦,请耐心等待一下!": "Platsinformationen har inte erhållits ännu, vänta tålmodigt!", + "请填写信息": "Fyll i informationen", + "有效期": "Giltighetstid", + "生效时间": "Starttid", + "失效时间": "Sluttid", + "上传成功": "Uppladdade med lyckat resultat", + "未生效": "Inaktivt", + "已生效": "Effektiv", + "指纹详情": "Fingeravtrycksinformation", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Du kommer att krävas för att placera din finger till sensoren flera gånger.Vänligen följ ....", + "开始添加": "Start", + "请将您的手指按下": "Placera din finger på sensorna", + "根据提示,抬起手指后再进行下一次指纹采集": "Följ uppmaningarna ... Du kommer att krävas för att ta bort och placera din finger till sensorn för nästa inspelning", + "添加成功": "Lägg till framgångsrikt", + "更新成功": "Uppdatera framgångsrikt", + "搜索": "Sök i", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Efter återställningen tas kortet på låset raderas. Vill du återställa?", + "已失效": "Ogiltigt", + "卡详情": "Kortsinformation", + "请输入": "Vänligen ange här.", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Genom att vrida av, förblir Låset olåst hela dagen tills det är manuellt låst", + "请输入小于或等于60的数字": "Ange ett tal mindre än 60", + "操作成功": "Åtgärden lyckad", + "管理员密码相同,无需修改": "Administratörens lösenord är detsamma och behöver inte ändras", + "请输入6-9位数字": "6-9 Siffror i längd", + "请输入6-9位管理员密码": "Ange ett 6-9-siffrigt lösenord för administratörer", + "请输入新的管理员密码": "Ange ett nytt administratörslösenord.", + "未分组": "Obegränsad", + "请输入分组名称": "Skapa en grupp", + "创建成功": "Skapa framgångsrikt", + "设置锁分组成功": "Ställ in lyckat låsgruppe", + "电池1电量": "Batteri 1", + "电池2电量": "Batteri 2", + "电量更新时间": "Batteriuppdateringstid", + "锁电量更新成功": "Uppdatering av låseffekten framgångsrikt", + "您的钥匙未生效": "Din nyckel är inte effektiv.", + "您的钥匙已冻结": "Din nyckel har frysts", + "您的钥匙已过期": "Din nyckel har förgått", + "常开模式开启": "Låset är i Passage-läge", + "超级管理员": "Superadministratören", + "授权管理员": "Auktoriserad administration", + "普通用户": "Vanlig användare", + "余": "Balans", + "天": "Dagen", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Efter att ha raderat låset, kommer all information tas bort tillsammans, är du säker på att du vill ta bort låset?", + "请输入登录密码": "Ange programmets lösenord.", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Misslyckades att ta bort enheten, se till att enheten är nära enheten, enheten är inte ansluten, och enheten är påslagen.", + "用户无权限": "Användaren har inget behörigheter", + "创建公司后,考勤功能才能使用": "Skapa ett företag först.", + "是否删除钥匙?": "Ta bort denna ekey?", + "邮箱绑定成功": "E- post bindande framgångsrikt", + "手机绑定成功": "Mobiltelefonbindning framgångsrikt", + "网络访问失败,请检查网络是否正常": "Förfrågan misslyckades.Network otillgänglig, Kontrollera och ansluta din enhet till 3G/4G/WIFI", + "清空": "Rensa", + "是否清空?": "Förstått?", + "消息详情": "Brevinformation", + "创建时间": "Skapandetid", + "管理员详情": "Uppgifter om administratören", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Om någon tvingar dig att öppna dörren, kan du använda det här kortet. Larmmeddelandet skickas till administratörerna. För att använda denna funktion, se till att ditt lås är online.", + "请不要将胁迫卡用于日常开锁": "Använd inte tvångskortet för daglig användning.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Om någon tvingar dig att öppna dörren kan du använda fingeravtrycket. Larmmeddelandet skickas till administratörerna. För att använda denna funktion, se till att ditt lås är online.", + "请不要将胁迫指纹用于日常开锁": "Använd inte fingeravtrycket för daglig användning.", + "创建公司": "Skapa ett företag", + "公司名称不能超过30个字符": "Företagets namn får inte överstiga 30 tecken", + "公司名称不能小于6个字符": "Företagets namn kan inte vara mindre än 6 tecken", + "WIFI列表": "WIFI- listan", + "刷新": "Uppdatera", + "手动配网": "Manuellt distributionsnät", + "远距离": "Långdistans", + "中距离": "Mellansträckt", + "近距离": "Kort sträcka", + "锁时间更新成功": "Uppdatering av låsetid framgångsrikt", + "锁用户": "Lås användare", + "请选择常开日期": "Välj öppna datum", + "结束时间不能小于开始时间哦": "Sluttiden kan inte vara mindre än starttiden.", + "介绍": "Vår berättelse", + "个人信息收集清单": "Insamlingslista för personuppgifter", + "应用权限说明": "Beskrivning av programmets behörighet", + "第三方信息共享清单": "Informationsutbyte för tredje parts", + "请选择您的位置": "Välj plats", + "请先选择位置": "Välj plats först.", + "管理员密码": "Admin- lösenkode", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Om du behöver ändra, skriv in ett nytt administratörslösenord (6 siffror), klicka på OK för att ändra.", + "修改": "Ändrar", + "网络摄像头": "Kamera", + "重命名": "Byt namn", + "分组下的锁将被移到未分组里": "Lås under gruppen flyttas till ungrupper", + "编辑成功": "Redigera framgångsrikt", + "厂商": "Tillverkare", + "型号": "Modell", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "När lösenordet har genererats, använd det en gång för aktivering före 23:59 samma dag, Annars blir den ogiltig efter klockan 0. Efter att lösenordet är aktiverat kan det användas obegränsade tider inom giltighetstiden.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "När lösenordet har genererats, använd det före 23:59 samma dag, annars kommer det att vara ogiltigt efter klockan 0. Den tydliga koden används för att rensa alla lösenord som genereras före klockan 0 i dag.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "När lösenordet har genererats, använd det före 23:59 samma dag, annars kommer det att vara ogiltigt efter klockan 0.", + "清空密码底部提示": "Lösenordet är giltigt fram till 23:59 på dagen för tömning", + "相机": "Kamera", + "相册": "Bilder", + "读写": "Lagring", + "定位": "Plats", + "需要访问相机权限才能拍照上传文件例如头像上传": "Tillgång till kameran krävs för att ta bilder och ladda upp filer, såsom att ladda upp en profilbild.", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Tillgång till kamera krävs för att ladda upp filer och avatarer med albumbilder", + "需要访问读写权限才能使用本地图片上传头像": "Tillgång till läs- och skrivrättigheter krävs för att ladda upp avatare med lokala bilder", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Tillgång till platsinformation krävs för att använda lägg till nyckelfunktionen.", + "申请": "Ansökan", + "权限": "Behörigheter", + "不允许": "Inte tillåted", + "允许": "Tillåts", + "权限被拒绝": "Tillstånd nekades", + "请手动在系统设置中开启": "Aktivera det manuellt i systeminställningarna", + "权限以继续使用应用": "Tillstånd att fortsätta använda programmet.", + "去设置": "Gå och ordna upp det.", + "当前网络": "Nuvarande nätverk", + "位置信息": "Platsinformation", + "请输入wifi名称": "Ange wifi- namn", + "虹膜": "Iris", + "手掌": "Palmer", + "商城": "Mall", + "我的": "Ja", + "微信公众号推送": "Vichatta offentligt konto", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "För att öppna wechatt för att ta emot larmmeddelanden, måste du vara uppmärksam på Skye Smart Lock vichatt offentliga konto först, spara QR-koden och använd wechat för att skanna inställningar", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Tillgång till Bluetooth-rättigheter krävs för att använda platsinformationen för lägg till nyckelfunktionen lägg till.", + "请输入Email": "Skriv in din e- post@ info: whatsthis", + "请输入手机号": "Ange ditt telefonnummer", + "家人到家": "Familjemedlem kom hem.", + "添加家人": "Lägg till familjemedlemman", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Om låset inte är anslutet till Internet, påminnelser om lösenkod, kort, fingeravtryck, och andra dörröppningsmetoder kan inte skickas i tid.", + "消息提醒": "Påminnelse", + "开门通知": "Inledande meddelande", + "N天未开门": "N dagar utan dörröppning", + "门未关好": "Dörren är inte stängd.", + "防拆报警": "Tamper alarm", + "低电量提醒": "Lågt batteri", + "胁迫开门": "Tvingad dörröppning", + "有人按门铃": "Någon ringer på dörrklockan.", + "有人出现在门口": "Någon dyker upp vid dörren.", + "提醒方式": "Påminnelsesmetoden", + "开门方式": "Dörröppningsmetoden", + "请选择": "Välj", + "家人": "Familjemedag", + "保存": "Spara", + "APP推送": "APP tryck", + "管理员": "Administratören", + "未启用": "Inte aktiverat", + "已启用": "Aktiverad", + "省电模式": "Strömsparläge", + "逗留抓拍模式": "Behåll inspelningsläge", + "实时监控模式": "Övervakningsläge", + "自定义模式": "Eget läge", + "猫眼设置": "Kattögon inställningar", + "猫眼工作模式": "Arbetsläge", + "自动亮屏": "Automatisk ljus skärm", + "亮屏持续时间": "Skärm i tid.", + "逗留警告": "Varna varnan", + "异常警告": "Onormal varning", + "短信提醒": "SMS", + "邮件提醒": "E- post@ info: whatsthis", + "N天未开门提醒": "N dagar utan dörröppning", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Om någon tvingar dig att öppna lås kan du använda fingeravtrycket. Larmmeddelandet kommer att skickas till administratörer.TO använda denna funktion, se till att ditt lås är online.", + "胁迫指纹": "Tvingat fingeravtryck", + "指纹列表": "Fingeravtryckslistan", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Efter inställd tid, om låset inte öppnas, kommer systemet att skicka ett påminnelsemeddelande till den utsedda mottagaren. Denna funktion kräver att låset ansluts till internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Efter att aktivera påminnelsen , När lås batteriet är under 20%, 10%, och 5%, systemet skickar ett påminnelsemeddelande till den utsedda mottagaren.", + "未开门时间": "Dagar utan dörröppning", + "添加和使用面容开锁时:": "Lägg till och använd Face när du låser upp:", + "关锁": "Nära lås", + "功能": "Funktion", + "配件": "Delar", + "云存": "Lagring av moln", + "本地": "Denna ort", + "3天滚动储存": "3 dagar rullande förvaring", + "去升级": "Uppgradera nu.", + "下载列表": "Nerladdningslistan", + "已下载": "Laddat ner", + "全部视频": "Alla videor", + "已为本设备免费提供3大滚动视频储存服务": "Tre rullande videolagringstjänster har tillhandahållits gratis för denna enhet.", + "视频播放": "Videouppspelning", + "全选": "Alla", + "请选择要删除的视频": "Välj videon som du vill ta bort.", + "请选择要下载的视频": "Välj den video du vill ladda ner", + "欢迎使用": "Välkommen att användare", + "用户协议和隐私政策概要": "Sammanfattning av Användaravtalet och sekretesspolicyn", + "协议概要": "Sammanfattning", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Tack för att du använder denna ansökan. Vi fäster stor vikt vid dina personuppgifter och sekretessskydd. Innan du använder denna produkt, läs den noga", + "《用户协议》": "Användarvillkor", + "和": "Och och", + "《隐私政策》": "Integritetspolicy Förs", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Hela innehållet av. Genom att klicka på \"Avtalet\" samtycker du och accepterar alla villkor. Om du väljer att inte samtycka kommer du inte att kunna använda våra produkter och tjänster och kommer att avsluta ansökan.", + "不同意": "Oening", + "同意": "Godkänns", + "该功能是高级功能,请开通后再使用": "Detta är den avancerade funktionen. Aktivera det först.", + "常用程序": "Gemensamma program", + "该锁已被重置": "Låset har återställts", + "需要访问读写权限才能使用手动升级固件": "Tillgång till läs- och skrivrättigheter krävs för att manuellt uppgradera firmware.", + "错误D固件,请选择正确的文件": "Fel inbyggd programvara, välj rätt fil.", + "非SYD固件,请选择正确的文件": "Inte SYD- firmware, välj rätt fil.", + "文件校验失败 0x01": "Filverifiering misslyckades 0x1", + "解析元数据失败,请选择正确的文件": "Misslyckades tolka metadata. Välj rätt fil.", + "文件校验失败 0x02": "Filverifiering misslyckades 0x02", + "文件校验失败 0x03": "Filverifiering misslyckades 0x03", + "固件升级完成": "Uppgradering färdigställd", + "记录": "Arkiv", + "开通高级功能后才可以对锁进行管理": "Aktivera avancerad funktion först för att hantera lås.", + "去开通": "Aktiverar", + "实名认证": "Behörighetskontroll med verkliga namn", + "当前剩余数量": "Återstående", + "购买": "Köp", + "实名认证为付费功能,请购买后再使用": "Autentisering av verkliga namn är en betald funktion, använd den efter köpet", + "密码不一致哦": "Lösenord är inkonsekventa", + "退出添加": "Avsluta läggning", + "管理员已满": "Administratör fullt", + "用户已满": "Användaren är full.", + "锁上面添加指纹已满": "Lägg till fingeravtryck på lås är fullt", + "指纹已存在": "Fingeravtrycket finns redan.", + "锁上面添加人脸已满": "Lås över tilläggsida är fullt", + "人脸已存在": "Ansiktet finns redan", + "锁上面添加卡已满": "Lås över tilläggskortet är fullt", + "卡已存在": "Kortet finns redan", + "锁上面添加密码已满": "Lås ovan lösenord är fullt", + "密码已存在": "En identisk lösenkod finns redan.Välj en annan.", + "请输入密码": "Ange lösenord", + "暂无密码,无需重置": "Inget lösenord, ingen anledning att återställa", + "真实姓名": "Riktigt namn", + "身份证号": "ID-nummer", + "请输入真实姓名": "Ange ditt riktiga namn", + "请输入身份证号": "Ange ditt ID-nummer", + "请输入身份证号和真实姓名": "Ange ditt ID-nummer och riktiga namn", + "点击返回设备配对": "Tryck på tillbaka till enhetsparing", + "无法连接?尝试升级": "Kan inte ansluta?", + "固件升级提示": "Uppgradering av företrädare", + "请先获取固件文件到手机本地,再选择升级": "Hämta firmware- filen till den lokala telefonen först, och välj sedan Uppgraderingar", + "固件升级中": "Fastvaran håller på att uppgraderas.", + "取消升级": "Avbryt uppgraderingen.", + "固件传输中": "Firvator under transitering", + "关闭": "Stäng av.", + "传输中'": "Under transitering", + "操作记录": "Arkiv", + "修改姓名": "Redigera namn", + "传输中": "Under transitering", + "发送人": "Utfärdat av:", + "发送时间": "Utfärdad tid", + "钥匙详情": "EKEY- infoName", + "姓名": "Namn", + "发送": "Skicka", + "请确认姓名全名和身份证号码是否正确": "Bekräfta att fullständigt namn och ID-nummer är korrekt.", + "传输期间请勿离开当前页面": "Lämna inte den aktuella sidan under överföringen", + "机型": "Modeller", + "硬件版本": "Hårdvarur", + "固件版本": "Firmware-versionen", + "手动升级": "Manuell uppgradering", + "设备连接中...": "Anslutning av enhet...", + "未避免异常情况,请在门打开时升级": "Oundvikliga undantag, uppgradera när dörren är öppen.", + "钥匙无效": "Nyckeln är ogiltigt", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Kan inte ansluta till låset.Vänligen starta om telefonens Blutooth och försök igen.", + "如果是全自动锁,请使屏幕变亮": "Om det är ett helt automatiskt lås, gör skärmen ljusare.", + "正在尝试闭锁……": "Försöker låsa. Vänta...", + "清空记录": "Rensa poster", + "是否要删除操作记录?": "Fortsätt att ta bort poster?", + "被删除的记录不能恢复": "Uppgifterna kan inte återställas efter radering.", + "全部事件": "Alla händelser", + "开锁事件": "Lås upp händelsen", + "异常事件": "Onormala händelser", + "门铃事件": "Händelse på dörrklocka", + "视频事件": "Videohändelsen", + "请开启蓝牙": "Vänd Bluetooth på", + "请选择有效日": "Välj den effektiva dagen", + "公司名字长度不能小于 6 ": "Företagets namn får inte vara längre än 6.", + "已是最新版本": "Inga uppdateringar", + "新建短信模版": "Skapa SMS- mall", + "新建邮件模版": "Skapa e- postmall", + "自定义短信模版": "SMS-mall", + "自定义邮件模版": "E- postmall", + "名称": "Namn", + "星星锁": "Stjärnlås", + "无考勤记录": "Inga poster", + "大家干劲十足": "Alla kommer i tiden", + "工作时长未出炉": "Ingen arbetstid", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Valet av land/region påverkar datasäkerheten.Du har för närvarande valt Albanien, bekräfta innan du fortsätter.", + "确认国家或地区": "Bekräfta land/region", + "我知道了": "Okej.", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "För att få viktiga uppdateringar, klicka på \"OK\" och aktivera meddelanden i inställningarna.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "När du har aktiverat, kan du återkoppla på genom att länge trycka in inställningstangenten på låset och lägga till den med APP.", + "已有": "Aktuellt", + "新增": "Nytt", + "账号格式错误": "Felaktigt format", + "接收者信息为空": "Informationen till mottagaren är tom.", + "请输入时间(秒)": "Ange tiden (s)", + "加载数据失败": "Misslyckades ladda data", + "重试": "Försök igen", + "升级中,是否退出": "Under uppgraderingen, om du ska avsluta", + "下一步": "Nästa", + "公寓": "Lägenhet", + "个人用户": "Personligt", + "星寓": "Stjärnalägenhet", + "账号": "Konton", + "请输入手机号或email": "Telefonnummer eller e-post", + "请输入星寓管理员的账号": "Ange kontot för stjärnbostadsadministratören", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Alla uppgifter i de valda låserna kommer att överföras permanent till mottagaren.", + "暂不支持跨平台转移,敬请期待": "Plattformöverföring stöds inte för tillfället, se fram emot den", + "移除坏锁": "Flytta felaktiga/skadade lås till papperskorgen", + "转移确认": "Bekräfta överföring", + "本次共转移": "Den här gången totalt", + "把智能锁": "Smart lås", + "确认": "Okej.", + "移除成功": "Ta bort framgångsrikt", + "转移成功": "Överföring framgångsrikt", + "该已锁被删除": "Den låsta är borttagen", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Den auktoriserade admin kan endast hantera lösenkoder,ekeys och etccreated av sig själv.", + "添加授权管理员": "Skapa administration", + "导出记录": "Exportregister", + "选择时间段": "Välj tidsperiod", + "导出": "Exportering", + "批量导出": "Export från sats", + "读取记录": "Uppdatera poster", + "设备": "Enheten", + "消息": "Meddelanden", + "智能分析": "Intelligent analys", + "精准识别设备事件,过滤无效信息": "Identifiera enhetshändelser och filtrera bort ogiltig information", + "系统设置": "Systeminställningar", + "系统的全局配置在此项内进行设置": "Systemets globala konfiguration anges i det här objektet", + "导出操作记录": "Exportregister", + "立即查看": "Visa", + "导出成功": "Exporterade med lyckat resultat", + "发送钥匙": "Skicka ekey", + "进度": "Hastighet", + "失败": "Misslyckades", + "人脸详情": "Ansiktsuppgifter", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "När någon känns cirka 1,5 meter framför dörren startar ansiktsigenkänningen automatiskt.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "När någon känns cirka 0,8 meter framför dörren startar ansiktsigenkänningen automatiskt.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "När någon känns cirka 0,5 meter framför dörren startar ansiktsigenkänningen automatiskt.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Avkänningsavståndet har stängts av, du måste manuellt vidröra alla tangenter på tangentbordet för att utföra ansiktsigenkänning upplåsning.", + "防误开已打开,开锁后": "Anti-misske öppningen har aktiverats och efter låsning.", + "秒内不可使用面容开锁": "Upplåsning av ansiktet kan inte användas inom sekunder", + "掌静脉": "Palmvene", + "添加掌静脉": "Tillsätt palmvenen", + "胁迫掌静脉": "Tvångsad palmvene", + "请不要将胁迫掌静脉用于日常开锁": "Var snäll och använd inte tvångs- palmvener för daglig upplåsning", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Kopplad till låset, var snäll och öppna din handflata.", + "掌静脉详情": "Detaljer", + "掌静脉号": "Palmvenens antal", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth är inte påslagen, aktivera Bluetooth i inställningarna", + "删除用户时,会将用户拥有的钥匙一起删除。": "Om en användare är DELETED eventuella ekeys associerade med Användaren kommer också att vara DELETED.", + "配置网络": "Anpassa nätverk", + "你好": "Hallå.", + "成功": "Framgångsrikt", + "类型选择": "Typvälj", + "请选择要使用哪种类型": "Välj vilken typ som ska användas", + "系统邮件(推荐)": "System e-post (rekommenderad)", + "系统短信(推荐)": "System SMS (rekommenderad)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-posten kommer att skickas från denna App.Vänligen köp e-postpaket först.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS kommer att skickas från denna App.Vänligen köp e-postpaket först.", + "个人邮件": "Personlig e-post", + "个人短信": "Personlig SMS", + "邮件将从你的个人邮箱发给用户": "E-postmeddelandet kommer att skickas från ditt personliga e-postkonto.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS-meddelandet kommer att skickas från ditt personliga telefonnummer.Du betalar till din teleoperatör.", + "为了更好地应用体验,请确定权限": "För bättre tillämpningsupplevelse, bekräfta behörigheter", + "您第一次拒绝权限,请确定权限": "Du vägrade tillstånd för första gången, bekräfta tillståndet.", + "您第二次拒绝权限,请去应用设置开启权限": "Du vägrade behörighet för andra gången, gå till programmens inställningar för att aktivera behörigheter", + "去应用市场": "Gå till appbutiken", + "温馨提示": "Varm prompt", + "关闭应用": "Stäng programmet", + "开启微信接收报警消息需要先关注": "För att öppna WeChat för att ta emot alarmmeddelanden måste du följa", + "微信公众号,请保存二维码并使用微信扫一扫设置": "WeChat, spara QR-koden och använd WeChat för att skanna inställningarna.", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Autentisering av verkliga namn är en betald funktion, kontakta låsadministratören för att köpa och använda", + "位置权限": "Platsbehörigheter", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Bevilja appen att använda din lokalistiska.Den används för att skanna BLE-lås och gateways.", + "相机/相册权限": "Behörighet för kamera/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Bevilja appen att läsa och skriva foto och filer från Lagring.", + "点击选择": "Klicka för att markera", + "微信": "Wechat", + "朋友圈": "Momentar", + "QQ": "QQ", + "QQ空间": "QQZoneName", + "微博": "WeiboName", + "FaceBook": "Facebok", + "链接": "Länk", + "今天": "Idag", + "密码错误": "Ogiltigt lösenord", + "网络中断": "Nätverksavbrott", + "钥匙不存在": "Nyckel finns inte.", + "钥匙过期": "Nyckeln har utgått", + "钥匙已存在": "Nyckel finns redan", + "密码失效": "Ogiltigt lösenord.", + "门锁时间异常": "Onormal dörrlåsetid", + "APP(手机)未联网": "APP (mobiltelefon) är inte ansluten till internet.", + "数据不存在": "Data finns inte.", + "待接收": "Mottas", + "已冻结": "Frysta", + "已删除": "Raderat", + "未知": "Okänt", + "拖动下方滑块完成拼图": "Dra skjutreglaget till rätt inläggning", + "验证成功": "Verifiering framgångsrikt", + "验证失败": "Verifiering misslyckades", + "向右拖动滑块填充拼图": "Dra skjutreglaget till höger för att fylla spelet", + "请先获取到位置信息哦": "Hämta platsinformation först.", + "请选择国家": "Välj ett land", + "获取锁信息": "Hämta låsningsinformation", + "锁数据异常,请重试": "Låsdata är onormala, försök igen.", + "连接设备中...": "Ansluta enhet...", + "把锁": "Lås", + "条": "Strims", + "封": "Försegling", + "次": "Gånger", + "支付成功": "Betala framgångsrikt", + "查看详情": "Visa detaljer", + "请输入模板名称": "Ange mallnamn", + "模版类型": "Type", + "再返回一次退出": "Avsluta igen.", + "请先添加锁": "Lägg till låset först.", + "可视对讲": "Visuell interkoma", + "详细日志": "Detaljerad logg", + "已复制到剪切板": "Kopierad", + "拍照": "Foto", + "从相册选择": "Välj mellan albumet", + "选择问题": "Välj en fråga", + "确认长度不足8位": "Bekräfta längden mindre än 8 siffror", + "新密码长度不足8位": "Nytt lösenords längd mindre än 8 siffror", + "两次密码不一致": "Lösenord felmatch.Vänligen försök igen.", + "请点击获取验证码,验证码将发送到": "Vänligen få en verifieringskod.Koden skickas till", + "切换": "Byta", + "验证": "Verifiera", + "验证成功,账号已删除": "Verifiering lyckats, kontot raderat", + "该密码不是自定义密码,无法修改": "Det här lösenordet är inte ett eget lösenord och kan inte ändras", + "请选择设备要关联哪些姓名": "Välj vilka namn enheten ska associeras med", + "请选择姓名要关联哪些设备": "Välj vilka enheter namnet ska associeras med", + "确定要移除所选中的坏锁吗?": "Ta bort fellåset?", + "邮件通知": "Meddela via e-post", + "短信通知": "Underrätta via SMS", + "您好,您的授权管理员生成成功": "Hallå, din auktoriserade administratör har skapats med lyckat resultat.", + "请输入接收者姓名": "Vänligen ange här.", + "版本更新": "Versionsuppdatering", + "下次再说": "Nästa gång.", + "配网成功": "Framgång i nätverksdistribution", + "配网失败": "Nätverksdistribution misslyckades", + "该锁的无线键盘都将被删除": "Alla trådlösa knappsatser för det här låset kommer att utlösas.", + "实时画面": "Bild i realtid", + "适合门口较为安全的环境。": "Passar för relativt säkra miljöer vid dörren.", + "仅发生特定事件才录像,并可查看实时画面。": "Endast specifika händelser spelas in och bilden i realtid kan visas.", + "一般情况下,满电可使用7-8个月": "Under normala förhållanden kan det användas i 7-8 månader när det är fullt laddat", + "有人逗留或发生特定事件才录像,可随时查看": "Någon stannar eller särskilda händelser registreras, och kan visas när som helst.", + "实时画面。": "Bild i realtid.", + "一般情况下,满电可使用5~6个月。": "Under normala omständigheter, kan det användas i 5 ~ 6 månader när fullt laddas.", + "适合门口人员复杂、较不安全的环境。": "Lämplig för komplexa och relativt osäkra miljöer vid dörren.", + "有人出现就录像,可随时查看实时画面。": "Spela in när någon dyker upp, och visa bilden i realtid när som helst.", + "一般情况下,满电可使用2~4个月。": "Under normala omständigheter, kan det användas i 2~4 månader när fullt laddas.", + "根据您家门口实际情况设置录像和实时画面功能。": "Ställ in video- och realtidsbildfunktioner enligt den faktiska situationen vid dörren.", + "可使用时长由具体设置决定。": "Användningstiden bestäms av de specifika inställningarna.", + "查看": "Visa", + "有人按门铃或发生": "Någon ringer på dörrklockan.", + "异常事件时": "Onormal händelse.", + "不录像": "Ingen video.", + "有人出现、按门铃": "Någon dyker upp och ringer på dörrklockan.", + "或发生异常事件时": "En onormal händelse inträffar", + "逗留达到10秒": "Stanna i 10 sekunder", + "约1.5米": "Cirka 1,5 meter", + "随时": "När som helst.", + "立即录像": "Registrera omedelbart.", + "录像时机": "Videotidering", + "有人出现时录像": "Spela in när någon dyker upp.", + "人体侦测距离": "Avstånd för detektering av människan", + "查看实时画面": "Visa bild i realtid", + "自定义时间": "Egen tid", + "当日": "Idag", + "次日": "Nästa dag.", + "自定义时段": "Anpassad tidsperiod", + "发生事件时查看": "Visa när en händelse inträn", + "实时查看": "Realtidsvy", + "有人在门口出现10秒后开始录像。": "Någon dyker upp i dörren i tio sekunder innan inspelningen.", + "有人按门铃时立即录像。": "Registrera omedelbart när någon ringer på dörrklockan.", + "有人出现在门前1.5米范围时启动录像": "Börja inspelning när någon dyker upp inom 1,5 meter framför dörren.", + "约0.8米": "Omkring 0,8 meter", + "约3.0米": "Cirka 3,0 meter", + "添加指纹失败": "Åtgärden misslyckades.", + "项": "Poster", + "播放中": "Spelar", + "下载": "Ladda ner", + "暂无下载内容": "Inget nedladdningsinnehåll", + "亮度": "Ljusstyrka", + "音量": "Volym", + "快进至": "Få framåt till för", + "快退至": "Spola tillbaka till", + "暂无视频信息": "Ingen videoinformation", + "加载出错": "Ladningsfel", + "请单人正对门锁,距离一个成年人手臂长度": "Stå framför dörrlåset ensam, i en armlängd", + "(约0.6米)。": "(Ca 0,6 meter).", + "保持脸部无遮挡,露出五官。": "Håll ansiktet fritt och visa dina ansiktsdrag.", + "准备好了,开始添加": "Redo, börja lägga till.", + "正在录入中...": "Inspelning...", + "添加人脸失败": "Misslyckades lägga till sidan", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Efter återställning kommer låsets ansikten att raderas. Är du säker på att du vill återställa?", + "人脸号": "Ansiktsnummer", + "虹膜详情": "Iris-detaljer", + "虹膜号": "Iris-nummer", + "选择设备类型": "Välj enhetstyp", + "照明灯具": "Belysning", + "电动窗帘": "Elektriska gardine", + "门窗传感器": "Dörr- och fönstergivare", + "传感器": "Sensor", + "清除数据成功": "Data avlägsnade med lyckad", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Låset är inte anslutet till internet, så registrering av lösenkod, kort, fingeravtryck, och andra dörröppningsmetoder kan inte laddas upp i realtid.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Om du behöver behålla de historiska registerna, kan du exportera dem.", + "看不到操作记录,可能原因有": "Kan inte se operationsposterna, möjliga orsaker", + "操作记录详情": "Uppgifter om verksamhetens regior", + "操作时间": "Arbetstid", + "此模块功能需要锁联网后设置方可生效": "Denna modul funktion måste ställas in när låset är anslutet till Internet för att få verkan.", + "用户已存在": "Användaren finns redan", + "钥匙数量已到上限": "Antalet nycklar har nått den övre gränsen.", + "附近没有可用网关": "Det finns ingen gateway i närheten.", + "正在创建安全连接...": "Skapa en säker anslutning...", + "监视状态下不能发送录音": "Kan inte skicka inspelningar i övervakningsläge", + "挂断": "Lägg på.", + "监视中暂不能开锁": "Låsning är inte tillgänglig under övervakning", + "长按说话": "Tryck och håll tala.", + "松开发送": "Utgå för att skicka", + "请输入6位数字开锁密码": "Ange ett 6-siffrigt lösenord", + "请输入开锁密码": "Ange lösenordet för upplåsning.", + "接收者在有效期内可以不限次数使用": "Mottagare kan använda ekeys under obegränsade tider inom giltighetstiden.", + "接收者可以使用此App开关锁": "Mottagare kan låsa/upplåsa med denna app.", + "单次钥匙有效期为1小时,只能使用一次": "Engångs ekey är giltig i en timme och kan endast användas ONCE.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Mottagare kan använda ekeys under obegränsade tider inom den fasta cykeltiden.", + "获取模板失败": "Misslyckades hämta mallen", + "微信通知": "Wechat- anmälanComment", + "系统短信": "System- SMS", + "系统邮件": "System e-post", + "模板": "Mall", + "新建模版": "Skapa mall", + "您好,您的密码是": "Hej, ditt lösenord är:", + "密码名字": "Lösenordsnamn", + "请输入6-9位密码": "Ange ett 6-9-siffrigt lösenord", + "设置密码": "Ange lösenord", + "操作成功,密码为": "Lyckades. Lösenkoden er", + "类型:自定义-永久": "Typ:Anpassad permanenta", + "实时播放": "Uppspelning i realtid", + "点击对讲": "Klicka för att interfona", + "长按开锁": "Lång tryck för att låsa upp låsa", + "接听失败": "Misslyckades att svara", + "请在锁设置中开启远程开锁": "Aktivera fjärrlåsning i låsinställningarna", + "接听": "Svar:", + "截图已保存到相册": "Skärmbild sparad i albumet", + "添加遥控": "Lägg till fjärrkontrollen", + "已连接到锁,请按遥控": "Anslutet till låset, tryck på fjärrkontrollen.", + "遥控号": "Fjärrkontrollnummer", + "遥控详情": "Fjärrkontrolluppgifter", + "照明": "Belysning", + "退出演示模式": "Avsluta demoläge", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Tips: Det aktuella gränssnittet är ett skärmgränssnitt. Efter att lägga till enheten, kan du fortsätta att använda den.", + "门已上锁": "Dörren är låst.", + "您的账号在异地登录,如非本人,请尽快修改密码": "Ditt konto har använts för att logga in från en ny enhet", + "开门成功": "Öppna dörren framgångsrikt", + "开门失败": "Misslyckades öppna dörren.", + "呼叫提醒": "Påminnelse", + "收到来自": "Mottaget från", + "锁的呼叫": "Lås utlysningar", + "加载数据中": "Ladda uppgifter", + "搜索所有锁类型": "Sök igenom alla låstyper", + "锁电量更新时间": "Låsa uppdateringstid för batteriet", + "1月": "Jan.", + "2月": "Feb", + "3月": "Maro", + "4月": "Apr", + "5月": "Maji", + "6月": "Jun", + "7月": "Julel", + "8月": "Aug", + "9月": "Sep", + "10月": "Okt", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Heta städer", + "导出锁数据": "Exportera låsdata", + "一键开锁": "Lås upp ett klick.", + "已开通": "Öppnad", + "编辑员工": "Redigera personalComment", + "一": "Ett", + "二": "Två:", + "三": "Tre", + "四": "Fyra", + "五": "Fem", + "六": "Sex", + "日": "Solan", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?", + "在线": "Online:", + "离线": "Frånkoppling", + "购买记录": "Inköpsregistret", + "使用记录": "Användarlista", + "失效时间要大于当前时间": "Utgångstiden måste vara längre än nuvarande tid.", + "修改名字": "Redigera namn", + "时": "Timme", + "分": "Minuter", + "Amazon Alexa": "Amazon- Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Du kan använda Alexa för att låsa upp, låsa och kontrollera låsstatus", + "支持的国家": "Stödda länder", + "支持的国家值": "USA, Kanada, Storbritannien, Australien, Indien, Tyskland, Frankrike, Italien, Spanien, Japan.", + "操作流程": "Driftsprocess", + "操作流程值": "1 Lägg till ett lås och gateway med Smart Lås APP\n\n2 Aktivera fjärrlåsningsfunktionen för låset i APP (denna funktion är avstängd som standard). Om du inte har det här alternativet stöder inte låset Alexa\n\n3 Lägg till färdigheter till Alexa och godkänna dem med Smart lås APP konto och lösenord. När auktorisationen är framgångsrik kan du upptäcka enheter under kontot\n\n4 Hitta låset i Alexa-appen, slå på röst upplåsningsfunktionen och ställa in språklösenordet.\n\n5 Låset kan manövreras genom Alexa", + "Google Home": "Google HomeName", + "Action name": "Åtgärdsnamn", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Stödda språk", + "英语": "Engelska", + "Google Home操作流程的值": "1. Använd Smart Lås APP för att lägga till lås och gateways\n\n2. Aktivera fjärrlåsningsfunktionen för låset i APP (denna funktion är avstängd som standard). Utan det här alternativet stöder inte låset Google Home.\n\n3. Installera Google Home APP och klicka på \" \" knappen i det övre vänstra hörnet.\n\n4. På sidan Inställningar, välj \"Arbeta med Google\"\n\n5. Sök efter \"ScienerSmart\" och använd smart Lock APP-konto och lösenord för att auktorisera", + "密码需至少包含数字/字母/字符中的2种组合": "Lösenordet måste innehålla minst två av följande: siffror, bokstäver och specialtecken.", + "已开锁": "Olås", + "已闭锁": "Låst", + "两次密码不一致哦": "Lösenord är inkonsekventa", + "中功率": "Medelse", + "常规使用": "Regelbunden användning", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "När gateway är på, tryck och håll omställningsknappen i 5 sekunder, och klicka Nästa när indikatorljuset blinkar växelvist", + "扫描设备": "Söka enheter", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Borttagning misslyckades. Porten kan ha gått offline. Vill du tvinga bort data?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_th.json b/lan/lan_th.json new file mode 100644 index 00000000..94dda514 --- /dev/null +++ b/lan/lan_th.json @@ -0,0 +1,1122 @@ +{ + "星锁": "ล็อคดาวล็อค", + "锁通通": "ล็อคผ่าน", + "点击开锁,长按闭锁": "แตะเพื่อปลดล็อคค้างไว้เพื่อล็อค", + "考勤": "การเข้าร่วมการเข้างาน", + "考勤设置": "การตั้งค่าการเข้างาน", + "电子钥匙": "กุญแจ ekeys", + "添加卡": "เพิ่มบัตร", + "卡号": "หมายเลขบัตร", + "添加指纹": "เพิ่มลายนิ้วมือ", + "指纹号": "หมายเลขลายนิ้วมือ", + "遥控": "รีโมต", + "添加人脸": "เพิ่มใบหน้าและใบหน้า", + "门锁日志": "ล็อกประตูล็อก", + "密码号": "รหัสผ่านหมายเลข", + "添加者": "ผู้ให้บริการอุปกรณ์เสริม", + "添加时间": "เวลาเวลาที่กำหนด", + "重置": "รีเซ็ตค่าใหม่", + "请输入手机号或者邮箱": "หมายเลขโทรศัพท์หรืออีเมล์", + "工作时间": "เวลาทำงานของคุณ", + "工作日设置": "การตั้งค่าวันทำงาน", + "星期一": "วันจันทร์", + "星期二": "วันอังคาร", + "星期三": "วันพุธที่ดี", + "星期四": "วันพฤหัสบดี", + "星期五": "วันศุกร์", + "星期六": "วันเสาร์", + "星期日": "วันอาทิตย์นอกสถานที่", + "简写周一": "M M ค่ะ", + "简写周二": "ทีเชิร์ต", + "简写周三": "W ค่ะคุณลูกค้า", + "简写周四": "ทีเชิร์ต", + "简写周五": "F F", + "简写周六": "S S", + "简写周日": "S S", + "周一": "Mon Mon", + "周二": "Tue Tue", + "周三": "วันพุธกลางคืน", + "周四": "พฤ", + "周五": "วันศุกร์", + "周六": "ส.", + "周日": "ดวงอาทิตย์ดวงอาทิตย์ดวงอาทิตย์", + "群发钥匙": "ส่งหลาย ekeys", + "锁": "ที่ล็อคล็อค", + "请添加": "ผู้รับผู้รับสินค้า", + "允许远程开锁": "ปลดล็อคจากระยะไกล", + "请输入验证码": "รหัสการตรวจสอบ", + "获取密码": "รหัสผ่านสร้างรหัสผ่าน", + "请给密码命名": "ป้อนชื่อสำหรับรหัสผ่านนี้", + "密码有限期为6个小时,只能使用一次": "รหัสผ่านนี้ต้องใช้ภายใน6ชั่วโมงนับจากเวลาปัจจุบันหรือจะถูกระงับด้วยเหตุผลด้านความปลอดภัยรหัสผ่านนี้สามารถใช้ได้เพียงครั้งเดียวเท่านั้น", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "ป้อนด้วยตนเอง6-9หลักเป็นรหัสผ่านสามารถเพิ่มด้วยโทรศัพท์ Bluetooth ถัดจากล็อคหรือเพิ่มจากระยะไกลผ่านเกตเวย์", + "获取": "การรับ", + "添加": "การเพิ่ม", + "删除公司": "บริษัทลบ", + "密码详情": "ข้อมูลรหัสผ่าน", + "修改密码": "เปลี่ยนรหัสผ่านได้", + "添加虹膜": "เพิ่มไอริส", + "添加门磁": "เซนเซอร์ประตู", + "添加无线键盘": "แป้นกดไร้สาย", + "添加手掌": "เพิ่มฝ่ามือลงไป", + "请输入员工账号": "กรอกบัญชีพนักงาน", + "批量授权锁": "แกรนท์ล็อกหลายอัน", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "ผู้ดูแลระบบที่ได้รับอนุญาตจะได้รับอนุญาตส่วนใหญ่ในการดำเนินการล็อคนี้", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "คุณลักษณะนี้ช่วยให้คุณสามารถปลดล็อคสมาร์ทล็อคจากระยะไกลผ่านทางเกตเวย์คุณลักษณะนี้สามารถเปิดหรือปิดผ่านทางบลูทูธเท่านั้น", + "排列方式": "ประเภทรายการ", + "早到榜": "รายการก่อนวัย", + "迟到榜": "รายการปลาย", + "当前模式": "โหมดปัจจุบัน", + "勤奋榜": "การทำงานหนักรายการ", + "延迟时间": "เวลาที่ล่าช้า", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "ตัวล็อคจะล็อคอัตโนมัติหลังจากเวลาผ่านไปค่ะขอให้ปลดล็อคเป็นครั้งแรกค่ะเพื่อให้มีการตั้งค่าให้ค่ะ", + "时间": "เวลาเวลาที่กำหนด", + "开始时间": "เริ่มต้นเวลา", + "结束时间": "สิ้นสุดเวลา", + "工作时间设置": "การตั้งค่าเวลาทำงาน", + "常开模式": "โหมดผ่านได้", + "常开时间": "ในช่วงเวลานี้", + "常开日期": "ในวันนี้", + "添加员工": "เพิ่มพนักงาน", + "节假日": "วันหยุดวันหยุดพักผ่อน", + "打卡方式": "วิธีการใช้วัสดุ", + "员工是否有钥匙": "มี ekey อยู่แล้ว", + "上班时间": "เวลาเริ่มต้นของ", + "下班时间": "การปิดเวลา", + "本周": "สัปดาห์นี้", + "单休": "สุดสัปดาห์วันเดียว", + "双休": "วันหยุดสุดสัปดาห์สองวัน", + "单双休": "วันหยุดสุดสัปดาห์หนึ่งวัน", + "年": "ปีที่ผ่านไป", + "月": "เดือนเดือนเดือน", + "放假日期": "วันหยุดวันหยุดพักผ่อน", + "补班日期": "วันทำงานแบบสบายๆ", + "添加假日": "เพิ่มวันหยุด", + "开始日期": "วันเริ่มต้นใหม่", + "必填": "จำเป็นต้องใช้", + "结束日期": "วันสิ้นสุดวันที่", + "日榜": "วันต่อวัน", + "月榜": "แบบต่อเดือน", + "考勤记录": "บันทึกของ", + "假日信息": "ข้อมูลวันหยุด", + "基本信息": "อุปกรณ์พื้นฐาน", + "无线键盘": "แป้นกดไร้สาย", + "选择无线键盘": "เพิ่มแป้นกด", + "门磁": "เซนเซอร์ประตู", + "自动闭锁": "ล็อกอัตโนมัติ", + "锁声音": "ล็อคเสียง", + "防撬报警": "การแจ้งเตือนการงัดแงะ", + "重置键": "ปุ่มรีเซ็ต", + "锁时间": "ล็อคนาฬิกานาฬิกา", + "诊断": "วินิจฉัยวินิจฉัยปัญหา", + "上传数据": "อัปโหลดข้อมูล", + "导入其他锁数据": "นำเข้าจากล็อคอีกอัน", + "锁升级": "อัพเดตเฟิร์มแวร์", + "标记房态": "สถานะห้อง", + "开锁提醒": "การแจ้งเตือนการปลดล็อค", + "微信二维码": "ปลดล็อครหัส QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "ผู้ที่มีปุ่มอิเล็กทรอนิกส์สามารถเปิดประตูได้โดยการสแกนรหัส QR นี้ผ่าน WeChat รหัส QR ของล็อคแต่ละอันจะแตกต่างกันคุณสามารถพิมพ์ออกและวางไว้ถัดจากล็อคที่สอดคล้องกัน", + "锁编号": "ล็อคหมายเลข", + "电量": "แบตเตอรี่แบบชาร์จได้", + "锁分组": "ล็อกกลุ่ม", + "选择分组": "การเลือกกลุ่ม", + "创建新分组": "การสร้างกลุ่ม", + "管理员开锁密码": "รหัสผ่านผู้ดูแลระบบ", + "更新": "อัพเดต", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "ระดับแบตเตอรี่จะได้รับการอัปเดตโดยเกตเวย์หรือบลูทูธโทรศัพท์", + "当屏幕闪烁时,点击下一步": "คลิกถัดไปเมื่อปุ่มกดกะพริบ", + "输入*529#或按设置键": "ป้อน README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # หรือกดปุ่มการตั้งค่า", + "长按重置键2秒": "กดปุ่มรีเซ็ตค้างไว้2วินาที", + "附近的设备": "อุปกรณ์ใกล้เคียง", + "暂无数据": "ไม่มีข้อมูล", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "คุณสามารถที่จะได้รับสถานะประตูที่มีเซ็นเซอร์ประตูพร้อมกับเกตเวย์เพียงหนึ่งเซ็นเซอร์ที่ได้รับอนุญาตให้เชื่อมโยงกับล็อค", + "开始": "การเริ่มทำงาน", + "全天": "ตลอดหลายชั่วโมง", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "คุณสามารถตั้งเวลาได้หลายช่วงเวลาสำหรับโหมด Passage ภายในช่วงเวลาที่กำหนดล็อคจะยังคงอยู่ในสถานะเปิดหลังจากปลดล็อค", + "请选择锁音量": "กรุณาเลือกปริมาณล็อค", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "โดยการเปิดคุณจะได้ยินเสียงจากล็อค", + "低": "ต่ำไปหน่อย", + "较低": "ขนาดกลางต่ำ", + "中": "กลางกลางกลาง", + "较高": "สูงปานกลาง", + "高": "สูงสูงมาก", + "开启后,锁被撬动时,会发出报警声": "โดยการเปิดคุณเปิดใช้งานการแจ้งเตือนการงัดแงะ", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "โดยการปิดปุ่มรีเซ็ตจะถูกปิดใช้งาน", + "校准时间": "ปรับเทียบเวลา", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "การวินิจฉัยคือการอ่านข้อมูลการกำหนดค่าภายในล็อคและอัปโหลดเพื่อให้พนักงานสามารถวิเคราะห์สาเหตุของความล้มเหลวได้", + "上传": "อัพเดต", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "อัปโหลดข้อมูลจาก LOCK ไปยังเซิร์ฟเวอร์อาจใช้เวลาหลายนาที", + "请选择要从哪把锁导入": "เลือกล็อคเพื่อนำเข้าจาก", + "有新版本": "มีเวอร์ชันใหม่", + "当前版本": "รุ่นปัจจุบัน", + "升级": "อัพเดต", + "空闲": "Vacant", + "已入住": "ครอบครองแล้ว", + "多语言": "ภาษาภาษาต่างๆ", + "添加锁": "เพิ่มล็อค", + "锁地址": "ล็อคที่อยู่", + "选择锁类型": "เลือกประเภทล็อก", + "NFC无源锁": "ล็อค NFC Passive", + "添加设备": "เพิ่มอุปกรณ์", + "网关": "เกตเวย์เกตเวย์", + "客服": "ฝ่ายบริการลูกค้า", + "设置": "การตั้งค่าการตั้งค่า", + "更多设置": "ชุดอื่นๆ", + "消息推送": "แจ้งเตือนผลักดัน", + "锁用户管理": "ล็อกผู้ใช้", + "拥有的钥匙": "Ekeys ที่เกี่ยวข้องกับผู้ใช้รายนี้", + "批量授权": "การจัดการอำนาจ", + "关联设备": "อุปกรณ์ที่เกี่ยวข้อง", + "关联姓名": "ชื่อที่เกี่ยวข้อง", + "转移智能锁": "ล็อคการถ่ายโอน", + "选择锁": "ล็อกหน้าจอ", + "接收人信息": "ผู้รับผู้รับสินค้า", + "转移网关": "โอนเกตเวย์", + "锁屏": "ล็อกหน้าจอ", + "已关闭": "ปิดด้วยส่วนลด", + "已开启": "เปิดบน", + "开启": "เปิดเปิดเครื่อง", + "确定要开启重置键?": "ยังคงเปิดใช้งานปุ่มรีเซ็ต?", + "确定要关闭重置键?": "ยังคงปิดการใช้งานปุ่มรีเซ็ต?", + "隐藏无效开锁权限": "ซ่อนการเข้าถึงที่ไม่ถูกต้อง", + "APP开锁时需手机连网的锁": "ล็อคต้องใช้โทรศัพท์ออนไลน์", + "增值服务": "การบริการที่ยอดเยี่ยม", + "关于": "เกี่ยวกับเกี่ยวกับ", + "退出": "โลโก้เอาท์", + "删除账号": "ลบบัญชี", + "个人信息": "ข้อมูลบัญชี", + "头像": "อวาตาร์", + "昵称": "ชื่อเล่นที่เรียกว่า", + "请输入昵称": "กรุณาใส่ชื่อเล่นของคุณ", + "修改昵称": "เปลี่ยนชื่อ", + "修改账号": "แก้ไขบัญชี", + "重置密码": "รีเซ็ตรหัสผ่านแล้ว", + "安全问题": "คำถามความปลอดภัย", + "为了你的账号安全,修改账号前请先使用验证码验证": "เพื่อความปลอดภัยของบัญชีของคุณโปรดใช้การตรวจสอบรหัสผ่านบัญชีก่อนแก้ไขบัญชี", + "请输入新账号": "กรุณาป้อนบัญชีใหม่", + "找回密码和登录新设备时,可通过绑定的手机验证": "หมายเลขโทรศัพท์ที่มีผลผูกพันจะถูกใช้เพื่อรับรหัสยืนยัน", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "อีเมลที่มีผลผูกพันจะถูกใช้เพื่อรับรหัสยืนยัน", + "原密码": "รหัสผ่านปัจจุบัน", + "新密码": "รหัสผ่านใหม่ล่าสุด", + "确认密码": "ยืนยันรหัสผ่าน", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "ในกรณีที่โทรศัพท์ของคุณหายไปคุณสามารถเข้าสู่ระบบโทรศัพท์เครื่องใหม่ได้โดยตอบคำถามด้านความปลอดภัย", + "问题一": "คำถามที่1", + "问题二": "คำถามที่2", + "问题三": "คำถามที่3", + "请输入你的答案": "กรุณาพิมพ์คำตอบของคุณ", + "即将到期": "หมดอายุเร็วๆนี้", + "去授权": "ไปที่การอนุญาต", + "修改名称": "แก้ไขชื่อ", + "状态": "สเตท", + "WiFi名称": "ชื่อ WIFI", + "网络MAC": "เครือข่าย Mac", + "网关升级": "การปรับปรุงเกตเวย์", + "网关连接的锁": "ล็อคเชื่อมต่อกับเกตเวย์นี้", + "信号强": "แข็งแรงทนทาน", + "选择网关类型": "เลือกประเภทเกตเวย์", + "添加网关": "เพิ่มเกตเวย์", + "重新通电": "เชื่อมต่อพลังงานอีกครั้ง", + "指示灯": "ไฟแสดงสถานะ", + "选择网关": "เลือกเกตเวย์", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "ไม่รองรับ5G ครับรบกวนเลือก WIFI 2.4G นะครับ", + "WiFi密码": "WIFI passward", + "请输入WiFi密码": "ป้อนรหัสผ่าน WiFi", + "网关名称": "ชื่อเกตเวย์", + "请输入网关名称": "ป้อนชื่อเกตเวย์", + "IP地址": "ที่อยู่ IP", + "子网掩码": "หน้ากากซับเน็ต", + "默认网关": "เกตเวย์เริ่มต้น", + "自动获取DNS服务器地址": "รับที่อยู่เซิร์ฟเวอร์ DNS โดยอัตโนมัติ", + "首选DNS": "DNS ที่ต้องการ", + "备选DNS": "DNS ทางเลือกอื่น", + "不使用静态IP": "ไม่มีการใช้ IP แบบคงที่", + "使用静态IP": "ใช้ IP แบบคงที่", + "请输入IP地址": "ใส่ที่อยู่ IP", + "请输入子网掩码": "ใส่หน้ากากย่อย", + "请输入默认网关": "เข้าสู่เกตเวย์เริ่มต้น", + "所有锁": "ล็อกทั้งหมด", + "搜索所有类型的锁": "สแกนล็อคทุกประเภท", + "门锁": "ล็อคประตูล็อค", + "挂锁": "กุญแจล็อคกุญแจ", + "保险箱锁": "ล็อคที่ปลอดภัย", + "智能门禁": "การควบคุมการเข้าถึงอัจฉริยะ", + "车位锁": "ล็อคจอดรถ", + "摸亮触摸屏": "แตะปุ่มใดๆเพื่อเปิดใช้งานปุ่มกด", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "โปรดแตะปุ่มใดๆเพื่อเปิดใช้งานล็อคและวางไว้ในโหมดจับคู่กดถัดไป", + "附近的锁": "ล็อกใกล้เคียง", + "如需修改名字请重新命名,点击确定添加锁": "หากคุณต้องการเปลี่ยนชื่อโปรดเปลี่ยนชื่อคลิกตกลงเพื่อเพิ่มล็อค", + "添加锁时,手机必须在锁旁边": "เมื่อเพิ่มล็อคโทรศัพท์จะต้องอยู่ถัดจากล็อค", + "登录": "เข้าสู่ระบบด้วยระบบ", + "注册": "ลงทะเบียนลงทะเบียน", + "我已阅读并同意": "ฉันได้อ่านและเห็นด้วย", + "验证码": "รหัสสำหรับเด็ก", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "รหัสผ่านของคุณต้องมี8-20ตัวอักษรและรวมขั้นต่ำสองประเภทของตัวเลขตัวอักษรและสัญลักษณ์", + "手机": "โทรศัพท์สำหรับโทรศัพท์", + "邮箱": "อีเมล์ของคุณ", + "请输入邮箱": "การป้อนอีเมลของคุณ", + "国家/地区": "ประเทศ/ภูมิภาค", + "你所在的国家/地区": "ประเทศ/ภูมิภาคของคุณ", + "选择国家/地区": "เลือกประเทศหรือภูมิภาคของคุณ", + "获取验证码": "รับรหัส", + "商务合作": "ธุรกิจสำหรับธุรกิจ", + "电脑网页版": "ระบบเว็บ", + "酒店系统": "ระบบในโรงแรม", + "说明书网页版": "คู่มือการใช้งาน", + "高级功能": "ฟังก์ชันขั้นสูง", + "记录保存": "บันทึกการเก็บรักษา", + "您可通过短信将密码、电子钥匙信息发给接收人。": "สามารถใช้ SMS เพื่อส่งรหัสผ่านและข้อมูล ekey ไปยังผู้รับ", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "อีเมลสามารถใช้เพื่อส่งรหัสผ่านและข้อมูล ekey ไปยังผู้รับ", + "购买实名认证提示": "หลังจากเปิดใช้งานฟังก์ชันแล้วคุณต้องใช้รหัสผ่านลายนิ้วมือใบหน้าหรือบัญชีเพื่อเปิดแอปไม่จำเป็นต้องตรวจสอบอีกครั้งเป็นเวลา3นาที", + "请选择你希望的实名认证频次": "กรุณาเลือกความถี่ในการตรวจสอบชื่อจริงที่คุณต้องการ", + "仅首次": "เป็นครั้งแรกที่", + "每日一次": "วันละครั้ง", + "每周一次": "สัปดาห์ละครั้ง", + "每月一次": "เดือนละครั้ง", + "当前状态": "สถานะปัจจุบัน", + "试用中": "เมื่อทดลองใช้", + "高级功能权益内容": "ฟังก์ชันขั้นสูง", + "短信模板": "เทมเพลต SMS", + "邮件模板": "แม่แบบอีเมล", + "发卡工具": "ตัวเข้ารหัสบัตร", + "购买高级功能须知": "การแจ้งเตือน", + "购买高级功能提示": "คุณสมบัติขั้นสูงอื่นๆอยู่ระหว่างการพัฒนาและหากคุณต้องการคุณสามารถเปิดบริการได้ตามจำนวนล็อคคุณสมบัติขั้นสูงมีให้สำหรับล็อคของคุณเองเท่านั้นหากคุณเป็นผู้ดูแลระบบที่ได้รับอนุญาตโปรดติดต่อผู้ดูแลระบบด้านบนของล็อคเพื่อเปิดบริการ", + "免费体验": "ทดลองใช้ฟรี", + "立即开通": "เปิดตอนนี้", + "购买短信": "ซื้อ SMS", + "购买邮件": "ซื้ออีเมล", + "购买实名认证次数": "ซื้อเวลาการตรวจสอบชื่อจริง", + "开通高级功能": "เปิดใช้งานฟังก์ชันขั้นสูง", + "选择套餐": "การเลือกแพคเกจ", + "支付方式": "โหมดการชำระเงิน", + "支付宝": "Alipay", + "去支付": "การจ่ายเงิน", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "คุณสามารถกำหนดข้อความได้ด้วยตัวเองโดยใช้เพื่อส่งข้อมูลรหัสผ่านและ ekey ไปยังผู้อื่น", + "高级功能仅能用于你自己的锁": "ฟังก์ชั่นขั้นสูงสามารถใช้ล็อคของคุณเองได้เท่านั้น", + "新建模板": "แม่แบบ creat", + "类型": "ประเภทประเภท", + "模版内容": "เนื้อหาเทมเพลต", + "预览": "ตัวอย่างตัวอย่างตัวอย่าง", + "房间名": "ห้องในห้อง", + "预计产生短信条数": "ส่วนข้อความโดยประมาณ", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "คุณลักษณะนี้ช่วยให้คุณสามารถซ่อน passcodes,ekeys, บัตรและลายนิ้วมือซึ่งไม่ถูกต้องเป็นระยะเวลาหนึ่ง", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "โทรศัพท์ของผู้ใช้จะต้องออนไลน์เพื่อปลดล็อคล็อคที่เลือกเหล่านี้กับ app.", + "配置WiFi": "การกำหนดค่า WIFI", + "请输入WiFi名字": "กรุณาป้อนชื่อ WIFI", + "WiFi配网": "เครือข่ายการกระจาย WIFI", + "胁迫卡": "การ์ดความเครียด", + "员工是否有密码": "มีรหัสผ่านแล้ว", + "员工是否有卡": "มีการ์ดอยู่แล้ว", + "员工是否有指纹": "ตั้งค่าลายนิ้วมือแล้ว", + "获取钥匙": "รับกุญแจ", + "获取卡": "การรับบัตร", + "获取指纹": "การรับลายนิ้วมือ", + "安全验证": "การตรวจสอบตัวตน", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "ข้อมูลบัญชีทั้งหมดของคุณจะถูกลบออกจากแพลตฟอร์มอย่างถาวรและไม่สามารถกู้คืนได้คุณต้องการลบหรือไม่?", + "监控": "จอภาพสำหรับตรวจสอบ", + "视频日志": "บันทึกวิดีโอบันทึก", + "开门器": "ที่เปิดประตู", + "面容开锁": "ปลดล็อคใบหน้า", + "开门方向设置": "ชุดเปิดทิศทาง", + "电机功率设置": "การตั้งค่ามอเตอร์ไฟฟ้า", + "开锁时是否需联网": "หากจำเป็นต้องใช้อินเทอร์เน็ตเมื่อปลดล็อก", + "选择要加入分组的锁": "เลือกล็อกเพื่อเพิ่มในกลุ่มนี้", + "锁数量": "ล็อคนับ", + "小米IOT平台": "แพลตฟอร์ม Xiaomi IOT", + "面容开锁设置": "ชุดปลดล็อคใบหน้า", + "感应距离": "ระยะตรวจจับ", + "防误开": "ป้องกันการเปิดผิด", + "防误开已关闭,关门后仍可使用面容开锁": "ป้องกันการเปิดผิดหลังจากปิดประตูแล้วยังสามารถใช้ปลดล็อคใบหน้าได้", + "添加和使用面容开锁时": "เพิ่มและใช้ใบหน้าเมื่อปลดล็อค", + "添加和使用面容开锁时提示": "\n1, โปรดพยายามที่จะให้คนเดียวในด้านหน้าของการดำเนินงานประตู;\n2, กรุณายืนอยู่ด้านหน้าของล็อคประตูประมาณ0.5 ~ 0.8เมตรหันหน้าไปทางล็อคประตู;\n3.โปรดให้ใบหน้าของคุณไม่มีสิ่งกีดขวางและเปิดเผยคุณสมบัติใบหน้าของคุณ\n4.เมื่อการจดจำใบหน้าผิดปกติคุณสามารถสัมผัสปุ่มใดๆบนแป้นพิมพ์ดิจิตอลเพื่อรีสตาร์ทการจดจำใบหน้าด้วยตนเอง", + "秒": "S S", + "请根据门锁实际情况,请谨慎选择电机功率:": "โปรดเลือกกำลังมอเตอร์อย่างระมัดระวังตามสถานการณ์จริงของล็อคประตู:", + "小功率:": "มินิวัตต์", + "耗电少": "ใช้พลังงานน้อยลง", + "大功率": "กำลังสูง:", + "大功率提示": "หากลิ้นล็อคไม่สามารถหดกลับได้ตามปกติเมื่อปลดล็อคหรือจำเป็นต้องขับเคลื่อน", + "开门方向设置提示": "โปรดเลือกทิศทางเพื่อเปิดประตูบ้านของคุณอย่างระมัดระวัง (หากคุณเลือกทิศทางที่ไม่ถูกต้องคุณจะไม่สามารถเปิดและปิดประตูได้อย่างถูกต้อง):", + "左开": "เปิดซ้ายได้", + "右开": "เปิดขวาได้", + "判断方法:": "คำอธิบาย:", + "判断方法内容": "ชายคนนั้นยืนอยู่นอกบ้านหันหน้าไปทางประตูทางเข้า", + "录像时段": "ช่องเสียบวิดีโอ", + "密码": "รหัสผู้สัญจรไปมา", + "卡": "การ์ดสำหรับเด็ก", + "指纹": "ลายนิ้วมือลายนิ้วมือ", + "人脸": "ใบหน้าและใบหน้า", + "配件商城": "ล๊อคมอลล์", + "公司名称": "ชื่อบริษัท", + "请输入公司名字": "ป้อนชื่อบริษัท", + "提示": "คำใบ้", + "是否删除?": "จะลบหรือไม่?", + "员工信息": "ข้อมูลพนักงาน", + "员工": "พนักงานทำการควบคุม", + "打卡方式无效": "ไม่มีสินค้า", + "中国": "ของจีน", + "选择钥匙": "เลือก ekey", + "编辑": "แก้ไขแล้ว", + "无": "ไม่ไม่มี", + "有": "ใช่ค่ะ", + "请输入姓名": "กรุณาป้อนชื่อ", + "获取人脸": "การรับใบหน้า", + "选择密码": "การเลือกรหัสผ่าน", + "选择卡": "การเลือกบัตร", + "选择指纹": "เลือกลายนิ้วมือ", + "选择人脸": "เลือกใบหน้า", + "员工是否有人脸": "ไม่ว่าพนักงานจะมีใบหน้าหรือไม่", + "同时删除员工钥匙": "ลบ ekey ของเขา/เธอ", + "删除": "ดีเล็ท", + "确定要删除员工吗?": "ลบพนักงานคนนี้", + "月统计": "สถิติรายเดือน", + "迟到": "ช่วงปลาย", + "早退": "ออกจากก่อน", + "未打卡": "ไม่มีการบันทึก", + "钥匙将在": "Ekey นี้จะหมดอายุใน", + "天后失效": "วัน (S)", + "电量更新时间:": "เวลาอัปเดตแบตเตอรี่:", + "新增配件": "การเพิ่ม", + "钥匙不可用": "ไม่สามารถใช้กุญแจได้", + "正在开锁中...": "ปลดล็อค...", + "你的钥匙": "กุญแจของคุณ", + "常开模式启动!长按闭锁": "เปิดโหมดเริ่มต้น! กดค้างเพื่อล็อค", + "演示模式": "โหมดสาธิตการใช้งาน", + "请先同意用户协议及隐私政策": "โปรดยอมรับข้อตกลงผู้ใช้และนโยบายความเป็นส่วนตัวก่อน", + "用户协议": "เงื่อนไขการใช้งานผู้ใช้", + "隐私政策": "นโยบายความเป็นส่วนตัว", + "注册成功": "การลงทะเบียนสำเร็จ", + "你所在的": "คุณอยู่ใน", + "手机号": "หมายเลขโทรศัพท์โทรศัพท์", + "忘记密码": "ลืมรหัสผ่าน", + "重置成功": "รีเซ็ตความสำเร็จ", + "确定要退出吗?": "ทางออก?", + "功能暂未开放": "ฟังก์ชั่นยังไม่ได้เปิด", + "设置成功": "ตั้งค่าสำเร็จแล้ว", + "删除成功": "ลบเรียบร้อยแล้ว", + "单次": "วันต่อครั้ง", + "永久": "ถาวรถาวรถาวร", + "限时": "ที่ตั้งเวลาไว้", + "自定义": "กำหนดเองได้", + "清空码": "ลบออกได้", + "循环": "รีเคิร์ฟ", + "工作日": "วันทำงานของคุณ", + "每日": "วันต่อวัน", + "周末": "วันหยุดสุดสัปดาห์สุดสัปดาห์", + "确定要删除吗?": "ลบใช่ไหม?", + "该锁的密码都将被删除": "รหัสผ่านทั้งหมดสำหรับล็อคนี้จะถูกลบออก", + "已过期": "ไม่ถูกต้องค่ะ", + "该锁的电子钥匙都将被删除": "Ekeys ทั้งหมดสำหรับล็อคนี้จะถูกลบออก", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "ลบ ekeys ทั้งหมดที่เกี่ยวข้องกับ ekey นี้ขั้นตอนนี้ไม่สามารถยกเลิกได้!", + "删除钥匙会在用户APP连网后生效": "Ekey จะถูกลบ", + "有效时间": "เวลาที่มีประสิทธิภาพ", + "接收者": "ผู้รับผู้รับสินค้า", + "仅管理自己创建的用户": "จัดการผู้ใช้ของตัวเองเท่านั้น", + "远程开锁": "ปลดล็อคจากระยะไกล", + "请输入钥匙名称": "กรุณาป้อนชื่อคีย์", + "修改成功": "ปรับเปลี่ยนความสำเร็จ", + "冻结": "แช่แข็งแบบแข็ง", + "解除冻结": "นั่นคือละลาย", + "授权": "การอนุญาตตัว", + "取消授权": "De-Authorize", + "同时解冻其发送的钥匙": "ละลาย ekeys ทั้งหมดที่ออกโดยผู้ใช้รายนี้", + "会在用户APP连网后生效": "Ekey นี้จะละลายเมื่อแอปของผู้ใช้เชื่อมต่อกับเครือข่าย", + "同时冻结其发送的钥匙": "ตรึง ekeys ทั้งหมดที่ออกโดยผู้ใช้รายนี้", + "冻结会在用户APP连网后生效": "Ekey นี้จะถูกแช่แข็งเมื่อแอปของผู้ใช้เชื่อมต่อกับเครือข่าย", + "取消授权会在用户APP连网后生效": "ผู้ใช้จะหลวมสิทธิ์ของเขา/เธอเมื่อ APP ของผู้ใช้เชื่อมต่อกับเครือข่าย", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "ผู้ใช้ที่ได้รับอนุญาตมีสิทธิ์เกือบเท่า Lock Manager (เช่นความสามารถในการส่ง ekeys และ passcodes)", + "失效时间需晚于生效时间": "เวลาหมดอายุต้องช้ากว่าเวลาที่มีประสิทธิภาพ", + "生效时间需晚于当前时间": "เวลาที่มีประสิทธิภาพต้องช้ากว่าเวลาปัจจุบัน", + "失效日期需晚于生效日期": "วันหมดอายุต้องช้ากว่าวันที่มีประสิทธิภาพ", + "修改有效期": "เปลี่ยนระยะเวลา", + "生效日期": "วันเริ่มต้นใหม่", + "失效日期": "วันสิ้นสุดวันที่", + "开锁": "ปลดล็อค", + "开锁成功": "ปลดล็อคความสำเร็จ", + "请选择锁": "กรุณาเลือกล็อค", + "请选择接收者": "กรุณาเลือกผู้รับ", + "请选择有效期": "กรุณาเลือกระยะเวลาที่ใช้ได้", + "请选择发送方式": "กรุณาเลือกวิธีการส่ง", + "请选择结束时间": "กรุณาเลือกเวลาสิ้นสุด", + "完成": "สมบูรณ์สมบูรณ์สมบูรณ์", + "有效日": "วงจรเปิด", + "发送成功": "การส่งความสำเร็จ", + "请选择开始时间": "กรุณาเลือกเวลาเริ่มต้น", + "选择用户": "เลือกผู้รับ", + "已选中": "สินค้าที่เลือก", + "确定": "ตกลงครับ", + "请选择要发送的锁": "กรุณาเลือกล็อค", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "การตรวจสอบชื่อจริงใบหน้าหมายถึงความต้องการของผู้ใช้ในการตรวจสอบใบหน้าของเขาก่อนที่จะปลดล็อคแอปโทรศัพท์และการตรวจสอบสามารถปลดล็อคได้", + "分享": "การแบ่งปัน", + "请输入接收者账号": "กรุณาป้อนบัญชีผู้รับ", + "接收者号码未注册,请重新发送": "หมายเลขผู้รับไม่ได้ลงทะเบียนกรุณาส่งใหม่", + "是否发送电子钥匙给未注册账号": "คุณต้องการส่ง ekey ไปยังบัญชีใหม่หรือไม่", + "取消": "ยกเลิกยกเลิกแล้ว", + "标记成功": "ทำเครื่องหมายความสำเร็จ", + "微信好友": "เพื่อน WeChat", + "短信": "เอสเอ็มเอส", + "邮件": "อีเมล์ของคุณ", + "更多": "เพิ่มเติมอีกมากมาย", + "您好,您的电子钥匙生成成功": "สวัสดีคีย์อิเล็กทรอนิกส์ของคุณถูกสร้างขึ้นเรียบร้อยแล้ว", + "生效时间不能小于当前时间": "เวลาที่มีประสิทธิภาพต้องไม่น้อยกว่าเวลาปัจจุบัน", + "结束时间不能小于当前时间": "เวลาสิ้นสุดต้องไม่น้อยกว่าเวลาปัจจุบัน", + "是否为管理员": "มันเป็นผู้ดูแลระบบ", + "已连接到锁,请将卡靠近门锁的读卡区": "เชื่อมต่อ.วางการ์ดกับเครื่องอ่านการ์ด", + "尝试连接设备...": "เชื่อมต่อกับล็อกโปรดรอสักครู่", + "地理位置": "ที่ตั้งทางภูมิศาสตร์", + "检查以确保以下地址是正确的": "ตรวจสอบให้แน่ใจว่าที่อยู่ต่อไปนี้ถูกต้อง", + "地图加载中,请稍候。。": "กำลังโหลดแผนที่อยู่โปรดรอสักครู่...", + "跳过": "ข้ามข้ามข้าม", + "还未获取到位置信息哦,请耐心等待一下!": "ยังไม่ได้รับข้อมูลตำแหน่งโปรดรอสักครู่!", + "请填写信息": "กรุณากรอกข้อมูล", + "有效期": "ระยะเวลาที่ใช้ได้", + "生效时间": "เริ่มต้นเวลา", + "失效时间": "สิ้นสุดเวลา", + "上传成功": "อัปโหลดเรียบร้อยแล้ว", + "未生效": "ไม่ได้ใช้งาน", + "已生效": "มีประสิทธิภาพดี", + "指纹详情": "ข้อมูลลายนิ้วมือ", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "คุณจะต้องวางนิ้วของคุณไปที่เซ็นเซอร์หลายครั้งโปรดทำตามคำแนะนำ...", + "开始添加": "การเริ่มทำงาน", + "请将您的手指按下": "วางนิ้วของคุณบนเซ็นเซอร์", + "根据提示,抬起手指后再进行下一次指纹采集": "ทำตามคำแนะนำ... คุณจะต้องถอดและวางนิ้วของคุณไปที่เซ็นเซอร์เพื่อบันทึกครั้งต่อไป", + "添加成功": "เพิ่มความสำเร็จด้วย", + "更新成功": "อัปเดตความสำเร็จ", + "搜索": "การค้นหาค้นหา", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตการ์ดของล็อคจะถูกลบคุณต้องการรีเซ็ตหรือไม่?", + "已失效": "ไม่ถูกต้องค่ะ", + "卡详情": "ข้อมูลการ์ด", + "请输入": "กรุณาป้อนที่นี่", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "โดยการปิดล็อคจะยังคงปลดล็อคทั้งวันจนกว่าจะถูกล็อคด้วยตนเอง", + "请输入小于或等于60的数字": "กรุณาป้อนหมายเลขน้อยกว่า60", + "操作成功": "การทำงานสำเร็จ", + "管理员密码相同,无需修改": "รหัสผ่านของผู้ดูแลระบบเหมือนกันและไม่จำเป็นต้องแก้ไข", + "请输入6-9位数字": "ความยาว6-9หลัก", + "请输入6-9位管理员密码": "กรุณาป้อนรหัสผ่านผู้ดูแลระบบ6-9หลัก", + "请输入新的管理员密码": "กรุณาป้อนรหัสผ่านผู้ดูแลระบบใหม่", + "未分组": "ไม่มีการจัดกลุ่ม", + "请输入分组名称": "การสร้างกลุ่ม", + "创建成功": "การสร้างความสำเร็จ", + "设置锁分组成功": "ตั้งค่ากลุ่มล็อคสำเร็จ", + "电池1电量": "แบตเตอรี่1ก้อน", + "电池2电量": "แบตเตอรี่2ก้อน", + "电量更新时间": "เวลาอัปเดตแบตเตอรี่", + "锁电量更新成功": "ล็อคความสำเร็จในการปรับปรุงพลังงาน", + "您的钥匙未生效": "กุญแจของคุณไม่มีประสิทธิภาพ", + "您的钥匙已冻结": "กุญแจของคุณถูกแช่แข็ง", + "您的钥匙已过期": "กุญแจของคุณหมดอายุแล้ว", + "常开模式开启": "ล็อคอยู่ในโหมดทางเดิน", + "超级管理员": "ซุปเปอร์แอดมิน", + "授权管理员": "ผู้ดูแลระบบที่ได้รับอนุญาต", + "普通用户": "ผู้ใช้ทั่วไป", + "余": "บาลานซ์", + "天": "วันต่อวัน", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "หลังจากลบล็อคข้อมูลทั้งหมดจะถูกลบเข้าด้วยกันคุณแน่ใจว่าต้องการลบล็อคหรือไม่?", + "请输入登录密码": "กรุณาป้อนรหัสผ่านแอปพลิเคชัน", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "ไม่สามารถลบอุปกรณ์ได้โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์อยู่ใกล้อุปกรณ์ไม่ได้เชื่อมต่อและอุปกรณ์เปิดอยู่", + "用户无权限": "ผู้ใช้ไม่ได้รับอนุญาต", + "创建公司后,考勤功能才能使用": "โปรดสร้างบริษัทก่อน", + "是否删除钥匙?": "ลบ ekey นี้ใช่ไหม?", + "邮箱绑定成功": "ความสำเร็จในการผูกอีเมล", + "手机绑定成功": "ความสำเร็จในการเข้าเล่มโทรศัพท์มือถือ", + "网络访问失败,请检查网络是否正常": "คำขอไม่สามารถใช้งานเครือข่ายได้โปรดตรวจสอบและเชื่อมต่ออุปกรณ์ของคุณกับ3G/4G /wifi", + "清空": "ใสสะอาด", + "是否清空?": "ชัดเจนไหม?", + "消息详情": "ข้อความข้อมูล", + "创建时间": "เวลาการสร้าง", + "管理员详情": "รายละเอียดผู้ดูแลระบบ", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "ถ้ามีคนบังคับให้คุณเปิดประตูคุณสามารถใช้การ์ดใบนี้ได้ข้อความแจ้งเตือนจะถูกส่งไปยังการบริหารจัดการหากต้องการใช้คุณสมบัตินี้โปรดตรวจสอบให้แน่ใจว่าล็อคของคุณออนไลน์", + "请不要将胁迫卡用于日常开锁": "กรุณาอย่าใช้บัตรบังคับสำหรับการใช้งานประจำวัน", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "ถ้ามีคนบังคับให้คุณเปิดประตูคุณสามารถใช้ลายนิ้วมือนี้ได้ข้อความแจ้งเตือนจะถูกส่งไปยังการบริหารจัดการเพื่อใช้คุณลักษณะนี้โปรดตรวจสอบให้แน่ใจว่าล็อคของคุณออนไลน์", + "请不要将胁迫指纹用于日常开锁": "กรุณาอย่าใช้ลายนิ้วมือบังคับสำหรับการใช้งานประจำวัน", + "创建公司": "การสร้างบริษัท", + "公司名称不能超过30个字符": "ชื่อบริษัทไม่เกิน30ตัวอักษร", + "公司名称不能小于6个字符": "ชื่อบริษัทต้องไม่น้อยกว่า6ตัวอักษร", + "WIFI列表": "รายการ WIFI", + "刷新": "รีเฟรช", + "手动配网": "เครือข่ายการกระจายแบบแมนนวล", + "远距离": "ระยะทางไกลๆ", + "中距离": "ระยะปานกลาง", + "近距离": "ระยะทางสั้นๆ", + "锁时间更新成功": "ล็อคเวลาอัพเดทความสำเร็จ", + "锁用户": "ล็อกผู้ใช้", + "请选择常开日期": "กรุณาเลือกวันที่เปิด", + "结束时间不能小于开始时间哦": "เวลาสิ้นสุดต้องไม่น้อยกว่าเวลาเริ่มต้น", + "介绍": "เรื่องราวของเรา", + "个人信息收集清单": "รายการรวบรวมข้อมูลส่วนบุคคล", + "应用权限说明": "คำอธิบายการอนุญาตแอปพลิเคชัน", + "第三方信息共享清单": "รายการการแบ่งปันข้อมูลของบุคคลที่สาม", + "请选择您的位置": "กรุณาเลือกสถานที่ของคุณ", + "请先选择位置": "กรุณาเลือกสถานที่ตั้งก่อน", + "管理员密码": "รหัสผ่านผู้ดูแลระบบ", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "หากคุณต้องการแก้ไขโปรดป้อนรหัสผ่านผู้ดูแลระบบใหม่ (6หลัก) คลิกตกลงเพื่อแก้ไข", + "修改": "ปรับเปลี่ยนปรับเปลี่ยนได้", + "网络摄像头": "กล้องถ่ายรูปสำหรับกล้อง", + "重命名": "เปลี่ยนชื่อ", + "分组下的锁将被移到未分组里": "ล็อคภายใต้กลุ่มจะถูกย้ายไปยัง ungrouped", + "编辑成功": "แก้ไขความสำเร็จ", + "厂商": "ผู้ผลิตจากโรงงาน", + "型号": "โมเดลโมเดลจำลอง", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "หลังจากสร้างรหัสผ่านแล้วโปรดใช้ครั้งเดียวเพื่อเปิดใช้งานก่อน23:59ในวันเดียวกันมิฉะนั้นจะไม่ถูกต้องหลังจากเวลา0นาฬิกาหลังจากเปิดใช้งานรหัสผ่านแล้วสามารถใช้งานได้ไม่จำกัดครั้งภายในระยะเวลาที่กำหนด", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "หลังจากสร้างรหัสผ่านแล้วโปรดใช้ก่อน23:59ในวันเดียวกันมิฉะนั้นจะไม่ถูกต้องหลังจาก0นาฬิการหัสที่ชัดเจนจะใช้ในการล้างรหัสผ่านทั้งหมดที่สร้างขึ้นก่อน0โมงเย็นวันนี้", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "หลังจากสร้างรหัสผ่านแล้วโปรดใช้ก่อน23:59ในวันเดียวกันมิฉะนั้นจะไม่ถูกต้องหลังจาก0นาฬิกา", + "清空密码底部提示": "รหัสผ่านสามารถใช้ได้จนถึง23:59ในวันที่ว่างเปล่า", + "相机": "กล้องถ่ายรูปสำหรับกล้อง", + "相册": "รูปภาพสำหรับถ่ายภาพ", + "读写": "การจัดเก็บข้อมูล", + "定位": "ที่ตั้งของสถานที่", + "需要访问相机权限才能拍照上传文件例如头像上传": "การเข้าถึงกล้องจะต้องถ่ายภาพและอัปโหลดไฟล์เช่นการอัปโหลดภาพโปรไฟล์", + "需要访问相机权限才能使用相册图片上传文件上传头像": "การเข้าถึงกล้องจะต้องอัปโหลดไฟล์และอวตารโดยใช้ภาพอัลบั้ม", + "需要访问读写权限才能使用本地图片上传头像": "การเข้าถึงการอ่านและเขียนสิทธิ์จะต้องอัปโหลดอวตารโดยใช้ภาพในท้องถิ่น", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "การเข้าถึงข้อมูลตำแหน่งจะต้องใช้ฟังก์ชันเพิ่มคีย์", + "申请": "แอพลิเคชัน", + "权限": "การขออนุญาต", + "不允许": "ไม่ได้รับอนุญาต", + "允许": "อนุญาตให้ใช้", + "权限被拒绝": "การอนุญาตถูกปฏิเสธ", + "请手动在系统设置中开启": "โปรดเปิดใช้งานด้วยตนเองในการตั้งค่าระบบ", + "权限以继续使用应用": "การอนุญาตให้ใช้แอปพลิเคชันต่อไป", + "去设置": "ไปตั้งค่ามัน", + "当前网络": "เครือข่ายปัจจุบัน", + "位置信息": "ข้อมูลตำแหน่ง", + "请输入wifi名称": "กรุณาป้อนชื่อ WIFI", + "虹膜": "ไอริส", + "手掌": "ฝ่ามือสำหรับฝ่ามือ", + "商城": "ห้างสรรพสินค้าเล็กๆ", + "我的": "ของฉัน", + "微信公众号推送": "บัญชีสาธารณะ WeChat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "ในการเปิด WeChat เพื่อรับข้อความเตือนคุณต้องใส่ใจกับบัญชีสาธารณะของ Skye Smart Lock WeChat ก่อนโปรดบันทึกรหัส QR และใช้ WeChat เพื่อสแกนการตั้งค่า", + "蓝牙": "บลูทูธ", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "การเข้าถึงการอนุญาตบลูทูธจะต้องใช้ข้อมูลตำแหน่งของฟังก์ชั่นเพิ่มคีย์", + "请输入Email": "การป้อนอีเมลของคุณ", + "请输入手机号": "ใส่หมายเลขโทรศัพท์ของคุณ", + "家人到家": "สมาชิกในครอบครัวมาถึงบ้าน", + "添加家人": "เพิ่มสมาชิกในครอบครัว", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "หากล็อคไม่ได้เชื่อมต่อกับอินเทอร์เน็ตการแจ้งเตือนสำหรับรหัสผ่านบัตรลายนิ้วมือและวิธีการเปิดประตูอื่นๆไม่สามารถส่งได้ทันเวลา", + "消息提醒": "แจ้งเตือนความจำ", + "开门通知": "การแจ้งเตือนการเปิด", + "N天未开门": "N วันโดยไม่ต้องเปิดประตู", + "门未关好": "ประตูไม่ได้ปิด", + "防拆报警": "สัญญาณเตือนการงัดแงะ", + "低电量提醒": "แบตเตอรี่ต่ำมาก", + "胁迫开门": "บังคับเปิดประตู", + "有人按门铃": "มีคนกดกริ่งประตู", + "有人出现在门口": "มีคนปรากฏที่ประตู", + "提醒方式": "วิธีการแจ้งเตือน", + "开门方式": "วิธีการเปิดประตู", + "请选择": "กรุณาเลือก", + "家人": "สมาชิกในครอบครัว", + "保存": "บันทึกบันทึก", + "APP推送": "แอปผลักดัน", + "管理员": "ผู้ดูแลระบบ", + "未启用": "ไม่ได้เปิดใช้งาน", + "已启用": "เปิดใช้งานแล้ว", + "省电模式": "โหมดประหยัดพลังงาน", + "逗留抓拍模式": "โหมดจับภาพต่อเนื่อง", + "实时监控模式": "โหมดการตรวจสอบแบบเรียลไทม์", + "自定义模式": "โหมดกำหนดเอง", + "猫眼设置": "การตั้งค่าตาแมว", + "猫眼工作模式": "โหมดการทำงานของตาแมว", + "自动亮屏": "หน้าจอสว่างอัตโนมัติ", + "亮屏持续时间": "หน้าจอเปิดเวลา", + "逗留警告": "เตือนอยู่เสมอ", + "异常警告": "คำเตือนผิดปกติ", + "短信提醒": "เอสเอ็มเอส", + "邮件提醒": "อีเมล์ของคุณ", + "N天未开门提醒": "N วันโดยไม่ต้องเปิดประตู", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "หากมีคนบังคับให้คุณเปิดล็อคคุณสามารถใช้ลายนิ้วมือนี้ได้ข้อความแจ้งเตือนจะถูกส่งไปยังการบริหารจัดการหากต้องการใช้คุณลักษณะนี้โปรดตรวจสอบให้แน่ใจว่าล็อคของคุณออนไลน์", + "胁迫指纹": "การบังคับลายนิ้วมือ", + "指纹列表": "รายการลายนิ้วมือ", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "หลังจากตั้งเวลาแล้วหากไม่ได้เปิดล็อคระบบจะส่งข้อความเตือนไปยังผู้รับที่กำหนดฟังก์ชันนี้ต้องใช้ล็อคเพื่อเชื่อมต่อกับอินเทอร์เน็ต", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "หลังจากเปิดใช้งานการแจ้งเตือนเมื่อแบตเตอรี่ล็อคต่ำกว่า20%, 10% และ5% ระบบจะส่งข้อความเตือนไปยังผู้รับที่กำหนด", + "未开门时间": "วันโดยไม่มีการเปิดประตู", + "添加和使用面容开锁时:": "เพิ่มและใช้ใบหน้าเมื่อปลดล็อค:", + "关锁": "ปิดล็อค", + "功能": "ฟังก์ชันการทำงานของ", + "配件": "ชิ้นส่วนอะไหล่", + "云存": "ที่เก็บข้อมูลบนคลาวด์", + "本地": "การค้นหานี้", + "3天滚动储存": "การกลิ้งเก็บของ3วัน", + "去升级": "อัปเกรดตอนนี้", + "下载列表": "ดาวน์โหลดรายการ", + "已下载": "ดาวน์โหลดดาวน์โหลดแล้ว", + "全部视频": "วิดีโอทั้งหมด", + "已为本设备免费提供3大滚动视频储存服务": "มีบริการจัดเก็บข้อมูลวิดีโอแบบเลื่อนสามแบบสำหรับอุปกรณ์นี้โดยไม่เสียค่าใช้จ่าย", + "视频播放": "การเล่นวิดีโอ", + "全选": "ทั้งหมดมี", + "请选择要删除的视频": "โปรดเลือกวิดีโอที่คุณต้องการลบ", + "请选择要下载的视频": "โปรดเลือกวิดีโอที่คุณต้องการดาวน์โหลด", + "欢迎使用": "ยินดีต้อนรับสู่การใช้งาน", + "用户协议和隐私政策概要": "สรุปข้อตกลงผู้ใช้และนโยบายความเป็นส่วนตัว", + "协议概要": "สรุปโปรโตคอล", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "ขอบคุณที่ใช้แอปพลิเคชันนี้เราให้ความสำคัญอย่างยิ่งกับข้อมูลส่วนบุคคลและการปกป้องความเป็นส่วนตัวของคุณก่อนใช้ผลิตภัณฑ์นี้โปรดอ่านอย่างละเอียด", + "《用户协议》": "เงื่อนไขการใช้งานผู้ใช้", + "和": "และก็พร้อม", + "《隐私政策》": "《ความเป็นส่วนตัวนโยบาย》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "เนื้อหาทั้งหมดของโดยคลิกที่ \"ตกลง\" คุณยอมรับและยอมรับเงื่อนไขทั้งหมดหากคุณเลือกที่จะไม่เห็นด้วยคุณจะไม่สามารถใช้ผลิตภัณฑ์และบริการของเราและจะออกจากแอปพลิเคชัน", + "不同意": "Disagree", + "同意": "ตกลงกัน", + "该功能是高级功能,请开通后再使用": "นี่คือฟังก์ชันขั้นสูงโปรดเปิดใช้งานก่อน", + "常用程序": "โปรแกรมทั่วไป", + "该锁已被重置": "ล็อคถูกรีเซ็ตแล้ว", + "需要访问读写权限才能使用手动升级固件": "จำเป็นต้องเข้าถึงการอนุญาตการอ่านและเขียนเพื่ออัปเกรดเฟิร์มแวร์ด้วยตนเอง", + "错误D固件,请选择正确的文件": "เฟิร์มแวร์ผิดโปรดเลือกไฟล์ที่ถูกต้อง", + "非SYD固件,请选择正确的文件": "ไม่ใช่เฟิร์มแวร์ syd โปรดเลือกไฟล์ที่ถูกต้อง", + "文件校验失败 0x01": "การตรวจสอบไฟล์0x01ล้มเหลว", + "解析元数据失败,请选择正确的文件": "ไม่สามารถแยกข้อมูลเมตาได้โปรดเลือกไฟล์ที่ถูกต้อง", + "文件校验失败 0x02": "การตรวจสอบไฟล์0x02ล้มเหลว", + "文件校验失败 0x03": "การตรวจสอบไฟล์0x03ล้มเหลว", + "固件升级完成": "การอัปเกรดเฟิร์มแวร์เสร็จสมบูรณ์", + "记录": "บันทึกของ", + "开通高级功能后才可以对锁进行管理": "โปรดเปิดใช้งานฟังก์ชันขั้นสูงก่อนเพื่อจัดการการล็อก", + "去开通": "เปิดใช้งานได้", + "实名认证": "การตรวจสอบชื่อจริง", + "当前剩余数量": "ที่เหลือ", + "购买": "การซื้อสินค้า", + "实名认证为付费功能,请购买后再使用": "การตรวจสอบชื่อจริงเป็นฟังก์ชันชำระเงินโปรดใช้หลังจากซื้อ", + "密码不一致哦": "รหัสผ่านไม่สอดคล้องกัน", + "退出添加": "เลิกเพิ่ม", + "管理员已满": "แอดมินเต็ม", + "用户已满": "ผู้ใช้เต็มแล้ว", + "锁上面添加指纹已满": "เพิ่มลายนิ้วมือบนล็อคเต็ม", + "指纹已存在": "ลายนิ้วมือมีอยู่แล้ว", + "锁上面添加人脸已满": "ล็อคด้านบนเพิ่มใบหน้าเต็ม", + "人脸已存在": "ใบหน้ามีอยู่แล้ว", + "锁上面添加卡已满": "ล็อคด้านบนเพิ่มการ์ดเต็ม", + "卡已存在": "มีบัตรอยู่แล้ว", + "锁上面添加密码已满": "ล็อคด้านบนเพิ่มรหัสผ่านเต็ม", + "密码已存在": "มีรหัสผ่านเหมือนกันอยู่แล้วโปรดเลือกรหัสผ่านอื่น", + "请输入密码": "กรุณาป้อนรหัสผ่าน", + "暂无密码,无需重置": "ไม่มีรหัสผ่านไม่จำเป็นต้องรีเซ็ต", + "真实姓名": "ชื่อที่แท้จริง", + "身份证号": "หมายเลขรหัสประจำตัว", + "请输入真实姓名": "กรุณาป้อนชื่อจริงของคุณ", + "请输入身份证号": "กรุณาป้อนหมายเลข ID ของคุณ", + "请输入身份证号和真实姓名": "กรุณาป้อนหมายเลข ID และชื่อจริง", + "点击返回设备配对": "แตะกลับไปที่การจับคู่อุปกรณ์", + "无法连接?尝试升级": "ไม่สามารถเชื่อมต่อได้?อัปเกรดพยายาม", + "固件升级提示": "พรอมต์อัปเกรดเฟิร์มแวร์", + "请先获取固件文件到手机本地,再选择升级": "โปรดรับไฟล์เฟิร์มแวร์ไปยังโทรศัพท์ท้องถิ่นก่อนจากนั้นเลือกอัปเกรด", + "固件升级中": "กำลังอัปเกรดเฟิร์มแวร์อยู่", + "取消升级": "ยกเลิกการอัปเกรด", + "固件传输中": "เฟิร์มแวร์ในระหว่างการขนส่ง", + "关闭": "ปิดเครื่อง", + "传输中'": "ในระหว่างการขนส่ง", + "操作记录": "บันทึกของ", + "修改姓名": "แก้ไขชื่อ", + "传输中": "ในระหว่างการขนส่ง", + "发送人": "ออกโดย", + "发送时间": "ออกเวลา", + "钥匙详情": "ข้อมูล ekey", + "姓名": "ชื่อของบริษัท", + "发送": "การส่ง", + "请确认姓名全名和身份证号码是否正确": "กรุณายืนยันว่าชื่อเต็มและหมายเลข ID ถูกต้อง", + "传输期间请勿离开当前页面": "อย่าออกจากหน้าปัจจุบันในระหว่างการถ่ายโอน", + "机型": "โมเดลโมเดลจำลอง", + "硬件版本": "รุ่นฮาร์ดแวร์", + "固件版本": "เฟิร์มแวร์เวอร์ชัน", + "手动升级": "การอัปเกรดด้วยตนเอง", + "设备连接中...": "อุปกรณ์เชื่อมต่อ...", + "未避免异常情况,请在门打开时升级": "ข้อยกเว้นที่หลีกเลี่ยงไม่ได้โปรดอัปเกรดเมื่อเปิดประตู", + "钥匙无效": "คีย์ไม่ถูกต้อง", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "ไม่สามารถเชื่อมต่อกับล็อกได้โปรดรีสตาร์ทบลูทูธของโทรศัพท์แล้วลองอีกครั้ง", + "如果是全自动锁,请使屏幕变亮": "หากเป็นการล็อคอัตโนมัติเต็มรูปแบบโปรดทำให้หน้าจอสว่างขึ้น", + "正在尝试闭锁……": "พยายามล็อกโปรดรอสักครู่", + "清空记录": "บันทึกที่ชัดเจน", + "是否要删除操作记录?": "ยังคงลบระเบียนใช่ไหม", + "被删除的记录不能恢复": "ไม่สามารถกู้คืนบันทึกได้หลังจากลบ", + "全部事件": "ทุกเหตุการณ์", + "开锁事件": "ปลดล็อคเหตุการณ์", + "异常事件": "เหตุการณ์ผิดปกติ", + "门铃事件": "เหตุการณ์กริ่งประตู", + "视频事件": "กิจกรรมวิดีโอ", + "请开启蓝牙": "กรุณาเปิดบลูทูธ", + "请选择有效日": "กรุณาเลือกวันที่มีประสิทธิภาพ", + "公司名字长度不能小于 6 ": "ความยาวของชื่อบริษัทต้องไม่น้อยกว่า6", + "已是最新版本": "ไม่มีการอัปเดต", + "新建短信模版": "แม่แบบ creat SMS", + "新建邮件模版": "สร้างเทมเพลตอีเมล", + "自定义短信模版": "เทมเพลต SMS", + "自定义邮件模版": "แม่แบบอีเมล", + "名称": "ชื่อของบริษัท", + "星星锁": "ล็อคดาวล็อค", + "无考勤记录": "ไม่มีการบันทึก", + "大家干劲十足": "ทุกคนมาทันเวลา", + "工作时长未出炉": "ไม่มีชั่วโมงการทำงาน", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "ทางเลือกของประเทศ/ภูมิภาคจะส่งผลต่อความปลอดภัยของข้อมูลคุณได้เลือกแอลเบเนียในขณะนี้โปรดยืนยันก่อนดำเนินการต่อ", + "确认国家或地区": "ยืนยันประเทศ/ภูมิภาค", + "我知道了": "ได้รับแล้ว", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "หากต้องการรับการอัปเดตที่สำคัญโปรดคลิก 'ตกลง' และเปิดใช้งานการแจ้งเตือนในการตั้งค่า", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "หลังจากเปิดเครื่องแล้วคุณสามารถเปิดเครื่องใหม่ได้โดยกดปุ่มการตั้งค่าบนล็อคค้างไว้และเพิ่มใหม่ด้วยแอป", + "已有": "ปัจจุบันปัจจุบัน", + "新增": "ของใหม่", + "账号格式错误": "รูปแบบที่ไม่ดี", + "接收者信息为空": "ข้อมูลผู้รับว่างเปล่า", + "请输入时间(秒)": "กรุณาป้อนเวลา (วินาที)", + "加载数据失败": "ไม่สามารถโหลดข้อมูลได้", + "重试": "ลองใหม่อีกครั้ง", + "升级中,是否退出": "ในระหว่างการอัพเกรดไม่ว่าจะออก", + "下一步": "ถัดไปถัดไป", + "公寓": "อพาร์ทเม้น", + "个人用户": "ส่วนตัวส่วนตัว", + "星寓": "อพาร์ทเม้นดาว", + "账号": "บัญชีของคุณ", + "请输入手机号或email": "หมายเลขโทรศัพท์หรืออีเมล์", + "请输入星寓管理员的账号": "กรุณาป้อนบัญชีของผู้ดูแลระบบอพาร์ทเม้นดาว", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "ข้อมูลทั้งหมดของล็อคที่เลือกจะถูกโอนไปยังผู้รับอย่างถาวร", + "暂不支持跨平台转移,敬请期待": "ไม่รองรับการถ่ายโอนข้ามแพลตฟอร์มในขณะนี้โปรดรอสักครู่", + "移除坏锁": "ย้ายล็อคที่ผิดพลาด/เสียหายไปยังถังขยะ", + "转移确认": "ยืนยันการถ่ายโอน", + "本次共转移": "คราวนี้มีทั้งหมด", + "把智能锁": "ล็อคสมาร์ท", + "确认": "ตกลงครับ", + "移除成功": "ลบเรียบร้อยแล้ว", + "转移成功": "โอนความสำเร็จ", + "该已锁被删除": "ล็อคถูกลบออก", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "ผู้ดูแลระบบที่ได้รับอนุญาตสามารถจัดการรหัสผ่าน ekeys และ etccreated ได้ด้วยตัวเองเท่านั้น", + "添加授权管理员": "สร้างผู้ดูแลระบบ", + "导出记录": "บันทึกการส่งออก", + "选择时间段": "เลือกช่วงเวลา", + "导出": "ส่งออกจากต่างประเทศ", + "批量导出": "ชุดส่งออก", + "读取记录": "รีเฟรชระเบียน", + "设备": "อุปกรณ์สำหรับเชื่อมต่อ", + "消息": "ข้อความต่างๆ", + "智能分析": "การวิเคราะห์อัจฉริยะ", + "精准识别设备事件,过滤无效信息": "ระบุเหตุการณ์ของอุปกรณ์อย่างถูกต้องและกรองข้อมูลที่ไม่ถูกต้อง", + "系统设置": "การตั้งค่าระบบ", + "系统的全局配置在此项内进行设置": "การกำหนดค่าระบบทั่วโลกถูกตั้งค่าไว้ในรายการนี้", + "导出操作记录": "บันทึกการส่งออก", + "立即查看": "การเช็คดู", + "导出成功": "ส่งออกเรียบร้อยแล้ว", + "发送钥匙": "ส่ง ekey", + "进度": "อัตราอัตรา", + "失败": "ล้มเหลวในการค้นหา", + "人脸详情": "รายละเอียดใบหน้า", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "เมื่อมีคนตรวจพบว่าหน้าประตูประมาณ1.5เมตรการปลดล็อกการจดจำใบหน้าจะเริ่มทำงานโดยอัตโนมัติ", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "เมื่อมีคนตรวจพบว่าหน้าประตูประมาณ0.8เมตรการปลดล็อกการจดจำใบหน้าจะเริ่มทำงานโดยอัตโนมัติ", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "เมื่อมีคนตรวจพบว่าหน้าประตูประมาณ0.5เมตรการปลดล็อกการจดจำใบหน้าจะเริ่มทำงานโดยอัตโนมัติ", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "ระยะการตรวจจับถูกปิดแล้วคุณต้องสัมผัสปุ่มใดๆบนแป้นพิมพ์ด้วยตนเองเพื่อทำการปลดล็อกการจดจำใบหน้า", + "防误开已打开,开锁后": "เปิดการเปิดป้องกันความผิดพลาดและหลังจากปลดล็อค", + "秒内不可使用面容开锁": "ไม่สามารถปลดล็อกใบหน้าได้ภายในไม่กี่วินาที", + "掌静脉": "หลอดเลือดดำปาล์ม", + "添加掌静脉": "เพิ่มหลอดเลือดดำปาล์ม", + "胁迫掌静脉": "หลอดเลือดดำปาล์มบังคับ", + "请不要将胁迫掌静脉用于日常开锁": "กรุณาอย่าใช้ coercion ปาล์มเส้นเลือดสำหรับปลดล็อคทุกวัน", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "เชื่อมต่อกับล็อคโปรดเปิดฝ่ามือตามธรรมชาติฝ่ามือหันหน้าไปทางกล้อง", + "掌静脉详情": "รายละเอียดหลอดเลือดดำปาล์ม", + "掌静脉号": "หมายเลขหลอดเลือดดำปาล์ม", + "蓝牙未打开,请到设置里面打开蓝牙": "ไม่ได้เปิดบลูทูธโปรดเปิดบลูทูธในการตั้งค่า", + "删除用户时,会将用户拥有的钥匙一起删除。": "หากผู้ใช้ถูกลบ ekeys ใดๆที่เกี่ยวข้องกับผู้ใช้จะถูกลบ", + "配置网络": "กำหนดค่าเครือข่าย", + "你好": "สวัสดีค่ะ", + "成功": "สำเร็จแล้ว", + "类型选择": "เลือกประเภท", + "请选择要使用哪种类型": "กรุณาเลือกประเภทที่จะใช้", + "系统邮件(推荐)": "อีเมลระบบ (แนะนำ)", + "系统短信(推荐)": "ระบบ SMS (แนะนำ)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "อีเมลจะถูกส่งจากแอปนี้กรุณาซื้อแพคเกจอีเมลก่อน", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS จะถูกส่งจากแอปนี้กรุณาซื้อแพคเกจอีเมลก่อน", + "个人邮件": "อีเมลส่วนตัว", + "个人短信": "ส่วนบุคคลเอสเอ็มเอส", + "邮件将从你的个人邮箱发给用户": "อีเมลจะถูกส่งจากบัญชีอีเมลส่วนตัวของคุณ", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "ข้อความ SMS จะถูกส่งจากหมายเลขโทรศัพท์ส่วนบุคคลของคุณคุณชำระเงินให้กับผู้ให้บริการโทรคมนาคมของคุณ", + "为了更好地应用体验,请确定权限": "เพื่อประสบการณ์การใช้งานที่ดีขึ้นโปรดยืนยันการอนุญาต", + "您第一次拒绝权限,请确定权限": "คุณปฏิเสธการอนุญาตเป็นครั้งแรกโปรดยืนยันการอนุญาต", + "您第二次拒绝权限,请去应用设置开启权限": "คุณปฏิเสธการอนุญาตเป็นครั้งที่สองโปรดไปที่การตั้งค่าแอปพลิเคชันเพื่อเปิดใช้งานการอนุญาต", + "去应用市场": "ไปที่ร้านแอป", + "温馨提示": "อบอุ่นรวดเร็ว", + "关闭应用": "ปิดแอปพลิเคชัน", + "开启微信接收报警消息需要先关注": "ในการเปิด WeChat เพื่อรับข้อความเตือนคุณต้องติดตาม", + "微信公众号,请保存二维码并使用微信扫一扫设置": "บัญชีสาธารณะ WeChat บันทึกรหัส QR และใช้ WeChat เพื่อสแกนการตั้งค่า", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "การตรวจสอบชื่อจริงเป็นฟังก์ชันชำระเงินโปรดติดต่อผู้ดูแลระบบล็อคเพื่อซื้อและใช้งาน", + "位置权限": "การอนุญาตตำแหน่ง", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "โปรดให้แอปเพื่อใช้ locatian ของคุณมันถูกใช้เพื่อสแกนล็อค BLE และเกตเวย์", + "相机/相册权限": "กล้อง/อัลบั้มได้รับอนุญาต", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "โปรดให้แอปอ่านและเขียนรูปภาพและไฟล์จากที่จัดเก็บ", + "点击选择": "คลิกเพื่อเลือก", + "微信": "WeChat WeChat", + "朋友圈": "ช่วงเวลาสั้นๆ", + "QQ": "QQ Q", + "QQ空间": "Qqzone", + "微博": "Weibo Weibo", + "FaceBook": "เฟสบุ๊ค", + "链接": "ตัวต่อเชื่อมกัน", + "今天": "วันนี้เลย", + "密码错误": "รหัสผ่านไม่ถูกต้อง", + "网络中断": "การหยุดชะงักของเครือข่าย", + "钥匙不存在": "คีย์ไม่มีอยู่", + "钥匙过期": "กุญแจหมดอายุ", + "钥匙已存在": "คีย์มีอยู่แล้ว", + "密码失效": "รหัสผ่านไม่ถูกต้อง", + "门锁时间异常": "ล็อคประตูเวลาผิดปกติ", + "APP(手机)未联网": "APP (โทรศัพท์มือถือ) ไม่ได้เชื่อมต่อกับอินเทอร์เน็ต", + "数据不存在": "ไม่มีข้อมูลใดๆ", + "待接收": "Bereceived", + "已冻结": "แช่แข็งแบบแข็ง", + "已删除": "ลบออกแล้ว", + "未知": "ไม่ทราบจัก", + "拖动下方滑块完成拼图": "ลากแถบเลื่อนไปยังตำแหน่งที่ถูกต้อง", + "验证成功": "การตรวจสอบความสำเร็จ", + "验证失败": "การตรวจสอบล้มเหลว", + "向右拖动滑块填充拼图": "ลากแถบเลื่อนไปทางขวาเพื่อเติมปริศนา", + "请先获取到位置信息哦": "กรุณารับข้อมูลตำแหน่งก่อน", + "请选择国家": "กรุณาเลือกประเทศ", + "获取锁信息": "รับข้อมูลล็อค", + "锁数据异常,请重试": "ล็อคข้อมูลผิดปกติโปรดลองอีกครั้ง", + "连接设备中...": "อุปกรณ์เชื่อมต่อ...", + "把锁": "ตัวล็อคล็อค", + "条": "แถบสตริป", + "封": "ซีลกันรั่ว", + "次": "ไทม์ส", + "支付成功": "จ่ายเงินสำเร็จ", + "查看详情": "ดูรายละเอียด", + "请输入模板名称": "กรุณาป้อนชื่อแม่แบบ", + "模版类型": "ประเภทประเภท", + "再返回一次退出": "ออกอีกครั้ง", + "请先添加锁": "โปรดเพิ่มล็อคก่อน", + "可视对讲": "อินเตอร์คอมภาพ", + "详细日志": "บันทึกรายละเอียด", + "已复制到剪切板": "คัดลอกแล้วเลียนแบบ", + "拍照": "รูปภาพสำหรับถ่ายภาพ", + "从相册选择": "เลือกจากอัลบั้ม", + "选择问题": "กรุณาเลือกคำถาม", + "确认长度不足8位": "ยืนยันความยาวน้อยกว่า8หลัก", + "新密码长度不足8位": "ความยาวรหัสผ่านใหม่น้อยกว่า8หลัก", + "两次密码不一致": "รหัสผ่านไม่ตรงกันกรุณาลองอีกครั้ง", + "请点击获取验证码,验证码将发送到": "กรุณารับรหัสยืนยันรหัสจะถูกส่งไปที่", + "切换": "สวิทซ์", + "验证": "การตรวจสอบ", + "验证成功,账号已删除": "การตรวจสอบสำเร็จบัญชีถูกลบ", + "该密码不是自定义密码,无法修改": "รหัสผ่านนี้ไม่ใช่รหัสผ่านที่กำหนดเองและไม่สามารถแก้ไขได้", + "请选择设备要关联哪些姓名": "โปรดเลือกชื่ออุปกรณ์ที่ควรเกี่ยวข้องกับ", + "请选择姓名要关联哪些设备": "โปรดเลือกชื่ออุปกรณ์ที่เกี่ยวข้องกับ", + "确定要移除所选中的坏锁吗?": "ลบล็อคชำรุด?", + "邮件通知": "แจ้งผ่านทางอีเมล", + "短信通知": "แจ้งทาง SMS", + "您好,您的授权管理员生成成功": "สวัสดีผู้ดูแลระบบที่ได้รับอนุญาตของคุณได้รับการสร้างเรียบร้อยแล้ว", + "请输入接收者姓名": "กรุณาป้อนที่นี่", + "版本更新": "อัปเดตเวอร์ชัน", + "下次再说": "ครั้งต่อไปสำหรับ", + "配网成功": "ความสำเร็จในการกระจายเครือข่าย", + "配网失败": "การกระจายเครือข่ายล้มเหลว", + "该锁的无线键盘都将被删除": "คีย์แพดไร้สายทั้งหมดสำหรับล็อคนี้จะถูกลบออก", + "实时画面": "รูปภาพแบบเรียลไทม์", + "适合门口较为安全的环境。": "เหมาะสำหรับสภาพแวดล้อมที่ค่อนข้างปลอดภัยที่ประตู", + "仅发生特定事件才录像,并可查看实时画面。": "บันทึกเฉพาะกิจกรรมเฉพาะและสามารถดูภาพแบบเรียลไทม์ได้", + "一般情况下,满电可使用7-8个月": "ภายใต้สถานการณ์ปกติสามารถใช้งานได้7-8เดือนเมื่อชาร์จเต็ม", + "有人逗留或发生特定事件才录像,可随时查看": "มีการบันทึกการเข้าพักหรือกิจกรรมเฉพาะและสามารถดูได้ตลอดเวลา", + "实时画面。": "รูปภาพแบบเรียลไทม์", + "一般情况下,满电可使用5~6个月。": "ภายใต้สถานการณ์ปกติสามารถใช้งานได้5 ~ 6เดือนเมื่อชาร์จเต็ม", + "适合门口人员复杂、较不安全的环境。": "เหมาะสำหรับสภาพแวดล้อมที่ซับซ้อนและค่อนข้างไม่ปลอดภัยที่ประตู", + "有人出现就录像,可随时查看实时画面。": "บันทึกเมื่อมีคนปรากฏขึ้นและดูภาพแบบเรียลไทม์ได้ตลอดเวลา", + "一般情况下,满电可使用2~4个月。": "ภายใต้สถานการณ์ปกติสามารถใช้งานได้2 ~ 4เดือนเมื่อชาร์จเต็ม", + "根据您家门口实际情况设置录像和实时画面功能。": "ตั้งค่าวิดีโอและฟังก์ชั่นภาพแบบเรียลไทม์ตามสถานการณ์จริงที่ประตูของคุณ", + "可使用时长由具体设置决定。": "ระยะเวลาการใช้งานจะถูกกำหนดโดยการตั้งค่าเฉพาะ", + "查看": "การเช็คดู", + "有人按门铃或发生": "มีคนกดกริ่งประตูหรือ", + "异常事件时": "เหตุการณ์ผิดปกติ", + "不录像": "ไม่มีวิดีโอ", + "有人出现、按门铃": "มีคนปรากฏแหวนออด", + "或发生异常事件时": "หรือเหตุการณ์ผิดปกติเกิดขึ้น", + "逗留达到10秒": "อยู่ได้10วินาที", + "约1.5米": "ประมาณ1.5เมตรคับ", + "随时": "ทุกเวลาทุกเวลาทุกเวลา", + "立即录像": "บันทึกทันที", + "录像时机": "วิดีโอจับเวลา", + "有人出现时录像": "บันทึกเมื่อมีคนปรากฏ", + "人体侦测距离": "ระยะตรวจจับมนุษย์", + "查看实时画面": "ดูภาพเรียลไทม์", + "自定义时间": "เวลาที่กำหนดเอง", + "当日": "วันนี้เลย", + "次日": "วันถัดไป", + "自定义时段": "ระยะเวลาที่กำหนดเอง", + "发生事件时查看": "ดูเมื่อมีเหตุการณ์เกิดขึ้น", + "实时查看": "มุมมองแบบเรียลไทม์", + "有人在门口出现10秒后开始录像。": "มีคนปรากฏที่ประตูเป็นเวลา10วินาทีก่อนบันทึก", + "有人按门铃时立即录像。": "บันทึกทันทีเมื่อมีคนกดกริ่งประตู", + "有人出现在门前1.5米范围时启动录像": "เริ่มบันทึกเมื่อมีคนปรากฏภายใน1.5เมตรหน้าประตู", + "约0.8米": "ประมาณ0.8เมตรคับ", + "约3.0米": "ประมาณ3.0เมตรคับ", + "添加指纹失败": "การทำงานล้มเหลว", + "项": "สินค้าชิ้นนี้", + "播放中": "การเล่นเกม", + "下载": "ดาวน์โหลดแอลอีดี", + "暂无下载内容": "ไม่มีเนื้อหาดาวน์โหลด", + "亮度": "ความสว่างความสว่างสูง", + "音量": "วอลลุ่ม", + "快进至": "กรอไปข้างหน้า", + "快退至": "ย้อนกลับไปที่", + "暂无视频信息": "ไม่มีข้อมูลวิดีโอ", + "加载出错": "ข้อผิดพลาดในการโหลด", + "请单人正对门锁,距离一个成年人手臂长度": "กรุณายืนหน้าล็อคประตูเพียงอย่างเดียวที่ความยาวแขน", + "(约0.6米)。": "(ประมาณ0.6เมตร)", + "保持脸部无遮挡,露出五官。": "ให้ใบหน้าของคุณไม่มีอะไรขัดขวางและแสดงคุณสมบัติใบหน้าของคุณ", + "准备好了,开始添加": "พร้อมเริ่มเพิ่ม", + "正在录入中...": "บันทึก...", + "添加人脸失败": "การเพิ่มใบหน้าล้มเหลว", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วใบหน้าของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?", + "人脸号": "หมายเลขใบหน้า", + "虹膜详情": "รายละเอียดไอริส", + "虹膜号": "หมายเลขไอริส", + "选择设备类型": "เลือกประเภทอุปกรณ์", + "照明灯具": "อุปกรณ์ติดตั้งไฟ", + "电动窗帘": "ม่านไฟฟ้า", + "门窗传感器": "เซ็นเซอร์ประตูและหน้าต่าง", + "传感器": "เซนเซอร์ตรวจจับ", + "清除数据成功": "ข้อมูลถูกล้างเรียบร้อยแล้ว", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "ล็อคไม่ได้เชื่อมต่อกับอินเทอร์เน็ตดังนั้นรหัสผ่านบัตรลายนิ้วมือและวิธีการเปิดประตูอื่นๆจึงไม่สามารถอัปโหลดได้แบบเรียลไทม์", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "หากคุณต้องการเก็บบันทึกทางประวัติศาสตร์คุณสามารถส่งออกได้", + "看不到操作记录,可能原因有": "ไม่สามารถดูบันทึกการดำเนินงานเหตุผลที่เป็นไปได้", + "操作记录详情": "บันทึกรายละเอียดการใช้งาน", + "操作时间": "เวลาในการทำงาน", + "此模块功能需要锁联网后设置方可生效": "ต้องตั้งค่าฟังก์ชันโมดูลนี้หลังจากที่ล็อคเชื่อมต่อกับอินเทอร์เน็ตเพื่อมีผล", + "用户已存在": "ผู้ใช้มีอยู่แล้ว", + "钥匙数量已到上限": "จำนวนคีย์ถึงขีดจำกัดบนแล้ว", + "附近没有可用网关": "ไม่มีเกตเวย์ที่พร้อมใช้งานอยู่ใกล้ๆ", + "正在创建安全连接...": "การสร้างการเชื่อมต่อที่ปลอดภัย...", + "监视状态下不能发送录音": "ไม่สามารถส่งการบันทึกในโหมดการตรวจสอบ", + "挂断": "แขวนขึ้น", + "监视中暂不能开锁": "ปลดล็อคไม่สามารถใช้ได้ในระหว่างการตรวจสอบ", + "长按说话": "กดค้างไว้เพื่อพูด", + "松开发送": "ปล่อยเพื่อส่ง", + "请输入6位数字开锁密码": "กรุณาป้อนรหัสผ่านปลดล็อค6หลัก", + "请输入开锁密码": "กรุณาป้อนรหัสผ่านปลดล็อค", + "接收者在有效期内可以不限次数使用": "ผู้รับสามารถใช้ ekeys ได้ไม่จำกัดครั้งภายในระยะเวลาที่ถูกต้อง", + "接收者可以使用此App开关锁": "ผู้รับสามารถล็อก/ปลดล็อกได้โดยแอพนี้", + "单次钥匙有效期为1小时,只能使用一次": "Ekey ครั้งเดียวใช้ได้หนึ่งชั่วโมงและสามารถใช้ได้เพียงครั้งเดียวเท่านั้น", + "接收者可以在有效期内的固定时间段里,不限次数使用": "ผู้รับสามารถใช้ ekeys ได้ไม่จำกัดครั้งภายในรอบเวลาที่กำหนด", + "获取模板失败": "การรับเทมเพลตล้มเหลว", + "微信通知": "การแจ้งเตือน WeChat", + "系统短信": "ระบบ SMS", + "系统邮件": "อีเมลระบบ", + "模板": "เทมเพลต", + "新建模版": "สร้างเทมเพลต", + "您好,您的密码是": "สวัสดีรหัสผ่านของคุณคือ", + "密码名字": "ชื่อของรหัสผ่าน", + "请输入6-9位密码": "กรุณาป้อนรหัสผ่าน6-9หลัก", + "设置密码": "ตั้งรหัสผ่านได้", + "操作成功,密码为": "ประสบความสำเร็จรหัสผ่านคือ", + "类型:自定义-永久": "ประเภท: กำหนดเอง-ถาวร", + "实时播放": "เล่นแบบเรียลไทม์", + "点击对讲": "คลิกเพื่ออินเตอร์คอม", + "长按开锁": "กดค้างเพื่อปลดล็อค", + "接听失败": "ไม่สามารถตอบได้", + "请在锁设置中开启远程开锁": "โปรดเปิดใช้งานการปลดล็อกระยะไกลในการตั้งค่าการล็อค", + "接听": "คำตอบสำหรับเด็ก", + "截图已保存到相册": "ภาพหน้าจอที่บันทึกไว้ในอัลบั้ม", + "添加遥控": "เพิ่มรีโมทคอนโทรล", + "已连接到锁,请按遥控": "เชื่อมต่อกับล็อคโปรดกดรีโมทคอนโทรล", + "遥控号": "หมายเลขรีโมทคอนโทรล", + "遥控详情": "รายละเอียดการควบคุมระยะไกล", + "照明": "การให้แสง", + "退出演示模式": "ออกจากโหมดสาธิต", + "提示:当前界面为展示界面,添加设备后才能继续使用": "เคล็ดลับ: อินเทอร์เฟซปัจจุบันเป็นอินเทอร์เฟซการแสดงผลหลังจากเพิ่มอุปกรณ์แล้วคุณสามารถใช้งานได้ต่อไป", + "门已上锁": "ประตูถูกล็อค", + "您的账号在异地登录,如非本人,请尽快修改密码": "บัญชีของคุณถูกใช้เพื่อเข้าสู่ระบบจากอุปกรณ์ใหม่", + "开门成功": "เปิดประตูเรียบร้อยแล้ว", + "开门失败": "การเปิดประตูล้มเหลว", + "呼叫提醒": "แจ้งเตือนการโทร", + "收到来自": "ได้รับจาก", + "锁的呼叫": "ล็อคสายได้", + "加载数据中": "กำลังโหลดข้อมูล", + "搜索所有锁类型": "ค้นหาล็อคทุกประเภท", + "锁电量更新时间": "ล็อคเวลาอัปเดตแบตเตอรี่", + "1月": "JAN JAN", + "2月": "เดือนกุมภาพันธ์", + "3月": "มี .ค.", + "4月": "เม.ย. ิส", + "5月": "เดือนพฤษภาคม", + "6月": "จุนิน", + "7月": "ก.ค. ส", + "8月": "สคสิงหาคม", + "9月": "เดือนกันยายน", + "10月": "ตุลาคมส.", + "11月": "พ.ย. นี้", + "12月": "ธันวาคมคริส", + "热门城市": "เมืองร้อนๆ", + "导出锁数据": "ข้อมูลล็อคการส่งออก", + "一键开锁": "ปลดล็อคด้วยคลิกเดียว", + "已开通": "เปิดออกได้", + "编辑员工": "แก้ไขพนักงานแล้ว", + "一": "หนึ่งตัว", + "二": "สองสองชิ้น", + "三": "สามส่วน", + "四": "สี่ส่วน", + "五": "ห้าส่วน", + "六": "หกตัว", + "日": "ดวงอาทิตย์ดวงอาทิตย์ดวงอาทิตย์", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?", + "在线": "ออนไลน์ผ่าน", + "离线": "ออฟไลน์", + "购买记录": "บันทึกการซื้อ", + "使用记录": "บันทึกผู้ใช้", + "失效时间要大于当前时间": "วันหมดอายุต้องนานกว่าเวลาปัจจุบัน", + "修改名字": "แก้ไขชื่อ", + "时": "ชั่วโมงต่อชั่วโมง", + "分": "นาทีของคุณ", + "Amazon Alexa": "Amazon Alexa อเมซอน", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "คุณสามารถใช้ Alexa เพื่อปลดล็อกล็อกและตรวจสอบสถานะการล็อก", + "支持的国家": "ประเทศที่รองรับ", + "支持的国家值": "สหรัฐอเมริกา, แคนาดา, สหราชอาณาจักร, ออสเตรเลีย, อินเดีย, เยอรมนี, ฝรั่งเศส, อิตาลี, สเปน, ญี่ปุ่น", + "操作流程": "ขั้นตอนการดำเนินงาน", + "操作流程值": "1เพิ่มล็อคและเกตเวย์กับ APP ล็อคสมาร์ท\n\n2เปิดใช้งานฟังก์ชั่นปลดล็อคระยะไกลของล็อคใน App (ฟังก์ชั่นนี้ถูกปิดโดยค่าเริ่มต้น) หากคุณไม่มีตัวเลือกนี้ล็อคจะไม่รองรับ Alexa\n\n3เพิ่มทักษะให้กับ Alexa และอนุญาตให้พวกเขาด้วยบัญชีสมาร์ทล็อค APP และรหัสผ่านหลังจากการอนุมัติประสบความสำเร็จคุณสามารถค้นพบอุปกรณ์ภายใต้บัญชี\n\n4ค้นหาการล็อคในแอป Alexa เปิดฟังก์ชั่นปลดล็อคด้วยเสียงและตั้งรหัสผ่านภาษา\n\n5ล็อคสามารถทำงานผ่าน Alexa", + "Google Home": "Google Home", + "Action name": "ชื่อแอคชัน", + "ScienerSmart": "Scienersmart", + "支持的语言": "ภาษาที่รองรับ", + "英语": "ภาษาอังกฤษแบบสบายๆ", + "Google Home操作流程的值": "1.ใช้แอป Smart Lock เพื่อเพิ่มล็อคและเกตเวย์\n\n2.เปิดใช้งานฟังก์ชั่นการปลดล็อกระยะไกลของล็อคในแอป (ฟังก์ชั่นนี้ถูกปิดโดยค่าเริ่มต้น) ไม่มีตัวเลือกนี้ล็อคไม่รองรับ Google Home\n\n3.ติดตั้งแอป Google Home และคลิกปุ่ม \"\" ที่มุมบนซ้าย\n\n4.ในหน้าการตั้งค่าให้เลือก \"ทำงานร่วมกับ Google\"\n\n5.ค้นหา \"scienersmart\" และใช้บัญชีแอปล็อคอัจฉริยะและรหัสผ่านเพื่ออนุญาต", + "密码需至少包含数字/字母/字符中的2种组合": "รหัสผ่านต้องมีอย่างน้อย2รายการต่อไปนี้: ตัวเลขตัวอักษรและอักขระพิเศษ", + "已开锁": "ปลดล็อคแล้ว", + "已闭锁": "ล็อคล็อคได้", + "两次密码不一致哦": "รหัสผ่านไม่สอดคล้องกัน", + "中功率": "กำลังไฟปานกลาง", + "常规使用": "ใช้เป็นประจำ", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "หลังจากเปิดเกตเวย์แล้วให้กดปุ่มรีเซ็ตค้างไว้5วินาทีและคลิกถัดไปเมื่อไฟแสดงสถานะกะพริบสลับกัน", + "扫描设备": "อุปกรณ์สแกน", + "删除失败,网关可能已经离线,是否强制删除该数据?": "การลบล้มเหลวเกตเวย์อาจออฟไลน์ไปแล้วคุณต้องการบังคับให้ลบข้อมูลหรือไม่?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_tr.json b/lan/lan_tr.json new file mode 100644 index 00000000..cd306451 --- /dev/null +++ b/lan/lan_tr.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Yıldız kilidi", + "锁通通": "Kilitle", + "点击开锁,长按闭锁": "Kilidini açmak için dokunun, kilitlemek için tutun", + "考勤": "Katılım", + "考勤设置": "Katılım ayarları", + "电子钥匙": "Ekeys", + "添加卡": "Kart ekle", + "卡号": "Kart numarası", + "添加指纹": "Parmak izi ekle", + "指纹号": "Parmak izi numarası", + "遥控": "Uzaktan kumanda", + "添加人脸": "Yüz ekle", + "门锁日志": "Kapı kilidi günlüğü", + "密码号": "Şifre numarası", + "添加者": "Operatör", + "添加时间": "Zaman", + "重置": "Sıfırla", + "请输入手机号或者邮箱": "Telefon numarası/e-posta", + "工作时间": "Çalışma süresi", + "工作日设置": "Workday ayarı", + "星期一": "Pazartesi", + "星期二": "Salı günü", + "星期三": "Çarşamba", + "星期四": "Perşembe", + "星期五": "Cuma", + "星期六": "Cumartesi", + "星期日": "Pazar günü", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Güneş", + "群发钥匙": "Birden fazla ekeys gönder", + "锁": "Kilit", + "请添加": "Alıcı", + "允许远程开锁": "Uzaktan kilidini aç", + "请输入验证码": "Doğrulama kodu", + "获取密码": "Şifre oluştur", + "请给密码命名": "Bu şifre için bir isim girin", + "密码有限期为6个小时,只能使用一次": "Bu şifre, mevcut zamandan itibaren 6 saat içinde kullanılmalıdır veya güvenlik nedeniyle askıya alınacaktır. bu şifre sadece bir kez kullanılabilir.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Şifre olarak manuel olarak 6-9 basamak girin. Kilidin yanında telefon bluetooth ile eklenebilir veya ağ geçidi üzerinden uzaktan eklenebilir", + "获取": "Al", + "添加": "Ekle", + "删除公司": "Şirketi sil", + "密码详情": "Şifre bilgisi", + "修改密码": "Şifre kodunu değiştir", + "添加虹膜": "Iris ekle", + "添加门磁": "Kapı sensörü", + "添加无线键盘": "Kablosuz tuş takımı", + "添加手掌": "Palmiye ekle", + "请输入员工账号": "Çalışan hesabını girin", + "批量授权锁": "Hibe çoklu kilitler", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Yetkili yönetici bu kilidi çalıştırmak için çoğunluk iznine sahip olacaktır.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Bu özellik, akıllı kilidi bir ağ geçidi üzerinden uzaktan açmanıza izin verir. bu özellik sadece bluetooth üzerinden açılıp kapatılabilir.", + "排列方式": "Liste türü", + "早到榜": "Erken liste", + "迟到榜": "Geç liste", + "当前模式": "Akım modu", + "勤奋榜": "Sıkı çalışma listesi", + "延迟时间": "Gecikme süresi", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Kilit, süreden sonra otomatik olarak kilitlenir. ayarı yapmak için lütfen bir kez kilidini açın.", + "时间": "Zaman", + "开始时间": "Başlangıç zamanı", + "结束时间": "Bitiş zamanı", + "工作时间设置": "Çalışma süresi ayarı", + "常开模式": "Geçiş modu", + "常开时间": "Bu süre zarfında", + "常开日期": "Bu günlerde", + "添加员工": "Personel ekle", + "节假日": "Tatil", + "打卡方式": "Yöntem", + "员工是否有钥匙": "Zaten ekey var", + "上班时间": "Başlangıç zamanı", + "下班时间": "Kapanış süresi", + "本周": "Bu hafta", + "单休": "Bir günlük hafta sonu", + "双休": "İki günlük hafta sonu", + "单双休": "Bir-iki günlük hafta sonu", + "年": "Yıl", + "月": "Ay", + "放假日期": "Tatil", + "补班日期": "Iş günü", + "添加假日": "Tatil ekle", + "开始日期": "Başlangıç tarihi", + "必填": "Gerekli", + "结束日期": "Bitiş tarihi", + "日榜": "Günlük", + "月榜": "Aylık", + "考勤记录": "Kayıtlar", + "假日信息": "Tatil bilgisi", + "基本信息": "Temelleri", + "无线键盘": "Kablosuz tuş takımı", + "选择无线键盘": "Tuş takımı ekle", + "门磁": "Kapı sensörü", + "自动闭锁": "Otomatik kilit", + "锁声音": "Sesi kilitle", + "防撬报警": "Sabotaj uyarısı", + "重置键": "Sıfırlama düğmesi", + "锁时间": "Kilit saati", + "诊断": "Teşhis et", + "上传数据": "Veri yükle", + "导入其他锁数据": "Başka bir kilit ithal et", + "锁升级": "Firmware güncellemesi", + "标记房态": "Oda durumu", + "开锁提醒": "Bildirimin kilidini aç", + "微信二维码": "Qr kodunun kilidini aç", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Elektronik tuşlu kişiler, bu qr kodunu wechat üzerinden tarayarak kapıyı açabilir. Her kilidin qr kodu farklıdır. Yazdırabilir ve ilgili kilidin yanına yapıştırabilirsiniz", + "锁编号": "Kilit numarası", + "电量": "Pil", + "锁分组": "Kilit grubu", + "选择分组": "Grubu seç", + "创建新分组": "Bir grup oluştur", + "管理员开锁密码": "Yönetici şifresi", + "更新": "Güncelleme", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Pil seviyesi ağ geçidi veya telefon bluetooth ile güncellenecektir", + "当屏幕闪烁时,点击下一步": "Tuş takımı yanıp söndüğünde İleri'ye tıklayın", + "输入*529#或按设置键": "README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # girin veya ayarlar tuşuna basın", + "长按重置键2秒": "Sıfırlama düğmesine 2 saniye basın ve basılı tutun", + "附近的设备": "Yakındaki ekipman", + "暂无数据": "Veri yok", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Bir kapı sensörü ile kapı durumu bir ağ geçidi ile birlikte elde edebileceksiniz. sadece bir sensörün bir kilit ile ilişkilendirilmesine izin verilir.", + "开始": "Başlangıç", + "全天": "Tüm saatler", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Geçiş modu için birden fazla zaman dilimi ayarlayabilirsiniz. ayarlanan süre içinde, kilit açıldıktan sonra açık bir durumda kalacaktır.", + "请选择锁音量": "Lütfen kilit hacmini seçin", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Açarak, sesi kilitten duyacaksınız", + "低": "Düşük", + "较低": "Orta düşük", + "中": "Orta", + "较高": "Orta yüksek", + "高": "Yüksek", + "开启后,锁被撬动时,会发出报警声": "Açarak, sabotaj uyarısını etkinleştirirsiniz.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Kapatarak sıfırlama düğmesi devre dışı bırakılır.", + "校准时间": "Kalibre süresi", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Teşhis, kilit içindeki yapılandırma bilgilerini okumak ve yüklemektir, böylece personel arızanın nedenini analiz edebilir", + "上传": "Yükleme", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Kilitten sunucuya veri yükle. birkaç dakika sürebilir", + "请选择要从哪把锁导入": "İçe aktarılacak bir kilit seçin", + "有新版本": "Yeni sürümü var", + "当前版本": "Mevcut sürüm", + "升级": "Güncelleme", + "空闲": "Boş boş", + "已入住": "Işgal edildi", + "多语言": "Diller", + "添加锁": "Kilit ekle", + "锁地址": "Kilit adresi", + "选择锁类型": "Kilit tipini seç", + "NFC无源锁": "Nfc pasif kilit", + "添加设备": "Cihaz ekle", + "网关": "Ağ geçidi", + "客服": "Müşteri hizmetleri", + "设置": "Ayarlar", + "更多设置": "Daha fazla set", + "消息推送": "Bildirim itme", + "锁用户管理": "Kullanıcıları kilitle", + "拥有的钥匙": "Bu kullanıcı ile ilişkili ekeys", + "批量授权": "Yetki yönetimi", + "关联设备": "Ilişkili cihaz", + "关联姓名": "Ilişkili isim", + "转移智能锁": "Transfer kilidi", + "选择锁": "Ekran kilidi", + "接收人信息": "Alıcı", + "转移网关": "Ağ geçidini transfer et", + "锁屏": "Ekran kilidi", + "已关闭": "Kapalı", + "已开启": "Üzerinde", + "开启": "Aç şunu", + "确定要开启重置键?": "Sıfırlama düğmesini etkinleştirmeye devam mı?", + "确定要关闭重置键?": "Sıfırlama düğmesini devre dışı bırakmaya devam edin?", + "隐藏无效开锁权限": "Geçersiz erişimi gizle", + "APP开锁时需手机连网的锁": "Çevrimiçi telefon gerektiren kilitler", + "增值服务": "Hizmetler", + "关于": "Hakkında", + "退出": "Çıkış", + "删除账号": "Hesabı sil", + "个人信息": "Hesap bilgisi", + "头像": "Avatar", + "昵称": "Takma ad", + "请输入昵称": "Lütfen takma adınızı girin", + "修改昵称": "Yeniden adlandırma", + "修改账号": "Hesabı düzenle", + "重置密码": "Şifreyi sıfırla", + "安全问题": "Güvenlik sorusu", + "为了你的账号安全,修改账号前请先使用验证码验证": "Hesabınızın güvenliği için lütfen hesabı değiştirmeden önce hesap şifre doğrulamasını kullanın", + "请输入新账号": "Lütfen yeni hesabı girin", + "找回密码和登录新设备时,可通过绑定的手机验证": "Doğrulama kodunu almak için bağlayıcı telefon numarası kullanılacaktır.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Bağlama e-postası doğrulama kodunu almak için kullanılacaktır.", + "原密码": "Geçerli şifre", + "新密码": "Yeni şifre", + "确认密码": "Şifreyi onayla", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Telefonunuzun kaybolması durumunda, güvenlik sorularını cevaplayarak yeni telefona giriş yapabilirsiniz.", + "问题一": "Soru 1", + "问题二": "Soru 2", + "问题三": "Soru 3", + "请输入你的答案": "Lütfen cevabınızı yazın", + "即将到期": "Yakında sona eriyor", + "去授权": "Yetki vermek için git", + "修改名称": "İsim düzenleme", + "状态": "Durum", + "WiFi名称": "Wifi adı", + "网络MAC": "Ağ mac", + "网关升级": "Ağ geçidi güncellemesi", + "网关连接的锁": "Bu ağ geçidine bağlı kilit (ler)", + "信号强": "Güçlü", + "选择网关类型": "Ağ geçidi türünü seçin", + "添加网关": "Ağ geçidi ekle", + "重新通电": "Gücü tekrar bağlayın", + "指示灯": "Gösterge ışığı", + "选择网关": "Ağ geçidini seç", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5g desteklenmiyor. lütfen 2.4g wifi seçin.", + "WiFi密码": "Wifi geçidi", + "请输入WiFi密码": "Wifi şifresini girin", + "网关名称": "Ağ geçidi adı", + "请输入网关名称": "Ağ geçidi adını girin", + "IP地址": "Ip adresi", + "子网掩码": "Alt ağ maskesi", + "默认网关": "Varsayılan ağ geçidi", + "自动获取DNS服务器地址": "Dns sunucu adresini otomatik olarak alın", + "首选DNS": "Tercih edilen dns", + "备选DNS": "Alternatif dns", + "不使用静态IP": "Statik ip kullanılmaz", + "使用静态IP": "Statik ip kullanın", + "请输入IP地址": "Ip adresini girin", + "请输入子网掩码": "Alt ağ maskesi girin", + "请输入默认网关": "Varsayılan ağ geçidini girin", + "所有锁": "Tüm kilitler", + "搜索所有类型的锁": "Her türlü kilidi tarayın", + "门锁": "Kapı kilidi", + "挂锁": "Asma kilit", + "保险箱锁": "Güvenli kilit", + "智能门禁": "Akıllı erişim kontrolü", + "车位锁": "Park kilidi", + "摸亮触摸屏": "Tuş takımını etkinleştirmek için herhangi bir tuşa dokunun", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Kilidi etkinleştirmek ve eşleştirme moduna koymak için lütfen herhangi bir tuşa dokunun.", + "附近的锁": "Yakındaki kilitler", + "如需修改名字请重新命名,点击确定添加锁": "Adı değiştirmek istiyorsanız, lütfen yeniden adlandırın, kilit eklemek için tamam'ı tıklayın", + "添加锁时,手机必须在锁旁边": "Bir kilit eklerken, telefon kilidin yanında olmalıdır", + "登录": "Giriş", + "注册": "Kayıt ol", + "我已阅读并同意": "Okudum ve kabul ettim", + "验证码": "Kod", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Şifreniz 8-20 karaktere sahip olmalı ve en az iki çeşit sayı, harf ve sembol içermelidir.", + "手机": "Telefon", + "邮箱": "E-posta", + "请输入邮箱": "Email girin", + "国家/地区": "Ülke/bölge", + "你所在的国家/地区": "Ülkeniz/bölgeniz", + "选择国家/地区": "Ülkenizi veya bölgenizi seçin", + "获取验证码": "Kodu al", + "商务合作": "Iş", + "电脑网页版": "Web sistemi", + "酒店系统": "Otel sistemi", + "说明书网页版": "Kullanım kılavuzu", + "高级功能": "Gelişmiş fonksiyon", + "记录保存": "Kayıt tutma", + "您可通过短信将密码、电子钥匙信息发给接收人。": "Sms, alıcıya şifre ve ekey bilgileri göndermek için kullanılabilir.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "E-posta, alıcıya şifre ve ekey bilgileri göndermek için kullanılabilir.", + "购买实名认证提示": "Fonksiyon etkinleştirildikten sonra, uygulamayı açmak için parmak izi, yüz veya hesap şifrenizi kullanmanız gerekir. 3 dakika boyunca tekrar doğrulamaya gerek yok", + "请选择你希望的实名认证频次": "Lütfen istediğiniz gerçek isim kimlik doğrulama frekansını seçin", + "仅首次": "İlk kez", + "每日一次": "Günde bir kez", + "每周一次": "Haftada bir kez", + "每月一次": "Her ay bir kez", + "当前状态": "Mevcut durum", + "试用中": "Denemede", + "高级功能权益内容": "Gelişmiş fonksiyonlar", + "短信模板": "Sms şablonu", + "邮件模板": "E-posta şablonu", + "发卡工具": "Kart kodlayıcı", + "购买高级功能须知": "Uyarı", + "购买高级功能提示": "Daha gelişmiş özellikler geliştirme aşamasındadır ve onlara ihtiyacınız varsa, kilitlerin sayısına göre hizmeti açmaktan memnuniyet duyarız. Gelişmiş özellikler sadece kendi kilitleriniz için kullanılabilir. Yetkili bir yöneticiniz varsa, hizmeti açmak için lütfen kilidin üst yöneticisine başvurun.", + "免费体验": "Ücretsiz deneme", + "立即开通": "Şimdi aç", + "购买短信": "Sms al", + "购买邮件": "E-posta satın al", + "购买实名认证次数": "Gerçek ad kimlik doğrulama süreleri satın alın", + "开通高级功能": "Gelişmiş işlevi etkinleştir", + "选择套餐": "Paketi seç", + "支付方式": "Ödeme şekli", + "支付宝": "Alipay", + "去支付": "Ödeme", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Mesajı kendiniz tanımlamanıza izin verilir. parola ve ekey bilgilerini başkalarına göndermek için kullanılır.", + "高级功能仅能用于你自己的锁": "Gelişmiş fonksiyon sadece kendi kilitlerinize uygulanabilir.", + "新建模板": "Creat şablonu", + "类型": "Tipi", + "模版内容": "Şablon içeriği", + "预览": "Önizleme", + "房间名": "Oda", + "预计产生短信条数": "Tahmini mesaj segmentleri", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Bu özellik, bir süre için geçersiz olan parola, ekeys, kart ve parmak izlerini gizlemenizi sağlar.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Bu seçilen kilitlerin kilidini uygulamayla açmak için kullanıcının telefonunun çevrimiçi olması gerekir.", + "配置WiFi": "Wifi yapılandırması", + "请输入WiFi名字": "Lütfen wifi adını girin", + "WiFi配网": "Wifi dağıtım ağı", + "胁迫卡": "Stres kartı", + "员工是否有密码": "Zaten şifre var", + "员工是否有卡": "Zaten kart var", + "员工是否有指纹": "Zaten parmak izini ayarla", + "获取钥匙": "Anahtar al", + "获取卡": "Kart al", + "获取指纹": "Parmak izi al", + "安全验证": "Kimlik doğrulama", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tüm hesap bilgileriniz platformdan kalıcı olarak kaldırılacak ve kurtarılamayacaktır. silmek ister misiniz?", + "监控": "Monitör", + "视频日志": "Video günlüğü", + "开门器": "Kapı açacağı", + "面容开锁": "Yüz kilidini açar", + "开门方向设置": "Açılış yönü seti", + "电机功率设置": "Motorpower ayarı", + "开锁时是否需联网": "Kilidini açarken internet gerekiyorsa", + "选择要加入分组的锁": "Bu gruba eklemek için kilitleri seçin", + "锁数量": "Kilit sayısı", + "小米IOT平台": "Xiaomi iot platformu", + "面容开锁设置": "Yüz kilidini açma seti", + "感应距离": "Algılama mesafesi", + "防误开": "Yanlış açılmayı önle", + "防误开已关闭,关门后仍可使用面容开锁": "Yanlış çalışmayı önlemek kapatıldı, kapıyı kapattıktan sonra hala yüz kilidini kullanabilir", + "添加和使用面容开锁时": "Kilidini açarken yüz ekle ve kullan", + "添加和使用面容开锁时提示": "\n1, lütfen kapı operasyonunun önünde tek bir kişiyi tutmaya çalışın;\n2, kapı kilidi karşısında yaklaşık 0.5 ~ 0.8 metre kapı kilidi önünde durmak lütfen;\n3. lütfen yüzünüzü engelsiz tutun ve yüz özelliklerinizi ortaya çıkarın;\n4. yüz tanıma anormal olduğunda, yüz tanıma işlemini manuel olarak yeniden başlatmak için dijital klavyede herhangi bir tuşa dokunabilirsiniz.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Lütfen kapı kilidinin gerçek durumuna göre motor gücünü dikkatlice seçin:", + "小功率:": "Miniwatt:", + "耗电少": "Daha az güç tüketimi", + "大功率": "Yüksek güç:", + "大功率提示": "Kilit dili kilidini açarken normal olarak geri çekilemezse veya sürülmesi gerekiyorsa", + "开门方向设置提示": "Lütfen evinizin kapısını açmak için dikkatli bir şekilde yönünü seçin (yanlış yönü seçerseniz, kapıyı düzgün bir şekilde açıp kapatamazsınız):", + "左开": "Sola aç", + "右开": "Sağa aç", + "判断方法:": ":", + "判断方法内容": "Adam evin dışında durdu, giriş kapısına baktı.", + "录像时段": "Video yuvası", + "密码": "Şifre kodları", + "卡": "Kartlar", + "指纹": "Parmak izi", + "人脸": "Yüz", + "配件商城": "Kilit alışveriş merkezi", + "公司名称": "Şirket adı", + "请输入公司名字": "Şirket adını girin", + "提示": "Ipucu", + "是否删除?": "Silmek için olsun?", + "员工信息": "Personel bilgisi", + "员工": "Personel", + "打卡方式无效": "Kullanılamıyor", + "中国": "Çin", + "选择钥匙": "Ekey seç", + "编辑": "Düzenle", + "无": "Hayır", + "有": "Evet", + "请输入姓名": "Lütfen bir isim girin", + "获取人脸": "Yüzleri almak", + "选择密码": "Şifre kodunu seç", + "选择卡": "Kart seç", + "选择指纹": "Parmak izini seç", + "选择人脸": "Yüz seç", + "员工是否有人脸": "Çalışanın bir yüzü olup olmadığı", + "同时删除员工钥匙": "Onun/onun ekey sil", + "删除": "Delet", + "确定要删除员工吗?": "Bu çalışanı sil", + "月统计": "Aylık istatistikler", + "迟到": "Geç saatlerde", + "早退": "Erken çık", + "未打卡": "Kayıt yok", + "钥匙将在": "Bu ekey sona erecek", + "天后失效": "Gün (ler)", + "电量更新时间:": "Pil güncelleme süresi:", + "新增配件": "Ekle", + "钥匙不可用": "Anahtar mevcut değil", + "正在开锁中...": "Kilit açma...", + "你的钥匙": "Senin anahtarın", + "常开模式启动!长按闭锁": "Açık mod başladı! Kilitlemek için uzun basın", + "演示模式": "Demo modu", + "请先同意用户协议及隐私政策": "Lütfen önce kullanıcı sözleşmesini ve gizlilik politikasını kabul edin", + "用户协议": "Kullanıcı şartları", + "隐私政策": "Gizlilik politikası", + "注册成功": "Kayıt başarılı", + "你所在的": "Sen içeridesin", + "手机号": "Telefon numarası", + "忘记密码": "Şifre unuttum", + "重置成功": "Başarıyı sıfırla", + "确定要退出吗?": "Çıkış?", + "功能暂未开放": "Fonksiyon henüz açık değil", + "设置成功": "Başarıyla kur", + "删除成功": "Başarıyla sil", + "单次": "Bir kez", + "永久": "Kalıcı", + "限时": "Zamanlanmış", + "自定义": "Özel", + "清空码": "Silme", + "循环": "Yinelenen", + "工作日": "Iş günü", + "每日": "Günlük", + "周末": "Hafta sonu", + "确定要删除吗?": "Sil?", + "该锁的密码都将被删除": "Bu kilit için tüm şifreler silinecek", + "已过期": "Geçersiz", + "该锁的电子钥匙都将被删除": "Bu kilit için tüm anahtarlar silinecek", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Bu ekey ile ilişkili tüm anahtarları silin. bu adım kaldırılamaz!", + "删除钥匙会在用户APP连网后生效": "Ekey silinecek", + "有效时间": "Etkili zaman", + "接收者": "Alıcı", + "仅管理自己创建的用户": "Sadece kendi kullanıcılarını yönetin", + "远程开锁": "Uzaktan kilidini aç", + "请输入钥匙名称": "Lütfen anahtar adını girin", + "修改成功": "Başarıyı değiştir", + "冻结": "Dondur", + "解除冻结": "Çözülme", + "授权": "Yetki ver", + "取消授权": "Yetki ver", + "同时解冻其发送的钥匙": "Bu kullanıcı tarafından verilen tüm anahtarları çözün", + "会在用户APP连网后生效": "Kullanıcının uygulaması bir ağa bağlandığında bu ekey çözülecektir", + "同时冻结其发送的钥匙": "Bu kullanıcı tarafından verilen tüm anahtarları dondurun", + "冻结会在用户APP连网后生效": "Kullanıcının uygulaması bir ağa bağlandığında bu ekey donmuş olacak", + "取消授权会在用户APP连网后生效": "Kullanıcı uygulaması bir ağa bağlandığında kullanıcı izinlerini kaybedecek", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Yetkili kullanıcı, kilit yöneticisi ile hemen hemen aynı izinlere sahiptir (örn. ekeys ve passcodes gönderme yeteneği)", + "失效时间需晚于生效时间": "Son kullanma süresi etkili zamandan daha geç olmalıdır", + "生效时间需晚于当前时间": "Etkili zaman şimdiki zamandan daha geç olmalıdır", + "失效日期需晚于生效日期": "Son kullanma tarihi etkili tarihten daha geç olmalıdır", + "修改有效期": "Değişim dönemi", + "生效日期": "Başlangıç tarihi", + "失效日期": "Bitiş tarihi", + "开锁": "Kilidini aç", + "开锁成功": "Başarının kilidini aç", + "请选择锁": "Lütfen kilitleri seçin", + "请选择接收者": "Lütfen alıcıyı seçin", + "请选择有效期": "Lütfen geçerlilik süresini seçin", + "请选择发送方式": "Lütfen gönderme yöntemini seçin", + "请选择结束时间": "Lütfen bitiş süresini seçin", + "完成": "Tamamlandı", + "有效日": "Döngüsü üzerinde", + "发送成功": "Başarı gönder", + "请选择开始时间": "Lütfen başlangıç saatini seçin", + "选择用户": "Alıcıları seç", + "已选中": "Seçilen", + "确定": "Tamam", + "请选择要发送的锁": "Lütfen kilitleri seçin", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Yüz gerçek adı kimlik doğrulaması, kullanıcının telefon uygulamasını açmadan önce yüzünü doğrulaması gerektiğini ve doğrulamanın kilidi açılabileceğini ifade eder.", + "分享": "Paylaş", + "请输入接收者账号": "Lütfen alıcı hesabını girin", + "接收者号码未注册,请重新发送": "Alıcı numarası kayıtlı değil, lütfen tekrar gönderin", + "是否发送电子钥匙给未注册账号": "Yeni bir hesaba bir ekey göndermek ister misiniz", + "取消": "İptal et", + "标记成功": "Başarıyı işaretle", + "微信好友": "Wechat arkadaşlar", + "短信": "Sms", + "邮件": "E-posta", + "更多": "Daha fazla", + "您好,您的电子钥匙生成成功": "Merhaba, elektronik anahtarınız başarıyla oluşturuldu", + "生效时间不能小于当前时间": "Etkili zaman şimdiki zamandan daha az olamaz", + "结束时间不能小于当前时间": "Son zaman şimdiki zamandan daha az olamaz", + "是否为管理员": "Bu bir yönetici mi", + "已连接到锁,请将卡靠近门锁的读卡区": "Bağlı. kartı kart okuyucuya yerleştirin", + "尝试连接设备...": "Kilitli bağlantı. lütfen bekle...", + "地理位置": "Coğrafi konum", + "检查以确保以下地址是正确的": "Aşağıdaki adresin doğru olduğundan emin olmak için kontrol edin", + "地图加载中,请稍候。。": "Harita yükleniyor, lütfen bekleyin...", + "跳过": "Atla", + "还未获取到位置信息哦,请耐心等待一下!": "Konum bilgisi henüz alınmadı, lütfen sabırla bekleyin!", + "请填写信息": "Lütfen bilgileri doldurun", + "有效期": "Geçerlilik süresi", + "生效时间": "Başlangıç zamanı", + "失效时间": "Bitiş zamanı", + "上传成功": "Başarıyla yüklendi", + "未生效": "Aktif değil", + "已生效": "Etkili", + "指纹详情": "Parmak izi bilgisi", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Parmağınızı sensöre birkaç kez yerleştirmeniz gerekecek. lütfen istemleri takip edin...", + "开始添加": "Başlangıç", + "请将您的手指按下": "Parmağınızı sensöre yerleştirin", + "根据提示,抬起手指后再进行下一次指纹采集": "Talimatları izleyin... bir sonraki kayıt için parmağınızı sensöre çıkarmanız ve yerleştirmeniz gerekecektir.", + "添加成功": "Başarı ekle", + "更新成功": "Başarıyı güncelle", + "搜索": "Arama", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Sıfırladıktan sonra, kilidin kartı silinir, sıfırlamak ister misiniz?", + "已失效": "Geçersiz", + "卡详情": "Kart bilgisi", + "请输入": "Lütfen buraya girin", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Kapatarak, kilit manuel olarak kilitlenene kadar tüm gün kilitli kalacaktır.", + "请输入小于或等于60的数字": "Lütfen 60'tan az bir sayı girin", + "操作成功": "Operasyon başarılı", + "管理员密码相同,无需修改": "Yönetici şifresi aynıdır ve değiştirilmesine gerek yoktur", + "请输入6-9位数字": "6-9 basamak uzunluğunda", + "请输入6-9位管理员密码": "Lütfen 6-9 haneli bir yönetici şifresi girin", + "请输入新的管理员密码": "Lütfen yeni bir yönetici şifresi girin", + "未分组": "Ungrouped", + "请输入分组名称": "Bir grup oluştur", + "创建成功": "Başarı yarat", + "设置锁分组成功": "Kilit grubunu başarıyla ayarlayın", + "电池1电量": "Pil 1", + "电池2电量": "Pil 2", + "电量更新时间": "Pil güncelleme süresi", + "锁电量更新成功": "Güç güncelleme başarısını kilitle", + "您的钥匙未生效": "Anahtarın etkili değil", + "您的钥匙已冻结": "Anahtarın donmuş", + "您的钥匙已过期": "Anahtarınızın süresi doldu", + "常开模式开启": "Kilit geçiş modunda", + "超级管理员": "Süper yönetici", + "授权管理员": "Yetkili yönetici", + "普通用户": "Sıradan kullanıcı", + "余": "Denge", + "天": "Gün", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Kilidi sildikten sonra, tüm bilgiler birlikte silinecek, kilidi silmek istediğinizden emin misiniz?", + "请输入登录密码": "Lütfen uygulama şifresini girin", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Cihazı silyemedi, lütfen cihazın cihazın yakınında olduğundan emin olun, cihaz bağlı değil ve cihaz açık", + "用户无权限": "Kullanıcının izni yok", + "创建公司后,考勤功能才能使用": "Lütfen önce bir şirket oluşturun", + "是否删除钥匙?": "Bu anahtarı sil?", + "邮箱绑定成功": "E-posta bağlama başarısı", + "手机绑定成功": "Cep telefonu bağlama başarısı", + "网络访问失败,请检查网络是否正常": "İstek başarısız oldu. ağ kullanılamıyor, lütfen cihazınızı 3g/4g/wifi'ye kontrol edin ve bağlayın", + "清空": "Temizle", + "是否清空?": "Temizle?", + "消息详情": "Mesaj bilgisi", + "创建时间": "Yaratma zamanı", + "管理员详情": "Yönetici detayları", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Birisi sizi kapıyı açmaya zorlarsa, bu kartı kullanabilirsiniz. alarm mesajı yöneticilere gönderilecektir. bu özelliği kullanmak için lütfen kilidinizin çevrimiçi olduğundan emin olun.", + "请不要将胁迫卡用于日常开锁": "Lütfen günlük kullanım için zorunlu kartı kullanmayın.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Birisi sizi kapıyı açmaya zorlarsa, bu parmak izini kullanabilirsiniz. alarm mesajı yöneticilere gönderilecektir. bu özelliği kullanmak için lütfen kilidinizin çevrimiçi olduğundan emin olun.", + "请不要将胁迫指纹用于日常开锁": "Lütfen günlük kullanım için zorla parmak izini kullanmayın.", + "创建公司": "Bir şirket oluştur", + "公司名称不能超过30个字符": "Şirket adı 30 karakteri geçemez", + "公司名称不能小于6个字符": "Şirket adı 6 karakterden az olamaz", + "WIFI列表": "Wifi listesi", + "刷新": "Yenile", + "手动配网": "Manuel dağıtım ağı", + "远距离": "Uzun mesafe", + "中距离": "Orta mesafe", + "近距离": "Kısa mesafe", + "锁时间更新成功": "Kilit zamanı güncelleme başarısı", + "锁用户": "Kullanıcıları kilitle", + "请选择常开日期": "Lütfen açık tarihi seçin", + "结束时间不能小于开始时间哦": "Son zaman başlangıç zamanından daha az olamaz", + "介绍": "Bizim hikayemiz", + "个人信息收集清单": "Kişisel bilgi toplama listesi", + "应用权限说明": "Uygulama izni açıklaması", + "第三方信息共享清单": "Üçüncü taraf bilgi paylaşım listesi", + "请选择您的位置": "Lütfen konumunuzu seçin", + "请先选择位置": "Lütfen önce konumu seçin", + "管理员密码": "Yönetici şifresi", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Değiştirmeniz gerekiyorsa, lütfen yeni bir yönetici şifresi girin (6 haneli), değiştirmek için tamam seçeneğini tıklayın", + "修改": "Değiştir", + "网络摄像头": "Kamera", + "重命名": "Yeniden adlandırma", + "分组下的锁将被移到未分组里": "Grubun altındaki kilitler gruplanmamış olarak taşınacak", + "编辑成功": "Başarıyı düzenle", + "厂商": "Üretici", + "型号": "Model", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Şifre oluşturulduktan sonra, lütfen aynı gün 23:59 'dan önce aktivasyon için bir kez kullanın, aksi takdirde saat 0'dan sonra geçersiz olacaktır. Şifre etkinleştirildikten sonra, geçerlilik süresi içinde sınırsız kez kullanılabilir.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Şifre oluşturulduktan sonra, lütfen aynı gün 23:59 'dan önce kullanın, aksi takdirde saat 0'dan sonra geçersiz olacaktır. Açık kod, bugün saat 0'dan önce üretilen tüm şifreleri temizlemek için kullanılır.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Şifre oluşturulduktan sonra, lütfen aynı gün 23:59 'dan önce kullanın, aksi takdirde saat 0'dan sonra geçersiz olacaktır.", + "清空密码底部提示": "Şifre, boşaltma gününde 23:59 'a kadar geçerlidir.", + "相机": "Kamera", + "相册": "Fotoğraflar", + "读写": "Depolama", + "定位": "Yer", + "需要访问相机权限才能拍照上传文件例如头像上传": "Fotoğraf çekmek ve profil resmi yüklemek gibi dosyaları yüklemek için kameraya erişim gereklidir", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Albüm görüntülerini kullanarak dosya ve avatarları yüklemek için kameraya erişim gereklidir", + "需要访问读写权限才能使用本地图片上传头像": "Yerel görüntüleri kullanarak avatarları yüklemek için okuma ve yazma izinlerine erişim gereklidir", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Ekle tuşu işlevini kullanmak için konum bilgilerine erişim gereklidir", + "申请": "Uygulama", + "权限": "Izin izni", + "不允许": "İzin verilmiyor", + "允许": "İzin verilir", + "权限被拒绝": "İzin reddedildi", + "请手动在系统设置中开启": "Lütfen sistem ayarlarında manuel olarak etkinleştirin", + "权限以继续使用应用": "Uygulamayı kullanmaya devam etmek için izin.", + "去设置": "Git kurmak", + "当前网络": "Mevcut ağ", + "位置信息": "Konum bilgisi", + "请输入wifi名称": "Lütfen wifi adını girin", + "虹膜": "Iris", + "手掌": "Palmiye", + "商城": "Alışveriş merkezi", + "我的": "Benim", + "微信公众号推送": "Wechat kamu hesabı", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Alarm mesajları almak için wechat açmak için, ilk önce skye akıllı kilit wechat kamu hesabına dikkat etmeniz gerekir, lütfen qr kodunu kaydedin ve ayarları taramak için wechat'i kullanın", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Ekle tuş fonksiyonunun konum bilgilerini kullanmak için bluetooth izinlerine erişim gereklidir", + "请输入Email": "Email girin", + "请输入手机号": "Telefon numaranızı girin", + "家人到家": "Aile üyesi eve geldi", + "添加家人": "Aile üyesini ekle", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Kilit internete bağlı değilse, şifre, kart, parmak izi ve diğer kapı açma yöntemleri için hatırlatıcılar zamanında gönderilemez.", + "消息提醒": "Hatırlatma", + "开门通知": "Açılış bildirimi", + "N天未开门": "Kapı açılmadan n gün", + "门未关好": "Kapı kapalı değil", + "防拆报警": "Sabotaj alarmı", + "低电量提醒": "Düşük pil", + "胁迫开门": "Zorla kapı açma", + "有人按门铃": "Birisi kapı zili çalıyor", + "有人出现在门口": "Birisi kapıda görünür", + "提醒方式": "Hatırlatma yöntemi", + "开门方式": "Kapı açma yöntemi", + "请选择": "Lütfen seçin", + "家人": "Aile üyesi", + "保存": "Kaydet", + "APP推送": "App itin", + "管理员": "Yönetici", + "未启用": "Etkin değil", + "已启用": "Etkin", + "省电模式": "Güç tasarrufu modu", + "逗留抓拍模式": "Yakalama modunu koru", + "实时监控模式": "Gerçek zamanlı izleme modu", + "自定义模式": "Özel mod", + "猫眼设置": "Kedi gözü ayarı", + "猫眼工作模式": "Kedi gözü çalışma modu", + "自动亮屏": "Otomatik parlak ekran", + "亮屏持续时间": "Ekran zamanında", + "逗留警告": "Uyarı kal", + "异常警告": "Anormal uyarı", + "短信提醒": "Sms", + "邮件提醒": "E-posta", + "N天未开门提醒": "Kapı açılmadan n gün", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Birisi sizi kilidi açmaya zorlarsa, bu parmak izini kullanabilirsiniz. Alarm mesajı yöneticilere gönderilecektir. bu özelliği kullanmak için lütfen kilidinizin çevrimiçi olduğundan emin olun.", + "胁迫指纹": "Zorla parmak izi", + "指纹列表": "Parmak izi listesi", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Ayarlanan süreden sonra, kilit açılmazsa, sistem belirlenen alıcıya bir hatırlatma mesajı gönderir. Bu işlev, kilidin internete bağlanmasını gerektirir.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Hatırlatıcıyı etkinleştirdikten sonra, kilit pili % 20, % 10 ve % 5'in altında olduğunda, sistem belirlenen alıcıya bir hatırlatma mesajı gönderir.", + "未开门时间": "Kapı açılmadan günler", + "添加和使用面容开锁时:": "Kilidini açarken yüzü ekleyin ve kullanın:", + "关锁": "Kilidi kapat", + "功能": "Fonksiyon", + "配件": "Parçalar", + "云存": "Bulut depolama alanı", + "本地": "Bu yer", + "3天滚动储存": "3 gün haddeleme depolama", + "去升级": "Şimdi yükselt", + "下载列表": "İndirme listesi", + "已下载": "İndirilen", + "全部视频": "Tüm videolar", + "已为本设备免费提供3大滚动视频储存服务": "Bu cihaz için üç kaydırma video depolama hizmeti ücretsiz olarak sağlanmıştır", + "视频播放": "Video oynatma", + "全选": "Hepsi", + "请选择要删除的视频": "Lütfen silmek istediğiniz videoyu seçin", + "请选择要下载的视频": "Lütfen indirmek istediğiniz videoyu seçin", + "欢迎使用": "Kullanmak hoş geldiniz", + "用户协议和隐私政策概要": "Kullanıcı sözleşmesi ve gizlilik politikasının özeti", + "协议概要": "Protokol özeti", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Bu uygulamayı kullandığınız için teşekkür ederiz. Kişisel bilgilerinize ve gizlilik korumanıza büyük önem veriyoruz. Bu ürünü kullanmadan önce lütfen dikkatlice okuyunuz", + "《用户协议》": "Kullanıcı şartları", + "和": "Ve", + "《隐私政策》": "Privacy gizlilik politikası 》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Tüm içeriği. \"Kabul et\" i tıklayarak, tüm şartları kabul edip kabul edersiniz. Kabul etmemeyi seçerseniz, ürünlerimizi ve hizmetlerimizi kullanamazsınız ve uygulamadan çıkacaksınız.", + "不同意": "Katılmıyorum", + "同意": "Katılıyorum", + "该功能是高级功能,请开通后再使用": "Bu gelişmiş fonksiyon. Lütfen önce etkinleştirin.", + "常用程序": "Ortak programlar", + "该锁已被重置": "Kilit sıfırlandı", + "需要访问读写权限才能使用手动升级固件": "Firmware manuel olarak yükseltmek için okuma ve yazma izinlerine erişim gereklidir", + "错误D固件,请选择正确的文件": "Yanlış firmware, lütfen doğru dosyayı seçin", + "非SYD固件,请选择正确的文件": "Syd firmware olmayan, lütfen doğru dosyayı seçin", + "文件校验失败 0x01": "Dosya doğrulama başarısız oldu 0x01", + "解析元数据失败,请选择正确的文件": "Meta verileri ayrıştırılamadı, lütfen doğru dosyayı seçin", + "文件校验失败 0x02": "Dosya doğrulaması başarısız oldu 0x02", + "文件校验失败 0x03": "Dosya doğrulama başarısız oldu 0x03", + "固件升级完成": "Firmware yükseltmesi tamamlandı", + "记录": "Kayıtlar", + "开通高级功能后才可以对锁进行管理": "Kilitleri yönetmek için lütfen önce gelişmiş işlevi etkinleştirin.", + "去开通": "Etkinleştir", + "实名认证": "Gerçek isim kimlik doğrulaması", + "当前剩余数量": "Kalan kalan", + "购买": "Satın al", + "实名认证为付费功能,请购买后再使用": "Gerçek ad kimlik doğrulaması ücretli bir işlemdir, lütfen satın aldıktan sonra kullanın", + "密码不一致哦": "Şifreler tutarsız", + "退出添加": "Eklemeyi bırak", + "管理员已满": "Yönetici tam", + "用户已满": "Kullanıcı dolu", + "锁上面添加指纹已满": "Kilit üzerinde parmak izi ekle dolu", + "指纹已存在": "Parmak izi zaten var.", + "锁上面添加人脸已满": "Yukarıdaki kilit yüz dolu", + "人脸已存在": "Yüz zaten var", + "锁上面添加卡已满": "Yukarıdaki kilit kart ekle dolu", + "卡已存在": "Kart zaten var", + "锁上面添加密码已满": "Yukarıdaki kilit şifre ekle dolu", + "密码已存在": "Aynı bir şifre zaten var. lütfen farklı bir tane seçin", + "请输入密码": "Lütfen şifreyi girin", + "暂无密码,无需重置": "Şifre yok, sıfırlamaya gerek yok", + "真实姓名": "Gerçek isim", + "身份证号": "Kimlik numarası", + "请输入真实姓名": "Lütfen gerçek adınızı girin", + "请输入身份证号": "Lütfen kimlik numaranızı girin", + "请输入身份证号和真实姓名": "Lütfen kimlik numaranızı ve gerçek adınızı girin", + "点击返回设备配对": "Cihaz eşleştirmesine dokunun", + "无法连接?尝试升级": "Bağlanamıyor mu? yükseltme girişimi", + "固件升级提示": "Firmware yükseltme istemi", + "请先获取固件文件到手机本地,再选择升级": "Lütfen önce firmware dosyasını yerel telefona alın ve ardından yükseltmeyi seçin", + "固件升级中": "Firmware yükseltiliyor", + "取消升级": "Yükseltmeyi iptal et", + "固件传输中": "Transit firmware", + "关闭": "Kapat", + "传输中'": "Transit", + "操作记录": "Kayıtlar", + "修改姓名": "İsim düzenleme", + "传输中": "Transit", + "发送人": "Tarafından verilen", + "发送时间": "Verilen zaman", + "钥匙详情": "Ekey bilgisi", + "姓名": "İsim", + "发送": "Gönder", + "请确认姓名全名和身份证号码是否正确": "Lütfen tam ad ve kimlik numarasının doğru olduğunu onaylayın", + "传输期间请勿离开当前页面": "Aktarım sırasında geçerli sayfayı bırakmayın", + "机型": "Modeller", + "硬件版本": "Donanım sürümü", + "固件版本": "Firmware sürümü", + "手动升级": "Manuel yükseltme", + "设备连接中...": "Cihaz bağlantısı...", + "未避免异常情况,请在门打开时升级": "Kaçınılmaz istisnalar, kapı açık olduğunda lütfen yükseltin", + "钥匙无效": "Anahtar geçersiz", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Kilide bağlanamıyor. lütfen telefonunuzun bluetooth cihazını yeniden başlatın ve tekrar deneyin.", + "如果是全自动锁,请使屏幕变亮": "Tam otomatik bir kilit ise, lütfen ekranı daha parlak hale getirin", + "正在尝试闭锁……": "Kilitlemeye çalışıyorum. lütfen bekle...", + "清空记录": "Kayıtları temizle", + "是否要删除操作记录?": "Kayıtları silmeye devam mı?", + "被删除的记录不能恢复": "Silindikten sonra kayıtlar geri alınamaz.", + "全部事件": "Tüm etkinlikler", + "开锁事件": "Etkinliğin kilidini aç", + "异常事件": "Anormal olay", + "门铃事件": "Kapı zili olayı", + "视频事件": "Video etkinliği", + "请开启蓝牙": "Lütfen bluetooth'u açın", + "请选择有效日": "Lütfen etkili günü seçin", + "公司名字长度不能小于 6 ": "Şirket adının uzunluğu 6'dan az olamaz", + "已是最新版本": "Güncelleme yok", + "新建短信模版": "Sms şablonu oluşturmak", + "新建邮件模版": "Creat e-posta şablonu", + "自定义短信模版": "Sms şablonu", + "自定义邮件模版": "E-posta şablonu", + "名称": "İsim", + "星星锁": "Yıldız kilidi", + "无考勤记录": "Kayıt yok", + "大家干劲十足": "Herkes zamanında gelir", + "工作时长未出炉": "Çalışma saatleri yok", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Ülke/bölge seçimi veri güvenliğini etkileyecektir. şu anda arnavutluk'u seçtiniz, lütfen devam etmeden önce onaylayın.", + "确认国家或地区": "Ülke/bölgeyi onaylayın", + "我知道了": "Anladım", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Önemli güncellemeleri almak için lütfen 'ok' seçeneğini tıklayın ve ayarlardaki bildirimleri etkinleştirin.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Açtıktan sonra, kilit üzerindeki ayar tuşuna uzun süre basarak tekrar açabilirsiniz ve uygulamayla yeniden ekleyebilirsiniz.", + "已有": "Akım", + "新增": "Yeni", + "账号格式错误": "Kötü format", + "接收者信息为空": "Alıcı bilgileri boş", + "请输入时间(秒)": "Lütfen zamanı girin (sn)", + "加载数据失败": "Veri yüklenemedi", + "重试": "Tekrar dene", + "升级中,是否退出": "Yükseltme sırasında, çıkmak için olsun", + "下一步": "Sonraki", + "公寓": "Daire", + "个人用户": "Kişisel", + "星寓": "Yıldız daire", + "账号": "Hesap", + "请输入手机号或email": "Telefon numarası veya e-posta", + "请输入星寓管理员的账号": "Lütfen yıldız daire yöneticisinin hesabını girin", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Seçilen kilidin tüm verileri alıcıya kalıcı olarak aktarılacaktır.", + "暂不支持跨平台转移,敬请期待": "Çapraz platform transferi şu an için desteklenmiyor, lütfen dört gözle bekleyin", + "移除坏锁": "Hatalı/hasarlı kilitleri çöp kutusuna taşı", + "转移确认": "Aktarımı onaylayın", + "本次共转移": "Bu sefer toplam", + "把智能锁": "Akıllı kilit", + "确认": "Tamam", + "移除成功": "Başarıyla kaldır", + "转移成功": "Transfer başarısı", + "该已锁被删除": "Kilitli silindi", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Yetkili yönetici sadece parola, ekeys ve etccreated tarafından yönetilebilir.", + "添加授权管理员": "Yönetici oluştur", + "导出记录": "İhracat kayıtları", + "选择时间段": "Zaman dilimini seç", + "导出": "Ihracat", + "批量导出": "Toplu ihracat", + "读取记录": "Kayıtları yenileyin", + "设备": "Cihaz", + "消息": "Mesajlar", + "智能分析": "Akıllı analiz", + "精准识别设备事件,过滤无效信息": "Cihaz etkinliklerini doğru bir şekilde tanımlayın ve geçersiz bilgileri filtreleyin", + "系统设置": "Sistem ayarları", + "系统的全局配置在此项内进行设置": "Sistemin küresel konfigürasyonu bu öğede ayarlanır", + "导出操作记录": "İhracat kayıtları", + "立即查看": "Görünüm", + "导出成功": "Başarıyla ihraç edildi", + "发送钥匙": "Ekey gönder", + "进度": "Oran", + "失败": "Başarısız oldu", + "人脸详情": "Yüz detayları", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Birisi kapının önünde yaklaşık 1,5 metre hissettiğinde, yüz tanıma kilidi otomatik olarak başlatılacaktır.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Birisi kapının önünde yaklaşık 0.8 metre hissettiğinde, yüz tanıma kilidi otomatik olarak başlatılacaktır.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Birisi kapının önünde yaklaşık 0.5 metre hissettiğinde, yüz tanıma kilidi otomatik olarak başlatılacaktır.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Algılama mesafesi kapatıldı, yüz tanıma kilidini açmak için klavyedeki herhangi bir tuşa manuel olarak dokunmanız gerekir.", + "防误开已打开,开锁后": "Anti-hata açılması açık ve açıldıktan sonra", + "秒内不可使用面容开锁": "Yüz açma saniye içinde kullanılamaz", + "掌静脉": "Palmiye damarı", + "添加掌静脉": "Palmiye damarı ekle", + "胁迫掌静脉": "Zorla palm ven", + "请不要将胁迫掌静脉用于日常开锁": "Günlük kilit açma için lütfen zorlama hurma damarları kullanmayın", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Kilide bağlı, lütfen doğal olarak avucunuzu açın, avuç içi kameraya bakıyor", + "掌静脉详情": "Palm ven detayları", + "掌静脉号": "Palm ven numarası", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth açık değil, lütfen ayarlarda bluetooth'u açın", + "删除用户时,会将用户拥有的钥匙一起删除。": "Bir kullanıcı silinirse, kullanıcı ile ilişkili herhangi bir ekeys de silinecektir.", + "配置网络": "Ağı yapılandır", + "你好": "Merhaba", + "成功": "Başarılı", + "类型选择": "Tip seç", + "请选择要使用哪种类型": "Lütfen hangi türü kullanacağınızı seçin", + "系统邮件(推荐)": "Sistem e-postası (önerilir)", + "系统短信(推荐)": "Sistem sms (önerilir)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "E-posta bu uygulamadan gönderilecektir. lütfen önce e-posta paketini satın alın.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Sms bu uygulamadan gönderilecektir. lütfen önce e-posta paketini satın alın.", + "个人邮件": "Kişisel e-posta", + "个人短信": "Kişisel sms", + "邮件将从你的个人邮箱发给用户": "E-posta kişisel e-posta hesabınızdan gönderilecektir.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Sms mesajı kişisel telefon numaranızdan gönderilecektir. telekom operatörünüze ödeme yaparsınız.", + "为了更好地应用体验,请确定权限": "Daha iyi bir uygulama deneyimi için lütfen izinleri onaylayın", + "您第一次拒绝权限,请确定权限": "İlk kez izin vermediniz, lütfen izni onaylayın", + "您第二次拒绝权限,请去应用设置开启权限": "İkinci kez izin vermeyi reddettiniz, lütfen izin almak için uygulama ayarlarına gidin", + "去应用市场": "App store'a git", + "温馨提示": "Sıcak istemi", + "关闭应用": "Uygulamayı kapat", + "开启微信接收报警消息需要先关注": "Alarm mesajları almak için wechat'i açmak için takip etmeniz gerekiyor", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat genel hesabı, qr kodunu kaydedin ve ayarları taramak için wechat'i kullanın", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Gerçek ad kimlik doğrulaması ücretli bir fonksiyondur, lütfen satın almak ve kullanmak için kilit yöneticisine başvurun", + "位置权限": "Konum izni", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Lütfen konumunuzu kullanmak için uygulamayı verin. ble kilitlerini ve ağ geçitlerini taramak için kullanılır.", + "相机/相册权限": "Kamera/albüm izni", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Lütfen fotoğraf ve dosyaları depodan okumak ve yazmak için uygulamayı verin.", + "点击选择": "Seçmek için tıklayın", + "微信": "Wechat", + "朋友圈": "Anlar", + "QQ": "Qq", + "QQ空间": "Qqzone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Bağlantı", + "今天": "Bugün", + "密码错误": "Geçersiz şifre", + "网络中断": "Ağ kesintisi", + "钥匙不存在": "Anahtar mevcut değil", + "钥匙过期": "Anahtarın süresi doldu", + "钥匙已存在": "Anahtar zaten var", + "密码失效": "Şifre geçersiz", + "门锁时间异常": "Kapı kilidi zaman anormal", + "APP(手机)未联网": "App (cep telefonu) internete bağlı değil", + "数据不存在": "Veri mevcut değil", + "待接收": "Bereceived", + "已冻结": "Dondurulmuş", + "已删除": "Silindi", + "未知": "Bilinmeyen", + "拖动下方滑块完成拼图": "Kaydırıcıyı doğru postion'a sürükleyin", + "验证成功": "Doğrulama başarısı", + "验证失败": "Doğrulama başarısız oldu", + "向右拖动滑块填充拼图": "Bulmacayı doldurmak için kaydırıcıyı sağa sürükleyin", + "请先获取到位置信息哦": "Lütfen önce konum bilgilerini alın", + "请选择国家": "Lütfen bir ülke seçin", + "获取锁信息": "Kilit bilgilerini al", + "锁数据异常,请重试": "Kilit verileri anormal, lütfen tekrar deneyin", + "连接设备中...": "Bağlantı cihazı...", + "把锁": "Kilitler", + "条": "Şerit", + "封": "Mühür", + "次": "Zamanlar", + "支付成功": "Başarı ödemek", + "查看详情": "Detayları görüntüle", + "请输入模板名称": "Lütfen şablon adını girin", + "模版类型": "Tipi", + "再返回一次退出": "Tekrar çık", + "请先添加锁": "Lütfen önce kilidi ekleyin", + "可视对讲": "Görsel interkom", + "详细日志": "Detaylı günlük", + "已复制到剪切板": "Kopyalanan", + "拍照": "Fotoğraf", + "从相册选择": "Albümden seçim yap", + "选择问题": "Lütfen bir soru seçin", + "确认长度不足8位": "Uzunluğu 8 basamaktan az onaylayın", + "新密码长度不足8位": "Yeni şifre uzunluğu 8 basamaktan az", + "两次密码不一致": "Şifre uyuşmazlığı. lütfen tekrar deneyin", + "请点击获取验证码,验证码将发送到": "Lütfen bir doğrulama kodu alın. kod gönderilecek", + "切换": "Anahtarı", + "验证": "Doğrulayın", + "验证成功,账号已删除": "Doğrulama başarılı, hesap silindi", + "该密码不是自定义密码,无法修改": "Bu şifre özel bir şifre değildir ve değiştirilemez", + "请选择设备要关联哪些姓名": "Lütfen cihazın hangi isimlerle ilişkili olması gerektiğini seçin", + "请选择姓名要关联哪些设备": "Lütfen ismin hangi cihazlarla ilişkili olması gerektiğini seçin", + "确定要移除所选中的坏锁吗?": "Arızalı kilidi çıkarın mı?", + "邮件通知": "E-posta yoluyla bilgilendirin", + "短信通知": "Sms ile bildir", + "您好,您的授权管理员生成成功": "Merhaba, yetkili yöneticiniz başarıyla oluşturuldu", + "请输入接收者姓名": "Lütfen buraya girin", + "版本更新": "Sürüm güncellemesi", + "下次再说": "Bir dahaki sefere", + "配网成功": "Ağ dağıtım başarısı", + "配网失败": "Ağ dağıtımı başarısız oldu", + "该锁的无线键盘都将被删除": "Bu kilit için tüm kablosuz tuş takımı silinecek", + "实时画面": "Gerçek zamanlı resim", + "适合门口较为安全的环境。": "Kapıda nispeten güvenli ortamlar için uygundur.", + "仅发生特定事件才录像,并可查看实时画面。": "Sadece belirli etkinlikler kaydedilir ve gerçek zamanlı resim görüntülenebilir.", + "一般情况下,满电可使用7-8个月": "Normal şartlar altında, tam olarak şarj edildiğinde 7-8 ay boyunca kullanılabilir", + "有人逗留或发生特定事件才录像,可随时查看": "Birisi kalır veya belirli olaylar kaydedilir ve istediğiniz zaman görüntülenebilir", + "实时画面。": "Gerçek zamanlı resim.", + "一般情况下,满电可使用5~6个月。": "Normal şartlar altında, tam olarak şarj edildiğinde 5 ~ 6 ay boyunca kullanılabilir.", + "适合门口人员复杂、较不安全的环境。": "Kapıda karmaşık ve nispeten güvensiz ortamlar için uygundur.", + "有人出现就录像,可随时查看实时画面。": "Birisi göründüğünde kaydedin ve gerçek zamanlı resmi istediğiniz zaman görüntüleyin.", + "一般情况下,满电可使用2~4个月。": "Normal şartlar altında, tam olarak şarj edildiğinde 2 ~ 4 ay boyunca kullanılabilir.", + "根据您家门口实际情况设置录像和实时画面功能。": "Kapınızdaki gerçek duruma göre video ve gerçek zamanlı resim işlevlerini ayarlayın.", + "可使用时长由具体设置决定。": "Kullanım süresi belirli ayarlar tarafından belirlenir.", + "查看": "Görünüm", + "有人按门铃或发生": "Birisi kapı zili çalar veya", + "异常事件时": "Anormal olay", + "不录像": "Video yok", + "有人出现、按门铃": "Birisi görünür, kapı zili çalar", + "或发生异常事件时": "Veya anormal bir olay meydana gelir", + "逗留达到10秒": "10 saniye kal", + "约1.5米": "Yaklaşık 1.5 metre", + "随时": "Her zaman", + "立即录像": "Hemen kayıt yap", + "录像时机": "Video zamanlaması", + "有人出现时录像": "Birisi göründüğünde kayıt olun", + "人体侦测距离": "İnsan algılama mesafesi", + "查看实时画面": "Gerçek zamanlı resmi görüntüle", + "自定义时间": "Özel zaman", + "当日": "Bugün", + "次日": "Ertesi gün", + "自定义时段": "Özel zaman dönemi", + "发生事件时查看": "Bir olay oluştuğunda görüntüle", + "实时查看": "Gerçek zamanlı görünüm", + "有人在门口出现10秒后开始录像。": "Birisi kayıttan önce 10 saniye boyunca kapıda görünür.", + "有人按门铃时立即录像。": "Birisi kapı zilini çaldığında hemen kayıt yapın.", + "有人出现在门前1.5米范围时启动录像": "Birisi kapının önünde 1,5 metre içinde göründüğünde kaydı başlat", + "约0.8米": "Yaklaşık 0.8 metre", + "约3.0米": "Yaklaşık 3.0 metre", + "添加指纹失败": "Operasyon başarısız oldu.", + "项": "Öğeler", + "播放中": "Oynamak", + "下载": "Indir", + "暂无下载内容": "İndirme içeriği yok", + "亮度": "Parlaklık", + "音量": "Hacim", + "快进至": "Hızlı ileri", + "快退至": "Geri sarma", + "暂无视频信息": "Video bilgisi yok", + "加载出错": "Yükleme hatası", + "请单人正对门锁,距离一个成年人手臂长度": "Lütfen kapı kilidinin önünde tek başına, bir kolun uzunluğunda durun", + "(约0.6米)。": "(Yaklaşık 0.6 metre).", + "保持脸部无遮挡,露出五官。": "Yüzünüzü engelsiz tutun ve yüz özelliklerinizi gösterin.", + "准备好了,开始添加": "Hazır, eklemeye başla", + "正在录入中...": "Kayıt...", + "添加人脸失败": "Yüz ekleyemedi", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Sıfırladıktan sonra, kilidin yüzleri silinecektir. Sıfırlamak istediğine emin misin?", + "人脸号": "Yüz numarası", + "虹膜详情": "Iris detayları", + "虹膜号": "Iris numarası", + "选择设备类型": "Cihaz tipini seç", + "照明灯具": "Aydınlatma armatürleri", + "电动窗帘": "Elektrikli perdeler", + "门窗传感器": "Kapı ve pencere sensörü", + "传感器": "Sensör", + "清除数据成功": "Veri başarıyla temizlendi", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Kilit internete bağlı değildir, bu nedenle şifre, kart, parmak izi ve diğer kapı açma yöntemlerinin geri kazanılması gerçek zamanlı olarak yüklenemez.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Tarihi kayıtları tutmanız gerekiyorsa, bunları ihraç edebilirsiniz.", + "看不到操作记录,可能原因有": "Operasyon kayıtlarını, olası nedenleri göremiyorum", + "操作记录详情": "Operasyon kayıt detayları", + "操作时间": "Çalışma süresi", + "此模块功能需要锁联网后设置方可生效": "Kilit, internete bağlandıktan sonra bu modül fonksiyonunun ayarlanması gerekiyor.", + "用户已存在": "Kullanıcı zaten var", + "钥匙数量已到上限": "Anahtar sayısı üst sınıra ulaştı", + "附近没有可用网关": "Yakınlarda mevcut ağ geçidi yok", + "正在创建安全连接...": "Güvenli bir bağlantı yaratmak...", + "监视状态下不能发送录音": "İzleme modunda kayıt gönderemiyorum", + "挂断": "Telefonu kapat", + "监视中暂不能开锁": "Kilit açma izleme sırasında mevcut değildir", + "长按说话": "Basın ve konuşmaya devam edin", + "松开发送": "Göndermek için serbest bırakın", + "请输入6位数字开锁密码": "Lütfen 6 haneli bir kilit açma şifresi girin", + "请输入开锁密码": "Lütfen kilit açma şifresini girin", + "接收者在有效期内可以不限次数使用": "Alıcılar, geçerlilik süresi içinde ekey'leri sınırsız süre için kullanabilirler.", + "接收者可以使用此App开关锁": "Alıcı bu uygulama tarafından kilitlenebilir/kilidini açabilir.", + "单次钥匙有效期为1小时,只能使用一次": "Bir kerelik ekey bir saat için geçerlidir ve sadece bir kez kullanılabilir.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Alıcılar, ekey'leri sabit döngü süresi içinde sınırsız kez kullanabilir.", + "获取模板失败": "Şablonu alamadı", + "微信通知": "Wechat bildirimi", + "系统短信": "Sistem sms", + "系统邮件": "Sistem e-postası", + "模板": "Şablon", + "新建模版": "Şablon oluştur", + "您好,您的密码是": "Merhaba, şifreniz", + "密码名字": "Şifre adı", + "请输入6-9位密码": "Lütfen 6-9 haneli bir şifre girin", + "设置密码": "Şifre ayarla", + "操作成功,密码为": "Başarılı. şifre", + "类型:自定义-永久": "Tipi: özel-kalıcı", + "实时播放": "Gerçek zamanlı oynatma", + "点击对讲": "Interkom için tıklayın", + "长按开锁": "Kilidini açmak için uzun basın", + "接听失败": "Cevap veremedi", + "请在锁设置中开启远程开锁": "Lütfen kilit ayarlarında uzaktan kilit açma özelliğini etkinleştirin", + "接听": "Cevap ver", + "截图已保存到相册": "Ekran görüntüsü albüme kaydedildi", + "添加遥控": "Uzaktan kumanda ekle", + "已连接到锁,请按遥控": "Kilide bağlı, lütfen uzaktan kumandaya basın", + "遥控号": "Uzaktan kumanda numarası", + "遥控详情": "Uzaktan kumanda detayları", + "照明": "Aydınlatma", + "退出演示模式": "Çıkış demo modu", + "提示:当前界面为展示界面,添加设备后才能继续使用": "İpucu: mevcut arayüz bir ekran arayüzüdür. Cihazı ekledikten sonra kullanmaya devam edebilirsiniz.", + "门已上锁": "Kapı kilitli", + "您的账号在异地登录,如非本人,请尽快修改密码": "Hesabınız yeni bir cihazdan giriş yapmak için kullanıldı", + "开门成功": "Kapıyı başarıyla aç", + "开门失败": "Kapıyı açamadı", + "呼叫提醒": "Çağrı hatırlatıcısı", + "收到来自": "Alınan", + "锁的呼叫": "Kilit çağrısı", + "加载数据中": "Veri yükleme", + "搜索所有锁类型": "Tüm kilit tiplerini arayın", + "锁电量更新时间": "Pil güncelleme süresini kilitle", + "1月": "Jan", + "2月": "Feb", + "3月": "Mar", + "4月": "Apr", + "5月": "Mayıs", + "6月": "Jun", + "7月": "Jul", + "8月": "Aug", + "9月": "Sep", + "10月": "Oct", + "11月": "Nov", + "12月": "Dec", + "热门城市": "Sıcak şehirler", + "导出锁数据": "Kilit verilerini dışa aktar", + "一键开锁": "Tek tıklama kilidini", + "已开通": "Açıldı", + "编辑员工": "Personeli düzenle", + "一": "Bir tane", + "二": "Iki", + "三": "Üç", + "四": "Dört", + "五": "Beş", + "六": "Altı", + "日": "Güneş", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?", + "在线": "Çevrimiçi", + "离线": "Çevrimdışı", + "购买记录": "Satın alma kaydı", + "使用记录": "Kullanıcı kaydı", + "失效时间要大于当前时间": "Son kullanma süresi mevcut süreden daha uzun olmalıdır", + "修改名字": "İsim düzenleme", + "时": "Saat", + "分": "Dakika", + "Amazon Alexa": "Amazon alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Kilit durumunu açmak, kilitlemek ve kontrol etmek için alexa'yı kullanabilirsiniz", + "支持的国家": "Desteklenen ülkeler", + "支持的国家值": "Abd, kanada, İngiltere, avustralya, hindistan, almanya, fransa, İtalya, İspanya, japonya", + "操作流程": "Operasyon süreci", + "操作流程值": "1 akıllı kilit uygulaması ile bir kilit ve ağ geçidi ekleyin\n\n2 uygulamadaki kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapatılır). Bu seçeneğiniz yoksa, kilit alexa'yı desteklemiyor\n\n3 alexa'ya beceri ekleyin ve bunları akıllı kilit uygulamasının hesabı ve şifresiyle yetkilendirin. Yetkilendirme başarılı olduktan sonra, hesap altındaki cihazları keşfedebilirsiniz\n\n4 alexa uygulamasında kilidi bulun, ses açma işlevini açın ve dil şifresini ayarlayın\n\n5 kilit alexa ile çalıştırılabilir", + "Google Home": "Google ev", + "Action name": "Eylem adı", + "ScienerSmart": "Scienersmart", + "支持的语言": "Desteklenen diller", + "英语": "İngilizce", + "Google Home操作流程的值": "1. kilitler ve ağ geçitleri eklemek için akıllı kilit uygulamasını kullanın\n\n2. uygulamadaki kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapatılır). Bu seçenek olmadan, kilit google home'u desteklemiyor\n\n3. google home uygulamasını yükleyin ve sol üst köşedeki \"\" düğmesine tıklayın\n\n4. ayarlar sayfasında \"google ile çalış\" ı seçin\n\n5. \"scienersmart\" için arama yapın ve yetkilendirmek için akıllı kilit uygulaması hesabını ve şifresini kullanın", + "密码需至少包含数字/字母/字符中的2种组合": "Şifre aşağıdakilerden en az 2 tane içermelidir: sayılar, harfler ve özel karakterler", + "已开锁": "Unlocked", + "已闭锁": "Kilitli", + "两次密码不一致哦": "Şifreler tutarsız", + "中功率": "Orta güç", + "常规使用": "Düzenli kullanım", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Ağ geçidi açıldıktan sonra, sıfırlama düğmesine 5 saniye basılı tutun ve gösterge ışığı dönüşümlü olarak yanıp söndüğünde İleri'ye tıklayın.", + "扫描设备": "Tarama cihazı", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Silme başarısız oldu. Ağ geçidi çevrimdışı geçmiş olabilir. Verileri silmeye zorlamak ister misiniz?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_tw.json b/lan/lan_tw.json new file mode 100644 index 00000000..38ea07af --- /dev/null +++ b/lan/lan_tw.json @@ -0,0 +1,1123 @@ +{ + "星锁": "星形鎖", + "锁通通": "鎖定通過", + "点击开锁,长按闭锁": "觸摸以解鎖,按住以鎖定", + "考勤": "出席情況", + "考勤设置": "考勤設置", + "电子钥匙": "EKeys", + "添加卡": "添加卡片", + "卡号": "卡號", + "添加指纹": "添加指紋", + "指纹号": "指紋編號", + "遥控": "遠程", + "添加人脸": "添加面", + "门锁日志": "門鎖日誌", + "密码号": "密碼號碼", + "添加者": "操作員", + "添加时间": "時間", + "重置": "重置", + "请输入手机号或者邮箱": "電話號碼或電子郵件", + "工作时间": "工作時間", + "工作日设置": "工作日設置", + "星期一": "星期一", + "星期二": "星期二", + "星期三": "星期三", + "星期四": "星期四", + "星期五": "星期五", + "星期六": "星期六", + "星期日": "周日", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Mon", + "周二": "星期二", + "周三": "星期三", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "太陽", + "群发钥匙": "發送多個ekeys", + "锁": "鎖", + "请添加": "收件人", + "允许远程开锁": "遠程解鎖", + "请输入验证码": "驗證碼", + "获取密码": "生成密碼", + "请给密码命名": "輸入此密碼的名稱", + "密码有限期为6个小时,只能使用一次": "此密碼必須在當前時間後的6小時內使用,否則出於安全原因將被暫停。 此密碼只能使用一次。", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "手動輸入6-9位數字作為密碼。 可以通過手機藍牙在鎖旁邊添加,也可以通過網關遠程添加", + "获取": "獲取", + "添加": "添加", + "删除公司": "刪除公司", + "密码详情": "密碼信息", + "修改密码": "更改密碼", + "添加虹膜": "添加虹膜", + "添加门磁": "車門傳感器", + "添加无线键盘": "無線鍵盤", + "添加手掌": "添加手掌", + "请输入员工账号": "輸入員工帳戶", + "批量授权锁": "授予多個鎖", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "授權的管理員將具有操作此鎖的多數權限。", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "此功能允許您通過網關遠程解鎖智能鎖。 此功能只能通過藍牙打開或關閉。", + "排列方式": "列表類型", + "早到榜": "早期列表", + "迟到榜": "延遲列表", + "当前模式": "電流模式", + "勤奋榜": "努力工作清單", + "延迟时间": "延遲時間", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "時間過後鎖會自動鎖定,請先解鎖一次,使設置可用。", + "时间": "時間", + "开始时间": "開始時間", + "结束时间": "結束時間", + "工作时间设置": "工作時間設置", + "常开模式": "通道模式", + "常开时间": "在這個時期", + "常开日期": "在這些日子", + "添加员工": "添加工作人員", + "节假日": "節假日", + "打卡方式": "方法", + "员工是否有钥匙": "已經有ekey", + "上班时间": "開始時間", + "下班时间": "關閉時間", + "本周": "本周", + "单休": "一日週末", + "双休": "雙休日", + "单双休": "一個兩天的周末", + "年": "年份", + "月": "月份", + "放假日期": "節假日", + "补班日期": "工作天數", + "添加假日": "添加假日", + "开始日期": "開始日期", + "必填": "必填項", + "结束日期": "結束日期", + "日榜": "每日", + "月榜": "每月", + "考勤记录": "記錄", + "假日信息": "假日信息", + "基本信息": "基礎知識", + "无线键盘": "無線鍵盤", + "选择无线键盘": "添加鍵盤", + "门磁": "車門傳感器", + "自动闭锁": "自動鎖定", + "锁声音": "鎖定聲音", + "防撬报警": "篡改警報", + "重置键": "復位按鈕", + "锁时间": "鎖定時鐘", + "诊断": "診斷", + "上传数据": "上傳數據", + "导入其他锁数据": "從另一個鎖導入", + "锁升级": "固件更新", + "标记房态": "房間狀態", + "开锁提醒": "解鎖通知", + "微信二维码": "解鎖QR碼", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "有電子鑰匙的人,通過微信掃一掃這個二維碼,就可以開門了。 每個鎖的QR碼是不同的。 您可以將其打印出來並粘貼到相應的鎖旁邊", + "锁编号": "鎖號", + "电量": "蓄電池", + "锁分组": "「鎖定」 組", + "选择分组": "選擇組", + "创建新分组": "創建組", + "管理员开锁密码": "管理員密碼", + "更新": "更新", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "電池電量將通過網關或手機藍牙更新", + "当屏幕闪烁时,点击下一步": "鍵盤閃爍時單擊 「下一步」", + "输入*529#或按设置键": "輸入 README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # 或按設置鍵", + "长按重置键2秒": "按住復位按鈕2秒鐘", + "附近的设备": "附近的設備", + "暂无数据": "無數據", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "您將能夠使用門傳感器和網關獲取門狀態。 只允許一個傳感器與鎖關聯。", + "开始": "開始", + "全天": "所有小時", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "您可以為通道模式設置多個時間段,在設置的時間段內,鎖在解鎖後將保持打開狀態。", + "请选择锁音量": "請選擇鎖定音量", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "通過打開,您將聽到鎖發出的聲音", + "低": "低", + "较低": "中低", + "中": "中", + "较高": "中高", + "高": "高", + "开启后,锁被撬动时,会发出报警声": "通過啟用,您可以啟用篡改警報。", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "通過關閉,重置按鈕被禁用。", + "校准时间": "校準時間", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "診斷是讀取鎖內部的配置信息並上傳,以便工作人員分析故障原因", + "上传": "上傳", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "將數據從鎖上載到服務器。 這可能需要幾分鐘", + "请选择要从哪把锁导入": "選擇要從中導入的鎖", + "有新版本": "有新版本", + "当前版本": "當前版本", + "升级": "更新", + "空闲": "空缺", + "已入住": "已占用", + "多语言": "語言", + "添加锁": "添加鎖定", + "锁地址": "鎖地址", + "选择锁类型": "選擇鎖定類型", + "NFC无源锁": "NFC被動鎖", + "添加设备": "添加設備", + "网关": "網關", + "客服": "客戶服務", + "设置": "設置", + "更多设置": "更多設置", + "消息推送": "通知推送", + "锁用户管理": "鎖定用戶", + "拥有的钥匙": "與此用戶關聯的eKeys", + "批量授权": "權限管理", + "关联设备": "關聯設備", + "关联姓名": "關聯名稱", + "转移智能锁": "傳輸鎖", + "选择锁": "屏幕鎖定", + "接收人信息": "收件人", + "转移网关": "傳輸網關", + "锁屏": "屏幕鎖定", + "已关闭": "關", + "已开启": "開啟", + "开启": "打開", + "确定要开启重置键?": "是否繼續啟用重置按鈕?", + "确定要关闭重置键?": "是否繼續禁用重置按鈕?", + "隐藏无效开锁权限": "隱藏無效訪問", + "APP开锁时需手机连网的锁": "需要手機在線的鎖", + "增值服务": "服務", + "关于": "關於", + "退出": "註銷", + "删除账号": "刪除帳戶", + "个人信息": "帳戶信息", + "头像": "頭像", + "昵称": "暱稱", + "请输入昵称": "請輸入您的暱稱", + "修改昵称": "重命名", + "修改账号": "編輯帳戶", + "重置密码": "重置密碼", + "安全问题": "安全問題", + "为了你的账号安全,修改账号前请先使用验证码验证": "為了您的賬號安全,請在修改賬號前使用賬號密碼驗證", + "请输入新账号": "請輸入新帳戶", + "找回密码和登录新设备时,可通过绑定的手机验证": "綁定的電話號碼將用於接收驗證碼。", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "綁定電子郵件將用於接收驗證碼。", + "原密码": "當前密碼", + "新密码": "新密碼", + "确认密码": "確認密碼", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "如果您的手機丟失,您可以通過回答安全問題登錄到新的手機。", + "问题一": "問題1", + "问题二": "問題2", + "问题三": "問題3", + "请输入你的答案": "請鍵入您的答案", + "即将到期": "即將到期", + "去授权": "轉到授權", + "修改名称": "編輯名稱", + "状态": "狀態", + "WiFi名称": "Wifi名稱", + "网络MAC": "網絡MAC", + "网关升级": "網關更新", + "网关连接的锁": "連接到此網關的鎖", + "信号强": "強", + "选择网关类型": "選擇網關類型", + "添加网关": "添加網關", + "重新通电": "重新連接電源", + "指示灯": "指示燈", + "选择网关": "選擇網關", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "不支持5g,請選擇2.4的WiFi。", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "輸入WiFi密碼", + "网关名称": "網關名稱", + "请输入网关名称": "輸入網關名稱", + "IP地址": "IP地址", + "子网掩码": "子網掩碼", + "默认网关": "默認網關", + "自动获取DNS服务器地址": "自動獲取DNS服務器地址", + "首选DNS": "首選DNS", + "备选DNS": "備選DNS", + "不使用静态IP": "不使用靜態ip", + "使用静态IP": "使用靜態ip", + "请输入IP地址": "輸入IP地址", + "请输入子网掩码": "輸入子網掩碼", + "请输入默认网关": "輸入默認網關", + "所有锁": "所有鎖", + "搜索所有类型的锁": "掃描所有類型的鎖", + "门锁": "門鎖", + "挂锁": "掛鎖", + "保险箱锁": "安全鎖", + "智能门禁": "智能訪問控制", + "车位锁": "駐車鎖", + "摸亮触摸屏": "觸摸任意鍵以激活鍵盤", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "請觸摸任意鍵以激活鎖定並將其置於配對模式。 按下一步", + "附近的锁": "附近的鎖", + "如需修改名字请重新命名,点击确定添加锁": "如果要更改名稱,請重命名,單擊好添加鎖定", + "添加锁时,手机必须在锁旁边": "添加鎖時,手機必須在鎖旁邊", + "登录": "登錄", + "注册": "註冊", + "我已阅读并同意": "我已經閱讀並同意", + "验证码": "代碼", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "您的密碼必須包含8-20個字符,並且至少包含兩種類型的數字、字母和符號", + "手机": "電話", + "邮箱": "電子郵件", + "请输入邮箱": "輸入您的電子郵件", + "国家/地区": "國家/地區", + "你所在的国家/地区": "您所在的國家/地區", + "选择国家/地区": "選擇您的國家或地區", + "获取验证码": "獲取代碼", + "商务合作": "業務", + "电脑网页版": "Web系統", + "酒店系统": "酒店系統", + "说明书网页版": "用戶手冊", + "高级功能": "高級功能", + "记录保存": "記錄保留", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS可用於向接收者發送密碼和ekey信息。", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "電子郵件可用於向收件人發送密碼和ekey信息。", + "购买实名认证提示": "啟用該功能後,您需要使用指紋,臉部或帳戶密碼才能打開該應用程序。 3分鐘不用再驗證", + "请选择你希望的实名认证频次": "請選擇您想要的實名認證頻率", + "仅首次": "第一次", + "每日一次": "每天一次", + "每周一次": "每周一次", + "每月一次": "每月一次", + "当前状态": "當前狀態", + "试用中": "在審判中", + "高级功能权益内容": "高級功能", + "短信模板": "短信模板", + "邮件模板": "電子郵件模板", + "发卡工具": "卡編碼器", + "购买高级功能须知": "通知", + "购买高级功能提示": "更高級的功能正在開發中,如果您需要它們,歡迎您根據鎖的數量打開服務。 高級功能僅適用於您自己的鎖。 如果您是授權管理員,請聯繫鎖的頂級管理員以打開服務", + "免费体验": "免費試用", + "立即开通": "現在打開", + "购买短信": "購買短信", + "购买邮件": "購買電子郵件", + "购买实名认证次数": "購買實名認證次數", + "开通高级功能": "啟用高級功能", + "选择套餐": "選擇軟件包", + "支付方式": "付款方式", + "支付宝": "支付寶", + "去支付": "工資", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "允許您自己定義消息。 它用於向他人發送密碼和ekey信息。", + "高级功能仅能用于你自己的锁": "高級功能只能應用自己的鎖。", + "新建模板": "創建模板", + "类型": "類型", + "模版内容": "模板內容", + "预览": "預覽", + "房间名": "房間", + "预计产生短信条数": "估計的消息段", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "此功能允許您隱藏一段時間內無效的密碼,ekeys,卡和指紋。", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "用戶的手機需要在線才能使用應用程序解鎖這些選定的鎖。", + "配置WiFi": "配置WiFi", + "请输入WiFi名字": "請輸入Wifi名稱", + "WiFi配网": "WiFi分發網絡", + "胁迫卡": "應力卡片", + "员工是否有密码": "已有密碼", + "员工是否有卡": "已經有卡", + "员工是否有指纹": "已設置指紋", + "获取钥匙": "獲取密鑰", + "获取卡": "獲取卡片", + "获取指纹": "獲取指紋", + "安全验证": "身份驗證", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "您的所有帳戶信息都將從平台中永久刪除,並且無法恢復。 是否要刪除?", + "监控": "顯示器", + "视频日志": "視頻日誌", + "开门器": "開門器", + "面容开锁": "面部解鎖", + "开门方向设置": "打開方向設置", + "电机功率设置": "電機功率設置", + "开锁时是否需联网": "如果解鎖時需要互聯網", + "选择要加入分组的锁": "選擇要添加到此組的鎖", + "锁数量": "鎖定計數", + "小米IOT平台": "小米IOT平台", + "面容开锁设置": "面解鎖設置", + "感应距离": "感應距離", + "防误开": "防止錯誤打開", + "防误开已关闭,关门后仍可使用面容开锁": "防止誤開已關閉,關門後仍可使用面部解鎖", + "添加和使用面容开锁时": "解鎖時添加和使用面", + "添加和使用面容开锁时提示": "\n1、請盡量保持單人在門前操作;\n2、請站在門鎖前0.5 ~ 0.8米左右,正對門鎖;\n3.請保持臉部通暢,露出五官;\n4,人臉識別異常時,可以觸摸數字鍵盤上的任何鍵手動重啟人臉識別。", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "請根據門鎖的實際情況仔細選擇電機功率:", + "小功率:": "小瓦:", + "耗电少": "更少的功耗", + "大功率": "高功率:", + "大功率提示": "如果解鎖時鎖舌不能正常縮回,或需要驅動", + "开门方向设置提示": "請仔細選擇打開您家的門的方向 (如果選擇了錯誤的方向,您將無法正確打開和關閉門):", + "左开": "向左打開", + "右开": "向右打開", + "判断方法:": "判斷方法:", + "判断方法内容": "那個人站在房子外面,面對入口門。", + "录像时段": "視頻插槽", + "密码": "密碼", + "卡": "卡片", + "指纹": "指紋", + "人脸": "面部", + "配件商城": "鎖商城", + "公司名称": "公司名稱", + "请输入公司名字": "輸入公司名稱", + "提示": "提示", + "是否删除?": "是否刪除?", + "员工信息": "工作人員信息", + "员工": "工作人員", + "打卡方式无效": "不可用", + "中国": "中國", + "选择钥匙": "選擇ekey", + "编辑": "編輯", + "无": "否", + "有": "是", + "请输入姓名": "請輸入名稱", + "获取人脸": "獲取面孔", + "选择密码": "選擇密碼", + "选择卡": "選擇卡片", + "选择指纹": "選擇指紋", + "选择人脸": "選擇面", + "员工是否有人脸": "員工是否有面子", + "同时删除员工钥匙": "刪除他/她的ekey", + "删除": "Delet", + "确定要删除员工吗?": "刪除此員工", + "月统计": "月度統計", + "迟到": "遲到", + "早退": "早點離開", + "未打卡": "無記錄", + "钥匙将在": "此ekey將在", + "天后失效": "天 (s)", + "电量更新时间:": "電池更新時間:", + "新增配件": "添加", + "钥匙不可用": "密鑰不可用", + "正在开锁中...": "正在解鎖...", + "你的钥匙": "你的鑰匙", + "常开模式启动!长按闭锁": "打開模式已啟動! 長按鎖定", + "演示模式": "演示模式", + "请先同意用户协议及隐私政策": "請先同意用戶協議和隱私政策", + "用户协议": "用戶條款", + "隐私政策": "隱私政策", + "注册成功": "註冊成功", + "你所在的": "你在", + "手机号": "電話號碼", + "忘记密码": "忘記密碼", + "重置成功": "重置成功", + "确定要退出吗?": "退出?", + "功能暂未开放": "功能尚未打開", + "设置成功": "設置成功", + "删除成功": "刪除成功", + "单次": "一次性", + "永久": "永久", + "限时": "定時", + "自定义": "自定義", + "清空码": "擦除", + "循环": "經常性", + "工作日": "工作日", + "每日": "每日", + "周末": "周末", + "确定要删除吗?": "是否刪除?", + "该锁的密码都将被删除": "該鎖的所有密碼將被刪除", + "已过期": "無效", + "该锁的电子钥匙都将被删除": "此鎖的所有eKeys將被刪除", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "刪除與此ekey關聯的所有ekey。 此步驟無法撤消!", + "删除钥匙会在用户APP连网后生效": "Ekey將被刪除", + "有效时间": "有效時間", + "接收者": "收件人", + "仅管理自己创建的用户": "只管理自己的用戶", + "远程开锁": "遠程解鎖", + "请输入钥匙名称": "請輸入密鑰名稱", + "修改成功": "修改成功", + "冻结": "凍結", + "解除冻结": "解凍", + "授权": "授權", + "取消授权": "取消授權", + "同时解冻其发送的钥匙": "解凍此用戶發出的所有ekey", + "会在用户APP连网后生效": "當用戶的應用程序連接到網絡時,此ekey將被解凍", + "同时冻结其发送的钥匙": "凍結此用戶發出的所有ekeys", + "冻结会在用户APP连网后生效": "當用戶的應用程序連接到網絡時,此ekey將被凍結", + "取消授权会在用户APP连网后生效": "當用戶的應用程序連接到網絡時,用戶將失去他/她的權限", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "授權用戶具有與鎖定管理器幾乎相同的權限 (例如,發送ekeys和密碼的能力)", + "失效时间需晚于生效时间": "過期時間必須晚於生效時間", + "生效时间需晚于当前时间": "有效時間必須晚於當前時間", + "失效日期需晚于生效日期": "到期日期必須晚於生效日期", + "修改有效期": "變更期間", + "生效日期": "開始日期", + "失效日期": "結束日期", + "开锁": "解鎖", + "开锁成功": "解鎖成功", + "请选择锁": "請選擇鎖定", + "请选择接收者": "請選擇接收器", + "请选择有效期": "請選擇有效期", + "请选择发送方式": "請選擇發送方法", + "请选择结束时间": "請選擇結束時間", + "完成": "完成", + "有效日": "循環開啟", + "发送成功": "發送成功", + "请选择开始时间": "請選擇開始時間", + "选择用户": "選擇收件人", + "已选中": "已選擇", + "确定": "好", + "请选择要发送的锁": "請選擇鎖定", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "人臉實名認證是指用戶在解鎖手機APP前需要驗證自己的人臉,驗證後即可解鎖。", + "分享": "分享", + "请输入接收者账号": "請輸入接收方帳戶", + "接收者号码未注册,请重新发送": "接收器號碼未註冊,請重新發送", + "是否发送电子钥匙给未注册账号": "您是否要向新帳戶發送ekey", + "取消": "取消", + "标记成功": "標記成功", + "微信好友": "微信好友", + "短信": "短信", + "邮件": "電子郵件", + "更多": "更多", + "您好,您的电子钥匙生成成功": "您好,您的電子鑰匙生成成功", + "生效时间不能小于当前时间": "有效時間不能小於當前時間", + "结束时间不能小于当前时间": "結束時間不能小於當前時間", + "是否为管理员": "是管理員嗎", + "已连接到锁,请将卡靠近门锁的读卡区": "已連接。 將卡放在讀卡器上", + "尝试连接设备...": "正在與鎖定連接。 請稍候...", + "地理位置": "地理位置", + "检查以确保以下地址是正确的": "檢查以下地址是否正確", + "地图加载中,请稍候。。": "地圖正在加載,請稍候...", + "跳过": "跳過", + "还未获取到位置信息哦,请耐心等待一下!": "位置信息尚未獲取,請耐心等待!", + "请填写信息": "請填寫信息", + "有效期": "有效期", + "生效时间": "開始時間", + "失效时间": "結束時間", + "上传成功": "上傳成功", + "未生效": "不活動", + "已生效": "有效", + "指纹详情": "指紋信息", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "您將被要求多次將手指放在傳感器上。 請按照提示進行操作...", + "开始添加": "開始", + "请将您的手指按下": "將手指放在傳感器上", + "根据提示,抬起手指后再进行下一次指纹采集": "按照提示操作... 您將被要求移除並將手指放在傳感器上進行下一次記錄", + "添加成功": "添加成功", + "更新成功": "更新成功", + "搜索": "搜索", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "重置後,鎖的卡片會被刪除,你想重置嗎?", + "已失效": "無效", + "卡详情": "卡片信息", + "请输入": "請在此處輸入", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "通過關閉,鎖將全天保持解鎖狀態,直到手動鎖定為止", + "请输入小于或等于60的数字": "請輸入小於60的數字", + "操作成功": "操作成功", + "管理员密码相同,无需修改": "管理員密碼相同,不需要修改", + "请输入6-9位数字": "6-9位數字長度", + "请输入6-9位管理员密码": "請輸入6-9位數的管理員密碼", + "请输入新的管理员密码": "請輸入新的管理員密碼", + "未分组": "未分組", + "请输入分组名称": "創建組", + "创建成功": "創造成功", + "设置锁分组成功": "設置鎖定組成功", + "电池1电量": "蓄電池1", + "电池2电量": "蓄電池2", + "电量更新时间": "電池更新時間", + "锁电量更新成功": "鎖定電源更新成功", + "您的钥匙未生效": "您的密鑰無效", + "您的钥匙已冻结": "您的密鑰已被凍結", + "您的钥匙已过期": "您的密鑰已過期", + "常开模式开启": "鎖處於通道模式", + "超级管理员": "超級管理員", + "授权管理员": "授權管理員", + "普通用户": "普通用戶", + "余": "餘額", + "天": "日", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "刪除鎖後,所有信息將一起刪除,您確定要刪除鎖嗎?", + "请输入登录密码": "請輸入應用程序密碼", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "刪除設備失敗,請確保設備在設備附近,設備未連接,並且設備已打開", + "用户无权限": "用戶沒有權限", + "创建公司后,考勤功能才能使用": "請先創建一個公司", + "是否删除钥匙?": "是否刪除此ekey?", + "邮箱绑定成功": "電子郵件綁定成功", + "手机绑定成功": "手機綁定成功:", + "网络访问失败,请检查网络是否正常": "請求失敗。 網絡不可用,請檢查並將設備連接到3g/4g/WIFI", + "清空": "清除", + "是否清空?": "清楚嗎?", + "消息详情": "消息信息", + "创建时间": "創建時間", + "管理员详情": "管理員詳細信息", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "如果有人強迫您開門,您可以使用此卡。 警報消息將發送給管理員。 要使用此功能,請確保您的鎖在線。", + "请不要将胁迫卡用于日常开锁": "請不要將強制卡用於日常使用。", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "如果有人強迫您開門,您可以使用此指紋。 警報消息將發送給管理員。 要使用此功能,請確保您的鎖在線。", + "请不要将胁迫指纹用于日常开锁": "請不要將強制指紋用於日常使用。", + "创建公司": "創建公司", + "公司名称不能超过30个字符": "公司名稱不能超過30個字符", + "公司名称不能小于6个字符": "公司名稱不能少於6個字符", + "WIFI列表": "WIFI列表", + "刷新": "刷新", + "手动配网": "手動配電網", + "远距离": "長距離", + "中距离": "中等距離", + "近距离": "短距離", + "锁时间更新成功": "鎖定時間更新成功", + "锁用户": "鎖定用戶", + "请选择常开日期": "請選擇開放日期", + "结束时间不能小于开始时间哦": "結束時間不能小於開始時間", + "介绍": "我們的故事", + "个人信息收集清单": "個人信息收集清單", + "应用权限说明": "應用權限說明", + "第三方信息共享清单": "第三方信息分享列表", + "请选择您的位置": "請選擇您的位置", + "请先选择位置": "請先選擇位置", + "管理员密码": "管理員密碼", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "如需修改,請輸入新的管理員密碼 (6位),點擊好修改", + "修改": "修改", + "网络摄像头": "攝像頭", + "重命名": "重命名", + "分组下的锁将被移到未分组里": "組下的鎖將移動到取消分組", + "编辑成功": "編輯成功", + "厂商": "製造商", + "型号": "型號", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "密碼生成後,請在當天23:59前使用一次激活,否則0點後無效。 密碼激活後,可在有效期內無限次使用。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "密碼生成後,請在當天23:59前使用,否則0點後無效。 清除代碼用於清除今天0點之前生成的所有密碼。", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "密碼生成後,請在當天23:59前使用,否則0點後無效。", + "清空密码底部提示": "密碼有效期至清空當天23:59", + "相机": "攝像頭", + "相册": "照片", + "读写": "存儲", + "定位": "位置", + "需要访问相机权限才能拍照上传文件例如头像上传": "拍攝照片和上傳文件 (例如上傳個人資料圖片) 需要訪問相機", + "需要访问相机权限才能使用相册图片上传文件上传头像": "使用相冊圖像上傳文件和頭像需要訪問相機", + "需要访问读写权限才能使用本地图片上传头像": "使用本地圖像上傳頭像需要訪問讀寫權限", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "使用添加鍵功能需要訪問位置信息", + "申请": "應用程序", + "权限": "許可", + "不允许": "不允許", + "允许": "允許", + "权限被拒绝": "權限被拒絕", + "请手动在系统设置中开启": "請在系統設置中手動啟用", + "权限以继续使用应用": "繼續使用應用程序的權限。", + "去设置": "去設置它", + "当前网络": "當前網絡", + "位置信息": "位置信息", + "请输入wifi名称": "請輸入wifi名稱", + "虹膜": "虹膜", + "手掌": "棕櫚", + "商城": "商場", + "我的": "我的", + "微信公众号推送": "微信公眾賬號", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "打開微信接收報警信息,需要先關注斯凱智能鎖微信公眾賬號,請保存二維碼,使用微信掃描設置", + "蓝牙": "藍牙", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "需要訪問藍牙權限才能使用添加鍵功能的位置信息", + "请输入Email": "輸入您的電子郵件", + "请输入手机号": "輸入您的電話號碼", + "家人到家": "家庭成員到家", + "添加家人": "添加家庭成員", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "如果鎖沒有連接到互聯網,密碼、卡、指紋和其他開門方法的提醒不能及時發送。", + "消息提醒": "提醒", + "开门通知": "開盤通知", + "N天未开门": "N天沒有開門", + "门未关好": "門沒有關閉", + "防拆报警": "篡改警報", + "低电量提醒": "電池電量低", + "胁迫开门": "強制開門", + "有人按门铃": "有人按門鈴", + "有人出现在门口": "有人出現在門口", + "提醒方式": "提醒方法", + "开门方式": "開門方法", + "请选择": "請選擇", + "家人": "家庭成員", + "保存": "保存", + "APP推送": "應用推送", + "管理员": "管理員", + "未启用": "未啟用", + "已启用": "已啟用", + "省电模式": "省電模式", + "逗留抓拍模式": "停留捕獲模式", + "实时监控模式": "實時監控模式", + "自定义模式": "自定義模式", + "猫眼设置": "貓眼設置", + "猫眼工作模式": "貓眼工作模式", + "自动亮屏": "自動亮屏", + "亮屏持续时间": "屏幕開啟時間", + "逗留警告": "停留警告", + "异常警告": "異常警告", + "短信提醒": "短信", + "邮件提醒": "電子郵件", + "N天未开门提醒": "N天沒有開門", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "如果有人強迫你打開鎖,你可以使用這個指紋。 警報消息將發送給管理員。 要使用此功能,請確保您的鎖處於聯機狀態。", + "胁迫指纹": "強制指紋", + "指纹列表": "指紋列表", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "在設定的時間之後,如果沒有打開鎖,系統會向指定的收件人發送提醒消息。 此功能需要將鎖連接到internet。", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "啟用提醒後,當鎖電池低於20% 、10% 和5% 時,系統會向指定的收件人發送提醒消息。", + "未开门时间": "沒有開門的天數", + "添加和使用面容开锁时:": "解鎖時添加和使用面:", + "关锁": "關閉鎖", + "功能": "功能", + "配件": "零件", + "云存": "雲存儲", + "本地": "這個地方", + "3天滚动储存": "3天滾動存儲", + "去升级": "立即升級", + "下载列表": "下載列表", + "已下载": "已下載", + "全部视频": "所有視頻", + "已为本设备免费提供3大滚动视频储存服务": "為該設備免費提供了三種滾動視頻存儲服務", + "视频播放": "視頻播放", + "全选": "全部", + "请选择要删除的视频": "請選擇要刪除的視頻", + "请选择要下载的视频": "請選擇要下載的視頻", + "欢迎使用": "歡迎使用", + "用户协议和隐私政策概要": "用戶協議和隱私政策摘要", + "协议概要": "協議摘要", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "感謝您使用此應用程序。 我們非常重視您的個人信息和隱私保護。 使用本產品前,請仔細閱讀", + "《用户协议》": "用戶條款", + "和": "和", + "《隐私政策》": "《隱私政策》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部內容。 單擊 「同意」,即表示您同意並接受所有條款。 如果您選擇不同意,您將無法使用我們的產品和服務,並將退出申請。", + "不同意": "不同意", + "同意": "同意", + "该功能是高级功能,请开通后再使用": "這是高級功能。 請先啟用它。", + "常用程序": "通用程序", + "该锁已被重置": "鎖已重置", + "需要访问读写权限才能使用手动升级固件": "手動升級固件需要訪問讀寫權限", + "错误D固件,请选择正确的文件": "固件錯誤,請選擇正確的文件", + "非SYD固件,请选择正确的文件": "非SYD固件,請選擇正確的文件", + "文件校验失败 0x01": "文件驗證失敗0x01", + "解析元数据失败,请选择正确的文件": "解析元數據失敗,請選擇正確的文件", + "文件校验失败 0x02": "文件驗證失敗0x02", + "文件校验失败 0x03": "文件驗證失敗0x03", + "固件升级完成": "固件升級已完成", + "记录": "記錄", + "开通高级功能后才可以对锁进行管理": "請先啟用高級功能來管理鎖。", + "去开通": "啟用", + "实名认证": "實名認證", + "当前剩余数量": "剩餘", + "购买": "購買", + "实名认证为付费功能,请购买后再使用": "實名認證是付費功能,請購買後使用", + "密码不一致哦": "密碼不一致", + "退出添加": "退出添加", + "管理员已满": "管理員已滿", + "用户已满": "用戶已滿", + "锁上面添加指纹已满": "在鎖已滿時添加指紋", + "指纹已存在": "指紋已經存在。", + "锁上面添加人脸已满": "上面的鎖定添加面已滿", + "人脸已存在": "人臉已存在", + "锁上面添加卡已满": "上鎖加卡已滿", + "卡已存在": "卡已存在", + "锁上面添加密码已满": "上鎖添加密碼已滿", + "密码已存在": "已存在相同的密碼。 請選擇其他密碼", + "请输入密码": "請輸入密碼", + "暂无密码,无需重置": "無密碼,無需重置", + "真实姓名": "真實姓名", + "身份证号": "身份證號碼", + "请输入真实姓名": "請輸入您的真實姓名", + "请输入身份证号": "請輸入您的身份證號碼", + "请输入身份证号和真实姓名": "請輸入您的身份證號碼和真實姓名", + "点击返回设备配对": "輕敲返回設備配對", + "无法连接?尝试升级": "無法連接? 已嘗試升級", + "固件升级提示": "固件升級提示", + "请先获取固件文件到手机本地,再选择升级": "請先獲取固件文件到本地電話,然後選擇升級", + "固件升级中": "正在升級固件", + "取消升级": "取消升級", + "固件传输中": "傳輸中的固件", + "关闭": "關閉", + "传输中'": "在運輸途中", + "操作记录": "記錄", + "修改姓名": "編輯名稱", + "传输中": "在運輸途中", + "发送人": "簽發人", + "发送时间": "發布時間", + "钥匙详情": "Ekey信息", + "姓名": "姓名", + "发送": "發送", + "请确认姓名全名和身份证号码是否正确": "請確認全名和身份證號是否正確", + "传输期间请勿离开当前页面": "在傳輸過程中不要離開當前頁面", + "机型": "型號", + "硬件版本": "硬件版本", + "固件版本": "固件版本", + "手动升级": "手動升級", + "设备连接中...": "設備正在連接...", + "未避免异常情况,请在门打开时升级": "不可避免的例外情況,請在門打開時升級", + "钥匙无效": "密鑰無效", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "無法連接到鎖。 請重新啟動手機的Blutooth並重試。", + "如果是全自动锁,请使屏幕变亮": "如果是全自動鎖定,請使屏幕更亮", + "正在尝试闭锁……": "試圖鎖定。 請稍候...", + "清空记录": "清除記錄", + "是否要删除操作记录?": "是否繼續刪除記錄?", + "被删除的记录不能恢复": "刪除後無法恢復記錄。", + "全部事件": "所有事件", + "开锁事件": "解鎖事件", + "异常事件": "異常事件", + "门铃事件": "門鈴事件", + "视频事件": "視頻事件", + "请开启蓝牙": "請打開藍牙", + "请选择有效日": "請選擇有效日期", + "公司名字长度不能小于 6 ": "公司名稱的長度不能小於6", + "已是最新版本": "無更新", + "新建短信模版": "創建SMS模板", + "新建邮件模版": "創建電子郵件模板", + "自定义短信模版": "短信模板", + "自定义邮件模版": "電子郵件模板", + "名称": "姓名", + "星星锁": "星形鎖", + "无考勤记录": "無記錄", + "大家干劲十足": "每個人都及時來", + "工作时长未出炉": "無工作時間", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "國家/地區的選擇將影響數據安全。 您當前選擇了阿爾巴尼亞,請確認後再繼續。", + "确认国家或地区": "確認國家/地區", + "我知道了": "拿到了", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "要接收重要更新,請單擊 「確定」 並在設置中啟用通知。", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "開機後,您可以通過長按鎖上的設置鍵重新開機,並與應用程序重新添加", + "已有": "電流", + "新增": "新建", + "账号格式错误": "格式錯誤", + "接收者信息为空": "收件人信息為空", + "请输入时间(秒)": "請輸入時間 (秒)", + "加载数据失败": "加載數據失敗", + "重试": "重試", + "升级中,是否退出": "升級過程中,是否退出", + "下一步": "下一個", + "公寓": "公寓", + "个人用户": "個人", + "星寓": "星級公寓", + "账号": "帳戶", + "请输入手机号或email": "電話號碼或電子郵件", + "请输入星寓管理员的账号": "請輸入星級公寓管理員的帳戶", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "所選鎖的所有數據將永久傳輸給收件人。", + "暂不支持跨平台转移,敬请期待": "暫不支持跨平台轉賬,敬請期待", + "移除坏锁": "將有故障/損壞的鎖移至垃圾箱", + "转移确认": "確認轉移", + "本次共转移": "這一次總共", + "把智能锁": "智能鎖", + "确认": "好", + "移除成功": "刪除成功", + "转移成功": "轉移成功", + "该已锁被删除": "已鎖定的已刪除", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授權管理員只能管理自己創建的密碼,ekeys和etc。", + "添加授权管理员": "創建管理員", + "导出记录": "導出記錄", + "选择时间段": "選擇時間段", + "导出": "出口", + "批量导出": "批量導出", + "读取记录": "刷新記錄", + "设备": "設備", + "消息": "消息", + "智能分析": "智能分析", + "精准识别设备事件,过滤无效信息": "準確識別設備事件並過濾掉無效信息", + "系统设置": "系統設置", + "系统的全局配置在此项内进行设置": "在此項目中設置系統的全局配置", + "导出操作记录": "導出記錄", + "立即查看": "查看", + "导出成功": "已成功導出", + "发送钥匙": "發送ekey", + "进度": "費率", + "失败": "失敗", + "人脸详情": "面部細節", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "當感測到有人在門前1.5米時,將自動啟動面部識別解鎖。", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "當感測到有人在門前0.8米時,將自動啟動面部識別解鎖。", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "當感測到有人在門前0.5米時,將自動啟動面部識別解鎖。", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感應距離已關閉,您需要手動觸摸鍵盤上的任何鍵才能進行人臉識別解鎖。", + "防误开已打开,开锁后": "防誤開已打開,解鎖後", + "秒内不可使用面容开锁": "面部解鎖秒內無法使用", + "掌静脉": "手掌靜脈", + "添加掌静脉": "添加手掌靜脈", + "胁迫掌静脉": "手掌強迫靜脈", + "请不要将胁迫掌静脉用于日常开锁": "請不要使用強制手掌靜脈進行日常解鎖", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "連接到鎖,請自然地打開你的手掌,手掌正對著相機", + "掌静脉详情": "手掌靜脈細節", + "掌静脉号": "手掌靜脈數", + "蓝牙未打开,请到设置里面打开蓝牙": "藍牙未開啟,請在設置中開啟藍牙", + "删除用户时,会将用户拥有的钥匙一起删除。": "如果用戶被刪除,與該用戶關聯的任何ekeys也將被刪除。", + "配置网络": "配置網絡", + "你好": "你好", + "成功": "成功", + "类型选择": "類型選擇", + "请选择要使用哪种类型": "請選擇要使用的類型", + "系统邮件(推荐)": "系統電子郵件 (推薦)", + "系统短信(推荐)": "系統SMS (推薦)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "電子郵件將從此應用程序發送。 請先購買電子郵件包。", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "短信將從這個應用程序發送。 請先購買電子郵件包。", + "个人邮件": "個人電子郵件", + "个人短信": "個人短信", + "邮件将从你的个人邮箱发给用户": "電子郵件將從您的個人電子郵件帳戶發送。", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS消息將從您的個人電話號碼發送。 您向電信運營商付費。", + "为了更好地应用体验,请确定权限": "為了更好的應用體驗,請確認權限", + "您第一次拒绝权限,请确定权限": "您第一次拒絕許可,請確認許可", + "您第二次拒绝权限,请去应用设置开启权限": "您第二次拒絕權限,請轉到應用程序設置以啟用權限", + "去应用市场": "前往app store", + "温馨提示": "溫馨提示", + "关闭应用": "關閉應用程序", + "开启微信接收报警消息需要先关注": "要打開微信接收報警消息,您需要關注", + "微信公众号,请保存二维码并使用微信扫一扫设置": "微信公眾賬號,保存二維碼,用微信掃一掃設置", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "實名認證為付費功能,請聯繫鎖管理員購買使用", + "位置权限": "位置權限", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "請授予應用程序使用您的locatian。 它用於掃描BLE鎖和網關。", + "相机/相册权限": "相機/相冊權限", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "請授予應用程序從存儲中讀取和寫入照片和文件。", + "点击选择": "單擊以選擇", + "微信": "微信", + "朋友圈": "力矩", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "微博", + "FaceBook": "FaceBook", + "链接": "鍊接", + "今天": "今天", + "密码错误": "無效密碼", + "网络中断": "網絡中斷", + "钥匙不存在": "密鑰不存在", + "钥匙过期": "密鑰已過期", + "钥匙已存在": "密鑰已存在", + "密码失效": "密碼無效", + "门锁时间异常": "門鎖時間異常", + "APP(手机)未联网": "應用程序 (手機) 未連接到互聯網", + "数据不存在": "數據不存在", + "待接收": "BeReceived", + "已冻结": "凍結", + "已删除": "已刪除", + "未知": "未知", + "拖动下方滑块完成拼图": "將滑塊拖動到正確的位置", + "验证成功": "驗證成功", + "验证失败": "驗證失敗", + "向右拖动滑块填充拼图": "向右拖動滑塊以填充拼圖", + "请先获取到位置信息哦": "請先獲取位置信息", + "请选择国家": "請選擇一個國家", + "获取锁信息": "獲取鎖定信息", + "锁数据异常,请重试": "鎖數據異常,請重試", + "连接设备中...": "正在連接設備...", + "把锁": "鎖", + "条": "剝除", + "封": "密封", + "次": "次", + "支付成功": "支付成功", + "查看详情": "查看詳細信息", + "请输入模板名称": "請輸入模板名稱", + "模版类型": "類型", + "再返回一次退出": "再次退出", + "请先添加锁": "請先添加鎖", + "可视对讲": "可視對講", + "详细日志": "詳細日誌", + "已复制到剪切板": "已複製", + "拍照": "照片", + "从相册选择": "從相冊中選擇", + "选择问题": "請選擇一個問題", + "确认长度不足8位": "確認長度小於8位", + "新密码长度不足8位": "新密碼長度小於8位", + "两次密码不一致": "密碼不匹配。 請重試", + "请点击获取验证码,验证码将发送到": "請獲取驗證碼。 該代碼將被發送到", + "切换": "開關", + "验证": "驗證", + "验证成功,账号已删除": "驗證成功,帳戶已刪除", + "该密码不是自定义密码,无法修改": "此密碼不是自定義密碼,無法修改", + "请选择设备要关联哪些姓名": "請選擇設備應與之關聯的名稱", + "请选择姓名要关联哪些设备": "請選擇名稱應與之關聯的設備", + "确定要移除所选中的坏锁吗?": "是否移除故障鎖?", + "邮件通知": "通過電子郵件通知", + "短信通知": "通過短信通知", + "您好,您的授权管理员生成成功": "您好,您的授權管理員已生成成功", + "请输入接收者姓名": "請在此處輸入", + "版本更新": "版本更新", + "下次再说": "下次", + "配网成功": "網絡分發成功", + "配网失败": "網絡分發失敗", + "该锁的无线键盘都将被删除": "此鎖的所有無線鍵盤將被刪除", + "实时画面": "實時圖片", + "适合门口较为安全的环境。": "適合在門口相對安全的環境。", + "仅发生特定事件才录像,并可查看实时画面。": "僅記錄特定事件,並且可以查看實時圖片。", + "一般情况下,满电可使用7-8个月": "正常情況下,充滿電可以使用7-8個月", + "有人逗留或发生特定事件才录像,可随时查看": "有人停留或記錄特定事件,並可以隨時查看", + "实时画面。": "實時圖片。", + "一般情况下,满电可使用5~6个月。": "正常情況下,充滿電後可使用5 ~ 6個月。", + "适合门口人员复杂、较不安全的环境。": "適用於復雜和相對不安全的環境。", + "有人出现就录像,可随时查看实时画面。": "記錄何時有人出現,並隨時查看實時畫面。", + "一般情况下,满电可使用2~4个月。": "正常情況下,充滿電後可使用2 ~ 4個月。", + "根据您家门口实际情况设置录像和实时画面功能。": "根據您家門口的實際情況設置視頻和實時圖片功能。", + "可使用时长由具体设置决定。": "使用的持續時間由具體設置決定。", + "查看": "查看", + "有人按门铃或发生": "有人按門鈴或", + "异常事件时": "異常事件", + "不录像": "無視頻", + "有人出现、按门铃": "有人出現,按門鈴", + "或发生异常事件时": "或發生異常事件", + "逗留达到10秒": "停留10秒", + "约1.5米": "關於1.5米", + "随时": "隨時", + "立即录像": "立即記錄", + "录像时机": "視頻定時", + "有人出现时录像": "當有人出現時記錄", + "人体侦测距离": "人體檢測距離", + "查看实时画面": "查看實時圖片", + "自定义时间": "自定義時間", + "当日": "今天", + "次日": "第二天", + "自定义时段": "自定義時間段", + "发生事件时查看": "事件發生時的視圖", + "实时查看": "實時視圖", + "有人在门口出现10秒后开始录像。": "有人在錄音前出現在門口10秒鐘。", + "有人按门铃时立即录像。": "當有人按門鈴時立即記錄。", + "有人出现在门前1.5米范围时启动录像": "當有人出現在門前1.5米時開始錄製", + "约0.8米": "關於0.8米", + "约3.0米": "關於3.0米", + "添加指纹失败": "操作失敗。", + "项": "項目", + "播放中": "正在播放", + "下载": "下載", + "暂无下载内容": "無下載內容", + "亮度": "亮度", + "音量": "體積", + "快进至": "快進到", + "快退至": "倒帶到", + "暂无视频信息": "無視頻信息", + "加载出错": "加載錯誤", + "请单人正对门锁,距离一个成年人手臂长度": "請獨自站在門鎖的前面,在一個手臂的長度", + "(约0.6米)。": "(約0.6米)。", + "保持脸部无遮挡,露出五官。": "保持你的臉通暢,並顯示你的面部特徵。", + "准备好了,开始添加": "準備就緒,開始添加", + "正在录入中...": "正在錄製...", + "添加人脸失败": "添加面失敗", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "重置後,鎖的面將被刪除。 是否確實要重置?", + "人脸号": "面數", + "虹膜详情": "虹膜詳細信息", + "虹膜号": "虹膜編號", + "选择设备类型": "選擇設備類型", + "照明灯具": "照明燈具", + "电动窗帘": "電動窗簾", + "门窗传感器": "門窗傳感器", + "传感器": "傳感器", + "清除数据成功": "已成功清除數據", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "鎖沒有連接到互聯網,所以密碼、卡、指紋和其他開門方法的記錄不能實時上傳。", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "如果您需要保留歷史記錄,您可以導出它們。", + "看不到操作记录,可能原因有": "看不到操作記錄,可能原因", + "操作记录详情": "操作記錄詳細信息", + "操作时间": "作業時間", + "此模块功能需要锁联网后设置方可生效": "需要在鎖連接到互聯網後設置此模塊功能才能生效", + "用户已存在": "用戶已存在", + "钥匙数量已到上限": "鍵的數量已達到上限", + "附近没有可用网关": "附近沒有可用的網關", + "正在创建安全连接...": "正在創建安全連接...", + "监视状态下不能发送录音": "無法在監視模式下發送錄製內容", + "挂断": "掛斷電話", + "监视中暂不能开锁": "監控期間無法解鎖", + "长按说话": "按住說話", + "松开发送": "釋放以發送", + "请输入6位数字开锁密码": "請輸入6位數的解鎖密碼", + "请输入开锁密码": "請輸入解鎖密碼", + "接收者在有效期内可以不限次数使用": "收件人可以在有效期內無限制地使用ekeys。", + "接收者可以使用此App开关锁": "收件人能夠通過這個應用程序鎖定/解鎖。", + "单次钥匙有效期为1小时,只能使用一次": "一次性ekey的有效期為1小時,只能使用一次。", + "接收者可以在有效期内的固定时间段里,不限次数使用": "接收者能夠在固定週期時間內無限制地使用ekeys。", + "获取模板失败": "無法獲取模板", + "微信通知": "微信通知", + "系统短信": "系統短信", + "系统邮件": "系統電子郵件", + "模板": "模板", + "新建模版": "創建模板", + "您好,您的密码是": "您好,您的密碼是", + "密码名字": "密碼名稱", + "请输入6-9位密码": "請輸入6-9位密碼", + "设置密码": "設置密碼", + "操作成功,密码为": "成功。 密碼是", + "类型:自定义-永久": "類型: 自定義-永久", + "实时播放": "實時回放", + "点击对讲": "點擊對講機", + "长按开锁": "長按解鎖", + "接听失败": "回答失敗", + "请在锁设置中开启远程开锁": "請在鎖定設置中啟用遠程解鎖", + "接听": "答案", + "截图已保存到相册": "已保存到相冊的屏幕截圖", + "添加遥控": "添加遠程控制", + "已连接到锁,请按遥控": "連接到鎖,請按遙控器", + "遥控号": "遙控器編號", + "遥控详情": "遠程控制詳細信息", + "照明": "照明", + "退出演示模式": "退出演示模式", + "提示:当前界面为展示界面,添加设备后才能继续使用": "提示: 當前界面為顯示界面。 添加設備後,您可以繼續使用它", + "门已上锁": "門是鎖著的", + "您的账号在异地登录,如非本人,请尽快修改密码": "您的帳戶已用於從新設備登錄", + "开门成功": "成功打開門", + "开门失败": "無法打開門", + "呼叫提醒": "來電提醒", + "收到来自": "從收到", + "锁的呼叫": "鎖定調用", + "加载数据中": "正在加載數據", + "搜索所有锁类型": "搜索所有鎖定類型", + "锁电量更新时间": "鎖定電池更新時間", + "1月": "1月", + "2月": "2月", + "3月": "3月", + "4月": "4月", + "5月": "五月", + "6月": "6月", + "7月": "7月", + "8月": "8月", + "9月": "9月", + "10月": "10月", + "11月": "11月", + "12月": "12月", + "热门城市": "熱門城市", + "导出锁数据": "導出鎖定數據", + "一键开锁": "一鍵解鎖", + "已开通": "已打開", + "编辑员工": "編輯工作人員", + "一": "一個", + "二": "兩個", + "三": "三個", + "四": "四", + "五": "五個", + "六": "六個", + "日": "太陽", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?", + "在线": "在線", + "离线": "離線", + "购买记录": "採購記錄", + "使用记录": "用戶記錄", + "失效时间要大于当前时间": "過期時間必須長於當前時間", + "修改名字": "編輯名稱", + "时": "小時", + "分": "分鐘", + "Amazon Alexa": "亞馬遜Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa解鎖,鎖定和檢查鎖定狀態", + "支持的国家": "支持的國家", + "支持的国家值": "美國,加拿大,英國,澳大利亞,印度,德國,法國,意大利,西班牙,日本", + "操作流程": "操作流程", + "操作流程值": "1使用智能鎖應用程序添加鎖和網關\n\n2在應用程序中啟用鎖的遠程解鎖功能 (默認情況下此功能處於關閉狀態)。 如果您沒有此選項,則鎖不支持Alexa\n\n3向Alexa添加技能,並使用Smart lock應用程序的帳戶和密碼對其進行授權。 授權成功後,您可以發現該賬號下的設備\n\n4在Alexa應用程序中找到鎖,打開語音解鎖功能,並設置語言密碼\n\n5鎖可以通過Alexa操作", + "Google Home": "Google Home", + "Action name": "動作名稱", + "ScienerSmart": "ScienerSmart", + "支持的语言": "支持的語言", + "英语": "英語", + "Google Home操作流程的值": "1.使用智能鎖應用程序添加鎖和網關\n\n2.在應用程序中啟用鎖的遠程解鎖功能 (默認情況下此功能處於關閉狀態)。 如果沒有此選項,鎖不支持Google Home\n\n3.安裝Google Home應用程序,然後單擊左上角的 「」 按鈕\n\n4.在設置頁面上,選擇 「與Google合作」\n\n5.搜索 「scienershart」 並使用smart lock APP帳戶和密碼進行授權", + "密码需至少包含数字/字母/字符中的2种组合": "密碼必須至少包含以下兩項: 數字、字母和特殊字符", + "已开锁": "已解鎖", + "已闭锁": "已鎖定", + "两次密码不一致哦": "密碼不一致", + "中功率": "媒介權力", + "常规使用": "經常使用", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "網關通電後,按住reset按鈕5秒鐘,當指示燈交替閃爍時單擊Next", + "扫描设备": "掃描設備", + "删除失败,网关可能已经离线,是否强制删除该数据?": "刪除失敗。 網關可能已脫機。 是否要強制刪除數據?", + "超级管理员英文": "超級管理員", + "授权管理员英文": "授權管理員", + "普通管理员英文": "普通用戶", + "网关设备英文": "網關設備", + "手机需联网英文": "手機需要聯網", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" + +} \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json new file mode 100644 index 00000000..18d523a5 --- /dev/null +++ b/lan/lan_uk.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Блокування зірок", + "锁通通": "Замикання", + "点击开锁,长按闭锁": "Торкніться, щоб розблокувати, утримуйте, щоб заблокувати", + "考勤": "Відвідування", + "考勤设置": "Налаштування відвідуваності", + "电子钥匙": "eKey", + "添加卡": "Додати картку", + "卡号": "Номер картки", + "添加指纹": "Додайте відбиток пальця", + "指纹号": "Номер відбитка пальця", + "遥控": "Віддаленого", + "添加人脸": "Додати обличчя", + "门锁日志": "Колода дверного замка", + "密码号": "Номер пароля", + "添加者": "Оператор", + "添加时间": "Час", + "重置": "Скинути", + "请输入手机号或者邮箱": "Номер телефону/Email", + "工作时间": "Робочий час", + "工作日设置": "Налаштування робочого дня", + "星期一": "Понеділок", + "星期二": "Вівторок", + "星期三": "Середа", + "星期四": "Четвер", + "星期五": "П’ятниця", + "星期六": "Субота", + "星期日": "Неділя", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "Пн", + "周二": "Вів", + "周三": "Ср", + "周四": "чт", + "周五": "Пт", + "周六": "Сб", + "周日": "Сонце", + "群发钥匙": "Надсилання кількох електронних ключів", + "锁": "Замок", + "请添加": "Одержувача", + "允许远程开锁": "Дистанційне розблокування", + "请输入验证码": "Код підтвердження", + "获取密码": "Згенерувати код допуску", + "请给密码命名": "Введіть ім'я для цього коду допуску", + "密码有限期为6个小时,只能使用一次": "Цей пароль ПОВИНЕН бути використаний протягом 6 годин від поточного часу, інакше він буде ПРИЗУПИНЕНО з міркувань безпеки. Цей пароль можна використовувати лише ОДИН РАЗ.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Вручну введіть в якості пароля 6-9 цифр. Можна додати по телефону Bluetooth поруч із замком, або віддалено додати через шлюз", + "获取": "Отримати", + "添加": "Додати", + "删除公司": "Видалити компанію", + "密码详情": "Інформація про пароль", + "修改密码": "Зміна коду допуску", + "添加虹膜": "Додайте ірис", + "添加门磁": "Датчик дверей", + "添加无线键盘": "Бездротова клавіатура", + "添加手掌": "Додати долоню", + "请输入员工账号": "Увійдіть в особистий кабінет співробітника", + "批量授权锁": "Надайте кілька замків", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Авторизований адміністратор матиме більшість дозволів на експлуатацію цього замка.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Ця функція дозволяє розблокувати Smart Lock віддалено через шлюз.Цю функцію можна увімкнути або вимкнути ЛИШЕ через Bluetooth.", + "排列方式": "Тип списку", + "早到榜": "Ранній список", + "迟到榜": "Пізній список", + "当前模式": "Поточний режим", + "勤奋榜": "Список працьовитості", + "延迟时间": "Час затримки", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Замок заблокується автоматично через деякий час. Будь ласка, спочатку розблокуйте його один раз, щоб зробити налаштування доступним.", + "时间": "Час", + "开始时间": "Час початку", + "结束时间": "Час закінчення", + "工作时间设置": "Налаштування робочого часу", + "常开模式": "Прохідний РЕЖИМ", + "常开时间": "У цей часовий проміжок", + "常开日期": "У ці дні", + "添加员工": "Додати персонал", + "编辑员工": "Редагувати персонал", + "节假日": "Свято", + "打卡方式": "Метод", + "员工是否有钥匙": "Вже є екей", + "上班时间": "Час початку", + "下班时间": "Час закриття", + "本周": "Цього тижня", + "单休": "Одноденні вихідні", + "双休": "Дводенні вихідні", + "单双休": "Одно-дводенні вихідні", + "年": "Рік", + "月": "Місяць", + "放假日期": "Свято", + "补班日期": "Робочі будні", + "添加假日": "Додати свято", + "开始日期": "Дата початку", + "必填": "Необхідний", + "结束日期": "Кінцева дата", + "日榜": "Щоденний", + "月榜": "Щомісяця", + "考勤记录": "Записи", + "假日信息": "Інформація про свято", + "基本信息": "Базові фрази", + "无线键盘": "Бездротова клавіатура", + "选择无线键盘": "Додайте клавіатуру", + "门磁": "Датчик дверей", + "自动闭锁": "Автоматичне блокування", + "锁声音": "Заблокувати звук", + "防撬报警": "Сповіщення про несанкціонований доступ", + "重置键": "Кнопка скидання", + "锁时间": "Заблокувати годинник", + "诊断": "Діагностувати", + "上传数据": "Завантажити дані", + "导入其他锁数据": "Імпортувати з іншого замка", + "锁升级": "Оновлення прошивки", + "标记房态": "Статус кімнати", + "开锁提醒": "Сповіщення про розблокування", + "微信二维码": "Розблокувати QR-код", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Люди з електронними ключами можуть відкрити двері, відсканувавши цей QR-код через WeChat. QR-код кожного замка відрізняється. Ви можете роздрукувати його і приклеїти поруч з відповідним замком", + "锁编号": "Номер замка", + "电量": "Батарея", + "锁分组": "Група замків", + "选择分组": "Вибрати групу", + "创建新分组": "Створення групи", + "管理员开锁密码": "Пароль адміністратора", + "更新": "Оновлювати", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Рівень заряду батареї буде оновлюватися шлюзом або телефоном Bluetooth", + "当屏幕闪烁时,点击下一步": "Натисніть далі, коли почне блимати клавіатура", + "输入*529#或按设置键": "Введіть *529# або натисніть клавішу Налаштування", + "长按重置键2秒": "Натисніть і утримуйте кнопку скидання 2 секунди", + "附近的设备": "Обладнання поблизу", + "暂无数据": "Немає даних", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Ви зможете отримати статус дверей за допомогою датчика дверей разом зі шлюзом. Тільки один датчик може бути пов'язаний із замком.", + "开始": "Почати", + "全天": "Цілодобово", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Ви можете встановити кілька періодів часу для режиму проходження. Протягом встановлених періодів часу замок залишатиметься у відкритому стані після розблокування.", + "请选择锁音量": "Будь ласка, виберіть блокування гучності", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Увімкнувши, ви почуєте звук із замка", + "低": "Низький", + "较低": "Середньо низький", + "中": "Середнє", + "较高": "Середньо високий", + "高": "Високий", + "开启后,锁被撬动时,会发出报警声": "Увімкнувши, ви вмикаєте оповіщення про несанкціонований доступ.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "При вимкненні кнопка RESET відключається.", + "校准时间": "Час калібрування", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Діагностика полягає в зчитуванні інформації про конфігурацію всередині замку та її завантаженні, щоб персонал міг проаналізувати причину несправності", + "上传": "Завантажити", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Передавайте дані із замка на сервер. Це може зайняти кілька хвилин", + "请选择要从哪把锁导入": "Виберіть замок для імпорту", + "有新版本": "Мають нову версію", + "当前版本": "Поточна Версія", + "升级": "Оновлювати", + "空闲": "Вакантні", + "已入住": "Зайняли", + "多语言": "Мови", + "添加锁": "Додати замок", + "锁地址": "Адреса блокування", + "选择锁类型": "Виберіть тип замка", + "NFC无源锁": "Пасивне блокування NFC", + "添加设备": "Додати пристрій", + "网关": "Шлюз", + "客服": "Обслуговування клієнтів", + "设置": "Параметри", + "更多设置": "Більше наборів", + "消息推送": "Push-сповіщення", + "锁用户管理": "Блокування користувачів", + "拥有的钥匙": "eKeys, пов'язані з цим Користувачем", + "批量授权": "Управління повноваженнями", + "关联设备": "Пов'язаний пристрій", + "关联姓名": "Пов'язане ім'я", + "转移智能锁": "Блокування передачі даних", + "选择锁": "Блокування екрана", + "接收人信息": "Одержувача", + "转移网关": "Трансферний шлюз", + "锁屏": "Блокування екрана", + "已关闭": "Вимкнено", + "已开启": "На", + "开启": "Увімкніть", + "确定要开启重置键?": "Продовжуйте включати кнопку Reset?", + "确定要关闭重置键?": "Продовжуєте відключати кнопку Reset?", + "隐藏无效开锁权限": "Приховування недійсного доступу", + "APP开锁时需手机连网的锁": "Замки, що вимагають телефонного зв'язку онлайн", + "增值服务": "Послуги", + "关于": "Про", + "退出": "Вихід", + "删除账号": "Видалити обліковий запис", + "个人信息": "Інформація про обліковий запис", + "头像": "Аватар", + "昵称": "Псевдонім", + "请输入昵称": "Будь ласка, введіть свій нікнейм", + "修改昵称": "Перейменувати", + "修改账号": "Редагувати обліковий запис", + "重置密码": "Скинути пароль", + "安全问题": "Контрольне запитання", + "为了你的账号安全,修改账号前请先使用验证码验证": "З міркувань безпеки вашого облікового запису, будь ласка, скористайтеся верифікацією пароля облікового запису перед зміною облікового запису", + "请输入新账号": "Будь ласка, увійдіть до нового облікового запису", + "找回密码和登录新设备时,可通过绑定的手机验证": "Номер телефону для прив'язки буде використовуватися для отримання коду підтвердження.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Обов'язковий електронний лист буде використано для отримання коду підтвердження.", + "原密码": "Поточний пароль", + "新密码": "Новий пароль", + "确认密码": "Підтвердіть пароль", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "У разі втрати телефону ви можете увійти на новий телефон, відповівши на контрольні запитання.", + "问题一": "Питання 1", + "问题二": "Питання 2", + "问题三": "Питання 3", + "请输入你的答案": "Будь ласка, введіть Вашу відповідь", + "即将到期": "Термін дії скоро закінчується", + "去授权": "Перейти до авторизації", + "修改名称": "Редагувати ім'я", + "状态": "Статус", + "WiFi名称": "Назва Wi-Fi", + "网络MAC": "Мережевий MAC", + "网关升级": "Оновлення шлюзу", + "网关连接的锁": "Замок(и), підключений до цього шлюзу", + "信号强": "Сильний", + "选择网关类型": "Виберіть тип шлюзу", + "添加网关": "Додати шлюз", + "重新通电": "Повторно підключіть живлення", + "指示灯": "Світловий індикатор", + "选择网关": "Виберіть шлюз", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G не підтримується,. Будь ласка, виберіть Wi-Fi 2.4G.", + "WiFi密码": "WiFi Passward", + "请输入WiFi密码": "Введіть пароль WiFi", + "网关名称": "Ім'я шлюзу", + "请输入网关名称": "Введіть ім'я шлюзу", + "IP地址": "IP-адреса", + "子网掩码": "Маска підмережі", + "默认网关": "Шлюз за замовчуванням", + "自动获取DNS服务器地址": "Автоматичне отримання адреси DNS-сервера", + "首选DNS": "Бажаний DNS", + "备选DNS": "Альтернативний DNS", + "不使用静态IP": "Не використовується статичний IP", + "使用静态IP": "Використовуйте статичну IP-адресу", + "请输入IP地址": "Введіть IP-адресу", + "请输入子网掩码": "Введіть маску підмережі", + "请输入默认网关": "Введіть шлюз за замовчуванням", + "所有锁": "Всі замки", + "搜索所有类型的锁": "Сканування всіх типів замків", + "门锁": "Дверний замок", + "挂锁": "Замок", + "保险箱锁": "Замок сейфа", + "智能门禁": "Інтелектуальний контроль доступу", + "车位锁": "Паркувальний замок", + "摸亮触摸屏": "Торкніться будь-якої клавіші, щоб активувати клавіатуру", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Будь ласка, торкніться будь-якої клавіші, щоб активувати блокування, і переведіть його в режим СПОЛУЧЕННЯ.Натисніть Далі", + "附近的锁": "Найближчі замки", + "如需修改名字请重新命名,点击确定添加锁": "Якщо ви хочете змінити ім'я, будь ласка, перейменуйте, натисніть OK, щоб додати блокування", + "添加锁时,手机必须在锁旁边": "При додаванні блокування телефон повинен знаходитися поруч із замком", + "登录": "Логін", + "注册": "Зареєструватися", + "我已阅读并同意": "Я прочитав і погодився", + "验证码": "Код", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Ваш пароль повинен складатися з 8-20 символів і включати мінімум два типи цифр, букв і символів", + "手机": "Телефон", + "邮箱": "Електронна пошта", + "请输入邮箱": "Введіть свою електронну пошту", + "国家/地区": "Країна/регіон", + "你所在的国家/地区": "Ваша країна або регіон", + "选择国家/地区": "Виберіть свою країну або регіон", + "获取验证码": "Отримати код", + "商务合作": "Бізнес", + "电脑网页版": "Веб-система", + "酒店系统": "Готельна система", + "说明书网页版": "Інструкція з експлуатації", + "高级功能": "Розширена функція", + "记录保存": "Зберігання записів", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS можна використовувати для надсилання коду допуску та інформації електронного ключа одержувачу.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Електронний лист можна використовувати для надсилання коду допуску та інформації електронного ключа одержувачу.", + "购买实名认证提示": "Після ввімкнення функції вам потрібно використовувати відбиток пальця, обличчя або пароль облікового запису, щоб відкрити APP. Немає необхідності повторно перевіряти протягом 3 хвилин", + "请选择你希望的实名认证频次": "Будь ласка, виберіть потрібну частоту автентифікації справжнього імені", + "仅首次": "Вперше", + "每日一次": "один раз на добу", + "每周一次": "раз на тиждень", + "每月一次": "раз на місяць", + "当前状态": "Поточний статус", + "试用中": "Під судом", + "高级功能权益内容": "Розширені функції", + "短信模板": "Шаблон SMS", + "邮件模板": "Шаблон листа", + "发卡工具": "Кодувальник карток", + "购买高级功能须知": "Повідомлення", + "购买高级功能提示": "Більш просунуті функції знаходяться в розробці, і якщо вони вам потрібні, ви можете відкрити сервіс виходячи з кількості замків. Розширені функції доступні лише для ваших власних замків. Якщо ви є авторизованим адміністратором, будь ласка, зверніться до топ-адміністратора замка для відкриття сервісу", + "免费体验": "Безкоштовна пробна версія", + "立即开通": "Закрито", + "购买短信": "Купити SMS", + "购买邮件": "Купити EMail", + "购买实名认证次数": "Купуйте час автентифікації справжнього імені", + "开通高级功能": "Увімкніть функцію «Додатково»", + "选择套餐": "Оберіть пакет", + "支付方式": "Спосіб Оплати", + "支付宝": "Аліпай", + "去支付": "Зарплата", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Ви можете самостійно визначити повідомлення. Він використовується для надсилання інформації про код допуску та електронний ключ іншим особам.", + "高级功能仅能用于你自己的锁": "Розширена функція може бути застосована тільки власними локонами.", + "新建模板": "Створити шаблон", + "类型": "Тип", + "模版内容": "Зміст шаблону", + "预览": "Попередній перегляд", + "房间名": "Кімната", + "预计产生短信条数": "Приблизна кількість сегментів повідомлень", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Ця функція дозволяє приховувати коди доступу, електронні ключі, картки та відбитки пальців, які є недійсними протягом певного періоду часу.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Телефон користувача повинен бути підключений до Інтернету, щоб розблокувати ці вибрані замки за допомогою APP.", + "配置WiFi": "Налаштування WiFi", + "请输入WiFi名字": "Будь ласка, введіть назву Wi-Fi", + "WiFi配网": "Розподільча мережа WiFi", + "胁迫卡": "Карта стресу", + "员工是否有密码": "Вже має пароль", + "员工是否有卡": "Вже має картку", + "员工是否有指纹": "Вже встановлено відбиток пальця", + "获取钥匙": "Отримати ключ", + "获取卡": "Отримати картку", + "获取指纹": "Отримати відбиток пальця", + "安全验证": "Верифікація особи", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Вся інформація вашого Облікового запису буде видалена з Платформи НАЗАВЖДИ і не може бути Recovered.Do ви хочете Видалити?", + "监控": "Монітор", + "视频日志": "Відео журнал", + "开门器": "Відкривач дверей", + "面容开锁": "Розблокування по обличчю", + "开门方向设置": "Встановлено напрямок відкривання", + "电机功率设置": "Налаштування потужності двигуна", + "开锁时是否需联网": "Якщо потрібен інтернет при розблокуванні", + "选择要加入分组的锁": "Виберіть замки, щоб додати їх до цієї групи", + "锁数量": "Лічильник замків", + "小米IOT平台": "Платформа Xiaomi IOT", + "面容开锁设置": "Набір розблокувань по обличчю", + "感应距离": "Відстань зондування", + "防误开": "Запобігайте неправильному відкриттю", + "防误开已关闭,关门后仍可使用面容开锁": "Запобігти неправильному відкриттю було закрито, після закриття дверей все ще можна використовувати розблокування обличчям", + "添加和使用面容开锁时": "Додавання та використання обличчя під час розблокування", + "添加和使用面容开锁时提示": "\n1. Будь ласка, намагайтеся тримати одну людину перед дверима;\n2, будь ласка, встаньте перед дверним замком приблизно на 0,5 ~ 0,8 метра, обличчям до дверного замка;\n3. Будь ласка, тримайте обличчя вільним і оголюйте риси обличчя;\n4. Коли розпізнавання обличчя ненормальне, ви можете торкнутися будь-якої клавіші на цифровій клавіатурі, щоб перезапустити розпізнавання обличчя вручну.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Будь ласка, уважно вибирайте потужність двигуна відповідно до фактичної ситуації з дверним замком:", + "小功率:": "Мініват:", + "耗电少": "Менше споживання енергії", + "大功率": "Потужні:", + "大功率提示": "Якщо язичок фіксатора не може нормально втягнутися при розблокуванні, або його потрібно водити\nГачок неба і землі рекомендується вибирати високої потужності. У цей момент споживана потужність складе\nЗбільшення.", + "开门方向设置提示": "Будь ласка, уважно виберіть напрямок для відкриття дверей вашого будинку (якщо ви виберете неправильний напрямок, ви не зможете відкрити та закрити двері належним чином):", + "左开": "Відкрити ліворуч", + "右开": "Відкрити праворуч", + "判断方法:": "判断方法:", + "判断方法内容": "Чоловік стояв біля будинку, обличчям до вхідних дверей.\nЯкщо петля або вал дверей знаходиться зліва, двері залишають відкритими;\nДвері відкриті вправо, якщо їх петля або вал знаходяться справа.\nЯкщо налаштування неправильне, він не буде відкривати та закривати дверцята належним чином.\nРекомендується для експлуатації монтажним або обслуговуючим персоналом.", + "录像时段": "Відео слот", + "密码": "Коди доступу", + "卡": "Карти", + "指纹": "Відбитків пальців", + "人脸": "Обличчя", + "配件商城": "Lock Mall", + "公司名称": "Назва компанії", + "请输入公司名字": "Введіть назву компанії", + "提示": "Підказка", + "是否删除?": "Чи потрібно видаляти?", + "员工信息": "Інформація про персонал", + "员工": "Персонал", + "打卡方式无效": "Недоступний", + "中国": "Китай", + "选择钥匙": "Вибираємо ekey", + "编辑": "Редагувати", + "无": "Ні", + "有": "Так", + "请输入姓名": "Будь ласка, введіть ім'я", + "获取人脸": "Отримання облич", + "选择密码": "Виберіть код допуску", + "选择卡": "Оберіть картку", + "选择指纹": "Виберіть відбиток пальця", + "选择人脸": "Вибрати обличчя", + "员工是否有人脸": "Чи є у працівника обличчя", + "同时删除员工钥匙": "Видалити його/її ekey", + "删除": "Видалення", + "确定要删除员工吗?": "Видалити цього співробітника", + "月统计": "Щомісячна статистика", + "迟到": "пізно", + "早退": "Ідіть раніше", + "未打卡": "Запис відсутній", + "钥匙将在": "Термін дії цього ключа закінчується через", + "天后失效": "день(и)", + "电量更新时间:": "Час оновлення акумулятора:", + "新增配件": "Додати", + "钥匙不可用": "Ключ недоступний", + "正在开锁中...": "Розблокування...", + "你的钥匙": "Ваш ключ", + "常开模式启动!长按闭锁": "Відкритий режим запущено! Натисніть і утримуйте, щоб заблокувати", + "演示模式": "Демонстраційний режим", + "请先同意用户协议及隐私政策": "Будь ласка, спочатку погодьтеся з угодою користувача та політикою конфіденційності", + "用户协议": "Умови користувача", + "隐私政策": "Політика конфіденційності", + "注册成功": "Реєстрація успішна", + "你所在的": "Ви знаходитесь в", + "手机号": "Контактний телефон", + "忘记密码": "Забули пароль", + "重置成功": "Скидання успіху", + "确定要退出吗?": "Вийти?", + "功能暂未开放": "Функція ще не відкрита", + "设置成功": "Налаштування виконано успішно", + "删除成功": "Успішне видалення", + "单次": "Одноразова", + "永久": "Постійний", + "限时": "Приурочений", + "自定义": "Нестандартний", + "清空码": "Видалити", + "循环": "Повторювані", + "工作日": "Робочого дня", + "每日": "Щоденний", + "周末": "Вихідні", + "确定要删除吗?": "Видалити?", + "该锁的密码都将被删除": "Усі коди доступу для цього замка будуть ВИДАЛЕНІ", + "已过期": "Інвалід", + "该锁的电子钥匙都将被删除": "Усі eKey для цього замка будуть ВИДАЛЕНІ", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "DELETE Усі ключі, пов'язані з цим ключем. Цей крок не може бути СКАСОВАНИЙ!", + "删除钥匙会在用户APP连网后生效": "Ключ буде ВИДАЛЕНО", + "有效时间": "Ефективний час", + "接收者": "Одержувача", + "仅管理自己创建的用户": "Керує тільки своїми користувачами", + "远程开锁": "Дистанційне розблокування", + "请输入钥匙名称": "Будь ласка, введіть назву ключа", + "修改成功": "Змінюйте успіх", + "冻结": "Заморожувати", + "解除冻结": "Відлиги", + "授权": "Авторизувати", + "取消授权": "Скасувати авторизацію", + "同时解冻其发送的钥匙": "Розморожувати всі ключі, видані цим користувачем", + "会在用户APP连网后生效": "Цей ключ буде РОЗМОРОЖЕНИЙ, коли APP користувача підключається до мережі", + "同时冻结其发送的钥匙": "Заморозити всі електронні ключі, видані цим користувачем", + "冻结会在用户APP连网后生效": "Цей ключ буде ЗАМОРОЖЕНО, коли APP користувача підключається до мережі", + "取消授权会在用户APP连网后生效": "Користувач ВТРАТИТЬ СВОЇ Дозволи, коли ДОДАТОК Користувача підключається до Мережі", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Авторизований користувач має майже такі ж дозволи, як і менеджер LOCK (наприклад. Можливість надсилати електронні ключі та паролі)", + "失效时间需晚于生效时间": "Термін придатності повинен бути пізніше терміну набрання чинності", + "生效时间需晚于当前时间": "Час набрання чинності має бути пізніше поточного часу", + "失效日期需晚于生效日期": "Термін придатності має бути пізнішим за дату набрання чинності", + "修改有效期": "Період зміни", + "生效日期": "Дата початку", + "失效日期": "Кінцева дата", + "开锁": "Розблокувати", + "开锁成功": "Розблокуйте успіх", + "请选择锁": "Будь ласка, виберіть замки", + "请选择接收者": "Будь ласка, виберіть приймач", + "请选择有效期": "Будь ласка, оберіть термін дії", + "请选择发送方式": "Будь ласка, виберіть спосіб відправки", + "请选择结束时间": "Будь ласка, виберіть час завершення", + "完成": "Повний", + "有效日": "Цикл увімкнено", + "发送成功": "Надішліть успіх", + "请选择开始时间": "Будь ласка, оберіть час початку", + "选择用户": "Виберіть отримувачів", + "已选中": "Вибрані", + "确定": "ГАРАЗД", + "请选择要发送的锁": "Будь ласка, виберіть замки", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Автентифікація справжнього імені обличчя означає потребу користувача підтвердити своє обличчя перед розблокуванням програми телефону, і підтвердження можна розблокувати.", + "分享": "Ділити", + "请输入接收者账号": "Будь ласка, введіть обліковий запис одержувача", + "接收者号码未注册,请重新发送": "Номер одержувача не зареєстрований, будь ласка, надішліть ще раз", + "是否发送电子钥匙给未注册账号": "Ви хочете відправити ekey на новий обліковий запис", + "取消": "Скасувати", + "标记成功": "Позначте успіх", + "微信好友": "Друзі WeChat", + "短信": "SMS", + "邮件": "Електронна пошта", + "更多": "Більше", + "您好,您的电子钥匙生成成功": "Доброго дня, ваш електронний ключ успішно згенеровано", + "生效时间不能小于当前时间": "Час дії не може бути меншим за поточний час", + "结束时间不能小于当前时间": "Час завершення не може бути меншим за поточний час", + "是否为管理员": "Це адміністратор", + "已连接到锁,请将卡靠近门锁的读卡区": "Підключено.Прикладіть картку до пристрою зчитування карток", + "尝试连接设备...": "Підключення за допомогою замка.Будь ласка, зачекайте...", + "地理位置": "Географічне положення", + "检查以确保以下地址是正确的": "Перевірте, чи правильна наступна адреса", + "地图加载中,请稍候。。": "Карта завантажується, будь ласка, зачекайте...", + "跳过": "Пропустити", + "还未获取到位置信息哦,请耐心等待一下!": "Інформація про місцезнаходження ще не отримана, будь ласка, зачекайте терпляче!", + "请填写信息": "Будь ласка, заповніть інформацію", + "有效期": "Термін дії", + "生效时间": "Час початку", + "失效时间": "Час закінчення", + "上传成功": "Завантажено успішно", + "未生效": "Неактивні", + "已生效": "Ефективний", + "指纹详情": "Інформація про відбитки пальців", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Вам потрібно буде кілька разів прикласти палець до датчика. Будь ласка, дотримуйтесь підказок...", + "开始添加": "Почати", + "请将您的手指按下": "Покладіть палець на датчик", + "根据提示,抬起手指后再进行下一次指纹采集": "Дотримуйтесь підказок... Вам потрібно буде видалити та прикласти палець до датчика для наступного запису", + "添加成功": "Додайте успіху", + "更新成功": "Успішне оновлення", + "搜索": "Шукати", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Після скидання карта замка буде видалена, хочете скинути?", + "已失效": "Інвалід", + "卡详情": "Інформація про картку", + "请输入": "Будь ласка, введіть тут", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Вимкнувши, замок залишатиметься розблокованим протягом усього дня, доки його не буде заблоковано вручну", + "请输入小于或等于60的数字": "Будь ласка, введіть число менше 60", + "操作成功": "Операція пройшла успішно", + "管理员密码相同,无需修改": "Пароль адміністратора такий самий і його не потрібно змінювати", + "请输入6-9位数字": "Довжина 6-9 цифр", + "请输入6-9位管理员密码": "Будь ласка, введіть 6-9-значний пароль адміністратора", + "请输入新的管理员密码": "Будь ласка, введіть новий пароль адміністратора", + "未分组": "Незгруповані", + "请输入分组名称": "Створення групи", + "创建成功": "Створюйте успіх", + "设置锁分组成功": "Успішне налаштування групи замків", + "电池1电量": "Акумулятор 1", + "电池2电量": "Акумулятор 2", + "电量更新时间": "Час оновлення акумулятора", + "锁电量更新成功": "Успішне оновлення живлення блокування", + "您的钥匙未生效": "Ваш ключ неефективний", + "您的钥匙已冻结": "Ваш ключ заморожено", + "您的钥匙已过期": "Термін дії вашого ключа закінчився", + "常开模式开启": "Замок знаходиться в режимі проходу", + "超级管理员": "Супер адмін", + "授权管理员": "Авторизований адміністратор", + "普通用户": "Звичайний користувач", + "余": "Баланс", + "天": "День", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Після зняття блокування вся інформація буде видалена разом, ви впевнені, що хочете видалити блокування?", + "请输入登录密码": "Будь ласка, введіть пароль програми", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Не вдалося видалити пристрій, переконайтеся, що пристрій знаходиться поруч із пристроєм, пристрій не підключено та пристрій увімкнено", + "用户无权限": "Користувач не має дозволу", + "创建公司后,考勤功能才能使用": "Будь ласка, спочатку створіть компанію", + "是否删除钥匙?": "Видалити цей екей?", + "邮箱绑定成功": "Успішна прив'язка електронної пошти", + "手机绑定成功": "Успішна прив'язка мобільного телефону", + "网络访问失败,请检查网络是否正常": "Запит не вдалося.Мережа недоступна, будь ласка, перевірте та підключіть свій пристрій до 3G/4G/WIFI", + "清空": "Ясний", + "是否清空?": "Ясний?", + "消息详情": "Інформація про повідомлення", + "创建时间": "Час створення", + "管理员详情": "Відомості про адміністратора", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Якщо хтось змусить вас відкрити двері, ви можете скористатися цією карткою. Повідомлення про тривогу буде надіслано адміністраторам. Щоб скористатися цією функцією, переконайтеся, що ваш замок підключено до Інтернету.", + "请不要将胁迫卡用于日常开锁": "Будь ласка, не використовуйте примусову картку для щоденного використання.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Якщо хтось змушує вас відкрити двері, ви можете використовувати цей відбиток пальця. Повідомлення про тривогу буде надіслано адміністраторам. Щоб скористатися цією функцією, переконайтеся, що ваш замок підключено до Інтернету.", + "请不要将胁迫指纹用于日常开锁": "Будь ласка, не використовуйте примусовий відбиток пальця для щоденного використання.", + "创建公司": "Створити компанію", + "公司名称不能超过30个字符": "Назва компанії не може перевищувати 30 символів", + "公司名称不能小于6个字符": "Назва компанії не може бути меншою за 6 символів", + "WIFI列表": "Список WIFI", + "刷新": "Оновити", + "手动配网": "Мережа ручного розподілу", + "远距离": "Міжміські", + "中距离": "Середня дистанція", + "近距离": "Коротка дистанція", + "锁时间更新成功": "Успішне блокування часу оновлення", + "锁用户": "Блокування користувачів", + "请选择常开日期": "Будь ласка, оберіть дату відкриття", + "结束时间不能小于开始时间哦": "Час завершення не може бути меншим за час початку", + "介绍": "Наша історія", + "个人信息收集清单": "Список збору особистої інформації", + "应用权限说明": "Опис дозволу на застосування", + "第三方信息共享清单": "Список спільного доступу до інформації третіх сторін", + "请选择您的位置": "Будь ласка, оберіть своє місцезнаходження", + "请先选择位置": "Будь ласка, спочатку виберіть місце розташування", + "管理员密码": "Пароль адміністратора", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Якщо вам потрібно внести зміни, будь ласка, введіть новий пароль адміністратора (6 цифр), натисніть OK для зміни", + "修改": "Змінити", + "网络摄像头": "Камери", + "重命名": "Перейменувати", + "分组下的锁将被移到未分组里": "Замки під групою будуть перенесені в розгруповані", + "编辑成功": "Успішне редагування", + "厂商": "Виробник", + "型号": "Модель", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Після того, як пароль буде згенерований, будь ласка, використовуйте його один раз для активації до 23:59 того ж дня, інакше він буде недійсним після 0 години. Після активації пароля його можна використовувати необмежену кількість разів протягом терміну дії.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Після того, як пароль буде згенерований, будь ласка, використовуйте його до 23:59 того ж дня, інакше він буде недійсним після 0 години. Чіткий код використовується для очищення всіх паролів, згенерованих до 0 години сьогоднішнього дня.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Після того, як пароль буде згенерований, будь ласка, використовуйте його до 23:59 того ж дня, інакше він буде недійсним після 0 години.", + "清空密码底部提示": "Пароль дійсний до 23:59 в день спустошення\n Порожній вміст 1: усі паролі, згенеровані до 0:00 дня (Паролі, згенеровані після 0:00 дня, не впливають на очищення паролів і можуть використовуватися й надалі)\nПорожній контент 2: Очистіть паролі Очистіть усі власні паролі (використані та невикористані) одразу після використання\nЩоб повністю очистити всі паролі, скористайтеся функцією «Скинути всі паролі»", + "相机": "Камери", + "相册": "Фото", + "读写": "Зберігання", + "定位": "мі́сце", + "需要访问相机权限才能拍照上传文件例如头像上传": "Доступ до камери потрібен для зйомки фотографій і завантаження файлів, наприклад, для завантаження зображення профілю", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Доступ до камери потрібен для завантаження файлів та аватарів за допомогою зображень з альбому", + "需要访问读写权限才能使用本地图片上传头像": "Для завантаження аватарів з використанням локальних зображень потрібен доступ до дозволів на читання та запис", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Доступ до інформації про місцезнаходження необхідний для використання функції додавання ключа", + "申请": "застосування", + "权限": "Дозволу", + "不允许": "Заборонено", + "允许": "Дозволило", + "权限被拒绝": "У дозволі відмовлено", + "请手动在系统设置中开启": "Будь ласка, увімкніть його вручну в налаштуваннях системи", + "权限以继续使用应用": "Дозвіл на подальше використання програми.", + "去设置": "Іди налаштуй", + "当前网络": "Поточна мережа", + "位置信息": "Інформація про місцезнаходження", + "请输入wifi名称": "Будь ласка, введіть назву Wi-Fi", + "虹膜": "Ірис", + "手掌": "Долоня", + "商城": "торго́вий центр", + "我的": "мій", + "微信公众号推送": "Публічний обліковий запис Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Щоб відкрити wechat для отримання тривожних повідомлень, вам потрібно спочатку звернути увагу на загальнодоступний обліковий запис wechat Skye Smart Lock, збережіть QR-код і за допомогою wechat відскануйте налаштування", + "蓝牙": "Технологія Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Доступ до дозволів Bluetooth потрібен для використання інформації про місцезнаходження функції додавання ключа", + "请输入Email": "Введіть свою електронну пошту", + "请输入手机号": "Введіть свій номер телефону", + "家人到家": "Член сім'ї приїхав додому", + "添加家人": "Додати члена родини", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Якщо замок не підключений до інтернету, нагадування про пароль, картку, відбиток пальця та інші способи відкриття дверей не можуть бути своєчасно відправлені.", + "消息提醒": "Нагадування", + "开门通知": "Повідомлення про відкриття", + "N天未开门": "N днів без відкривання дверей", + "门未关好": "Дверцята не закриті", + "防拆报警": "Спрацьовування тампера", + "低电量提醒": "Низький заряд батареї", + "胁迫开门": "Примусове відкривання дверей", + "有人按门铃": "Хтось дзвонить у двері", + "有人出现在门口": "У дверях хтось з'являється", + "提醒方式": "Метод нагадування", + "开门方式": "Спосіб відкривання дверей", + "请选择": "Будь ласка, виберіть", + "家人": "Член сім'ї", + "保存": "Рятувати", + "APP推送": "Push APP", + "管理员": "Адміністратора", + "未启用": "Не ввімкнено", + "已启用": "Включений", + "省电模式": "Режим енергозбереження", + "逗留抓拍模式": "Режим зйомки в режимі зупинки", + "实时监控模式": "Режим моніторингу в реальному часі", + "自定义模式": "Користувальницький режим", + "猫眼设置": "Постановка котячого ока", + "猫眼工作模式": "Режим роботи «котяче око»", + "自动亮屏": "Автоматичний яскравий екран", + "亮屏持续时间": "Вчасно переглядайте екран", + "逗留警告": "Будьте уважні", + "异常警告": "Попередження про відхилення від норми", + "短信提醒": "SMS", + "邮件提醒": "Електронна пошта", + "N天未开门提醒": "N днів без відкривання дверей", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Якщо хтось змусить вас відкрити замок, ви можете скористатися цим відбитком пальця. Повідомлення про тривогу буде надіслано адміністраторам. Щоб скористатися цією функцією, переконайтеся, що ваш замок підключено до Інтернету.", + "胁迫指纹": "Примусовий відбиток пальця", + "指纹列表": "Список відбитків пальців", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Після закінчення встановленого часу, якщо замок не буде відкритий, система надішле повідомлення з нагадуванням призначеному одержувачу. Для цієї функції замок має бути підключений до Інтернету.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Після ввімкнення нагадування, коли заряд батареї блокування опускається нижче 20%, 10% і 5%, система надішле повідомлення з нагадуванням призначеному одержувачу.", + "未开门时间": "Дні без відкривання дверей", + "添加和使用面容开锁时:": "Додавання та використання Face під час розблокування:", + "关锁": "закрити замок", + "功能": "функція", + "配件": "Частини", + "云存": "Хмарне сховище", + "本地": "Цей населений пункт", + "3天滚动储存": "3 дні прокатного зберігання", + "去升级": "Оновити зараз", + "下载列表": "Список завантажень", + "已下载": "Завантажити", + "全部视频": "Всі відео", + "已为本设备免费提供3大滚动视频储存服务": "Для цього пристрою на безоплатній основі надано три послуги зберігання відео з прокруткою", + "视频播放": "Відтворення відео", + "全选": "Увесь", + "请选择要删除的视频": "Будь ласка, виберіть відео, яке ви хочете видалити", + "请选择要下载的视频": "Будь ласка, виберіть відео, яке ви хочете завантажити", + "欢迎使用": "Ласкаво просимо до використання", + "用户协议和隐私政策概要": "Короткий зміст Угоди користувача та Політики конфіденційності", + "协议概要": "Короткий опис протоколу", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Дякуємо, що користуєтеся цією програмою. Ми надаємо великого значення вашій особистій інформації та захисту конфіденційності. Перед використанням цього продукту, будь ласка, уважно прочитайте його", + "《用户协议》": "Умови користувача", + "和": "і", + "《隐私政策》": "《Політика конфіденційності》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Весь зміст. Натискаючи «Згоден», ви погоджуєтеся і приймаєте всі умови. Якщо ви вирішите не погоджуватися, ви не зможете користуватися нашими продуктами та послугами та вийдете з програми.", + "不同意": "Погодитися", + "同意": "Згоден", + "该功能是高级功能,请开通后再使用": "Це розширена функція. Будь ласка, спочатку увімкніть його.", + "常用程序": "Загальні програми", + "该锁已被重置": "Блокування було скинуто", + "需要访问读写权限才能使用手动升级固件": "Для ручного оновлення прошивки потрібен доступ до дозволів на читання та запис", + "错误D固件,请选择正确的文件": "Неправильна прошивка, будь ласка, виберіть правильний файл", + "非SYD固件,请选择正确的文件": "Не використовуйте прошивку SYD, будь ласка, виберіть правильний файл", + "文件校验失败 0x01": "Не вдалося перевірити файл 0x01", + "解析元数据失败,请选择正确的文件": "Не вдалося проаналізувати метадані, будь ласка, виберіть правильний файл", + "文件校验失败 0x02": "Не вдалося перевірити файл 0x02", + "文件校验失败 0x03": "Не вдалося перевірити файл 0x03", + "固件升级完成": "Оновлення прошивки завершено", + "记录": "Записи", + "开通高级功能后才可以对锁进行管理": "Будь ласка, спочатку увімкніть розширену функцію для керування замками.", + "去开通": "Вмикати", + "实名认证": "Автентифікація справжнього імені", + "当前剩余数量": "Залишилися", + "购买": "Купити", + "实名认证为付费功能,请购买后再使用": "Аутентифікація справжнього імені є платною функцією, будь ласка, використовуйте її після покупки", + "密码不一致哦": "Паролі несумісні", + "退出添加": "Припиніть додавати", + "管理员已满": "Адміністратор повний", + "用户已满": "Користувач ситий", + "锁上面添加指纹已满": "Додати відбиток пальця при заповненні замка", + "指纹已存在": "Відбиток пальця вже існує.", + "锁上面添加人脸已满": "Замок зверху додати грань повний", + "人脸已存在": "Обличчя вже є", + "锁上面添加卡已满": "Замок над додатковою карткою заповнений", + "卡已存在": "Картка вже існує", + "锁上面添加密码已满": "Блокування зверху додати пароль заповнено", + "密码已存在": "Ідентичний пароль вже існує. Будь ласка, оберіть інший", + "请输入密码": "Будь ласка, введіть пароль", + "暂无密码,无需重置": "Немає пароля, не потрібно скидати", + "真实姓名": "Справжнє ім'я", + "身份证号": "Ідентифікаційний номер", + "请输入真实姓名": "Будь ласка, введіть своє справжнє ім'я", + "请输入身份证号": "Будь ласка, введіть свій ідентифікаційний номер", + "请输入身份证号和真实姓名": "Будь ласка, введіть свій ідентифікаційний номер та справжнє ім'я", + "点击返回设备配对": "Натисніть Назад до сполучення з пристроєм", + "无法连接?尝试升级": "Не вдається підключитися? Спроба оновлення", + "固件升级提示": "Запит на оновлення прошивки", + "请先获取固件文件到手机本地,再选择升级": "Спочатку завантажте файл прошивки на локальний телефон, а потім виберіть Оновити", + "固件升级中": "Прошивка оновлюється", + "取消升级": "Скасувати оновлення", + "固件传输中": "Прошивка під час передавання", + "关闭": "Вимикати", + "传输中'": "У дорозі", + "操作记录": "Записи", + "修改姓名": "Редагувати ім'я", + "传输中": "У дорозі", + "发送人": "Виданий", + "发送时间": "Виданий час", + "钥匙详情": "ekey Info", + "姓名": "Ім'я", + "发送": "Надіслати", + "请确认姓名全名和身份证号码是否正确": "Будь ласка, підтвердьте, що повне ім'я та ідентифікаційний номер правильні", + "传输期间请勿离开当前页面": "Не залишайте поточну сторінку під час передачі", + "机型": "Моделі", + "硬件版本": "Версія обладнання", + "固件版本": "Версія прошивки", + "手动升级": "Оновлення вручну", + "设备连接中...": "Підключення пристрою...", + "未避免异常情况,请在门打开时升级": "Неминучі винятки, будь ласка, оновлюйте, коли двері відкриті", + "钥匙无效": "Ключ недійсний", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Не вдається підключитися до замка.Будь ласка, перезавантажте Blutooth на телефоні та повторіть спробу.", + "如果是全自动锁,请使屏幕变亮": "Якщо це повністю автоматичне блокування, будь ласка, зробіть екран яскравішим", + "正在尝试闭锁……": "Спроба заблокуватися. Будь ласка, зачекай...", + "清空记录": "Очистіть записи", + "是否要删除操作记录?": "Продовжувати видаляти записи?", + "被删除的记录不能恢复": "Записи не можуть бути відновлені після видалення.", + "全部事件": "Всі події", + "开锁事件": "Розблокувати подію", + "异常事件": "Аномальна подія", + "门铃事件": "Подія дверного дзвінка", + "视频事件": "Відео подія", + "请开启蓝牙": "Будь ласка, увімкніть Bluetooth", + "请选择有效日": "Будь ласка, виберіть день набрання чинності", + "公司名字长度不能小于 6 ": "Довжина назви компанії не може бути менше 6", + "已是最新版本": "Немає оновлень", + "一": "Один", + "二": "Два", + "三": "Три", + "四": "Чотири", + "五": "П’ять", + "六": "Шість", + "日": "Сонце", + "新建短信模版": "Створити шаблон SMS", + "新建邮件模版": "Створити шаблон листа", + "自定义短信模版": "Шаблон SMS", + "自定义邮件模版": "Шаблон листа", + "名称": "Ім'я", + "星星锁": "Зоряний замок", + "无考勤记录": "Записів немає", + "大家干劲十足": "Всі приходять вчасно", + "工作时长未出炉": "Немає робочого часу", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Вибір країни/регіону вплине на безпеку даних. Ви наразі вибрали Албанію, будь ласка, підтвердьте, перш ніж продовжити.", + "确认国家或地区": "Підтвердьте країну або регіон", + "我知道了": "Зрозуміло", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Щоб отримувати важливі оновлення, натисніть «ОК» і увімкніть сповіщення в налаштуваннях.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Після ввімкнення ви можете повторно ввімкнути, утримуючи клавішу налаштування на замку, і знову додати її за допомогою APP", + "已有": "Струм", + "新增": "Новий", + "账号格式错误": "Невдалий формат", + "接收者信息为空": "Інформація про одержувача порожня", + "请输入时间(秒)": "Будь ласка, введіть час (сек)", + "加载数据失败": "Не вдалося завантажити дані", + "重试": "Спробуй ще раз", + "升级中,是否退出": "Під час оновлення, чи потрібно виходити", + "下一步": "Наступний", + "公寓": "Квартира", + "个人用户": "Особовий", + "星寓": "Зіркова квартира", + "账号": "Рахунок", + "请输入手机号或email": "Номер телефону або електронна пошта", + "请输入星寓管理员的账号": "Будь ласка, увійдіть в обліковий запис зіркового адміністратора квартири", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Всі дані обраного замка (блокувань) будуть назавжди передані одержувачу.", + "暂不支持跨平台转移,敬请期待": "Кросплатформна передача поки що не підтримується, будь ласка, чекайте з нетерпінням", + "移除坏锁": "Винесіть несправні/пошкоджені замки на смітник", + "转移确认": "Підтвердіть переказ", + "本次共转移": "Цього разу всього", + "把智能锁": "Розумний замок", + "确认": "ГАРАЗД", + "移除成功": "Успішне видалення", + "转移成功": "Успіх переказу", + "该已锁被删除": "Заблоковане видаляється", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Авторизований адміністратор може керувати лише кодами доступу, ключами тощо, створеними ним самим.", + "添加授权管理员": "Створити адміністратора", + "导出记录": "Експорт записів", + "选择时间段": "Виберіть період часу", + "导出": "Експорт", + "批量导出": "Пакетний експорт", + "读取记录": "Оновити записи", + "设备": "Пристрій", + "消息": "Повідомлення", + "智能分析": "Інтелектуальна аналітика", + "精准识别设备事件,过滤无效信息": "Точно визначайте події пристрою та відфільтровуйте недійсну інформацію", + "系统设置": "Системні налаштування", + "系统的全局配置在此项内进行设置": "У цьому пункті задається глобальна конфігурація системи", + "导出操作记录": "Експорт записів", + "立即查看": "Вид", + "导出成功": "Успішно експортовано", + "发送钥匙": "Надіслати електронний ключ", + "进度": "Ставка", + "失败": "Не вдалося", + "人脸详情": "Подробиці про обличчя", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Коли хтось буде виявлений приблизно за 1,5 метра перед дверима, розблокування розпізнавання обличчя почнеться автоматично.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Коли хтось буде виявлений приблизно за 0,8 метра перед дверима, автоматично розпочнеться розблокування розпізнавання обличчя.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Коли хтось буде виявлений приблизно за 0,5 метра перед дверима, автоматично розпочнеться розблокування з розпізнаванням обличчя.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Відстань виявлення була відключена, потрібно вручну торкнутися будь-якої клавіші на клавіатурі, щоб виконати розблокування розпізнаванням обличчя.", + "防误开已打开,开锁后": "Антипомилкове відкриття було включено, а після розблокування", + "秒内不可使用面容开锁": "Розблокування по обличчю не можна використовувати за лічені секунди", + "掌静脉": "Вена долоні", + "添加掌静脉": "Додайте вену долоні", + "胁迫掌静脉": "Форсована вена долоні", + "请不要将胁迫掌静脉用于日常开锁": "Будь ласка, не використовуйте примусові вени долоні для щоденного розблокування", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Підключений до замку, природно відкрийте долоню, долоня звернена до камери", + "掌静脉详情": "Деталі вени долоні", + "掌静脉号": "Номер вени долоні", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth не включений, будь ласка, увімкніть Bluetooth у налаштуваннях", + "删除用户时,会将用户拥有的钥匙一起删除。": "Якщо Користувач ВИДАЛЕНИЙ, будь-які ключі, пов'язані з Користувачем, також будуть ВИДАЛЕНІ.", + "配置网络": "Налаштування мережі", + "你好": "Привіт", + "成功": "успішний", + "类型选择": "Введіть, виберіть", + "请选择要使用哪种类型": "Будь ласка, виберіть, який тип використовувати", + "系统邮件(推荐)": "Системна електронна пошта (рекомендовано)", + "系统短信(推荐)": "Системні SMS (рекомендовано)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Електронний лист буде надіслано з цього додатка.Будь ласка, спочатку придбайте пакет електронної пошти.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "SMS буде надіслано з цього додатка.Будь ласка, спочатку придбайте пакет електронної пошти.", + "个人邮件": "Особиста електронна пошта", + "个人短信": "Персональні SMS", + "邮件将从你的个人邮箱发给用户": "Лист буде надіслано з вашого особистого облікового запису електронної пошти.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "SMS-повідомлення прийде з Вашого особистого номера телефону. Ви платите своєму оператору зв'язку.", + "为了更好地应用体验,请确定权限": "Для кращої роботи з програмою, будь ласка, підтвердьте дозволи", + "您第一次拒绝权限,请确定权限": "Ви вперше відмовилися від дозволу, будь ласка, підтвердіть дозвіл", + "您第二次拒绝权限,请去应用设置开启权限": "Ви відмовилися від дозволу вдруге, будь ласка, перейдіть до налаштувань програми, щоб увімкнути дозвіл", + "去应用市场": "Зайдіть в магазин додатків", + "温馨提示": "Тепла підказка", + "关闭应用": "Закрийте програму", + "开启微信接收报警消息需要先关注": "Щоб відкрити WeChat і отримувати повідомлення про будильники, вам потрібно слідкувати", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Публічний обліковий запис WeChat, збережіть QR-код і за допомогою WeChat відскануйте налаштування", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Аутентифікація справжнього імені є платною функцією, для покупки та використання зверніться до адміністратора замка", + "位置权限": "Дозвіл на доступ до геоданих", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Будь ласка, надайте Додатку можливість використовувати ваш локатор. Він використовується для сканування замків і шлюзів BLE.", + "相机/相册权限": "Дозвіл на використання камери/альбому", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Будь ласка, надайте програмі можливість читати та записувати фотографії та файли зі сховища.", + "点击选择": "Натисніть, щоб вибрати", + "微信": "WeChat", + "朋友圈": "Моменти", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Вейбо", + "FaceBook": "Фейсбук", + "链接": "Посилання", + "今天": "Сьогодні", + "密码错误": "Невірний пароль", + "网络中断": "Переривання мережі", + "钥匙不存在": "Ключа не існує", + "钥匙过期": "Термін дії ключа минув", + "钥匙已存在": "Ключ вже існує", + "密码失效": "Пароль невірний", + "门锁时间异常": "Ненормальний час блокування дверей", + "APP(手机)未联网": "APP (мобільний телефон) не підключений до Інтернету", + "数据不存在": "Даних не існує", + "待接收": "Отримано", + "已冻结": "Заморожені", + "已删除": "Видалені", + "未知": "Невідомий", + "拖动下方滑块完成拼图": "Перетягніть повзунок на потрібне місце", + "验证成功": "Успішна верифікація", + "验证失败": "Верифікація не пройшла", + "向右拖动滑块填充拼图": "Перетягніть повзунок вправо, щоб заповнити пазл", + "请先获取到位置信息哦": "Будь ласка, спочатку отримайте інформацію про місцезнаходження", + "请选择国家": "Будь ласка, оберіть країну", + "获取锁信息": "Отримання інформації про замок", + "锁数据异常,请重试": "Дані блокування ненормальні, будь ласка, спробуйте ще раз", + "连接设备中...": "Підключення пристрою...", + "把锁": "Замки", + "条": "смуга", + "封": "Печаткою", + "次": "Разів", + "支付成功": "Успішна оплата праці", + "查看详情": "Перегляд докладних відомостей", + "请输入模板名称": "Будь ласка, введіть назву шаблону", + "模版类型": "Тип", + "再返回一次退出": "Вихід знову", + "请先添加锁": "Будь ласка, спочатку додайте замок", + "可视对讲": "Візуальний домофон", + "详细日志": "Детальний журнал", + "已复制到剪切板": "Скопійовані", + "拍照": "Знімок", + "从相册选择": "Вибрати з альбому", + "选择问题": "Будь ласка, оберіть запитання", + "确认长度不足8位": "Підтвердьте довжину менше 8 цифр", + "新密码长度不足8位": "Довжина нового пароля менше 8 цифр", + "两次密码不一致": "Невідповідність пароля.Будь ласка, спробуйте ще раз", + "请点击获取验证码,验证码将发送到": "Будь ласка, отримайте код підтвердження. Код буде надіслано на адресу", + "切换": "Комутатор", + "验证": "Перевірити", + "验证成功,账号已删除": "Верифікація пройшла успішно, обліковий запис видалено", + "该密码不是自定义密码,无法修改": "Цей пароль не є власним паролем і не може бути змінений", + "请选择设备要关联哪些姓名": "Будь ласка, виберіть, з якими назвами має асоціюватися пристрій", + "请选择姓名要关联哪些设备": "Будь ласка, виберіть, з якими пристроями має асоціюватися назва", + "确定要移除所选中的坏锁吗?": "Зняти несправний замок?", + "邮件通知": "Повідомити електронною поштою", + "短信通知": "Сповіщати за допомогою SMS", + "您好,您的授权管理员生成成功": "Доброго дня, ваш авторизований адміністратор успішно згенерований", + "请输入接收者姓名": "Будь ласка, введіть тут", + "版本更新": "Оновлення версії", + "下次再说": "Наступного разу", + "配网成功": "Успішний розподіл по мережі", + "配网失败": "Не вдалося розподілити мережу", + "该锁的无线键盘都将被删除": "Всі бездротові клавіатури для цього замка будуть ВИДАЛЕНІ", + "实时画面": "Зображення в реальному часі", + "适合门口较为安全的环境。": "Підходить для відносно безпечних умов біля дверей.", + "仅发生特定事件才录像,并可查看实时画面。": "Записуються тільки конкретні події і можна переглядати картину в реальному часі.", + "一般情况下,满电可使用7-8个月": "За звичайних обставин його можна використовувати протягом 7-8 місяців при повній зарядці", + "有人逗留或发生特定事件才录像,可随时查看": "Хтось залишається або записуються конкретні події, і їх можна переглянути в будь-який час", + "实时画面。": "Зображення в реальному часі.", + "一般情况下,满电可使用5~6个月。": "За звичайних обставин його можна використовувати протягом 5 ~ 6 місяців при повній зарядці.", + "适合门口人员复杂、较不安全的环境。": "Підходить для складних і відносно небезпечних середовищ біля дверей.", + "有人出现就录像,可随时查看实时画面。": "Записуйте, коли хтось з'являється, і переглядайте зображення в реальному часі в будь-який час.", + "一般情况下,满电可使用2~4个月。": "За звичайних обставин його можна використовувати протягом 2~4 місяців при повній зарядці.", + "根据您家门口实际情况设置录像和实时画面功能。": "Налаштуйте функції відео та зображення в реальному часі відповідно до реальної ситуації біля ваших дверей.", + "可使用时长由具体设置决定。": "Тривалість використання визначається конкретними налаштуваннями.", + "查看": "Вид", + "有人按门铃或发生": "Хтось дзвонить у двері або", + "异常事件时": "Аномальна подія", + "不录像": "Немає відео", + "有人出现、按门铃": "Хтось з'являється, дзвонить у двері", + "或发生异常事件时": "або відбувається ненормальна подія", + "逗留达到10秒": "Затримайтеся на 10 секунд", + "约1.5米": "Близько 1,5 метрів", + "随时": "Постійного", + "立即录像": "Записуйте негайно", + "录像时机": "Хронометраж відео", + "有人出现时录像": "Записування моментів появи користувача", + "人体侦测距离": "Дальність виявлення людини", + "查看实时画面": "Перегляд зображення в реальному часі", + "自定义时间": "Нестандартний час", + "当日": "Сьогодні", + "次日": "Наступного дня", + "自定义时段": "Користувацький період часу", + "发生事件时查看": "Перегляд моментів виникнення події", + "实时查看": "Перегляд у реальному часі", + "有人在门口出现10秒后开始录像。": "Хтось з'являється у дверях на 10 секунд перед записом.", + "有人按门铃时立即录像。": "Записуйте негайно, коли хтось дзвонить у двері.", + "有人出现在门前1.5米范围时启动录像": "Починайте запис, коли хтось з'являється в радіусі 1,5 метра перед дверима", + "约0.8米": "Близько 0,8 метра", + "约3.0米": "Близько 3,0 метрів", + "添加指纹失败": "Операція не вдалася.", + "项": "Елементи", + "播放中": "Гра", + "下载": "Завантажити", + "暂无下载内容": "Контент не завантажується", + "亮度": "Яскравість", + "音量": "Обсяг", + "快进至": "Перенесемося до", + "快退至": "Перемотайте назад до", + "暂无视频信息": "Немає відеоінформації", + "加载出错": "Помилка при завантаженні", + "请单人正对门锁,距离一个成年人手臂长度": "Будь ласка, встаньте перед дверним замком наодинці, на відстані витягнутої руки", + "(约0.6米)。": "(близько 0,6 метра).", + "保持脸部无遮挡,露出五官。": "Тримайте обличчя вільним і показуйте риси обличчя.", + "准备好了,开始添加": "Готові, починаємо додавати", + "正在录入中...": "Запису...", + "添加人脸失败": "Не вдалося додати обличчя", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Після скидання грані замка будуть видалені. Ви впевнені, що хочете скинути налаштування?", + "人脸号": "Номер обличчя", + "虹膜详情": "Деталі про райдужну оболонку ока", + "虹膜号": "Число райдужної оболонки ока", + "选择设备类型": "Виберіть тип пристрою", + "照明灯具": "Освітлювальні прилади", + "电动窗帘": "Електричні штори", + "门窗传感器": "Датчик дверей та вікон", + "传感器": "Датчик", + "清除数据成功": "Дані успішно очищені", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Замок не підключений до Інтернету, тому рекоди пароля, картки, відбитка пальця та інші методи відкриття дверей не можуть бути завантажені в режимі реального часу.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Якщо вам потрібно зберегти історичні записи, ви можете експортувати їх.", + "看不到操作记录,可能原因有": "Не бачу записи операцій, можливі причини", + "操作记录详情": "Подробиці протоколу операції", + "操作时间": "Час операції", + "此模块功能需要锁联网后设置方可生效": "Цю функцію модуля потрібно встановити після підключення блокування до Інтернету, щоб вона набула чинності", + "用户已存在": "Користувач вже існує", + "钥匙数量已到上限": "Кількість ключів досягла верхньої межі", + "附近没有可用网关": "Поблизу немає доступного шлюзу", + "正在创建安全连接...": "Створення безпечного з'єднання...", + "监视状态下不能发送录音": "Не вдається надіслати записи в режимі моніторингу", + "挂断": "Покласти слухавку", + "监视中暂不能开锁": "Розблокування недоступне під час моніторингу", + "长按说话": "Натисніть і утримуйте, щоб говорити", + "松开发送": "Відпустіть для відправки", + "请输入6位数字开锁密码": "Будь ласка, введіть 6-значний пароль для розблокування", + "请输入开锁密码": "Будь ласка, введіть пароль для розблокування", + "接收者在有效期内可以不限次数使用": "Одержувачі можуть використовувати електронні ключі необмежену кількість разів протягом терміну дії.", + "接收者可以使用此App开关锁": "Одержувачі можуть заблокувати/розблокувати за допомогою цього додатка.", + "单次钥匙有效期为1小时,只能使用一次": "Одноразовий ключ дійсний протягом ОДНІЄЇ години і може бути використаний лише ОДИН РАЗ.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Одержувачі можуть використовувати електронні ключі необмежену кількість разів протягом встановленого часу циклу.", + "获取模板失败": "Не вдалося отримати шаблон", + "微信通知": "Сповіщення WeChat", + "系统短信": "Системні SMS", + "系统邮件": "Системна електронна пошта", + "模板": "Шаблон", + "新建模版": "Створити шаблон", + "您好,您的密码是": "Доброго дня, ваш пароль", + "密码名字": "Ім'я пароля", + "请输入6-9位密码": "Будь ласка, введіть пароль з 6-9 цифр", + "设置密码": "Встановити пароль", + "操作成功,密码为": "Успішно.Пароль - це", + "类型:自定义-永久": "Тип: Індивідуальний-Постійний", + "实时播放": "Відтворення в реальному часі", + "点击对讲": "Натисніть, щоб домофон", + "长按开锁": "Натисніть і утримуйте, щоб розблокувати", + "接听失败": "Не зміг відповісти", + "请在锁设置中开启远程开锁": "Будь ласка, увімкніть дистанційне розблокування в налаштуваннях блокування", + "接听": "Відповідь", + "截图已保存到相册": "Скріншот збережено в альбомі", + "添加遥控": "Додати пульт дистанційного керування", + "已连接到锁,请按遥控": "Підключившись до замку, будь ласка, натисніть на пульт дистанційного керування", + "遥控号": "Номер пульта дистанційного керування", + "遥控详情": "Деталі пульта дистанційного керування", + "照明": "Освітлення", + "退出演示模式": "Вихід з демо-режиму", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Порада: Поточний інтерфейс є інтерфейсом дисплея. Після додавання пристрою ви можете продовжувати його використовувати", + "门已上锁": "Дверцята замкнені на замок", + "您的账号在异地登录,如非本人,请尽快修改密码": "Ваш обліковий запис було використано для входу з нового пристрою", + "开门成功": "Відчиніть двері успішно", + "开门失败": "Не вдалося відкрити двері", + "呼叫提醒": "Нагадування про дзвінок", + "收到来自": "Отримано від", + "锁的呼叫": "Заблокувати дзвінок", + "加载数据中": "Завантаження даних", + "搜索所有锁类型": "Пошук за всіма типами замків", + "锁电量更新时间": "Блокування часу оновлення акумулятора", + "1月": "Січня", + "2月": "Лютого", + "3月": "Березня", + "4月": "Квітня", + "5月": "Травень", + "6月": "Червень", + "7月": "Липня", + "8月": "Серпня", + "9月": "Вересня", + "10月": "Жовтня", + "11月": "Листопада", + "12月": "Грудня", + "热门城市": "Гарячі міста", + "导出锁数据": "Експорт даних блокування", + "一键开锁": "Розблокування в один клік", + "已开通": "Відкрив", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?", + "在线": "Онлайн", + "离线": "Автономних", + "购买记录": "Запис про покупку", + "使用记录": "Запис користувача", + "失效时间要大于当前时间": "Час експірації має бути довшим за поточний час", + "修改名字": "Редагувати ім'я", + "时": "година", + "分": "хвилина", + "Amazon Alexa": "Амазонка Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Ви можете використовувати Alexa для розблокування, блокування та перевірки статусу замка", + "支持的国家": "Підтримувані країни", + "支持的国家值": "США, Канада, Великобританія, Австралія, Індія, Німеччина, Франція, Італія, Іспанія, Японія", + "操作流程": "Процес операції", + "操作流程值": "1 Додайте замок і шлюз за допомогою програми Smart lock APP\n\n2 Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Якщо у вас немає цієї опції, замок не підтримує Alexa\n\n3 Додайте навички до Alexa та авторизуйте їх за допомогою облікового запису та пароля програми Smart lock. Після успішної авторизації ви зможете виявити пристрої під обліковим записом\n\n4 Знайдіть замок у програмі Alexa, увімкніть функцію голосового розблокування та встановіть пароль мови\n\n5 Замком можна керувати через Alexa", + "Google Home": "Домашня сторінка Google", + "Action name": "Назва дії", + "ScienerSmart": "ScienerSmart", + "支持的语言": "Підтримувані мови", + "英语": "Англійська", + "Google Home操作流程的值": "1. Використовуйте додаток Smart lock, щоб додати замки та шлюзи\n\n2. Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Без цієї опції замок не підтримує Google Home\n\n3. Встановіть додаток Google Home і натисніть кнопку «+» у верхньому лівому куті\n\n4. На сторінці налаштувань виберіть «Робота з Google»\n\n5. Знайдіть «ScienerSmart» і використовуйте обліковий запис і пароль APP smart lock для авторизації", + "密码需至少包含数字/字母/字符中的2种组合": "Пароль повинен містити не менше 2 з наступних: цифри, букви та спеціальні символи", + "已开锁": "Розблокована", + "已闭锁": "Заблокований", + "两次密码不一致哦": "Паролі несумісні", + "中功率": "Середня потужність", + "常规使用": "Регулярне використання", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Після ввімкнення шлюзу натисніть і утримуйте кнопку скидання протягом 5 секунд, а потім натисніть «Далі», коли індикатор почне блимати по черзі", + "扫描设备": "Сканування пристрою", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Видалення не вдалося. Можливо, шлюз перейшов в автономний режим. Ви хочете примусово видалити дані?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json new file mode 100644 index 00000000..3fac30ad --- /dev/null +++ b/lan/lan_vi.json @@ -0,0 +1,1122 @@ +{ + "星锁": "Khóa Sao", + "锁通通": "Khóa qua", + "点击开锁,长按闭锁": "Chạm để mở khóa, giữ để khóa", + "考勤": "Tham dự", + "考勤设置": "Cài đặt chấm công", + "电子钥匙": "Ekeys", + "添加卡": "Thêm thẻ", + "卡号": "Số thẻ", + "添加指纹": "Thêm dấu vân tay", + "指纹号": "Số vân tay", + "遥控": "Điều khiển từ xa", + "添加人脸": "Thêm mặt", + "门锁日志": "Nhật ký khóa cửa", + "密码号": "Số mật khẩu", + "添加者": "Tổng đài", + "添加时间": "Thời gian", + "重置": "Đặt lại", + "请输入手机号或者邮箱": "Số điện thoại hoặc email", + "工作时间": "Thời gian làm việc", + "工作日设置": "Thiết lập ngày làm việc", + "星期一": "Thứ hai", + "星期二": "Thứ Ba", + "星期三": "Thứ Tư", + "星期四": "Thứ năm", + "星期五": "Thứ Sáu", + "星期六": "Thứ Bảy", + "星期日": "Chủ Nhật", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "MON", + "周二": "Tuệ", + "周三": "Kết Hôn", + "周四": "Thu", + "周五": "Thứ Sáu", + "周六": "Ghế ngồi", + "周日": "Mặt Trời", + "群发钥匙": "Gửi nhiều Ekeys", + "锁": "Khóa", + "请添加": "Người nhận", + "允许远程开锁": "Mở khóa từ xa", + "请输入验证码": "Mã xác minh", + "获取密码": "Tạo mật mã", + "请给密码命名": "Nhập tên cho mật mã này", + "密码有限期为6个小时,只能使用一次": "Mật Mã này phải được sử dụng trong vòng 6 giờ kể từ thời điểm hiện tại hoặc nó sẽ bị đình chỉ vì lý do an ninh. Mật mã này chỉ có thể được sử dụng một lần.", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "Nhập thủ công 6-9 chữ số làm mật khẩu. Có thể được thêm bằng bluetooth điện thoại bên cạnh khóa, hoặc được thêm từ xa thông qua cổng", + "获取": "Nhận", + "添加": "Thêm", + "删除公司": "Xóa công ty", + "密码详情": "Thông tin mật mã", + "修改密码": "Thay đổi mật mã", + "添加虹膜": "Thêm Iris", + "添加门磁": "Cảm biến cửa", + "添加无线键盘": "Bàn phím không dây", + "添加手掌": "Thêm lòng bàn tay", + "请输入员工账号": "Nhập tài khoản của nhân viên", + "批量授权锁": "Cấp nhiều ổ khóa", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "Quản trị viên được ủy quyền sẽ có sự cho phép đa số để vận hành khóa này.", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "Tính năng này cho phép bạn mở khóa thông minh từ xa thông qua một cổng. Tính năng này chỉ có thể được bật hoặc tắt thông qua Bluetooth.", + "排列方式": "Loại danh sách", + "早到榜": "Danh sách sớm", + "迟到榜": "Danh sách trễ", + "当前模式": "Chế độ dòng điện", + "勤奋榜": "Danh sách làm việc chăm chỉ", + "延迟时间": "Thời gian trễ", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "Khóa sẽ tự động khóa sau thời gian. Vui lòng mở khóa lần đầu tiên để thực hiện cài đặt khả dụng.", + "时间": "Thời gian", + "开始时间": "Thời gian bắt đầu", + "结束时间": "Thời gian kết thúc", + "工作时间设置": "Cài đặt thời gian làm việc", + "常开模式": "Chế độ đi qua", + "常开时间": "Trong khoảng thời gian này", + "常开日期": "Vào những ngày này", + "添加员工": "Thêm nhân viên", + "节假日": "Kỳ nghỉ", + "打卡方式": "Phương pháp", + "员工是否有钥匙": "Đã có ekey", + "上班时间": "Thời gian bắt đầu", + "下班时间": "Thời gian đóng", + "本周": "Tuần này", + "单休": "Cuối Tuần Một Ngày", + "双休": "Cuối tuần hai ngày", + "单双休": "Cuối Tuần Một Ngày hai ngày", + "年": "Năm", + "月": "Tháng", + "放假日期": "Kỳ nghỉ", + "补班日期": "Ngày làm việc", + "添加假日": "Thêm ngày lễ", + "开始日期": "Ngày bắt đầu", + "必填": "Yêu cầu", + "结束日期": "Ngày kết thúc", + "日榜": "Hàng ngày", + "月榜": "Hàng tháng", + "考勤记录": "Hồ sơ", + "假日信息": "Thông tin ngày lễ", + "基本信息": "Cơ bản", + "无线键盘": "Bàn phím không dây", + "选择无线键盘": "Thêm bàn phím", + "门磁": "Cảm biến cửa", + "自动闭锁": "Khóa tự động", + "锁声音": "Khóa âm thanh", + "防撬报警": "Cảnh báo giả mạo", + "重置键": "Nút đặt lại", + "锁时间": "Đồng hồ khóa", + "诊断": "Chẩn đoán", + "上传数据": "Tải lên dữ liệu", + "导入其他锁数据": "Nhập khẩu từ khóa khác", + "锁升级": "Cập nhật phần sụn", + "标记房态": "Trạng thái phòng", + "开锁提醒": "Mở khóa thông báo", + "微信二维码": "Mở khóa mã QR", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "Những người có chìa khóa điện tử có thể mở cửa bằng cách quét mã qr này thông qua Wechat. Mã QR của mỗi khóa là khác nhau. Bạn có thể in ra và dán bên cạnh khóa tương ứng", + "锁编号": "Số khóa", + "电量": "Pin", + "锁分组": "Nhóm khóa", + "选择分组": "Chọn nhóm", + "创建新分组": "Tạo nhóm", + "管理员开锁密码": "Mật mã Quản Trị", + "更新": "Cập nhật", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "Mức pin sẽ được cập nhật bởi Gateway hoặc phone bluetooth", + "当屏幕闪烁时,点击下一步": "Nhấp vào tiếp theo khi bàn phím nhấp nháy", + "输入*529#或按设置键": "Nhập README.md VERSION.md aliyun_face_plugin analysis_options.yaml android assets build error.log flavorizr.yaml images ios lan lib log.log pre_build.sh pubspec.lock pubspec.yaml star_lock star_lock.iml test test.sh translation.sh 529 # hoặc nhấn phím cài đặt", + "长按重置键2秒": "Nhấn và giữ nút Reset 2 giây", + "附近的设备": "Thiết bị gần đó", + "暂无数据": "Không có dữ liệu", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "Bạn sẽ có thể nhận được trạng thái cửa với một cảm biến cửa cùng với một cổng. Chỉ có một cảm biến được phép kết hợp với một khóa.", + "开始": "Bắt Đầu", + "全天": "Tất cả các giờ", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "Bạn có thể đặt nhiều khoảng thời gian cho chế độ PASSAGE. Trong khoảng thời gian đã đặt, khóa sẽ vẫn ở trạng thái mở sau khi được mở khóa.", + "请选择锁音量": "Vui lòng chọn khối lượng khóa", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "Bằng cách bật, bạn sẽ nghe thấy âm thanh từ ổ khóa", + "低": "Thấp", + "较低": "Thấp vừa", + "中": "Trung bình", + "较高": "Cao vừa", + "高": "Cao", + "开启后,锁被撬动时,会发出报警声": "Bằng cách bật, bạn bật cảnh báo giả mạo.", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "Bằng cách tắt, nút đặt lại bị vô hiệu hóa.", + "校准时间": "Thời gian hiệu chỉnh", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "Chẩn đoán là đọc thông tin cấu hình bên trong khóa và tải lên để nhân viên có thể phân tích nguyên nhân của sự thất bại", + "上传": "Tải lên", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "Tải dữ liệu từ khóa lên máy chủ. có thể mất vài phút", + "请选择要从哪把锁导入": "Chọn khóa để nhập khẩu từ", + "有新版本": "Có phiên bản mới", + "当前版本": "Phiên bản hiện tại", + "升级": "Cập nhật", + "空闲": "Trống", + "已入住": "Chiếm dụng", + "多语言": "Ngôn ngữ", + "添加锁": "Thêm khóa", + "锁地址": "Địa chỉ khóa", + "选择锁类型": "Chọn loại khóa", + "NFC无源锁": "Khóa thụ động NFC", + "添加设备": "Thêm thiết bị", + "网关": "Cổng", + "客服": "Dịch vụ khách hàng", + "设置": "Cài đặt", + "更多设置": "Nhiều bộ khác", + "消息推送": "Đẩy Thông báo", + "锁用户管理": "Người dùng khóa", + "拥有的钥匙": "Ekeys kết hợp với người dùng này", + "批量授权": "Quản lý thẩm quyền", + "关联设备": "Thiết bị liên kết", + "关联姓名": "Tên Liên kết", + "转移智能锁": "Khóa chuyển", + "选择锁": "Khóa màn hình", + "接收人信息": "Người nhận", + "转移网关": "Cổng chuyển", + "锁屏": "Khóa màn hình", + "已关闭": "Giảm giá", + "已开启": "Trên", + "开启": "Bật", + "确定要开启重置键?": "Tiếp tục kích hoạt nút Reset?", + "确定要关闭重置键?": "Tiếp tục tắt nút Reset?", + "隐藏无效开锁权限": "Ẩn truy cập không hợp lệ", + "APP开锁时需手机连网的锁": "Ổ khóa Yêu cầu điện thoại trực tuyến", + "增值服务": "Dịch vụ", + "关于": "Về", + "退出": "Logout", + "删除账号": "Xóa tài khoản", + "个人信息": "Thông tin tài khoản", + "头像": "Avatar", + "昵称": "Nickname", + "请输入昵称": "Vui lòng nhập nickname của bạn", + "修改昵称": "Đổi tên", + "修改账号": "Chỉnh sửa tài khoản", + "重置密码": "Đặt lại mật khẩu", + "安全问题": "Câu Hỏi an ninh", + "为了你的账号安全,修改账号前请先使用验证码验证": "Để bảo mật tài khoản của bạn, vui lòng sử dụng xác minh mật khẩu tài khoản trước khi sửa đổi tài khoản", + "请输入新账号": "Vui lòng nhập tài khoản mới", + "找回密码和登录新设备时,可通过绑定的手机验证": "Số điện thoại ràng buộc sẽ được sử dụng để nhận mã xác minh.", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "Email ràng buộc sẽ được sử dụng để nhận mã xác minh.", + "原密码": "Mật khẩu hiện tại", + "新密码": "Mật khẩu mới", + "确认密码": "Xác nhận mật khẩu", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "Trong trường hợp điện thoại bị mất, bạn có thể đăng nhập vào điện thoại mới bằng cách trả lời các câu hỏi bảo mật.", + "问题一": "Câu hỏi 1", + "问题二": "Câu 2", + "问题三": "Câu Hỏi 3", + "请输入你的答案": "Vui lòng nhập Câu Trả Lời của bạn", + "即将到期": "Hết hạn sớm", + "去授权": "Đi ủy quyền", + "修改名称": "Chỉnh sửa tên", + "状态": "Trạng thái", + "WiFi名称": "Tên wifi", + "网络MAC": "Mạng Mac", + "网关升级": "Cập nhật cổng", + "网关连接的锁": "Khóa được kết nối với cổng này", + "信号强": "Mạnh mẽ", + "选择网关类型": "Chọn loại cổng", + "添加网关": "Thêm cổng", + "重新通电": "Kết nối lại nguồn điện", + "指示灯": "Đèn báo", + "选择网关": "Chọn cổng", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "Không hỗ trợ 5g ạ. Vui lòng chọn Wifi 2.4G.", + "WiFi密码": "Wifi chuyển tiếp", + "请输入WiFi密码": "Nhập mật khẩu wifi", + "网关名称": "Tên cổng", + "请输入网关名称": "Nhập tên cổng", + "IP地址": "Địa chỉ IP", + "子网掩码": "Mặt nạ Mạng con", + "默认网关": "Cổng Mặc định", + "自动获取DNS服务器地址": "Tự động lấy địa chỉ máy chủ DNS", + "首选DNS": "DNS ưa thích", + "备选DNS": "DNS thay thế", + "不使用静态IP": "Không sử dụng IP tĩnh", + "使用静态IP": "Sử dụng ip tĩnh", + "请输入IP地址": "Nhập địa chỉ IP", + "请输入子网掩码": "Mặt Nạ Nhập Mạng con", + "请输入默认网关": "Nhập cổng Mặc định", + "所有锁": "Tất cả các ổ khóa", + "搜索所有类型的锁": "Quét tất cả các loại ổ khóa", + "门锁": "Khóa cửa", + "挂锁": "Ổ khóa", + "保险箱锁": "Khóa an toàn", + "智能门禁": "Kiểm soát truy cập thông minh", + "车位锁": "Khóa đỗ xe", + "摸亮触摸屏": "Chạm vào bất kỳ phím nào để kích hoạt bàn phím", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "Vui lòng chạm vào bất kỳ phím nào để kích hoạt khóa và đặt nó ở chế độ ghép nối. Nhấn tiếp theo", + "附近的锁": "Ổ khóa gần đó", + "如需修改名字请重新命名,点击确定添加锁": "Nếu bạn muốn đổi tên, vui lòng đổi tên, nhấp OK để thêm khóa", + "添加锁时,手机必须在锁旁边": "Khi thêm khóa, điện thoại phải nằm cạnh ổ khóa", + "登录": "Đăng nhập", + "注册": "Đăng ký", + "我已阅读并同意": "Tôi đã đọc và đồng ý", + "验证码": "Mã", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "Mật khẩu của bạn phải có 8-20 ký tự và bao gồm tối thiểu hai loại số, chữ cái và ký hiệu", + "手机": "Điện thoại", + "邮箱": "Email", + "请输入邮箱": "Nhập email của bạn", + "国家/地区": "Quốc gia/Khu vực", + "你所在的国家/地区": "Quốc gia/Khu vực của bạn", + "选择国家/地区": "Chọn quốc gia hoặc khu vực của bạn", + "获取验证码": "Nhận mã", + "商务合作": "Kinh Doanh", + "电脑网页版": "Hệ thống web", + "酒店系统": "Hệ thống khách sạn", + "说明书网页版": "Hướng dẫn sử dụng", + "高级功能": "Chức năng nâng cao", + "记录保存": "Lưu giữ hồ sơ", + "您可通过短信将密码、电子钥匙信息发给接收人。": "SMS Có thể được sử dụng để gửi mật mã và thông tin ekey cho người nhận.", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "Email có thể được sử dụng để gửi mật mã và thông tin ekey cho người nhận.", + "购买实名认证提示": "Sau khi bật chức năng, bạn cần sử dụng dấu vân tay, khuôn mặt hoặc mật khẩu tài khoản để mở ứng dụng. Không cần xác minh lại trong 3 phút", + "请选择你希望的实名认证频次": "Vui lòng chọn tần số xác thực Tên thật bạn muốn", + "仅首次": "Lần đầu tiên", + "每日一次": "Mỗi ngày một lần", + "每周一次": "Mỗi tuần một lần", + "每月一次": "Mỗi tháng một lần", + "当前状态": "Trạng thái hiện tại", + "试用中": "Đang dùng thử", + "高级功能权益内容": "Chức năng nâng cao", + "短信模板": "Mẫu SMS", + "邮件模板": "Mẫu email", + "发卡工具": "Bộ mã hóa thẻ", + "购买高级功能须知": "Thông báo", + "购买高级功能提示": "Các tính năng tiên tiến hơn đang được phát triển, và nếu bạn cần chúng, bạn có thể mở dịch vụ dựa trên Số lượng ổ khóa. Các tính năng tiên tiến chỉ có sẵn cho khóa của riêng bạn. Nếu bạn là quản trị viên được ủy quyền, vui lòng liên hệ với quản trị viên hàng đầu của khóa để mở dịch vụ", + "免费体验": "Dùng thử miễn phí", + "立即开通": "Mở ngay", + "购买短信": "Mua tin nhắn SMS", + "购买邮件": "Mua email", + "购买实名认证次数": "Mua thời gian xác thực Tên thật", + "开通高级功能": "Bật chức năng nâng cao", + "选择套餐": "Chọn gói", + "支付方式": "Phương thức thanh toán", + "支付宝": "Alipay", + "去支付": "Thanh toán", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "Bạn được phép tự xác định tin nhắn. Nó được sử dụng để gửi thông tin mật mã và ekey cho người khác.", + "高级功能仅能用于你自己的锁": "Các chức năng tiên tiến chỉ có thể được áp dụng khóa của riêng bạn.", + "新建模板": "Mẫu Tạo", + "类型": "Loại", + "模版内容": "Nội dung mẫu", + "预览": "Xem trước", + "房间名": "Phòng", + "预计产生短信条数": "Phân đoạn tin nhắn ước tính", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "Tính năng này cho phép bạn ẩn mật mã, Ekeys, thẻ và dấu vân tay không hợp lệ trong một khoảng thời gian.", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "Điện thoại của người dùng được yêu cầu trực tuyến để mở khóa các khóa được lựa chọn này bằng ứng dụng.", + "配置WiFi": "Wifi cấu hình", + "请输入WiFi名字": "Vui lòng nhập tên wifi", + "WiFi配网": "Mạng phân phối Wifi", + "胁迫卡": "Thẻ giảm căng thẳng", + "员工是否有密码": "Đã có mật mã", + "员工是否有卡": "Đã có thẻ", + "员工是否有指纹": "Đã đặt dấu vân tay", + "获取钥匙": "Lấy chìa khóa", + "获取卡": "Nhận thẻ", + "获取指纹": "Nhận dấu vân tay", + "安全验证": "Xác minh danh tính", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tất cả thông tin tài khoản của bạn sẽ bị xóa vĩnh viễn khỏi nền tảng và không thể phục hồi. Bạn có muốn xóa?", + "监控": "Màn hình", + "视频日志": "Nhật ký video", + "开门器": "Dụng cụ mở cửa", + "面容开锁": "Mở khóa mặt", + "开门方向设置": "Bộ hướng mở", + "电机功率设置": "Thiết lập động cơ", + "开锁时是否需联网": "Nếu internet là cần thiết khi mở khóa", + "选择要加入分组的锁": "Chọn khóa để thêm vào Nhóm này", + "锁数量": "Đếm khóa", + "小米IOT平台": "Nền tảng IOT Xiaomi", + "面容开锁设置": "Bộ mở khóa mặt", + "感应距离": "Khoảng cách cảm biến", + "防误开": "Ngăn chặn mở sai", + "防误开已关闭,关门后仍可使用面容开锁": "Ngăn chặn sự chín muồi đã được đóng lại, sau khi đóng cửa vẫn có thể sử dụng mở khóa mặt", + "添加和使用面容开锁时": "Thêm và sử dụng khuôn mặt khi mở khóa", + "添加和使用面容开锁时提示": "\n1, vui lòng cố gắng để giữ một người duy nhất trước cửa hoạt động;\n2, vui lòng đứng trước khóa cửa khoảng 0.5 ~ 0.8 mét, hướng về phía khóa cửa;\n3. Hãy giữ cho khuôn mặt của bạn không bị cản trở và làm lộ nét mặt của bạn;\n4. khi nhận dạng khuôn mặt là bất thường, bạn có thể chạm vào bất kỳ phím nào trên bàn phím kỹ thuật số để khởi động lại Nhận dạng khuôn mặt bằng tay.", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "Vui lòng chọn công suất động cơ cẩn thận theo tình hình thực tế của khóa cửa:", + "小功率:": "Miniwatt:", + "耗电少": "Tiêu thụ ít điện năng hơn", + "大功率": "Công suất cao:", + "大功率提示": "Nếu lưỡi khóa không thể rút lại bình thường khi mở khóa, hoặc cần phải điều khiển", + "开门方向设置提示": "Vui lòng cẩn thận chọn hướng mở cửa nhà bạn (nếu bạn chọn sai hướng, bạn sẽ không thể mở và đóng cửa đúng cách):", + "左开": "Mở trái", + "右开": "Mở bên phải", + "判断方法:": ":::", + "判断方法内容": "Người đàn ông đứng bên ngoài nhà, đối diện với cửa ra vào.", + "录像时段": "Khe cắm video", + "密码": "Mật mã", + "卡": "Thẻ", + "指纹": "Vân tay", + "人脸": "Mặt", + "配件商城": "Lock Mall", + "公司名称": "Tên công ty", + "请输入公司名字": "Nhập tên công ty", + "提示": "Gợi ý", + "是否删除?": "Có nên xóa không?", + "员工信息": "Thông tin nhân viên", + "员工": "Nhân viên", + "打卡方式无效": "Không có sẵn", + "中国": "Trung Quốc", + "选择钥匙": "Chọn ekey", + "编辑": "Chỉnh sửa", + "无": "Không", + "有": "Vâng", + "请输入姓名": "Vui lòng nhập tên", + "获取人脸": "Get Faces", + "选择密码": "Chọn mật mã", + "选择卡": "Chọn thẻ", + "选择指纹": "Chọn dấu vân tay", + "选择人脸": "Chọn khuôn mặt", + "员工是否有人脸": "Nhân viên có khuôn mặt không", + "同时删除员工钥匙": "Xóa ekey của anh ấy/cô ấy", + "删除": "Delet", + "确定要删除员工吗?": "Xóa nhân viên này", + "月统计": "Thống kê hàng tháng", + "迟到": "Trễ", + "早退": "Về sớm", + "未打卡": "Không ghi âm", + "钥匙将在": "Ekey này sẽ hết hạn", + "天后失效": "Ngày", + "电量更新时间:": "Thời gian cập nhật pin:", + "新增配件": "Thêm", + "钥匙不可用": "Không có chìa khóa", + "正在开锁中...": "Mở khóa...", + "你的钥匙": "Chìa khóa của bạn", + "常开模式启动!长按闭锁": "Mở chế độ bắt đầu! Nhấn lâu để khóa", + "演示模式": "Chế độ Demo", + "请先同意用户协议及隐私政策": "Trước tiên, vui lòng đồng ý với thỏa thuận người dùng và chính sách bảo mật", + "用户协议": "Điều khoản người dùng", + "隐私政策": "Chính sách bảo mật", + "注册成功": "Đăng ký thành công", + "你所在的": "Bạn tham gia", + "手机号": "Số điện thoại", + "忘记密码": "Quên mật khẩu", + "重置成功": "Thiết lập lại thành công", + "确定要退出吗?": "Lối ra?", + "功能暂未开放": "Chức năng chưa mở", + "设置成功": "Thiết lập thành công", + "删除成功": "Xóa thành công", + "单次": "Một lần", + "永久": "Vĩnh viễn", + "限时": "Hẹn giờ", + "自定义": "Tùy chỉnh", + "清空码": "Xóa", + "循环": "Tái phát", + "工作日": "Ngày làm việc", + "每日": "Hàng ngày", + "周末": "Cuối tuần", + "确定要删除吗?": "Xóa?", + "该锁的密码都将被删除": "Tất cả mật mã cho khóa này sẽ bị xóa", + "已过期": "Không hợp lệ", + "该锁的电子钥匙都将被删除": "Tất cả Ekeys cho khóa này sẽ bị xóa", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "Xóa tất cả Ekeys liên quan đến ekey này. Bước này không thể hoàn tác!", + "删除钥匙会在用户APP连网后生效": "Ekey sẽ bị xóa", + "有效时间": "Thời gian hiệu quả", + "接收者": "Người nhận", + "仅管理自己创建的用户": "Chỉ quản lý người dùng của riêng mình", + "远程开锁": "Mở khóa từ xa", + "请输入钥匙名称": "Vui lòng nhập tên khóa", + "修改成功": "Sửa đổi thành công", + "冻结": "Đóng băng", + "解除冻结": "Tan Băng", + "授权": "Ủy Quyền", + "取消授权": "Ủy Quyền", + "同时解冻其发送的钥匙": "Thaw All Ekeys do người dùng này cấp", + "会在用户APP连网后生效": "Ekey này sẽ được rã đông khi ứng dụng của người dùng kết nối với mạng", + "同时冻结其发送的钥匙": "Đóng băng tất cả các Ekeys do người dùng này cấp", + "冻结会在用户APP连网后生效": "Ekey này sẽ bị đóng băng khi ứng dụng của người dùng kết nối với mạng", + "取消授权会在用户APP连网后生效": "Người dùng sẽ mất quyền khi ứng dụng của người dùng kết nối với mạng", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "Người dùng được ủy quyền có gần như các quyền tương tự như Trình Quản Lý khóa (ví dụ: khả năng gửi Ekeys và mật mã)", + "失效时间需晚于生效时间": "Thời gian hết hạn phải chậm hơn thời gian có hiệu lực", + "生效时间需晚于当前时间": "Thời gian hiệu lực Phải trễ hơn thời gian hiện tại", + "失效日期需晚于生效日期": "Ngày hết hạn phải muộn hơn ngày có hiệu lực", + "修改有效期": "Thay đổi thời gian", + "生效日期": "Ngày bắt đầu", + "失效日期": "Ngày kết thúc", + "开锁": "Mở khóa", + "开锁成功": "Mở khóa thành công", + "请选择锁": "Vui lòng chọn khóa", + "请选择接收者": "Vui lòng chọn người nhận", + "请选择有效期": "Vui lòng chọn Thời hạn hiệu lực", + "请选择发送方式": "Vui lòng chọn phương thức gửi", + "请选择结束时间": "Vui lòng chọn thời gian kết thúc", + "完成": "Hoàn thành", + "有效日": "Đạp xe", + "发送成功": "Gửi thành công", + "请选择开始时间": "Vui lòng chọn thời gian bắt đầu", + "选择用户": "Chọn người nhận", + "已选中": "Đã chọn", + "确定": "Ok", + "请选择要发送的锁": "Vui lòng chọn khóa", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "Mặt xác thực Tên thật đề cập đến nhu cầu xác minh khuôn mặt của người dùng trước khi mở khóa ứng dụng điện thoại và có thể mở khóa xác minh.", + "分享": "Chia sẻ", + "请输入接收者账号": "Vui lòng nhập tài khoản người nhận", + "接收者号码未注册,请重新发送": "Số máy thu không được đăng ký, vui lòng gửi lại", + "是否发送电子钥匙给未注册账号": "Bạn có muốn gửi ekey vào tài khoản mới không", + "取消": "Hủy", + "标记成功": "Mark Success", + "微信好友": "Bạn bè Wechat", + "短信": "Tin nhắn SMS", + "邮件": "Email", + "更多": "Hơn", + "您好,您的电子钥匙生成成功": "Chào Bạn, khóa điện tử của bạn được tạo thành công ạ", + "生效时间不能小于当前时间": "Thời gian hiệu quả không thể nhỏ hơn thời gian hiện tại", + "结束时间不能小于当前时间": "Thời gian kết thúc không thể nhỏ hơn thời gian hiện tại", + "是否为管理员": "Có Phải Là quản trị viên không?", + "已连接到锁,请将卡靠近门锁的读卡区": "Đã kết nối. Đặt thẻ vào đầu đọc thẻ", + "尝试连接设备...": "Kết nối với khóa. Vui lòng đợi...", + "地理位置": "Vị trí địa lý", + "检查以确保以下地址是正确的": "Kiểm tra để đảm bảo địa chỉ sau đây chính xác", + "地图加载中,请稍候。。": "Bản đồ đang tải, vui lòng đợi...", + "跳过": "Bỏ qua", + "还未获取到位置信息哦,请耐心等待一下!": "Thông tin vị trí chưa nhận được, vui lòng kiên nhẫn chờ đợi!", + "请填写信息": "Vui lòng điền thông tin", + "有效期": "Thời hạn hiệu lực", + "生效时间": "Thời gian bắt đầu", + "失效时间": "Thời gian kết thúc", + "上传成功": "Tải lên thành công", + "未生效": "Không hoạt động", + "已生效": "Hiệu quả", + "指纹详情": "Thông tin vân tay", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "Bạn sẽ được yêu cầu đặt ngón tay của bạn vào cảm biến nhiều lần. vui lòng làm theo hướng dẫn...", + "开始添加": "Bắt Đầu", + "请将您的手指按下": "Đặt ngón tay của bạn lên cảm biến", + "根据提示,抬起手指后再进行下一次指纹采集": "Thực hiện theo các hướng dẫn... bạn sẽ được yêu cầu gỡ bỏ và đặt ngón tay của bạn vào cảm biến cho hồ sơ tiếp theo", + "添加成功": "Thêm thành công", + "更新成功": "Cập nhật thành công", + "搜索": "Tìm kiếm", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "Sau khi đặt lại, thẻ của khóa sẽ bị xóa, bạn có muốn đặt lại không?", + "已失效": "Không hợp lệ", + "卡详情": "Thông tin thẻ", + "请输入": "Vui lòng nhập vào đây", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "Bằng cách tắt, khóa sẽ vẫn được mở khóa cả ngày cho đến khi khóa thủ công", + "请输入小于或等于60的数字": "Vui lòng nhập số dưới 60", + "操作成功": "Vận hành thành công", + "管理员密码相同,无需修改": "Mật khẩu Quản Trị là như nhau và không cần phải sửa đổi", + "请输入6-9位数字": "Dài 6-9 chữ số", + "请输入6-9位管理员密码": "Vui lòng nhập mật khẩu quản trị viên 6-9 chữ số", + "请输入新的管理员密码": "Vui lòng nhập mật khẩu quản trị viên mới", + "未分组": "Chưa nhóm", + "请输入分组名称": "Tạo nhóm", + "创建成功": "Tạo Thành Công", + "设置锁分组成功": "Thiết lập nhóm khóa thành công", + "电池1电量": "Pin 1", + "电池2电量": "Pin 2", + "电量更新时间": "Thời gian cập Nhật Pin", + "锁电量更新成功": "Khóa điện cập nhật thành công", + "您的钥匙未生效": "Chìa khóa của bạn không hiệu quả", + "您的钥匙已冻结": "Chìa khóa của bạn đã bị đóng băng", + "您的钥匙已过期": "Khóa của bạn đã hết hạn", + "常开模式开启": "Khóa ở chế độ PASSAGE", + "超级管理员": "Super Admin", + "授权管理员": "Quản trị viên được ủy quyền", + "普通用户": "Người dùng thông thường", + "余": "Cân bằng", + "天": "Ngày", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "Sau khi xóa khóa, tất cả thông tin sẽ bị xóa cùng nhau, bạn có chắc chắn muốn xóa khóa không?", + "请输入登录密码": "Vui lòng nhập mật khẩu ứng dụng", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "Không thể xóa thiết bị, vui lòng đảm bảo rằng thiết bị ở gần thiết bị, thiết bị không được kết nối và thiết bị được bật", + "用户无权限": "Người dùng không được phép", + "创建公司后,考勤功能才能使用": "Vui lòng tạo công ty trước", + "是否删除钥匙?": "Xóa ekey này?", + "邮箱绑定成功": "Thành Công liên kết email", + "手机绑定成功": "Thành công liên kết điện thoại di động", + "网络访问失败,请检查网络是否正常": "Yêu cầu không thành công. mạng không khả dụng, vui lòng kiểm tra và kết nối thiết bị của bạn với 3G/4G/Wifi", + "清空": "Trong suốt", + "是否清空?": "Rõ chưa?", + "消息详情": "Thông tin tin nhắn", + "创建时间": "Thời gian sáng tạo", + "管理员详情": "Chi tiết quản trị viên", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Nếu ai đó bắt bạn mở cửa, bạn có thể sử dụng thẻ này. tin nhắn báo động sẽ được gửi đến quản lý. để sử dụng tính năng này, hãy đảm bảo khóa của bạn trực tuyến.", + "请不要将胁迫卡用于日常开锁": "Vui lòng không sử dụng thẻ buộc để sử dụng hàng ngày.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "Nếu ai đó buộc bạn mở cửa, bạn có thể sử dụng dấu vân tay này. Thông báo cảnh báo sẽ được gửi đến quản lý. để sử dụng tính năng này, hãy đảm bảo khóa của bạn trực tuyến.", + "请不要将胁迫指纹用于日常开锁": "Vui lòng không sử dụng dấu vân tay bắt buộc để sử dụng hàng ngày.", + "创建公司": "Tạo một công ty", + "公司名称不能超过30个字符": "Tên công ty không thể vượt quá 30 ký tự", + "公司名称不能小于6个字符": "Tên công ty không thể nhỏ hơn 6 ký tự", + "WIFI列表": "Danh sách Wifi", + "刷新": "Làm mới", + "手动配网": "Mạng phân phối thủ công", + "远距离": "Khoảng cách xa", + "中距离": "Khoảng cách trung bình", + "近距离": "Khoảng cách ngắn", + "锁时间更新成功": "Khóa Thời gian cập nhật thành công", + "锁用户": "Người dùng khóa", + "请选择常开日期": "Vui lòng chọn ngày mở", + "结束时间不能小于开始时间哦": "Thời gian kết thúc không thể nhỏ hơn thời gian bắt đầu", + "介绍": "Câu chuyện của chúng tôi", + "个人信息收集清单": "Danh sách thu thập thông tin cá nhân", + "应用权限说明": "Mô tả cho phép ứng dụng", + "第三方信息共享清单": "Danh sách chia sẻ thông tin của bên thứ ba", + "请选择您的位置": "Vui lòng chọn vị trí của bạn", + "请先选择位置": "Vui lòng chọn vị trí trước", + "管理员密码": "Mật mã Quản Trị", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "Nếu bạn cần sửa đổi, vui lòng nhập mật khẩu quản trị viên mới (6 chữ số), nhấp OK để sửa đổi", + "修改": "Sửa đổi", + "网络摄像头": "Máy ảnh", + "重命名": "Đổi tên", + "分组下的锁将被移到未分组里": "Khóa dưới nhóm sẽ được chuyển đến chưa được phân nhóm", + "编辑成功": "Chỉnh sửa thành công", + "厂商": "Nhà sản xuất", + "型号": "Mô hình", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "Sau khi tạo mật khẩu, vui lòng sử dụng một lần để kích hoạt trước 23:59 cùng ngày, nếu không nó sẽ không hợp lệ sau 0 giờ. Sau khi mật khẩu được kích hoạt, nó có thể được sử dụng không giới hạn thời gian trong thời hạn hiệu lực.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "Sau khi tạo mật khẩu, vui lòng sử dụng nó trước 23:59 cùng ngày, nếu không nó sẽ không hợp lệ sau 0 giờ. Mã rõ ràng được sử dụng để xóa tất cả các mật khẩu được tạo ra trước 0 Giờ hôm nay.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "Sau khi tạo mật khẩu, vui lòng sử dụng nó trước 23:59 cùng ngày, nếu không nó sẽ không hợp lệ sau 0 giờ.", + "清空密码底部提示": "Mật khẩu có hiệu lực đến 23:59 vào ngày đổ", + "相机": "Máy ảnh", + "相册": "Ảnh", + "读写": "Đựng đồ", + "定位": "Vị trí", + "需要访问相机权限才能拍照上传文件例如头像上传": "Cần truy cập vào máy ảnh để chụp ảnh và tải lên tệp, chẳng hạn như tải lên ảnh đại diện", + "需要访问相机权限才能使用相册图片上传文件上传头像": "Cần truy cập vào máy ảnh để tải tập tin và hình đại diện bằng hình ảnh Album", + "需要访问读写权限才能使用本地图片上传头像": "Truy cập vào quyền đọc và ghi là cần thiết để tải lên hình đại diện bằng hình ảnh cục bộ", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "Cần có quyền truy cập vào thông tin vị trí để sử dụng chức năng phím Thêm", + "申请": "Ứng dụng", + "权限": "Cho phép", + "不允许": "Không được phép", + "允许": "Cho phép", + "权限被拒绝": "Cho phép bị từ chối", + "请手动在系统设置中开启": "Vui lòng tự bật nó trong cài đặt hệ thống", + "权限以继续使用应用": "Cho phép tiếp tục sử dụng ứng dụng.", + "去设置": "Đi thiết lập", + "当前网络": "Mạng hiện tại", + "位置信息": "Thông tin vị trí", + "请输入wifi名称": "Vui lòng nhập tên wifi", + "虹膜": "Iris", + "手掌": "Lòng bàn tay", + "商城": "Trung tâm mua sắm", + "我的": "Của tôi", + "微信公众号推送": "Tài khoản công cộng Wechat", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "Để mở Wechat để nhận tin nhắn báo động, trước tiên bạn cần chú ý đến tài khoản công cộng Skye Smart Lock WeChat, Vui lòng lưu mã QR và sử dụng Wechat để quét cài đặt", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Cần truy cập vào quyền của bluetooth để sử dụng thông tin vị trí của chức năng thêm phím", + "请输入Email": "Nhập email của bạn", + "请输入手机号": "Nhập số điện thoại của bạn", + "家人到家": "Thành viên gia đình đã về nhà", + "添加家人": "Thêm thành viên gia đình", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "Nếu khóa không được kết nối với internet, không thể gửi lời nhắc mật mã, thẻ, dấu vân tay và các phương pháp mở cửa khác kịp thời.", + "消息提醒": "Nhắc nhở", + "开门通知": "Thông báo mở", + "N天未开门": "N Days without Door... Xem chi tiết niêm yết»", + "门未关好": "Cửa không đóng", + "防拆报警": "Báo động giả mạo", + "低电量提醒": "Pin yếu", + "胁迫开门": "Mở cửa CƯỠNG BỨC", + "有人按门铃": "Ai Đó bấm chuông cửa", + "有人出现在门口": "Ai Đó xuất hiện ở cửa", + "提醒方式": "Phương pháp nhắc nhở", + "开门方式": "Phương pháp mở cửa", + "请选择": "Vui lòng chọn", + "家人": "Thành viên gia đình", + "保存": "Tiết kiệm", + "APP推送": "Đẩy ứng dụng", + "管理员": "Quản trị viên", + "未启用": "Không bật", + "已启用": "Đã bật", + "省电模式": "Chế độ tiết kiệm điện", + "逗留抓拍模式": "Ở chế độ chụp", + "实时监控模式": "Chế độ theo dõi thời gian thực", + "自定义模式": "Chế độ tùy chỉnh", + "猫眼设置": "Thiết lập mắt mèo", + "猫眼工作模式": "Chế độ làm việc mắt mèo", + "自动亮屏": "Màn hình sáng tự động", + "亮屏持续时间": "Màn hình đúng giờ", + "逗留警告": "Cảnh báo ở lại", + "异常警告": "Cảnh báo bất thường", + "短信提醒": "Tin nhắn SMS", + "邮件提醒": "Email", + "N天未开门提醒": "N Days without Door... Xem chi tiết niêm yết»", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "Nếu ai đó bắt bạn mở khóa, bạn có thể sử dụng dấu vân tay này. Thông báo cảnh báo sẽ được gửi đến các quản trị viên. để sử dụng tính năng này, vui lòng đảm bảo khóa của bạn trực tuyến.", + "胁迫指纹": "Dấu vân tay CƯỠNG BỨC", + "指纹列表": "Danh sách vân tay", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "Sau thời gian đã đặt, nếu khóa không được mở, hệ thống sẽ gửi tin nhắn nhắc nhở cho người nhận được chỉ định. Chức năng này yêu cầu khóa phải được kết nối với Internet.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "Sau khi bật nhắc nhở, khi pin khóa dưới 20%, 10% và 5%, hệ thống sẽ gửi tin nhắn nhắc nhở đến người nhận được chỉ định.", + "未开门时间": "Ngày không có cửa mở", + "添加和使用面容开锁时:": "Thêm và sử dụng khuôn mặt khi mở khóa:", + "关锁": "Khóa đóng", + "功能": "Chức năng", + "配件": "Bộ phận", + "云存": "Lưu trữ đám mây", + "本地": "Địa phương này", + "3天滚动储存": "Cuộn lưu trữ 3 ngày", + "去升级": "Nâng cấp ngay", + "下载列表": "Danh sách tải xuống", + "已下载": "Đã tải về", + "全部视频": "Tất cả video", + "已为本设备免费提供3大滚动视频储存服务": "Đã cung cấp ba dịch vụ lưu trữ video cuộn cho thiết bị này miễn phí", + "视频播放": "Phát lại video", + "全选": "Tất cả", + "请选择要删除的视频": "Vui lòng chọn video bạn muốn xóa", + "请选择要下载的视频": "Vui lòng chọn video bạn muốn tải về", + "欢迎使用": "Mời bạn sử dụng", + "用户协议和隐私政策概要": "Tóm tắt thỏa thuận người dùng và chính sách bảo mật", + "协议概要": "Tóm tắt giao thức", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Cảm ơn bạn đã sử dụng ứng dụng này. Chúng tôi rất coi trọng thông tin cá nhân và bảo vệ quyền riêng tư của bạn. Trước khi sử dụng sản phẩm này, vui lòng đọc kỹ", + "《用户协议》": "Điều khoản người dùng", + "和": "Và", + "《隐私政策》": "\"Chính sách bảo mật\"", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "Toàn bộ nội dung của. Bằng cách nhấp vào \"Đồng Ý\", bạn đồng ý và chấp nhận tất cả các điều khoản. Nếu bạn chọn không đồng ý, bạn sẽ không thể sử dụng sản phẩm và dịch vụ của chúng tôi và sẽ thoát khỏi ứng dụng.", + "不同意": "Không đồng ý", + "同意": "Đồng Ý", + "该功能是高级功能,请开通后再使用": "Đây là chức năng tiên tiến. Vui lòng kích hoạt nó trước.", + "常用程序": "Chương trình phổ biến", + "该锁已被重置": "Khóa đã được thiết lập lại", + "需要访问读写权限才能使用手动升级固件": "Quyền truy cập vào quyền đọc và ghi là cần thiết để nâng cấp phần mềm thủ công", + "错误D固件,请选择正确的文件": "Phần sụn sai, vui lòng chọn đúng tệp", + "非SYD固件,请选择正确的文件": "Phần sụn không phải SYD, vui lòng chọn đúng tệp", + "文件校验失败 0x01": "Xác minh tệp không thành công 0x01", + "解析元数据失败,请选择正确的文件": "Không phân tích được siêu dữ liệu, vui lòng chọn đúng tệp", + "文件校验失败 0x02": "Xác minh tệp không thành công 0x02", + "文件校验失败 0x03": "Xác minh tệp không thành công 0x03", + "固件升级完成": "Hoàn thành nâng cấp phần sụn", + "记录": "Hồ sơ", + "开通高级功能后才可以对锁进行管理": "Trước tiên hãy bật chức năng nâng cao để quản lý ổ khóa.", + "去开通": "Bật", + "实名认证": "Xác thực Tên thật", + "当前剩余数量": "Còn lại", + "购买": "Mua", + "实名认证为付费功能,请购买后再使用": "Xác thực tên thật là một chức năng thanh toán, vui lòng sử dụng nó sau khi mua", + "密码不一致哦": "Mật khẩu không nhất quán", + "退出添加": "Bỏ thêm", + "管理员已满": "Quản Trị đầy đủ", + "用户已满": "Người dùng đã đầy", + "锁上面添加指纹已满": "Đầy đủ dấu vân tay trên khóa", + "指纹已存在": "Dấu vân tay đã tồn tại.", + "锁上面添加人脸已满": "Khóa phía trên là đầy đủ", + "人脸已存在": "Mặt đã tồn tại", + "锁上面添加卡已满": "Khóa ở trên thêm thẻ là đầy đủ", + "卡已存在": "Đã có thẻ", + "锁上面添加密码已满": "Khóa ở trên Thêm mật khẩu đã đầy", + "密码已存在": "Đã có một mật mã giống hệt nhau. Vui lòng chọn một mật mã khác", + "请输入密码": "Vui lòng nhập mật khẩu", + "暂无密码,无需重置": "Không có mật khẩu, không cần thiết lập lại", + "真实姓名": "Tên thật", + "身份证号": "Số ID", + "请输入真实姓名": "Vui lòng nhập tên thật của bạn", + "请输入身份证号": "Vui lòng nhập số ID của bạn", + "请输入身份证号和真实姓名": "Vui lòng nhập số ID và tên thật của bạn", + "点击返回设备配对": "Chạm lại để ghép nối thiết bị", + "无法连接?尝试升级": "Không thể kết nối? Đã thử nâng cấp", + "固件升级提示": "Nhắc nâng cấp phần sụn", + "请先获取固件文件到手机本地,再选择升级": "Vui lòng lấy tệp phần sụn về điện thoại cục bộ trước, sau đó chọn nâng cấp", + "固件升级中": "Phần sụn đang được nâng cấp", + "取消升级": "Hủy nâng cấp", + "固件传输中": "Phần sụn trong quá trình vận chuyển", + "关闭": "Tắt", + "传输中'": "Đang được vận chuyển", + "操作记录": "Hồ sơ", + "修改姓名": "Chỉnh sửa tên", + "传输中": "Đang được vận chuyển", + "发送人": "Được cấp bởi", + "发送时间": "Thời gian phát hành", + "钥匙详情": "Ekey info", + "姓名": "Tên", + "发送": "Gửi", + "请确认姓名全名和身份证号码是否正确": "Vui lòng xác nhận rằng họ và số ID là chính xác", + "传输期间请勿离开当前页面": "Không rời trang hiện tại trong khi chuyển", + "机型": "Mẫu", + "硬件版本": "Phiên bản phần cứng", + "固件版本": "Phiên bản phần sụn", + "手动升级": "Nâng cấp thủ công", + "设备连接中...": "Kết nối thiết bị...", + "未避免异常情况,请在门打开时升级": "Ngoại lệ không thể tránh khỏi, vui lòng nâng cấp khi cửa mở", + "钥匙无效": "Khóa không hợp lệ", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "Không thể kết nối với khóa. Vui lòng khởi động lại bluetooth của điện thoại và thử lại.", + "如果是全自动锁,请使屏幕变亮": "Khóa hoàn toàn tự động bạn nhé, màn hình sáng hơn", + "正在尝试闭锁……": "Cố gắng khóa. Vui lòng đợi...", + "清空记录": "Xóa hồ sơ", + "是否要删除操作记录?": "Tiếp tục xóa hồ sơ?", + "被删除的记录不能恢复": "Không thể khôi phục hồ sơ sau khi xóa.", + "全部事件": "Tất cả các sự kiện", + "开锁事件": "Mở khóa sự kiện", + "异常事件": "Sự kiện bất thường", + "门铃事件": "Sự kiện chuông cửa", + "视频事件": "Sự kiện Video", + "请开启蓝牙": "Bạn bật bluetooth lên nhé", + "请选择有效日": "Vui lòng chọn Ngày Hiệu Quả", + "公司名字长度不能小于 6 ": "Độ dài của tên công ty không thể nhỏ hơn 6", + "已是最新版本": "Không cập nhật", + "新建短信模版": "Tạo mẫu SMS", + "新建邮件模版": "Tạo mẫu email", + "自定义短信模版": "Mẫu SMS", + "自定义邮件模版": "Mẫu email", + "名称": "Tên", + "星星锁": "Khóa Sao", + "无考勤记录": "Không có hồ sơ", + "大家干劲十足": "Mọi người đều đến kịp thời", + "工作时长未出炉": "Không có giờ làm việc", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "Lựa chọn Quốc gia/Khu vực sẽ ảnh hưởng đến an ninh dữ liệu. bạn hiện đã chọn Albania, vui lòng xác nhận trước khi tiến hành.", + "确认国家或地区": "Xác nhận Quốc gia/Khu vực", + "我知道了": "Đã nhận", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "Để nhận được cập nhật quan trọng, vui lòng Nhấp vào \"OK\" và bật thông báo trong cài đặt.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "Sau khi bật, bạn có thể bật lại bằng cách nhấn và giữ phím cài đặt trên khóa và thêm lại bằng ứng dụng", + "已有": "Dòng điện", + "新增": "Mới", + "账号格式错误": "Định dạng xấu", + "接收者信息为空": "Thông tin người nhận trống", + "请输入时间(秒)": "Vui lòng nhập thời gian (giây)", + "加载数据失败": "Không tải được dữ liệu", + "重试": "Thử lại", + "升级中,是否退出": "Trong quá trình nâng cấp, Có nên thoát hay không", + "下一步": "Tiếp theo", + "公寓": "Căn hộ", + "个人用户": "Cá nhân", + "星寓": "Căn hộ Star", + "账号": "Tài khoản", + "请输入手机号或email": "Số điện thoại hoặc email", + "请输入星寓管理员的账号": "Vui lòng nhập tài khoản của quản trị viên căn hộ ngôi sao", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "Tất cả dữ liệu của (Các) Khóa đã chọn sẽ được chuyển vĩnh viễn cho người nhận.", + "暂不支持跨平台转移,敬请期待": "Hiện tại không hỗ trợ chuyển đa nền tảng, vui lòng mong nhận được sản phẩm", + "移除坏锁": "Di chuyển ổ khóa bị lỗi/hư hỏng vào thùng rác", + "转移确认": "Xác nhận chuyển khoản", + "本次共转移": "Thời gian này tổng cộng", + "把智能锁": "Khóa thông minh", + "确认": "Ok", + "移除成功": "Xóa thành công", + "转移成功": "Chuyển thành công", + "该已锁被删除": "Khóa bị xóa", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Quản trị viên được ủy quyền chỉ có thể tự quản lý mật mã, Ekeys và etccreated.", + "添加授权管理员": "Tạo quản trị viên", + "导出记录": "Hồ sơ xuất khẩu", + "选择时间段": "Chọn khoảng thời gian", + "导出": "Xuất khẩu", + "批量导出": "Hàng loạt xuất khẩu", + "读取记录": "Làm mới hồ sơ", + "设备": "Thiết bị", + "消息": "Tin nhắn", + "智能分析": "Phân Tích thông minh", + "精准识别设备事件,过滤无效信息": "Xác định chính xác sự kiện của thiết bị và lọc thông tin không hợp lệ", + "系统设置": "Cài đặt hệ thống", + "系统的全局配置在此项内进行设置": "Cấu hình toàn cầu của hệ thống được thiết lập trong Mục này", + "导出操作记录": "Hồ sơ xuất khẩu", + "立即查看": "Xem", + "导出成功": "Xuất thành công", + "发送钥匙": "Gửi ekey", + "进度": "Tỷ lệ", + "失败": "Thất Bại", + "人脸详情": "Chi tiết khuôn mặt", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "Khi ai đó cảm nhận được khoảng 1.5 mét trước cửa, việc mở khóa Nhận dạng khuôn mặt sẽ tự động được khởi động.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "Khi ai đó cảm nhận được khoảng 0.8 mét trước cửa, việc mở khóa Nhận dạng khuôn mặt sẽ tự động được khởi động.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "Khi ai đó cảm nhận được khoảng 0.5 mét trước cửa, việc mở khóa Nhận dạng khuôn mặt sẽ tự động được khởi động.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "Khoảng cách cảm biến đã được tắt, bạn cần chạm thủ công bất kỳ phím nào trên bàn phím để thực hiện mở khóa Nhận dạng khuôn mặt.", + "防误开已打开,开锁后": "Lỗ mở chống lỗi đã được bật, và sau khi mở khóa", + "秒内不可使用面容开锁": "Không thể sử dụng mở khóa khuôn mặt trong vòng vài giây", + "掌静脉": "Tĩnh mạch lòng bàn tay", + "添加掌静脉": "Thêm tĩnh mạch lòng bàn tay", + "胁迫掌静脉": "Tĩnh mạch cọ ép", + "请不要将胁迫掌静脉用于日常开锁": "Vui lòng không sử dụng tĩnh mạch cọ ép để mở khóa hàng ngày", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "Đã kết nối với khóa, vui lòng tự nhiên mở lòng bàn tay của bạn, lòng bàn tay hướng về phía máy ảnh", + "掌静脉详情": "Chi tiết vân tay", + "掌静脉号": "Số tĩnh mạch lòng bàn tay", + "蓝牙未打开,请到设置里面打开蓝牙": "Bluetooth không được bật, vui lòng bật bluetooth trong cài đặt", + "删除用户时,会将用户拥有的钥匙一起删除。": "Nếu người dùng bị xóa, bất kỳ Ekeys nào được liên kết với người dùng cũng sẽ bị xóa.", + "配置网络": "Cấu hình mạng", + "你好": "Xin chào", + "成功": "Thành Công", + "类型选择": "Loại chọn", + "请选择要使用哪种类型": "Vui lòng chọn loại để sử dụng", + "系统邮件(推荐)": "Email hệ thống (khuyên dùng)", + "系统短信(推荐)": "Hệ thống SMS (khuyên dùng)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "Email sẽ được gửi từ ứng dụng này. Trước tiên hãy mua gói email.", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "Tin nhắn SMS sẽ được gửi từ ứng dụng này. Trước tiên hãy mua gói email.", + "个人邮件": "Email cá nhân", + "个人短信": "Tin nhắn SMS cá nhân", + "邮件将从你的个人邮箱发给用户": "Email sẽ được gửi từ tài khoản email cá nhân của bạn.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "Tin nhắn SMS sẽ được gửi từ số điện thoại cá nhân của bạn. Bạn trả tiền cho nhà điều hành viễn thông của bạn.", + "为了更好地应用体验,请确定权限": "Để có trải nghiệm ứng dụng tốt hơn, vui lòng xác nhận quyền", + "您第一次拒绝权限,请确定权限": "Bạn từ chối quyền lần đầu tiên, vui lòng xác nhận quyền", + "您第二次拒绝权限,请去应用设置开启权限": "Bạn từ chối quyền lần thứ hai, vui lòng truy cập cài đặt ứng dụng để cho phép", + "去应用市场": "Vào App Store", + "温馨提示": "Nhắc nhở ấm áp", + "关闭应用": "Đóng ứng dụng", + "开启微信接收报警消息需要先关注": "Để mở Wechat để nhận tin nhắn báo động, bạn cần làm theo", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Tài khoản công cộng WeChat, lưu mã QR và sử dụng Wechat để quét cài đặt", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "Xác thực tên thật là một chức năng trả tiền, vui lòng liên hệ với quản trị viên khóa để mua và sử dụng", + "位置权限": "Cho phép vị trí", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "Vui lòng cấp ứng dụng để sử dụng locatian của bạn. Nó được sử dụng để quét khóa BLE và cổng.", + "相机/相册权限": "Cho phép máy ảnh/Album", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "Vui lòng cấp ứng dụng để đọc và ghi ảnh và tập tin từ bộ nhớ.", + "点击选择": "Nhấp để chọn", + "微信": "Wechat", + "朋友圈": "Khoảnh khắc", + "QQ": "QQ", + "QQ空间": "Qqzone", + "微博": "Weibo", + "FaceBook": "Facebook", + "链接": "Liên kết", + "今天": "Hôm Nay", + "密码错误": "Mật khẩu không hợp lệ", + "网络中断": "Gián đoạn mạng", + "钥匙不存在": "Khóa không tồn tại", + "钥匙过期": "Chìa khóa đã hết hạn", + "钥匙已存在": "Đã có chìa khóa", + "密码失效": "Mật khẩu không hợp lệ", + "门锁时间异常": "Thời gian khóa cửa bất thường", + "APP(手机)未联网": "Ứng dụng (điện thoại di động) không được kết nối với internet", + "数据不存在": "Dữ liệu không tồn tại", + "待接收": "Bereceived", + "已冻结": "Đông lạnh", + "已删除": "Đã xóa", + "未知": "Không rõ", + "拖动下方滑块完成拼图": "Kéo thanh trượt đến đúng vị trí", + "验证成功": "Xác minh thành công", + "验证失败": "Xác minh không thành công", + "向右拖动滑块填充拼图": "Kéo thanh trượt sang phải để lấp đầy câu đố", + "请先获取到位置信息哦": "Vui lòng lấy thông tin vị trí trước", + "请选择国家": "Vui lòng chọn một quốc gia", + "获取锁信息": "Nhận thông tin khóa", + "锁数据异常,请重试": "Dữ liệu khóa là bất thường, vui lòng thử lại", + "连接设备中...": "Thiết bị kết nối...", + "把锁": "Ổ khóa", + "条": "Dải", + "封": "Con dấu", + "次": "Lần", + "支付成功": "Thanh toán thành công", + "查看详情": "Xem chi tiết", + "请输入模板名称": "Vui lòng nhập Tên mẫu", + "模版类型": "Loại", + "再返回一次退出": "Thoát một lần nữa", + "请先添加锁": "Vui lòng thêm khóa trước", + "可视对讲": "Thiết bị liên lạc trực quan", + "详细日志": "Nhật Ký chi tiết", + "已复制到剪切板": "Đã Sao chép", + "拍照": "Ảnh", + "从相册选择": "Chọn từ Album", + "选择问题": "Vui lòng chọn một câu hỏi", + "确认长度不足8位": "Xác nhận chiều dài dưới 8 chữ số", + "新密码长度不足8位": "Mật khẩu mới dài dưới 8 chữ số", + "两次密码不一致": "Mật khẩu không khớp. Vui lòng thử lại", + "请点击获取验证码,验证码将发送到": "Bạn lấy mã xác minh nhé, mã sẽ được gửi đến bạn", + "切换": "Công tắc", + "验证": "Xác minh", + "验证成功,账号已删除": "Xác minh thành công, xóa tài khoản", + "该密码不是自定义密码,无法修改": "Mật khẩu này không phải là mật khẩu tùy chỉnh và không thể sửa đổi", + "请选择设备要关联哪些姓名": "Vui lòng chọn tên thiết bị nên được liên kết với", + "请选择姓名要关联哪些设备": "Vui lòng chọn tên thiết bị nào nên liên kết với", + "确定要移除所选中的坏锁吗?": "Tháo khóa bị hỏng?", + "邮件通知": "Thông báo qua email", + "短信通知": "Thông báo qua SMS", + "您好,您的授权管理员生成成功": "Xin Chào, quản trị viên được ủy quyền của bạn đã được tạo thành công", + "请输入接收者姓名": "Vui lòng nhập vào đây", + "版本更新": "Cập nhật phiên bản", + "下次再说": "Lần sau", + "配网成功": "Thành Công phân phối mạng", + "配网失败": "Phân phối mạng không thành công", + "该锁的无线键盘都将被删除": "Tất cả bàn phím không dây cho khóa này sẽ bị xóa", + "实时画面": "Hình ảnh thời gian thực", + "适合门口较为安全的环境。": "Thích hợp cho môi trường tương đối an toàn ở cửa.", + "仅发生特定事件才录像,并可查看实时画面。": "Chỉ có các sự kiện cụ thể được ghi lại và hình ảnh thời gian thực có thể được xem.", + "一般情况下,满电可使用7-8个月": "Trong trường hợp bình thường, có thể sử dụng trong 7-8 tháng khi sạc đầy", + "有人逗留或发生特定事件才录像,可随时查看": "Ai đó lưu lại hoặc các sự kiện cụ thể được ghi lại và có thể xem bất cứ lúc nào", + "实时画面。": "Hình ảnh thời gian thực.", + "一般情况下,满电可使用5~6个月。": "Trong trường hợp bình thường, nó có thể được sử dụng trong 5 ~ 6 tháng khi sạc đầy.", + "适合门口人员复杂、较不安全的环境。": "Thích hợp cho các môi trường phức tạp và tương đối không an toàn ở cửa.", + "有人出现就录像,可随时查看实时画面。": "Ghi lại khi ai đó xuất hiện và xem ảnh thời gian thực bất cứ lúc nào.", + "一般情况下,满电可使用2~4个月。": "Trong trường hợp bình thường, nó có thể được sử dụng trong 2 ~ 4 tháng khi sạc đầy.", + "根据您家门口实际情况设置录像和实时画面功能。": "Đặt các chức năng video và hình ảnh thời gian thực theo tình hình thực tế tại cửa nhà bạn.", + "可使用时长由具体设置决定。": "Thời gian sử dụng được xác định bởi các cài đặt cụ thể.", + "查看": "Xem", + "有人按门铃或发生": "Ai Đó bấm chuông cửa hoặc", + "异常事件时": "Sự kiện bất thường", + "不录像": "Không có Video", + "有人出现、按门铃": "Ai Đó xuất hiện, bấm chuông cửa", + "或发生异常事件时": "Hoặc một sự kiện bất thường xảy ra", + "逗留达到10秒": "Ở lại trong 10 giây", + "约1.5米": "Khoảng 1.5 mét", + "随时": "Bất cứ lúc nào", + "立即录像": "Ghi lại ngay lập tức", + "录像时机": "Hẹn giờ video", + "有人出现时录像": "Ghi lại khi ai đó xuất hiện", + "人体侦测距离": "Khoảng cách phát hiện của con người", + "查看实时画面": "Xem ảnh thời gian thực", + "自定义时间": "Thời gian tùy chỉnh", + "当日": "Hôm Nay", + "次日": "Ngày hôm sau", + "自定义时段": "Khoảng thời gian tùy chỉnh", + "发生事件时查看": "Xem khi xảy ra sự kiện", + "实时查看": "Chế độ xem thời gian thực", + "有人在门口出现10秒后开始录像。": "Ai Đó xuất hiện ở cửa trong 10 giây trước khi ghi âm.", + "有人按门铃时立即录像。": "Ghi lại ngay lập tức khi ai đó đổ chuông cửa.", + "有人出现在门前1.5米范围时启动录像": "Bắt đầu ghi hình khi ai đó xuất hiện trong vòng 1.5 mét trước cửa", + "约0.8米": "Khoảng 0.8 mét", + "约3.0米": "Khoảng 3.0 mét", + "添加指纹失败": "Hoạt động thất bại.", + "项": "Mặt hàng", + "播放中": "Chơi", + "下载": "Tải xuống", + "暂无下载内容": "Không tải nội dung", + "亮度": "Độ sáng", + "音量": "Âm lượng", + "快进至": "Chuyển tiếp nhanh", + "快退至": "Tua lại", + "暂无视频信息": "Không có thông tin video", + "加载出错": "Lỗi tải", + "请单人正对门锁,距离一个成年人手臂长度": "Vui lòng đứng trước khóa cửa một mình, với chiều dài tay", + "(约0.6米)。": "(Khoảng 0.6 mét).", + "保持脸部无遮挡,露出五官。": "Giữ cho khuôn mặt của bạn không bị cản trở và thể hiện nét mặt của bạn.", + "准备好了,开始添加": "Sẵn sàng, bắt đầu Thêm", + "正在录入中...": "Ghi âm...", + "添加人脸失败": "Không thể thêm khuôn mặt", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các khuôn mặt của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?", + "人脸号": "Số Mặt", + "虹膜详情": "Chi tiết Iris", + "虹膜号": "Số Iris", + "选择设备类型": "Chọn loại thiết bị", + "照明灯具": "Thiết bị chiếu sáng", + "电动窗帘": "Rèm Cửa điện", + "门窗传感器": "Cảm biến cửa và cửa sổ", + "传感器": "Cảm biến", + "清除数据成功": "Xóa dữ liệu thành công", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "Khóa không được kết nối với internet, vì vậy không thể tải lên các phương pháp mã hóa, thẻ, dấu vân tay và các phương pháp mở cửa khác trong thời gian thực.", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "Nếu bạn cần lưu giữ các hồ sơ lịch sử, bạn có thể xuất khẩu chúng.", + "看不到操作记录,可能原因有": "Không thể xem hồ sơ hoạt động, lý do khả thi", + "操作记录详情": "Chi tiết hồ sơ hoạt động", + "操作时间": "Thời gian hoạt động", + "此模块功能需要锁联网后设置方可生效": "Chức năng mô-đun này cần được đặt sau khi khóa được kết nối với internet để có hiệu lực", + "用户已存在": "Người dùng đã tồn tại", + "钥匙数量已到上限": "Số lượng phím đã đạt đến giới hạn trên", + "附近没有可用网关": "Không có cổng có sẵn gần đó", + "正在创建安全连接...": "Tạo kết nối an toàn...", + "监视状态下不能发送录音": "Không thể gửi bản ghi ở chế độ giám sát", + "挂断": "Treo lên", + "监视中暂不能开锁": "Mở khóa không có sẵn trong quá trình giám sát", + "长按说话": "Nhấn và giữ để nói", + "松开发送": "Phát hành để gửi", + "请输入6位数字开锁密码": "Vui lòng nhập mật khẩu mở khóa 6 chữ số", + "请输入开锁密码": "Vui lòng nhập mật khẩu mở khóa", + "接收者在有效期内可以不限次数使用": "Người nhận có thể sử dụng Ekeys trong thời gian không giới hạn trong thời gian hiệu lực.", + "接收者可以使用此App开关锁": "Người nhận có thể khóa/mở khóa bằng ứng dụng này.", + "单次钥匙有效期为1小时,只能使用一次": "Ekey một lần có hiệu lực trong một giờ và chỉ có thể được sử dụng một lần.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "Người nhận có thể sử dụng Ekeys cho thời gian không giới hạn trong thời gian chu kỳ cố định.", + "获取模板失败": "Không thể lấy mẫu", + "微信通知": "Thông báo Wechat", + "系统短信": "Hệ thống SMS", + "系统邮件": "Email hệ thống", + "模板": "Mẫu", + "新建模版": "Tạo mẫu", + "您好,您的密码是": "Xin Chào, mật khẩu của bạn là", + "密码名字": "Tên mật khẩu", + "请输入6-9位密码": "Vui lòng nhập mật khẩu 6-9 chữ số", + "设置密码": "Đặt mật khẩu", + "操作成功,密码为": "Đã thành công. Mật mã là", + "类型:自定义-永久": "Loại: tùy chỉnh-vĩnh viễn", + "实时播放": "Phát lại thời gian thực", + "点击对讲": "Nhấp vào hệ thống liên lạc nội bộ", + "长按开锁": "Nhấn và giữ để mở khóa", + "接听失败": "Không trả lời được", + "请在锁设置中开启远程开锁": "Vui lòng bật mở khóa từ xa trong cài đặt Khóa", + "接听": "Trả lời", + "截图已保存到相册": "Ảnh chụp màn hình được lưu vào album", + "添加遥控": "Thêm điều khiển từ xa", + "已连接到锁,请按遥控": "Đã kết nối với khóa, vui lòng nhấn điều khiển từ xa", + "遥控号": "Số điều khiển từ xa", + "遥控详情": "Chi tiết điều khiển từ xa", + "照明": "Chiếu sáng", + "退出演示模式": "Thoát chế độ Demo", + "提示:当前界面为展示界面,添加设备后才能继续使用": "Mẹo: Giao diện hiện tại là Giao diện hiển thị. Sau khi thêm thiết bị, bạn có thể tiếp tục sử dụng thiết bị", + "门已上锁": "Cửa bị khóa", + "您的账号在异地登录,如非本人,请尽快修改密码": "Tài khoản của bạn đã được sử dụng để đăng nhập từ một thiết bị mới", + "开门成功": "Mở Cửa Thành Công", + "开门失败": "Không thể mở cửa", + "呼叫提醒": "Nhắc nhở cuộc gọi", + "收到来自": "Nhận được từ", + "锁的呼叫": "Khóa cuộc gọi", + "加载数据中": "Tải dữ liệu", + "搜索所有锁类型": "Tìm kiếm tất cả các loại khóa", + "锁电量更新时间": "Khóa Thời gian cập nhật Pin", + "1月": "Tháng 1", + "2月": "Tháng 2", + "3月": "MAR", + "4月": "Tháng tư", + "5月": "Tháng năm", + "6月": "Jun", + "7月": "Tháng 7", + "8月": "Tháng tám", + "9月": "Sep", + "10月": "Tháng 10", + "11月": "Tháng 11", + "12月": "Tháng 12", + "热门城市": "Thành Phố nóng", + "导出锁数据": "Dữ liệu khóa xuất khẩu", + "一键开锁": "Mở khóa bằng một cú nhấp chuột", + "已开通": "Đã mở", + "编辑员工": "Nhân viên chỉnh sửa", + "一": "Một", + "二": "Hai", + "三": "Ba", + "四": "Bốn", + "五": "Năm", + "六": "Sáu", + "日": "Mặt Trời", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các tĩnh mạch metacarpal của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?", + "在线": "Trực tuyến", + "离线": "Ngoại tuyến", + "购买记录": "Hồ Sơ mua hàng", + "使用记录": "Bản ghi người dùng", + "失效时间要大于当前时间": "Thời gian hết hạn phải dài hơn thời gian hiện tại", + "修改名字": "Chỉnh sửa tên", + "时": "Giờ", + "分": "PHÚT", + "Amazon Alexa": "Amazon Alexa", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "Bạn có thể sử dụng Alexa để mở khóa, khóa và kiểm tra trạng thái khóa", + "支持的国家": "Các Quốc Gia được hỗ trợ", + "支持的国家值": "Mỹ, Canada, Anh, Úc, Ấn Độ, Đức, Pháp, Ý, Tây Ban Nha, Nhật Bản", + "操作流程": "Quy trình vận hành", + "操作流程值": "1 thêm khóa và cổng vào với ứng dụng Smart Lock\n\n2 Bật chức năng mở khóa từ xa của khóa trong ứng dụng (chức năng này bị tắt theo mặc định). Nếu bạn không có tùy chọn này, khóa không hỗ trợ Alexa\n\n3 thêm kỹ năng vào Alexa và ủy quyền cho họ bằng tài khoản và mật khẩu của ứng dụng Smart Lock. Sau khi ủy quyền thành công, bạn có thể khám phá các thiết bị trong tài khoản\n\n4 xác định vị trí khóa trong ứng dụng Alexa, bật chức năng mở khóa bằng giọng nói và đặt mật khẩu ngôn ngữ\n\n5 ổ khóa có thể hoạt động thông qua Alexa", + "Google Home": "Trang chủ Google", + "Action name": "Tên hành động", + "ScienerSmart": "Scienersmart", + "支持的语言": "Ngôn ngữ được hỗ trợ", + "英语": "Tiếng Anh", + "Google Home操作流程的值": "1. Sử dụng ứng dụng khóa thông minh để thêm khóa và cổng\n\n2. Kích hoạt chức năng mở khóa từ xa của khóa trong ứng dụng (chức năng này bị tắt theo mặc định). Không có tùy chọn này, khóa không hỗ trợ Google Home\n\n3. Cài đặt ứng dụng Google Home và nhấp vào nút \"\" ở góc trên cùng bên trái\n\n4. trên trang cài đặt, chọn \"làm việc với Google\"\n\n5. Tìm kiếm \"scienersmart\" và sử dụng tài khoản và mật khẩu ứng dụng Smart Lock để ủy quyền", + "密码需至少包含数字/字母/字符中的2种组合": "Mật khẩu phải chứa ít nhất 2 trong số những điều sau: số, chữ cái và ký tự đặc biệt", + "已开锁": "Đã mở khóa", + "已闭锁": "Khóa", + "两次密码不一致哦": "Mật khẩu không nhất quán", + "中功率": "Công suất trung bình", + "常规使用": "Sử dụng thường xuyên", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "Sau khi cổng được bật, Nhấn và giữ nút đặt lại trong 5 giây và Nhấp vào tiếp theo khi đèn báo nhấp nháy luân phiên", + "扫描设备": "Thiết bị quét", + "删除失败,网关可能已经离线,是否强制删除该数据?": "Xóa thất bại. Cổng có thể đã tắt. Bạn có muốn buộc xóa dữ liệu không?", + "超级管理员英文": "Super Admin", + "授权管理员英文": "Make admin", + "普通管理员英文": "Ordinary user", + "网关设备英文": "Gateway", + "手机需联网英文": "NeedNet", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" +} \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 051d588f..20d398f7 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -26,7 +26,6 @@ "星期五": "星期五", "星期六": "星期六", "星期日": "星期日", - "简写周一": "一", "简写周二": "二", "简写周三": "三", @@ -34,7 +33,6 @@ "简写周五": "五", "简写周六": "六", "简写周日": "日", - "周一": "周一", "周二": "周二", "周三": "周三", @@ -42,7 +40,6 @@ "周五": "周五", "周六": "周六", "周日": "周日", - "群发钥匙": "群发钥匙", "锁": "锁", "请添加": "请添加", @@ -61,389 +58,297 @@ "添加门磁": "添加门磁", "添加无线键盘": "添加无线键盘", "添加手掌": "添加手掌", - - "accountNumber": "账号", - "volumeAuthorizationLock": "批量授权锁", - "authorizedAdminTip": "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人", - "lockOperatingRecordTip": "如果您需要保留历史记录,可以在右上角导出", - "rankingList": "排列榜", - "earlyArrivalList": "早到榜", - "lateList": "迟到榜", - "hardWorkingList": "勤奋榜", - "company": "公司", - "staff": "员工", - "work": "工作", - "workday": "工作日", - "holidays": "节假日", - "punchingMode": "打卡方式", - "whetherTheEmployeeHasAKey": "员工是否有钥匙", - "selectKey": "选择钥匙", - "officeHours": "上班时间", - "closingTime": "下班时间", - "thisWeek": "本周", - "singleDayWeekend": "单休", - "twoDaysOff": "双休", - "oddOrEvenDaysOff": "单双休", - "year": "年", - "month": "月", - "libertyDay": "放假日期", - "coverDate": "补班日期", - "addedHoliday": "添加假日", - "startDate": "开始日期", - "accessDate": "接入日期", - "mustFillIn": "必填", - "endDate": "结束日期", - "dailyCharts": "日榜", - "monthlyLeaderboard": "月榜", - "noAttendanceRecord": "无考勤记录", - "attendanceRecord": "考勤记录", - "everyoneIsVeryMotivated": "大家干劲十足", - "workingHoursWereNotReleased": "工作时长未出炉", - "beLate": "迟到", - "leaveEarly": "早退", - "noCardPunched": "未打卡", - "holidayInfo": "假日信息", - "basicInformation": "基本信息", - "wirelessKeyboard": "无线键盘", - "doorMagnetic": "门磁", - "remoteUnlocking": "远程开锁", - "automaticBlocking": "自动闭锁", - "normallyOpenMode": "常开模式", - "automaticUnLock": "自动开锁", - "automaticUnLockTip": "开启后锁将在常开模式开始时自动打开", - "lockSound": "锁声音", - "burglarAlarm": "防撬报警", - "resetButton": "重置键", - "lockTime": "锁时间", - "diagnose": "诊断", - "uploadData": "上传数据", - "importOtherLockData": "导入其他锁数据", - "lockEscalation": "锁升级", - "markedHouseState": "标记房态", - "unlockReminder": "开锁提醒", - "unlockQRCode": "微信二维码", - "lockNumber": "锁编号", - "electricQuantity": "电量", - "lockName": "名称", - "lockGrouping": "锁分组", - "selectGroup": "选择分组", - "createNewGroup": "创建新分组", - "adminOpenLockPassword": "管理员开锁密码", - "update": "更新", - "updateElectricQuantityTip": "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新", - "adminOpenLockPasswordTip": "如果你在锁上修改过密码,锁内实际有效密码与这里显示的可能不同", - "updateLockAdminPassword": "上传锁内管理员密码", - "whenScreenFlashesClickNext": "当屏幕闪烁时,点击下一步", - "theScreenNeverFlickered": "屏幕一直没有闪烁", - "enterNumberOrPressSet": "输入*529#或按设置键", - "theLocationOfTheSetKeyWillBeDifferent": "设置键的位置会有差异", - "pressAndHoldTheResetButtonTwoSeconds": "长按重置键2秒", - "nearbyEquipment": "附近的设备", - "noData": "暂无数据", - "doorMagneticListTopTip": "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁", - "remoteUnlockingPageTip": "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。", - "currentMode": "当前模式", - "delayTime": "延迟时间", - "automaticBlockingTip": "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。", - "time": "时间", - "normallyOpen": "常开", - "date": "日期", - "begin": "开始", - "end": "结束", - "allDay": "全天", - "save": "保存", - "normallyOpenModeTip": "在设置的常开时间内,锁被打开后将一直处于打开的状态,直到被手动关闭", - "pleaseSelectLockVolume": "请选择锁音量", - "lockSoundTip": "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。", - "low": "低", - "lower": "较低", - "medium": "中", - "higher": "较高", - "high": "高", - "burglarAlarmTip": "开启后,锁被撬动时,会发出报警声", - "resetButtonTip1": "开启后,可通过长按锁上的重置键来用APP重新添加", - "resetButtonTip2": "关闭后,重置键无效,锁要通过app删除后才能重新添加", - "calibrationTime": "校准时间", - "setTheDSTMode": "夏令时模式设置", - "diagnoseTip": "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因", - "uploading": "上传", - "uploadDataTip": "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待", - "importOtherLockDataTip": "请选择要从哪把锁导入", - "haveNewVersion": "有新版本", - "currentVersion": "当前版本", - "newVersion": "新版本", - "upgrade": "升级", - "leisure": "空闲", - "checkedIn": "已入住", - "lanEnglish": "英文", - "lanChinese": "中文", - "multilingual": "多语言", - "addLock": "添加锁", - "lockAddress": "锁地址", - "selectLockType": "选择锁类型", - "videoIntercomDoorLock": "可视对讲门锁", - "NFCPassiveLock": "NFC无源锁", - "addDevice": "添加设备", - "gateway": "网关", - "message": "消息", - "supportStaff": "客服", - "set": "设置", - "moreServices": "更多服务", - "moreSet": "更多设置", - "prompTone": "提示音", - "touchUnlock": "触摸开锁", - "pushNotification": "消息推送", - "lockUserManagement": "锁用户管理", - "ownedKey": "拥有的钥匙", - "authorityManagement": "批量授权", - "associatedDevice": "关联设备", - "associatedName": "关联姓名", - "device": "设备", - "authorizedAdmin": "授权管理员", - "addAuthorizedAdmin": "添加授权管理员", - "lockGroup": "锁分组", - "transferSmartLock": "转移智能锁", - "selectiveLock": "选择锁", - "recipientInformation": "接收人信息", - "transferGateway": "转移网关", - "multiLanguage": "多语言", - "lockScreen": "锁屏", - "closed": "已关闭", - "opened": "已开启", - "close": "关闭", - "open": "开启", - "hideInvalidUnlockPermissions": "隐藏无效开锁权限", - "appUnlockRequiresMobilePhoneAccessToTheLock": "APP开锁时需手机连网的锁", - "valueAddedServices": "增值服务", - "about": "关于", - "userAgreement": "用户协议", - "privacyPolicy": "隐私政策", - "personalInformationCollectionList": "个人信息收集清单", - "applicationPermissionDescription": "应用权限说明", - "thirdPartyInformationSharingList": "第三方信息共享清单", - "logout": "退出", - "deleteAccount": "删除账号", - "personalInformation": "个人信息", - "avatar": "头像", - "nickName": "昵称", - "changeNickName": "修改昵称", - "modifyAccount": "修改账号", + "请输入员工账号": "请输入员工账号", + "批量授权锁": "批量授权锁", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。", + "排列方式": "排列方式", + "早到榜": "早到榜", + "迟到榜": "迟到榜", + "当前模式": "当前模式", + "勤奋榜": "勤奋榜", + "延迟时间": "延迟时间", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。", + "时间": "时间", + "开始时间": "开始时间", + "结束时间": "结束时间", + "工作时间设置": "工作时间设置", + "常开模式": "常开模式", + "常开时间": "常开时间", + "常开日期": "常开日期", + "添加员工": "添加员工", + "编辑员工": "编辑员工", + "节假日": "节假日", + "打卡方式": "打卡方式", + "员工是否有钥匙": "员工是否有钥匙", + "上班时间": "上班时间", + "下班时间": "下班时间", + "本周": "本周", + "单休": "单休", + "双休": "双休", + "单双休": "单双休", + "年": "年", + "月": "月", + "放假日期": "放假日期", + "补班日期": "补班日期", + "添加假日": "添加假日", + "开始日期": "开始日期", + "必填": "必填", + "结束日期": "结束日期", + "日榜": "日榜", + "月榜": "月榜", + "考勤记录": "考勤记录", + "未打卡": "未打卡", + "假日信息": "假日信息", + "基本信息": "基本信息", + "无线键盘": "无线键盘", + "选择无线键盘": "选择无线键盘", + "门磁": "门磁", + "自动闭锁": "自动闭锁", + "锁声音": "锁声音", + "防撬报警": "防撬报警", + "重置键": "重置键", + "锁时间": "锁时间", + "诊断": "诊断", + "上传数据": "上传数据", + "导入其他锁数据": "导入其他锁数据", + "锁升级": "锁升级", + "标记房态": "标记房态", + "开锁提醒": "开锁提醒", + "微信二维码": "微信二维码", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边", + "锁编号": "锁编号", + "电量": "电量", + "锁分组": "锁分组", + "选择分组": "选择分组", + "创建新分组": "创建新分组", + "管理员开锁密码": "管理员开锁密码", + "更新": "更新", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新", + "当屏幕闪烁时,点击下一步": "当屏幕闪烁时,点击下一步", + "输入*529#或按设置键": "输入*529#或按设置键", + "长按重置键2秒": "长按重置键2秒", + "附近的设备": "附近的设备", + "暂无数据": "暂无数据", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁", + "开始": "开始", + "全天": "全天", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。", + "请选择锁音量": "请选择锁音量", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。", + "低": "低", + "较低": "较低", + "中": "中", + "较高": "较高", + "高": "高", + "开启后,锁被撬动时,会发出报警声": "开启后,锁被撬动时,会发出报警声", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "关闭后,重置键无效,锁要通过app删除后才能重新添加", + "校准时间": "校准时间", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因", + "上传": "上传", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待", + "请选择要从哪把锁导入": "请选择要从哪把锁导入", + "有新版本": "有新版本", + "当前版本": "当前版本", + "升级": "升级", + "空闲": "空闲", + "已入住": "已入住", + "多语言": "多语言", + "添加锁": "添加锁", + "锁地址": "锁地址", + "选择锁类型": "选择锁类型", + "NFC无源锁": "NFC无源锁", + "添加设备": "添加设备", + "网关": "网关", + "客服": "客服", + "设置": "设置", + "更多设置": "更多设置", + "消息推送": "消息推送", + "锁用户管理": "锁用户管理", + "拥有的钥匙": "拥有的钥匙", + "批量授权": "批量授权", + "关联设备": "关联设备", + "关联姓名": "关联姓名", + "转移智能锁": "转移智能锁", + "选择锁": "选择锁", + "接收人信息": "接收人信息", + "转移网关": "转移网关", + "锁屏": "锁屏", + "已关闭": "已关闭", + "已开启": "已开启", + "开启": "开启", + "确定要开启重置键?": "确定要开启重置键?", + "确定要关闭重置键?": "确定要关闭重置键?", + "隐藏无效开锁权限": "隐藏无效开锁权限", + "APP开锁时需手机连网的锁": "APP开锁时需手机连网的锁", + "增值服务": "增值服务", + "关于": "关于", + "退出": "退出", + "删除账号": "删除账号", + "个人信息": "个人信息", + "头像": "头像", + "昵称": "昵称", + "请输入昵称": "请输入昵称", + "修改昵称": "修改昵称", + "修改账号": "修改账号", "重置密码": "重置密码", - "safetyProblem": "安全问题", - "modifyAccountTip": "为了你的账号安全,修改账号前请先使用验证码验证", - "pleaseEnterAccountNumber": "请输入账号", - "pleaseEnterNewAccountNumber": "请输入新账号", - "changeIphoneTip": "找回密码和登录新设备时,可通过绑定的手机验证", - "changeEmailTip": "找回密码和登录新设备时,可通过绑定的邮箱验证", - "goBind": "去绑定", - "originalPassword": "原密码", - "newPassword": "新密码", + "安全问题": "安全问题", + "为了你的账号安全,修改账号前请先使用验证码验证": "为了你的账号安全,修改账号前请先使用验证码验证", + "请输入新账号": "请输入新账号", + "找回密码和登录新设备时,可通过绑定的手机验证": "找回密码和登录新设备时,可通过绑定的手机验证", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "找回密码和登录新设备时,可通过绑定的邮箱验证", + "原密码": "原密码", + "新密码": "新密码", "确认密码": "确认密码", - "safetyProblemTip": "当你手机丢了,可以通过回答设置的安全问题来登录新设备", - "problemOne": "问题一", - "problemTwo": "问题二", - "problemThree": "问题三", - "pleaseEnterYourAnswer": "请输入你的答案", - "aboutToExpire": "即将到期", - "changeName": "修改名称", - "deAuthorize": "去授权", - "designation": "名称", - "state": "状态", - "wifiName": "WiFi名称", - "networkMAC": "网络MAC", - "gatewayUpgrade": "网关升级", - "gatewayConnectionLock": "网关连接的锁", - "strongSignal": "信号强", - "mediumSignal": "信号中等", - "averageSignal": "信号一般", - "weakSignal": "信号弱", - "selectGatewayType": "选择网关类型", - "addGateway": "添加网关", - "turnThePowerBackOn": "重新通电", - "indicatorLight": "指示灯", - "selectGatewayTypeNextTip": "将网关重新通电,指示灯交替闪烁时点击下一步", - "selectGateway": "选择网关", - "gatewayConfigurationWifiTip": "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置", - "wifiPassward": "WiFi密码", - "pleaseEnterTheWiFiPassword": "请输入WiFi密码", - "gatewayName": "网关名称", - "pleaseEnterGatewayName": "请输入网关名称", - "wifiMAC": "网络MAC", - "ipAddress": "IP地址", - "subnetMask": "子网掩码", - "defaultGateway": "默认网关", - "automaticallyGetTheDNSServerAddress": "自动获取DNS服务器地址", - "preferredDNS": "首选DNS", - "alternativeDNS": "备选DNS", - "noStaticIPIsUsed": "不使用静态IP", - "allLock": "所有锁", - "searchAllLockType": "搜索所有锁类型", - "doorLock": "门锁", - "padlock": "挂锁", - "safeLock": "保险箱锁", - "intelligentLockCore": "智能锁芯", - "itelligentAccessControl": "智能门禁", - "parkingLock": "车位锁", - "bicycleLock": "自行车锁", - "longRangeControl": "远程控制", - "lightTouchScreen": "摸亮触摸屏", - "lightTouchScreenTip": "摸亮触摸屏,锁进入可添加状态,点击下一步", - "next": "下一步", - "nearbyLock": "附近的锁", - "addSuccessfullyPleaseRename": "如需修改名字请重新命名,点击确定添加锁", - "whenAddingLockThePhoneMustBeNextToTheLock": "添加锁时,手机必须在锁旁边", - "login": "登录", - "register": "注册", - "forgetPassword": "忘记密码", - "readAndAgree": "我已阅读并同意", - "verificationCode": "验证码", - "registerPasswordTip": "密码必须是8-20位,至少包括数字/字母/符号中的2种", - "iphone": "手机", - "email": "邮箱", - "mobileNumber": "手机号", - "countryAndRegion": "国家/地区", - "select": "选择", - "getVerificationCode": "获取验证码", - "businessCooperation": "商务合作", - "officialWebsite": "官网", - "computerWebVersion": "电脑网页版", - "hotelSystem": "酒店系统", - "manualWebVersion": "说明书网页版", - "introduce": "介绍", - "note": "短信", - "mail": "邮件", - "advancedFunction": "高级功能", - "pushMessage": "推送", - "recordsRetention": "记录保存", - "smsBuyTip": "您可通过短信将密码、电子钥匙信息发给接收人。", - "emailBuyTip": "您可通过邮件将密码、电子钥匙信息发给接收人。", - "currentRemainingQuantity": "当前剩余数量", - "buy": "购买", - "record": "记录", - "buyRealNameTip": "给用户发送电子钥匙时,可以要求其开锁前先进行人脸识别,以保证是他本人在操作。人脸实名认证调用国家公安系统接口,为付费功能,请购买次数后再使用。", - "buyRealNameSelectYouWantBuyTip": "请选择你希望的实名认证频次", - "forTheFirstTime": "仅首次", - "onceDay": "每日一次", - "weekOnce": "每周一次", - "monthOnce": "每月一次", - "currentState": "当前状态", - "onTrial": "试用中", - "haveNotOpened": "未开通", - "advancedFeaturesAndBenefitsContent": "高级功能权益内容", - "smsTemplate": "短信模板", - "emailTemplate": "邮件模板", - "cardIssuingtool": "发卡工具", - "titleForBuyingAdvancedFeatures": "购买高级功能须知", - "tipsForBuyingAdvancedFeatures": "更多的高级功能正在开发中,如果您需要这些功能,欢迎根据锁的数量开通服务。高级功能仅能用于您自己的锁。如果您是授权管理员,请联系锁的最高管理员开通服务。", - "freeTrial": "免费体验", - "openNow": "立即开通", - "buySMS": "购买短信", - "buyMail": "购买邮件", - "buyRealNameAuthenticationTimes": "购买实名认证次数", - "enablingAdvancedFeatures": "开通高级功能", - "chooseAPackage": "选择套餐", - "modeOfPayment": "支付方式", - "alipay": "支付宝", - "goToPay": "去支付", - "customTemplatesTip": "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人", - "haveOpened": "已开通", - "unHaveOpenedTip1": "该功能是高级功能,请开通后再使用", - "unHaveOpenedTip2": "高级功能仅能用于你自己的锁", - "freeTrialKeywords": "免费试用", - "goToTheOpen": "去开通", - "creatingANewTemplate": "新建模板", - "type": "类型", - "templateContent": "模版内容", - "preview": "预览", - "hello": "你好", - "yourRoomIs": "您的房间是", - "roomName": "房间名", - "theCodeToOpenTheDoorIs": "开门密码是", - "templateTip1": "输入密码后请按#号键或其他开锁键结束。密码生效后24小时内至少要使用一次,否则将失效", - "templateTip2": "你收到一把电子钥匙,请使用小程序开门。", - "templateTip3": "或安装App来开门。", - "expectedNotoCount": "预计产生短信条数", - "templateTip4": "提示:向其他人发送消息时,关键宇", - "and": "和", - "willBeReplacedWithTheActualValue": "将替换为实际值", - "downloadLink": "下载链接", - "lockScreenTip": "功能开启后,需使用指纹、人脸或账号密码来打开 APP。3分钟内不需要再次验证", - "hideInvalidUnlockPermissionsTip": "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。", - "appUnlockRequiresMobilePhoneAccessToTheLockTip": "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁", - "checkAll": "全选", - "wifiDistributionNetwork": "WiFi配网", - "configuringWiFi": "配置WiFi", - "pleaseEnterWifiName": "请输入WiFi名字", - "wifiPwd": "WiFi名字", - "pleaseEnterWifiPwd": "请输入WiFi密码", - "edit": "编辑", - "stressFingerprint": "胁迫指纹", - "effectiveDay": "有效日", - "stressCard": "胁迫卡", - "stressPassword": "胁迫密码", - "whetherTheEmployeeHasPassword": "员工是否有密码", - "whetherTheEmployeeHasCard": "员工是否有卡", - "whetherTheEmployeeHasFingerprint": "员工是否有指纹", - "selectPassword": "选择密码", - "selectCard": "选择卡", - "selectFingerprint": "选择指纹", - "getKey": "获取钥匙", - "getCard": "获取卡", - "getFingerprint": "获取指纹", - "safeVerify": "安全验证", - "deleteAccountTips": "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?", - "humanFace": "人脸", - "monitoring": "监控", - "videoLog": "视频日志", - "messageReminding": "消息提醒", - "superAdmin": "超级管理员", - "normalUser": "普通用户", - "gatewayDevice": "网关设备", - "illumination": "照明", - "doorOpener": "开门器", - "faceUnlocks": "面容开锁", - "catEyeSet": "猫眼设置", - "openingDirectionSet": "开门方向设置", - "motorPowerSetting": "电机功率设置", - "bluetoothBroadcast": "蓝牙广播", - "whetherInternetRequiredWhenUnlocking": "开锁时是否需联网", - "selectTheLockToJoinTheGroup": "选择要加入分组的锁", - "lockTrCount": "锁数量", - "xiaomiIOTPlatform": "小米IOT平台", - "connectBlueErrorTip": "未连接到设备,请确保在设备附近,设备未被连接,设备已打开", - "pleaseEnterAGroupName": "请输入分组名称", - "hint": "提示", - "areYouSureYouWantToDeleteIt": "确定要删除吗?", - "faceUnlocksSet": "面容开锁设置", - "automaticBrighteningScreen": "自动亮屏", - "sensingDistance": "感应距离", - "sensingDistanceTip": "感应到门前约1.5米有人时,将自动启动面部识别开锁。", - "preventWrongOpening": "防误开", - "preventWrongOpeningTip": "防误开已关闭,关门后仍可使用面容开锁", - "remote": "远距离", - "closeRange": "近距离", - "addAndUseFaceWhenUnlocking": "添加和使用面容开锁时", - "addAndUseFaceWhenUnlockingTip": "\n1、请尽量保持单人在门前操作;\n2、请站立在门锁正前方约0.5~0.8米,面向门锁;\n3、请保持脸部无遮挡,露出五官;\n4、面容识别异常时,可触摸数字键盘任意按键,手动重启人脸识别。", - "second": "秒", - "motorPowerSettingTip": "请根据门锁实际情况,请谨慎选择电机功率:", - "miniwatt": "小功率:", - "miniwattTip": "耗电少", - "highPower": "大功率:", - "highPowerTip": "如果开锁时锁舌不能正常收回,,或需要带动\n天地钩,建议选择大功率。此时耗电将会\n增加。", - "openingDirectionSetTip": "请谨慎选择您家的开门方向(如果选择错误,将无法正常开关门):", - "openLeft": "左开", - "openRight": "右开", - "judgmentMethod": "判断方法:\n", - "judgmentMethodContent": "人站在屋外,面向入户门。\n如果门的合页或门轴在左边,则门是左开;\n如果门的合页或门轴在右边,则门是右开。\n如果设置错误,将无法正常开关门。\n建议由安装或维修人员操作。", - "customMode": "自定义模式", - "videoSlot": "录像时段", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "当你手机丢了,可以通过回答设置的安全问题来登录新设备", + "问题一": "问题一", + "问题二": "问题二", + "问题三": "问题三", + "请输入你的答案": "请输入你的答案", + "即将到期": "即将到期", + "修改名称": "修改名称", + "去授权": "去授权", + "状态": "状态", + "WiFi名称": "WiFi名称", + "网络MAC": "网络MAC", + "网关升级": "网关升级", + "网关连接的锁": "网关连接的锁", + "信号强": "信号强", + "选择网关类型": "选择网关类型", + "添加网关": "添加网关", + "重新通电": "重新通电", + "指示灯": "指示灯", + "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步": "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步", + "选择网关": "选择网关", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置", + "WiFi密码": "WiFi密码", + "请输入WiFi密码": "请输入WiFi密码", + "网关名称": "网关名称", + "请输入网关名称": "请输入网关名称", + "IP地址": "IP地址", + "子网掩码": "子网掩码", + "默认网关": "默认网关", + "自动获取DNS服务器地址": "自动获取DNS服务器地址", + "首选DNS": "首选DNS", + "备选DNS": "备选DNS", + "不使用静态IP": "不使用静态IP", + "使用静态IP": "使用静态IP", + "请输入IP地址": "请输入IP地址", + "请输入子网掩码": "请输入子网掩码", + "请输入默认网关": "请输入默认网关", + "所有锁": "所有锁", + "搜索所有类型的锁": "搜索所有类型的锁", + "门锁": "门锁", + "挂锁": "挂锁", + "保险箱锁": "保险箱锁", + "智能门禁": "智能门禁", + "车位锁": "车位锁", + "摸亮触摸屏": "摸亮触摸屏", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "摸亮触摸屏,锁进入可添加状态,点击下一步", + "附近的锁": "附近的锁", + "如需修改名字请重新命名,点击确定添加锁": "如需修改名字请重新命名,点击确定添加锁", + "添加锁时,手机必须在锁旁边": "添加锁时,手机必须在锁旁边", + "登录": "登录", + "注册": "注册", + "我已阅读并同意": "我已阅读并同意", + "验证码": "验证码", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "密码必须是8-20位,至少包括数字/字母/符号中的2种", + "手机": "手机", + "邮箱": "邮箱", + "请输入邮箱": "请输入邮箱", + "国家/地区": "国家/地区", + "你所在的国家/地区": "你所在的国家/地区", + "选择国家/地区": "你所在的国家/地区", + "获取验证码": "获取验证码", + "商务合作": "商务合作", + "电脑网页版": "电脑网页版", + "酒店系统": "酒店系统", + "说明书网页版": "说明书网页版", + "高级功能": "高级功能", + "记录保存": "记录保存", + "您可通过短信将密码、电子钥匙信息发给接收人。": "您可通过短信将密码、电子钥匙信息发给接收人。", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "您可通过邮件将密码、电子钥匙信息发给接收人。", + "购买实名认证提示": "给用户发送电子钥匙时,可以要求其开锁前先进行人脸识别,以保证是他本人在操作。人脸实名认证调用国家公安系统接口,为付费功能,请购买次数后再使用。", + "请选择你希望的实名认证频次": "请选择你希望的实名认证频次", + "仅首次": "仅首次", + "每日一次": "每日一次", + "每周一次": "每周一次", + "每月一次": "每月一次", + "当前状态": "当前状态", + "试用中": "试用中", + "高级功能权益内容": "高级功能权益内容", + "短信模板": "短信模板", + "邮件模板": "邮件模板", + "发卡工具": "发卡工具", + "购买高级功能须知": "购买高级功能须知", + "购买高级功能提示": "更多的高级功能正在开发中,如果您需要这些功能,欢迎根据锁的数量开通服务。高级功能仅能用于您自己的锁。如果您是授权管理员,请联系锁的最高管理员开通服务。", + "免费体验": "免费体验", + "立即开通": "立即开通", + "购买短信": "购买短信", + "购买邮件": "购买邮件", + "购买实名认证次数": "购买实名认证次数", + "开通高级功能": "开通高级功能", + "选择套餐": "选择套餐", + "支付方式": "支付方式", + "支付宝": "支付宝", + "去支付": "去支付", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人", + "高级功能仅能用于你自己的锁": "高级功能仅能用于你自己的锁", + "新建模板": "新建模板", + "类型": "类型", + "模版内容": "模版内容", + "预览": "预览", + "房间名": "房间名", + "预计产生短信条数": "预计产生短信条数", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁", + "WiFi配网": "WiFi配网", + "配置WiFi": "配置WiFi", + "请输入WiFi名字": "请输入WiFi名字", + "胁迫卡": "胁迫卡", + "员工是否有密码": "员工是否有密码", + "员工是否有卡": "员工是否有卡", + "员工是否有指纹": "员工是否有指纹", + "获取钥匙": "获取钥匙", + "获取卡": "获取卡", + "获取指纹": "获取指纹", + "安全验证": "安全验证", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?", + "监控": "监控", + "视频日志": "视频日志", + "网关设备": "网关设备", + "开门器": "开门器", + "面容开锁": "面容开锁", + "开门方向设置": "开门方向设置", + "电机功率设置": "电机功率设置", + "开锁时是否需联网": "开锁时是否需联网", + "选择要加入分组的锁": "选择要加入分组的锁", + "锁数量": "锁数量", + "小米IOT平台": "小米IOT平台", + "面容开锁设置": "面容开锁设置", + "感应距离": "感应距离", + "防误开": "防误开", + "防误开已关闭,关门后仍可使用面容开锁": "防误开已关闭,关门后仍可使用面容开锁", + "添加和使用面容开锁时": "添加和使用面容开锁时", + "添加和使用面容开锁时提示": "\n1、请尽量保持单人在门前操作;\n2、请站立在门锁正前方约0.5~0.8米,面向门锁;\n3、请保持脸部无遮挡,露出五官;\n4、面容识别异常时,可触摸数字键盘任意按键,手动重启人脸识别。", + "秒": "秒", + "请根据门锁实际情况,请谨慎选择电机功率:": "请根据门锁实际情况,请谨慎选择电机功率:", + "小功率:": "小功率:", + "耗电少": "耗电少", + "大功率": "大功率:", + "大功率提示": "如果开锁时锁舌不能正常收回,,或需要带动\n天地钩,建议选择大功率。此时耗电将会\n增加。", + "开门方向设置提示": "请谨慎选择您家的开门方向(如果选择错误,将无法正常开关门):", + "左开": "左开", + "右开": "右开", + "判断方法:": "判断方法:", + "判断方法内容": "人站在屋外,面向入户门。\n如果门的合页或门轴在左边,则门是左开;\n如果门的合页或门轴在右边,则门是右开。\n如果设置错误,将无法正常开关门。\n建议由安装或维修人员操作。", + "录像时段": "录像时段", "密码": "密码", "卡": "卡", "指纹": "指纹", "人脸": "人脸", "配件商城": "配件商城", "公司名称": "公司名称", - "修改公司名字": "修改公司名字", "请输入公司名字": "请输入公司名字", "提示": "提示", "是否删除?": "是否删除?", @@ -511,19 +416,18 @@ "请输入钥匙名称": "请输入钥匙名称", "修改成功": "修改成功", "冻结": "冻结", - "取消冻结": "取消冻结", + "解除冻结": "解除冻结", "授权": "授权", "取消授权": "取消授权", "同时解冻其发送的钥匙": "同时解冻其发送的钥匙", - "取消冻结会在用户APP连网后生效": "取消冻结会在用户APP连网后生效", + "会在用户APP连网后生效": "会在用户APP连网后生效", "同时冻结其发送的钥匙": "同时冻结其发送的钥匙", "冻结会在用户APP连网后生效": "冻结会在用户APP连网后生效", "取消授权会在用户APP连网后生效": "取消授权会在用户APP连网后生效", "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码", - "失效时间需大于生效时间": "失效时间需大于生效时间", - "生效时间需大于当前时间": "生效时间需大于当前时间", - "失效日期要大于生效日期": "失效日期要大于生效日期", - "失效时间要大于生效时间": "失效时间要大于生效时间", + "失效时间需晚于生效时间": "失效时间需晚于生效时间", + "生效时间需晚于当前时间": "生效时间需晚于当前时间", + "失效日期需晚于生效日期": "失效日期需晚于生效日期", "修改有效期": "修改有效期", "生效日期": "生效日期", "失效日期": "失效日期", @@ -557,7 +461,7 @@ "生效时间不能小于当前时间": "生效时间不能小于当前时间", "结束时间不能小于当前时间": "结束时间不能小于当前时间", "是否为管理员": "是否为管理员", - "已连接到锁,请将卡靠近锁的读卡区": "已连接到锁,请将卡靠近锁的读卡区", + "已连接到锁,请将卡靠近门锁的读卡区": "已连接到锁,请将卡靠近门锁的读卡区", "尝试连接设备...": "尝试连接设备...", "地理位置": "地理位置", "检查以确保以下地址是正确的": "检查以确保以下地址是正确的", @@ -594,8 +498,8 @@ "请输入分组名称": "请输入分组名称", "创建成功": "创建成功", "设置锁分组成功": "设置锁分组成功", - "电池1": "电池1", - "电池2": "电池2", + "电池1电量": "电池1电量", + "电池2电量": "电池2电量", "电量更新时间": "电量更新时间", "锁电量更新成功": "锁电量更新成功", "您的钥匙未生效": "您的钥匙未生效", @@ -610,7 +514,6 @@ "删除锁后,所有信息都会一起删除,确定删除锁吗?": "删除锁后,所有信息都会一起删除,确定删除锁吗?", "请输入登录密码": "请输入登录密码", "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "删除设备失败,请确保在设备附近,设备未被连接,设备已打开", - "。如果是全自动锁,请使屏幕变亮": "。如果是全自动锁,请使屏幕变亮", "用户无权限": "用户无权限", "创建公司后,考勤功能才能使用": "创建公司后,考勤功能才能使用", "是否删除钥匙?": "是否删除钥匙?", @@ -713,7 +616,6 @@ "逗留抓拍模式": "逗留抓拍模式", "实时监控模式": "实时监控模式", "自定义模式": "自定义模式", - "秒": "秒", "猫眼设置": "猫眼设置", "猫眼工作模式": "猫眼工作模式", "自动亮屏": "自动亮屏", @@ -731,7 +633,7 @@ "指纹列表": "指纹列表", "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网。", "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。", - "门未开时间": "门未开时间", + "未开门时间": "未开门时间", "添加和使用面容开锁时:": "添加和使用面容开锁时:", "云存": "云存", "本地": "本地", @@ -755,7 +657,6 @@ "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。", "不同意": "不同意", "同意": "同意", - "当前状态:已开通": "当前状态:已开通", "该功能是高级功能,请开通后再使用": "该功能是高级功能,请开通后再使用", "常用程序": "常用程序", "该锁已被重置": "该锁已被重置", @@ -833,19 +734,25 @@ "请选择有效日": "请选择有效日", "公司名字长度不能小于 6 ": "公司名字长度不能小于 6 ", "已是最新版本": "已是最新版本", - - "无考勤记录": "无考勤记录", - "大家干劲十足": "大家干劲十足", - "工作时长未出炉": "工作时长未出炉", - "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续", - "确认国家或地区": "确认国家或地区", - "我知道了": "我知道了", + "一": "一", + "二": "二", + "三": "三", + "四": "四", + "五": "五", + "六": "六", + "日": "日", "新建短信模版": "新建短信模版", "新建邮件模版": "新建邮件模版", "自定义短信模版": "自定义短信模版", "自定义邮件模版": "自定义邮件模版", "名称": "名称", "星星锁": "星星锁", + "无考勤记录": "无考勤记录", + "大家干劲十足": "大家干劲十足", + "工作时长未出炉": "工作时长未出炉", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续", + "确认国家或地区": "确认国家或地区", + "我知道了": "我知道了", "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。", "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "开启后,可通过长按锁上的设置键重新上电,用APP重新添加", "已有": "已有", @@ -861,7 +768,6 @@ "个人用户": "个人用户", "星寓": "星寓", "账号": "账号", - "请输入手机号或email": "请输入手机号或email", "请输入星寓管理员的账号": "请输入星寓管理员的账号", "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权", @@ -876,40 +782,321 @@ "该已锁被删除": "该已锁被删除", "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限", "添加授权管理员": "添加授权管理员", - "导出记录":"导出记录", - "选择时间段":"选择时间段", - "导出":"导出", - "批量导出":"批量导出", - "读取记录":"读取记录", - "手机需联网":"手机需联网", - "设备":"设备", - "消息":"消息", - "智能分析":"智能分析", - "精准识别设备事件,过滤无效信息":"精准识别设备事件,过滤无效信息", - "系统设置":"系统设置", - "系统的全局配置在此项内进行设置":"系统的全局配置在此项内进行设置", - "导出操作记录":"导出操作记录", - "立即查看":"立即查看", - "导出成功":"导出成功", + "导出记录": "导出记录", + "选择时间段": "选择时间段", + "导出": "导出", + "批量导出": "批量导出", + "读取记录": "读取记录", + "手机需联网": "手机需联网", + "设备": "设备", + "消息": "消息", + "智能分析": "智能分析", + "精准识别设备事件,过滤无效信息": "精准识别设备事件,过滤无效信息", + "系统设置": "系统设置", + "系统的全局配置在此项内进行设置": "系统的全局配置在此项内进行设置", + "导出操作记录": "导出操作记录", + "立即查看": "立即查看", + "导出成功": "导出成功", "发送钥匙": "发送钥匙", "进度": "进度", "失败": "失败", "人脸详情": "人脸详情", - "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。", "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。", "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。", "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。", "防误开已打开,开锁后": "防误开已打开,开锁后", "秒内不可使用面容开锁": "秒内不可使用面容开锁", + "掌静脉": "掌静脉", + "添加掌静脉": "添加掌静脉", + "胁迫掌静脉": "胁迫掌静脉", + "请不要将胁迫掌静脉用于日常开锁": "请不要将胁迫掌静脉用于日常开锁", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "已连接到锁,请自然张开手掌,掌心正对摄像头", + "掌静脉详情": "掌静脉详情", + "掌静脉号": "掌静脉号", + "蓝牙未打开,请到设置里面打开蓝牙": "蓝牙未打开,请到设置里面打开蓝牙", + "删除用户时,会将用户拥有的钥匙一起删除。": "删除用户时,会将用户拥有的钥匙一起删除。", + "配置网络": "配置网络", + "你好": "你好", + "成功": "成功", + "类型选择": "类型选择", + "请选择要使用哪种类型": "请选择要使用哪种类型", + "系统邮件(推荐)": "系统邮件(推荐)", + "系统短信(推荐)": "系统短信(推荐)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。", + "个人邮件": "个人邮件", + "个人短信": "个人短信", + "邮件将从你的个人邮箱发给用户": "邮件将从你的个人邮箱发给用户", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除", + "为了更好地应用体验,请确定权限": "为了更好地应用体验,请确定权限", + "您第一次拒绝权限,请确定权限": "您第一次拒绝权限,请确定权限", + "您第二次拒绝权限,请去应用设置开启权限": "您第二次拒绝权限,请去应用设置开启权限", + "去应用市场": "去应用市场", + "温馨提示": "温馨提示", + "关闭应用": "关闭应用", + "开启微信接收报警消息需要先关注": "开启微信接收报警消息需要先关注", + "微信公众号,请保存二维码并使用微信扫一扫设置": "微信公众号,请保存二维码并使用微信扫一扫设置", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "实名认证为付费功能,请联系锁的管理员购买后再使用", + "位置权限": "位置权限", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作", + "相机/相册权限": "相机/相册权限", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "请开启本地存储权限,允许应用读写设备上的照片及文件", + "点击选择": "点击选择", + "微信": "微信", + "朋友圈": "朋友圈", + "QQ": "QQ", + "QQ空间": "QQ空间", + "微博": "微博", + "FaceBook": "FaceBook", + "链接": "链接", + "今天": "今天", + "密码错误": "密码错误", + "网络中断": "网络中断", + "钥匙不存在": "钥匙不存在", + "钥匙过期": "钥匙过期", + "钥匙已存在": "钥匙已存在", + "密码失效": "密码失效", + "门锁时间异常": "门锁时间异常", + "APP(手机)未联网": "APP(手机)未联网", + "数据不存在": "数据不存在", + "待接收": "待接收", + "已冻结": "已冻结", + "已删除": "已删除", + "未知": "未知", + "拖动下方滑块完成拼图": "拖动下方滑块完成拼图", + "验证成功": "验证成功", + "验证失败": "验证失败", + "向右拖动滑块填充拼图": "向右拖动滑块填充拼图", + "请先获取到位置信息哦": "请先获取到位置信息哦", + "请选择国家": "请选择国家", + "获取锁信息": "获取锁信息", + "锁数据异常,请重试": "锁数据异常,请重试", + "连接设备中...": "连接设备中...", + "把锁": "把锁", + "条": "条", + "封": "封", + "次": "次", + "支付成功": "支付成功", + "查看详情": "查看详情", + "请输入模板名称": "请输入模板名称", + "模版类型": "模版类型", + "再返回一次退出": "再返回一次退出", + "请先添加锁": "请先添加锁", + "可视对讲": "可视对讲", + "详细日志": "详细日志", + "已复制到剪切板": "已复制到剪切板", + "拍照": "拍照", + "从相册选择": "从相册选择", + "选择问题": "选择问题", + "确认长度不足8位": "确认长度不足8位", + "新密码长度不足8位": "新密码长度不足8位", + "两次密码不一致": "两次密码不一致", + "请点击获取验证码,验证码将发送到": "请点击获取验证码,验证码将发送到", + "切换": "切换", + "验证": "验证", + "验证成功,账号已删除": "验证成功,账号已删除", + "该密码不是自定义密码,无法修改": "该密码不是自定义密码,无法修改", + "请选择设备要关联哪些姓名": "请选择设备要关联哪些姓名", + "请选择姓名要关联哪些设备": "请选择姓名要关联哪些设备", + "确定要移除所选中的坏锁吗?": "确定要移除所选中的坏锁吗?", + "邮件通知": "邮件通知", + "短信通知": "短信通知", + "您好,您的授权管理员生成成功": "您好,您的授权管理员生成成功", + "请输入接收者姓名": "请输入接收者姓名", + "版本更新": "版本更新", + "下次再说": "下次再说", + "配网成功": "配网成功", + "配网失败": "配网失败", + "该锁的无线键盘都将被删除": "该锁的无线键盘都将被删除", + "实时画面": "实时画面", + "适合门口较为安全的环境。": "适合门口较为安全的环境。", + "仅发生特定事件才录像,并可查看实时画面。": "仅发生特定事件才录像,并可查看实时画面。", + "一般情况下,满电可使用7-8个月": "一般情况下,满电可使用7-8个月", + "有人逗留或发生特定事件才录像,可随时查看": "有人逗留或发生特定事件才录像,可随时查看", + "实时画面。": "实时画面。", + "一般情况下,满电可使用5~6个月。": "一般情况下,满电可使用5~6个月。", + "适合门口人员复杂、较不安全的环境。": "适合门口人员复杂、较不安全的环境。", + "有人出现就录像,可随时查看实时画面。": "有人出现就录像,可随时查看实时画面。", + "一般情况下,满电可使用2~4个月。": "一般情况下,满电可使用2~4个月。", + "根据您家门口实际情况设置录像和实时画面功能。": "根据您家门口实际情况设置录像和实时画面功能。", + "可使用时长由具体设置决定。": "可使用时长由具体设置决定。", + "查看": "查看", + "有人按门铃或发生": "有人按门铃或发生", + "异常事件时": "异常事件时", + "不录像": "不录像", + "有人出现、按门铃": "有人出现、按门铃", + "或发生异常事件时": "或发生异常事件时", + "逗留达到10秒": "逗留达到10秒", + "约1.5米": "约1.5米", + "随时": "随时", + "立即录像": "立即录像", + "录像时机": "录像时机", + "有人出现时录像": "有人出现时录像", + "人体侦测距离": "人体侦测距离", + "查看实时画面": "查看实时画面", + "自定义时间": "自定义时间", + "当日": "当日", + "次日": "次日", + "自定义时段": "自定义时段", + "发生事件时查看": "发生事件时查看", + "实时查看": "实时查看", + "有人在门口出现10秒后开始录像。": "有人在门口出现10秒后开始录像。", + "有人按门铃时立即录像。": "有人按门铃时立即录像。", + "有人出现在门前1.5米范围时启动录像": "有人出现在门前1.5米范围时启动录像", + "约0.8米": "约0.8米", + "约3.0米": "约3.0米", + "添加指纹失败": "添加指纹失败", + "项": "项", + "播放中": "播放中", + "下载": "下载", + "暂无下载内容": "暂无下载内容", + "亮度": "亮度", + "音量": "音量", + "快进至": "快进至", + "快退至": "快退至", + "暂无视频信息": "暂无视频信息", + "加载出错": "加载出错", + "请单人正对门锁,距离一个成年人手臂长度": "请单人正对门锁,距离一个成年人手臂长度", + "(约0.6米)。": "(约0.6米)。", + "保持脸部无遮挡,露出五官。": "保持脸部无遮挡,露出五官。", + "准备好了,开始添加": "准备好了,开始添加", + "正在录入中...": "正在录入中...", + "添加人脸失败": "添加人脸失败", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "重置后,该锁的人脸都将被删除哦,确认要重置吗?", + "人脸号": "人脸号", + "虹膜详情": "虹膜详情", + "虹膜号": "虹膜号", + "选择设备类型": "选择设备类型", + "照明灯具": "照明灯具", + "电动窗帘": "电动窗帘", + "门窗传感器": "门窗传感器", + "传感器": "传感器", + "清除数据成功": "清除数据成功", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录", + "看不到操作记录,可能原因有": "看不到操作记录,可能原因有", + "操作记录详情": "操作记录详情", + "操作时间": "操作时间", + "此模块功能需要锁联网后设置方可生效": "此模块功能需要锁联网后设置方可生效", + "用户已存在": "用户已存在", + "钥匙数量已到上限": "钥匙数量已到上限", + "附近没有可用网关": "附近没有可用网关", + "正在创建安全连接...": "正在创建安全连接...", + "监视状态下不能发送录音": "监视状态下不能发送录音", + "挂断": "挂断", + "监视中暂不能开锁": "监视中暂不能开锁", + "长按说话": "长按说话", + "松开发送": "松开发送", + "请输入6位数字开锁密码": "请输入6位数字开锁密码", + "请输入开锁密码": "请输入开锁密码", + "接收者在有效期内可以不限次数使用": "接收者在有效期内可以不限次数使用", + "接收者可以使用此App开关锁": "接收者可以使用此App开关锁", + "单次钥匙有效期为1小时,只能使用一次": "单次钥匙有效期为1小时,只能使用一次", + "接收者可以在有效期内的固定时间段里,不限次数使用": "接收者可以在有效期内的固定时间段里,不限次数使用", + "获取模板失败": "获取模板失败", + "微信通知": "微信通知", + "系统短信": "系统短信", + "系统邮件": "系统邮件", + "模板": "模板", + "新建模版": "新建模版", + "您好,您的密码是": "您好,您的密码是", + "密码名字": "密码名字", + "请输入6-9位密码": "请输入6-9位密码", + "设置密码": "设置密码", + "操作成功,密码为": "操作成功,密码为", + "类型:自定义-永久": "类型:自定义-永久", + "实时播放": "实时播放", + "点击对讲": "点击对讲", + "长按开锁": "长按开锁", + "接听失败": "接听失败", + "请在锁设置中开启远程开锁": "请在锁设置中开启远程开锁", + "接听": "接听", + "截图已保存到相册": "截图已保存到相册", + "添加遥控": "添加遥控", + "已连接到锁,请按遥控": "已连接到锁,请按遥控", + "遥控号": "遥控号", + "遥控详情": "遥控详情", + "照明": "照明", + "退出演示模式": "退出演示模式", + "提示:当前界面为展示界面,添加设备后才能继续使用": "提示:当前界面为展示界面,添加设备后才能继续使用", + "门已上锁": "门已上锁", + "您的账号在异地登录,如非本人,请尽快修改密码": "您的账号在异地登录,如非本人,请尽快修改密码", + "开门成功": "开门成功", + "开门失败": "开门失败", + "呼叫提醒": "呼叫提醒", + "收到来自": "收到来自", + "锁的呼叫": "锁的呼叫", + "加载数据中": "加载数据中", + "搜索所有锁类型": "搜索所有锁类型", + "锁电量更新时间": "锁电量更新时间", + "1月": "1月", + "2月": "2月", + "3月": "3月", + "4月": "4月", + "5月": "5月", + "6月": "6月", + "7月": "7月", + "8月": "8月", + "9月": "9月", + "10月": "10月", + "11月": "11月", + "12月": "12月", + "热门城市": "热门城市", + "导出锁数据": "导出锁数据", + "一键开锁": "一键开锁", + "已开通": "已开通", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?", + "在线": "在线", + "离线": "离线", + "购买记录": "购买记录", + "使用记录": "使用记录", + "失效时间要大于当前时间": "失效时间要大于当前时间", + "修改名字": "修改名字", + "时": "时", + "分": "分", + "Amazon Alexa": "Amazon Alexa", "您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa进行开锁、闭锁和查看锁状态", "支持的国家": "支持的国家", "支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本", "操作流程": "操作流程", - - "密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合", - "操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了", "Google Home": "Google Home", "Action name": "Action name", @@ -917,5 +1104,23 @@ "支持的语言": "支持的语言", "英语": "英语", "Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n", - "开启": "开启" + "密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合", + "已开锁": "已开锁", + "已闭锁": "已闭锁", + "两次密码不一致哦": "两次密码不一致哦", + + "中功率": "中功率", + "常规使用": "常规使用", + "扫描设备": "扫描设备", + "删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败,网关可能已经离线,是否强制删除该数据?", + "超级管理员英文": "超级管理员", + "授权管理员英文": "授权管理员", + "普通管理员英文": "普通管理员", + "网关设备英文": "网关设备", + "手机需联网英文": "手机需联网", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M" } diff --git a/lib/app.dart b/lib/app.dart index c9127244..fad7b31d 100755 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,6 +3,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart'; @@ -19,6 +20,7 @@ import 'baseWidget.dart'; import 'tools/appRouteObserver.dart'; import 'tools/store_service.dart'; +import 'translations/current_locale_tool.dart'; class MyApp extends StatefulWidget { MyApp({required this.isLogin, GlobalKey? key}) : super(key: key); @@ -57,29 +59,29 @@ class _MyAppState extends State with WidgetsBindingObserver, BaseWidget { GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], + // localeResolutionCallback用于在启动时动态确定应该使用哪种语言和地区。 localeResolutionCallback: (Locale? locale, Iterable supportedLocales) { - if (!supportedLocales.contains(locale)) { - final int idx = appSupportedLocales.indexWhere((Locale element) => - element.languageCode == locale!.languageCode); - if (idx != -1) { - locale = appSupportedLocales[idx]; - } else { - locale = const Locale('zh', 'CN'); - } - } - AppManager().setLanCode( - code: '${locale!.languageCode}_${locale.countryCode}'); - return locale; + AppLog.log( + 'System device locale: ${Get.deviceLocale} locale:$locale'); + // if (widget.isLogin) { + // 登录之后调用存储的语言 + locale = CurrentLocaleTool.getCurrentLocale(); + // } else { + // // 没登录之前调用系统的语言 + // locale = Get.deviceLocale; + // } + locale = CurrentLocaleTool.convertLocale(locale); + AppLog.log('localeResolutionCallback locale: $locale'); + AppManager() + .setLanCode(code: '${locale.languageCode}_${locale.countryCode}'); + return Locale(locale.languageCode, locale.countryCode); }, - locale: StoreService.to.getLanguageCode()!.isNotEmpty - ? appDept.deptSupportedLocales - .where((Locale element) => - element.languageCode == StoreService.to.getLanguageCode()) - .first - : Get.deviceLocale, + // 用来指定应用当前使用的语言和地区。它定义了应用在启动时加载的默认语言环境。 + locale: CurrentLocaleTool.getCurrentLocale(), // locale: Get.deviceLocale, - fallbackLocale: const Locale('zh', 'CN'), + // fallbackLocale用于指定在无法找到匹配的语言时,应用应该使用的默认语言和地区。 + fallbackLocale: const Locale('en', 'US'), theme: ThemeData( scaffoldBackgroundColor: const Color(0xFFF6F6F6), backgroundColor: const Color(0xFFF6F6F6), @@ -170,5 +172,3 @@ Future getAgreePrivacyShowUpdate() async { AppFirstEnterHandle().getAppFirstEnter(isShowUpdateVersion); } } - - diff --git a/lib/appRouters.dart b/lib/appRouters.dart index 760aac4e..12fbb302 100755 --- a/lib/appRouters.dart +++ b/lib/appRouters.dart @@ -159,6 +159,7 @@ import 'mine/addLock/nearbyLock/nearbyLock_page.dart'; import 'mine/addLock/saveLock/saveLock_page.dart'; import 'mine/addLock/selectLockType/selectLockType_page.dart'; import 'mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart'; +import 'mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_page.dart'; import 'mine/gateway/addGateway/selectGateway/selectGatewayList_page.dart'; import 'mine/gateway/addGateway/selectGatewayType/selectGatewayType_page.dart'; import 'mine/gateway/addGateway/selectGatewayTypeNextTip/selectGatewayTypeNextTip_page.dart'; @@ -345,6 +346,8 @@ abstract class Routers { static const String selectGatewayPage = '/SelectGatewayPage'; // 我的-选择网关 static const String gatewayConfigurationWifiPage = '/GatewayConfigurationWifiPage'; // 我的-网关配置wifi + static const String gatewayGetWifiListPage = + '/GatewayGetWifiListPage'; // 我的-网关获取wifi列表 static const String messageListPage = '/MessageListPage'; // 我的-消息 static const String messageDetailPage = '/MessageDetailPage'; // 我的-消息详情 @@ -408,15 +411,16 @@ abstract class Routers { '/authorityManagementPage'; //批量授权 static const String massSendLockGroupListPage = '/massSendLockGroupListPage'; //群发锁分组列表 - static const massSendReceiverPage = '/massSendReceiverPage'; //群发接收人 - static const lockUserListPage = '/lockUserListPage'; //锁用户列表 - static const administratorDetailsPage = '/administratorDetailsPage'; //管理员详情 - static const expireLockManagePage = '/expireLockManagePage'; //即将到期 - static const expireKeyChangeDatePage = + static const String massSendReceiverPage = '/massSendReceiverPage'; //群发接收人 + static const String lockUserListPage = '/lockUserListPage'; //锁用户列表 + static const String administratorDetailsPage = + '/administratorDetailsPage'; //管理员详情 + static const String expireLockManagePage = '/expireLockManagePage'; //即将到期 + static const String expireKeyChangeDatePage = '/ExpireKeyChangeDatePage'; //即将到期卡、指纹、遥控钥匙详情修改日期 - static const expireKeyChangeValidityDatePage = + static const String expireKeyChangeValidityDatePage = '/ExpireKeyChangeValidityDatePage'; //即将到期卡、指纹、遥控钥匙详情修改循环日期 - static const adminDetailChangeDatePage = + static const String adminDetailChangeDatePage = '/adminDetailChangeDatePage'; //管理员详情修改生效时间 static const String adminLockListPage = '/adminLockListPage'; //管理员详情的锁列表 static const String safeVerifyPage = '/safeVerifyPage'; //删除账号安全验证 @@ -1176,5 +1180,8 @@ abstract class AppRouters { name: Routers.amazonAlexaPage, page: () => const AmazonAlexaPage()), GetPage( name: Routers.googleHomePage, page: () => const GoogleHomePage()), + GetPage( + name: Routers.gatewayGetWifiListPage, + page: () => const GatewayGetWifiListPage()), ]; } diff --git a/lib/app_settings/app_colors.dart b/lib/app_settings/app_colors.dart index ae6259ec..961b6434 100755 --- a/lib/app_settings/app_colors.dart +++ b/lib/app_settings/app_colors.dart @@ -119,26 +119,33 @@ class AppColors { static Color progressBgColor = const Color(0xFF022345); static Color progressValueColor = const Color(0xFF0093E5); - static const greyLineColor = Color.fromRGBO(240, 240, 240, 1); //灰色分割线220 - static const darkGrayTextColor = Color.fromRGBO(65, 65, 65, 1); //深灰色字体 - static const placeholderTextColor = Color.fromRGBO(128, 128, 128, 1); //占位字体颜色 - static const greyBackgroundColor = Color.fromRGBO(240, 240, 240, 1); //灰色背景色 - static const btnDisableColor = Color.fromRGBO(178, 178, 178, 1); //按钮不可用灰色 - static const toBeReceiveBgColor = Color.fromRGBO(246, 203, 203, 1); //待接收红色背景 - static const expireTextBgColor = Color.fromRGBO(253, 166, 8, 1); //即将到期时间字体背景色 - static const blueTextTipsColor = Color.fromRGBO(0, 113, 255, 1); //蓝色字体tips - static const blueViewBgColor = + static const Color greyLineColor = + Color.fromRGBO(240, 240, 240, 1); //灰色分割线220 + static const Color darkGrayTextColor = Color.fromRGBO(65, 65, 65, 1); //深灰色字体 + static const Color placeholderTextColor = + Color.fromRGBO(128, 128, 128, 1); //占位字体颜色 + static const Color greyBackgroundColor = + Color.fromRGBO(240, 240, 240, 1); //灰色背景色 + static const Color btnDisableColor = + Color.fromRGBO(178, 178, 178, 1); //按钮不可用灰色 + static const Color toBeReceiveBgColor = + Color.fromRGBO(246, 203, 203, 1); //待接收红色背景 + static const Color expireTextBgColor = + Color.fromRGBO(253, 166, 8, 1); //即将到期时间字体背景色 + static const Color blueTextTipsColor = + Color.fromRGBO(0, 113, 255, 1); //蓝色字体tips + static const Color blueViewBgColor = Color.fromRGBO(223, 237, 254, 1); //蓝色背景板 139 148 176 static const lightBlueBgColor = Color.fromRGBO(223, 237, 254, 0.3); //浅蓝色背景板 139 148 176 - - static const msgNoticeTextColor = Color.fromRGBO(139, 148, 176, 1); //消息提醒字体颜色 - static const alphaBgViewColor = Color.fromRGBO(0, 0, 0, 0.2); //透明度背景 - static const vipFeatureBgColor = + static const Color msgNoticeTextColor = + Color.fromRGBO(139, 148, 176, 1); //消息提醒字体颜色 + static const Color alphaBgViewColor = Color.fromRGBO(0, 0, 0, 0.2); //透明度背景 + static const Color vipFeatureBgColor = Color.fromRGBO(251, 248, 229, 1); //需开通高级功能背景色 - static const vipFeatureBtnBgColor = + static const Color vipFeatureBtnBgColor = Color.fromRGBO(197, 167, 109, 1); //需开通高级功能按钮背景色 - static const vipFeatureBtnTextColor = + static const Color vipFeatureBtnTextColor = Color.fromRGBO(110, 98, 81, 1); //需开通高级功能字体颜色 static Color openPassageModeColor = const Color(0xFFEB2A3B); // 首页开启常开模式颜色(红色) diff --git a/lib/app_settings/app_settings.dart b/lib/app_settings/app_settings.dart index f03b8cf1..a79ebe66 100755 --- a/lib/app_settings/app_settings.dart +++ b/lib/app_settings/app_settings.dart @@ -1,7 +1,7 @@ -import 'package:flutter/foundation.dart'; -import 'package:get/get.dart'; import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:get/get.dart'; import 'package:star_lock/mine/about/debug/debug_console.dart'; class AppLog { @@ -103,7 +103,7 @@ class AppDate { static int timeZeroOffset() => DateTime.now().timeZoneOffset.inHours; } -//TODO:错误类型 +// 错误类型 enum ErrorType { modeNotMatch, notConnected, diff --git a/lib/app_settings/app_style.dart b/lib/app_settings/app_style.dart index 00b9f14f..687acaf6 100755 --- a/lib/app_settings/app_style.dart +++ b/lib/app_settings/app_style.dart @@ -25,140 +25,186 @@ class AppStyle { ///textButtonStyle static ButtonStyle get textButtonStyle => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), - textStyle: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return textStyle(textColor: AppColors.buttonDisableColor); + textStyle: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return textStyle(textColor: AppColors.buttonDisableColor); + } return textStyle(); }) ); ///textButtonDeleteStyle static ButtonStyle get textButtonDeleteStyle => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.deleteBtnBgColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), - textStyle: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return textStyle(textColor: AppColors.buttonDisableColor); + textStyle: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return textStyle(textColor: AppColors.buttonDisableColor); + } return textStyle(); }) ); //textButtonStyle2 static ButtonStyle get textButtonStyle2 => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize2), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_11), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize2), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_11), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), - textStyle: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return textStyle(textColor: AppColors.buttonDisableColor,fontSize: 11.sp); + textStyle: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return textStyle(textColor: AppColors.buttonDisableColor,fontSize: 11.sp); + } return textStyle(fontSize: 11.sp); }) ); static ButtonStyle get textButtonStyleOthers => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableColor; }), - textStyle: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return textStyle(textColor: AppColors.buttonDisableColor); + textStyle: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return textStyle(textColor: AppColors.buttonDisableColor); + } return textStyle(textColor: AppColors.buttonEnableColor); }) ); static ButtonStyle get specialButtonStyle => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize3), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize3), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.deleteBtnBgColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableTextColor; }), - textStyle: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return textStyle(textColor: AppColors.buttonDisableColor); + textStyle: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return textStyle(textColor: AppColors.buttonDisableColor); + } return textStyle(textColor: AppColors.buttonEnableColor); }) ); static ButtonStyle clearTextButtonStyle({Color? textColor, Color? bgColor, double? fontSize, FontWeight? fontWeight}) => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ bgColor ??= AppColors.normalTextColor; - if(states.contains(MaterialState.disabled)) return bgColor?.withOpacity(0.6); + if(states.contains(MaterialState.disabled)) { + return bgColor?.withOpacity(0.6); + } return bgColor; }), - overlayColor: MaterialStateProperty.resolveWith((states){ + overlayColor: MaterialStateProperty.resolveWith((Set states){ textColor ??= AppColors.buttonEnableColor; - if(states.contains(MaterialState.pressed)) return textColor?.withOpacity(0.1); + if(states.contains(MaterialState.pressed)) { + return textColor?.withOpacity(0.1); + } return textColor?.withOpacity(0.1); }), - foregroundColor: MaterialStateProperty.resolveWith((states){ + foregroundColor: MaterialStateProperty.resolveWith((Set states){ textColor ??= AppColors.buttonEnableColor; - if(states.contains(MaterialState.disabled)) return textColor?.withOpacity(0.4); + if(states.contains(MaterialState.disabled)) { + return textColor?.withOpacity(0.4); + } return textColor; }), - textStyle: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return textStyle(fontSize: fontSize,fontWeight: fontWeight); + textStyle: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return textStyle(fontSize: fontSize,fontWeight: fontWeight); + } return textStyle(fontSize: fontSize,fontWeight: fontWeight); }), ); ///elevatedButtonButtonStyle static ButtonStyle get elevatedButtonButtonStyle => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), ); ///outlinedButtonButtonStyle static ButtonStyle get outlinedButtonButtonStyle => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_16), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_16), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), ); @@ -166,21 +212,25 @@ class AppStyle { ///outlinedButtonButtonStyle2 static ButtonStyle get outlinedButtonButtonStyle2_Selected => ButtonStyle( - minimumSize: MaterialStateProperty.resolveWith((states) => btnMinSize), - shape: MaterialStateProperty.resolveWith((states) => buttonShape_11), - backgroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableColor; + minimumSize: MaterialStateProperty.resolveWith((Set states) => btnMinSize), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_11), + backgroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableColor; + } return AppColors.buttonEnableColor; }), - foregroundColor: MaterialStateProperty.resolveWith((states){ - if(states.contains(MaterialState.disabled)) return AppColors.buttonDisableTextColor; + foregroundColor: MaterialStateProperty.resolveWith((Set states){ + if(states.contains(MaterialState.disabled)) { + return AppColors.buttonDisableTextColor; + } return AppColors.buttonEnableTextColor; }), ); ///outlinedButtonButtonStyle2_Selected static ButtonStyle get outlinedButtonButtonStyle2 => ButtonStyle( - shape: MaterialStateProperty.resolveWith((states) => buttonShape_11), + shape: MaterialStateProperty.resolveWith((Set states) => buttonShape_11), side: MaterialStateProperty.all(BorderSide( width: 1.w, color: AppColors.buttonEnableColor.withOpacity(0.5), diff --git a/lib/app_settings/app_theme.dart b/lib/app_settings/app_theme.dart index 7e6c662b..c4b339bc 100755 --- a/lib/app_settings/app_theme.dart +++ b/lib/app_settings/app_theme.dart @@ -122,9 +122,9 @@ class AppTheme { class NoShadowScrollBehavior extends ScrollBehavior { + const NoShadowScrollBehavior({this.axisDirection = AxisDirection.up}):super(); final AxisDirection axisDirection; - const NoShadowScrollBehavior({this.axisDirection = AxisDirection.up}):super(); @override Widget buildOverscrollIndicator(BuildContext context, Widget child, ScrollableDetails details) { return GlowingOverscrollIndicator(axisDirection: axisDirection, color: Colors.red,showTrailing: false,showLeading: false,child: child,); diff --git a/lib/baseWidget.dart b/lib/baseWidget.dart index 4315f18e..b318ae71 100755 --- a/lib/baseWidget.dart +++ b/lib/baseWidget.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; -import 'package:star_lock/translations/trans_lib.dart'; mixin BaseWidget { double fs(double value) => value.sp; @@ -36,7 +35,7 @@ mixin BaseWidget { ), Padding( padding: const EdgeInsets.only(top: 10), - child: Text(TranslationLoader.lanKeys!.noData!.tr, + child: Text('暂无数据'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor)), ) diff --git a/lib/blue/blue_manage.dart b/lib/blue/blue_manage.dart index d0a13911..eea8f7bc 100755 --- a/lib/blue/blue_manage.dart +++ b/lib/blue/blue_manage.dart @@ -5,11 +5,13 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; +import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/commonDataManage.dart'; import 'io_tool/io_model.dart'; import 'io_tool/io_tool.dart'; import 'io_tool/manager_event_bus.dart'; +import 'io_type.dart'; import 'reciver_data.dart'; //连接状态回调 @@ -72,6 +74,7 @@ class BlueManage { List lastTimeData = []; int? dataLen; Timer? scanSingleTimer; + bool needScanSingle = false; static BlueManage? _manager; @@ -99,7 +102,7 @@ class BlueManage { void _initAdapterStateStateSubscription() { _adapterStateStateSubscription ??= FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) { - AppLog.log('蓝牙状态:$state'); + AppLog.log('蓝牙状态:$state'); _adapterState = state; }); } @@ -148,6 +151,10 @@ class BlueManage { // AppLog.log('startScanSingle 蓝牙状态 系统蓝牙状态:$_adapterState 蓝牙连接状态:$bluetoothConnectionState'); if (_adapterState == BluetoothAdapterState.on) { try { + BuglyTool.uploadException( + message: '开始指定设备名称的扫描蓝牙设备', + detail: '调用方法是:startScanSingle 指定设备名称是:$deviceName', + upload: false); //android 扫描比较慢,取样只要 3 分之一 final int divisor = Platform.isAndroid ? 3 : 1; FlutterBluePlus.startScan( @@ -165,6 +172,11 @@ class BlueManage { start.millisecondsSinceEpoch; AppLog.log( '扫描到的设备数:${results.length} 是否查找到 $isExit 以查找$milliseconds毫秒'); + BuglyTool.uploadException( + message: '指定设备名称的扫描蓝牙设备 监听扫描结果', + detail: + 'startScanSingle$deviceName 监听扫描结果 是否查找到 $isExit 以查找$milliseconds毫秒 扫描到的设备数:${results.length} results:$results', + upload: false); if (isExit) { for (final ScanResult scanResult in results) { if (((scanResult.advertisementData.serviceUuids.isNotEmpty @@ -186,12 +198,21 @@ class BlueManage { } else { scanDevices.add(scanResult); } + BuglyTool.uploadException( + message: '遍历扫描到的结果跟缓存的结果对比,如果有最新的就更新缓存', + detail: + 'startScanSingle deviceName:$deviceName 查询到的结果scanResult:$scanResult', + upload: false); } } completer.complete(); } }, onError: (e) { + BuglyTool.uploadException( + message: '指定设备名称的扫描蓝牙设备 监听扫描结果失败', + detail: '打印失败问题 e:${e.toString()}', + upload: false); AppLog.log( '扫描失败:$e', ); @@ -201,13 +222,15 @@ class BlueManage { scanDevicesCallBack(scanDevices); subscription.cancel(); } catch (e) { + BuglyTool.uploadException( + message: '指定设备名称的扫描蓝牙设备 内部逻辑整形失败', + detail: 'tartScanSingle内部逻辑整形失败 e:${e.toString()}', + upload: false); AppLog.log('扫描失败'); } } else { try { - if (Platform.isAndroid) { - await FlutterBluePlus.turnOn(); - } + openBlue(); } catch (e) { AppLog.log('蓝牙打开失败'); } @@ -219,7 +242,8 @@ class BlueManage { } /// 开始扫描蓝牙设备 - Future startScan(int timeout, ScanDevicesCallBack scanDevicesCallBack, + Future startScan(int timeout, DeviceType deviceType, + ScanDevicesCallBack scanDevicesCallBack, {List? idList}) async { FlutterBluePlus.isSupported.then((bool isAvailable) async { if (isAvailable) { @@ -227,7 +251,8 @@ class BlueManage { if (_adapterState == BluetoothAdapterState.on) { try { FlutterBluePlus.startScan(timeout: Duration(seconds: timeout)); - final StreamSubscription> subscription = FlutterBluePlus.scanResults.listen((List results) { + final StreamSubscription> subscription = + FlutterBluePlus.scanResults.listen((List results) { scanDevices.clear(); for (final ScanResult scanResult in results) { // AppLog.log('扫描到的设备:${scanResult.device.platformName} ${scanResult.advertisementData.advName} ${scanResult.rssi}'); @@ -236,7 +261,7 @@ class BlueManage { ? scanResult.advertisementData.serviceUuids[0] : '') .toString() - .contains('758824')) && + .contains(getDeviceType(deviceType))) && (scanResult.rssi >= -100)) { // 查询id相同的元素 final int knownDeviceIndex = scanDevices.indexWhere( @@ -266,9 +291,7 @@ class BlueManage { } } else { try { - if (Platform.isAndroid) { - await FlutterBluePlus.turnOn(); - } + openBlue(); } catch (e) { AppLog.log('蓝牙打开失败'); } @@ -289,21 +312,46 @@ class BlueManage { if (_adapterState == BluetoothAdapterState.on) { // 蓝牙已开启,可以进行蓝牙操作 if (bluetoothConnectionState != BluetoothConnectionState.connected) { + BuglyTool.uploadException( + message: '点击按钮 蓝牙未连接 下一步扫描连接蓝牙', + detail: + 'blueSendData 蓝牙连接状态 bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName', + upload: false); _connect(deviceName, (BluetoothConnectionState state) { stateCallBack(bluetoothConnectionState!); }, isAddEquipment: isAddEquipment); } else { + BuglyTool.uploadException( + message: '点击按钮 蓝牙已经连接 下一步扫描连接蓝牙', + detail: + 'blueSendData 直接回调状态 蓝牙连接状态bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName', + upload: false); stateCallBack(bluetoothConnectionState!); } } else { + BuglyTool.uploadException( + message: '点击按钮 蓝牙未打开', + detail: + 'blueSendData 蓝牙未打开--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName', + upload: false); try { stateCallBack(BluetoothConnectionState.disconnected); openBlue(); } catch (e) { AppLog.log('蓝牙打开失败'); + BuglyTool.uploadException( + message: '点击按钮 蓝牙未打开 然后蓝牙打开失败', + detail: + 'blueSendData 蓝牙打开失败--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName', + upload: false); } } } else { + BuglyTool.uploadException( + message: '点击按钮 蓝牙状态不可用', + detail: 'blueSendData 蓝牙状态不可用--isAvailable:$isAvailable', + upload: false); + stateCallBack(BluetoothConnectionState.disconnected); AppLog.log('开始扫描 蓝牙不可用,不能进行蓝牙操作'); } }); @@ -314,10 +362,14 @@ class BlueManage { String deviceName, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { connectDeviceName = deviceName; + // 当前已扫描到的缓存设备 final List devicesList = scanDevices; + // 是否有缓存设备 true是有缓存设备 final bool isExistDevice = isExistScanDevices(connectDeviceName); + // 是否是当前设备 final bool isCurrentDevice = CommonDataManage().currentKeyInfo.lockName == deviceName; + // mac地址 final String? mac = CommonDataManage().currentKeyInfo.mac; AppLog.log('开始连接 是否存在缓存:$isExistDevice 是否是当前设备:$isCurrentDevice mac:$mac'); @@ -325,22 +377,76 @@ class BlueManage { !isExistDevice && isCurrentDevice && mac != null) { - scanSingleTimer?.cancel(); - //兼容android 的低配手机 - await doNotSearchBLE(mac, connectStateCallBack, - isAddEquipment: isAddEquipment); - scanSingleTimer = Timer(3.seconds, () { - scanSingleTimer?.cancel(); - startScanSingle(deviceName, 15, (List scanDevices) => null); - }); + // 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 + BuglyTool.uploadException( + message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', + detail: + '调用方法_connect deviceName:$deviceName GetPlatform.isAndroid:${GetPlatform.isAndroid} isExistDevice:$isExistDevice mac:$mac needScanSingle:$needScanSingle', + upload: false); + // scanSingleTimer?.cancel(); + // 兼容android 的低配手机 + try { + if (!needScanSingle) { + BuglyTool.uploadException( + message: + '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', + detail: '调用方法doNotSearchBLE,直接连接,needScanSingle:$needScanSingle', + upload: false); + await doNotSearchBLE(mac, connectStateCallBack, + isAddEquipment: isAddEquipment); + } else { + BuglyTool.uploadException( + message: + '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', + detail: + '调用方法startScanSingle,执行扫描函数,needScanSingle:$needScanSingle', + upload: false); + startScanSingle(deviceName, 15, (List scanDevices) { + _connectDevice(scanDevices, deviceName, connectStateCallBack, + isAddEquipment: isAddEquipment); + }); + } + } catch (e) { + BuglyTool.uploadException( + message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', + detail: '调用方法doNotSearchBLE发生异常,执行扫描函数 startScanSingle,异常信息:$e', + upload: false); + startScanSingle(deviceName, 15, (List scanDevices) { + _connectDevice(scanDevices, deviceName, connectStateCallBack, + isAddEquipment: isAddEquipment); + }); + } + // + // scanSingleTimer = Timer(3.seconds, () { + // scanSingleTimer?.cancel(); + // BuglyTool.uploadException( + // message: + // '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 3秒以后调用startScanSingle 上传记录当前方法是:_connect', + // detail: + // '_connect deviceName:$deviceName scanSingleTimer调用startScanSingle', + // upload: false); + // startScanSingle(deviceName, 15, (List scanDevices) => null); + // });ƒ } else if (isAddEquipment == false && isExistDevice == false) { - //取消缓存直接使用,存在配对场景设备信息会更变 + // 取消缓存直接使用,存在配对场景设备信息会更变 + BuglyTool.uploadException( + message: + '取消缓存直接使用,存在配对场景设备信息会更变 然后开始指定设备名称的扫描蓝牙设备 上传记录当前方法是:_connect', + detail: + '符合条件(isAddEquipment == false && isExistDevice == false) 下一步调用startScanSingle', + upload: false); + // AppLog.log('无存在设备需要扫描 deviceName:$deviceName isAddEquipment:$isAddEquipment'); startScanSingle(deviceName, 15, (List scanDevices) { _connectDevice(scanDevices, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); }); } else { + BuglyTool.uploadException( + message: '没有扫描直接调用连接设备 上传记录当前方法是:_connect', + detail: + '走这个方法是有缓存或者添加设备的时候以及不符合(GetPlatform.isAndroid && !isExistDevice && isCurrentDevice && mac != null) deviceName:$deviceName 直接调用_connectDevice', + upload: false); // AppLog.log('安卓或者iOS 存在设备不需要扫描 deviceName:$deviceName isAddEquipment:$isAddEquipment'); _connectDevice(devicesList, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); @@ -356,15 +462,15 @@ class BlueManage { } Future _connectDevice( - List devicesList, - String deviceName, - ConnectStateCallBack connectStateCallBack, - { - bool isAddEquipment = false,// 是否是添加设备之前 - bool isReconnect = true,// 是否是重连 - }) async { + List devicesList, + String deviceName, + ConnectStateCallBack connectStateCallBack, { + bool isAddEquipment = false, // 是否是添加设备之前 + bool isReconnect = true, // 是否是重连 + }) async { // 判断数组列表里面是否有这个设备 // AppLog.log("devicesList:$devicesList"); + final int knownDeviceIndex = devicesList.indexWhere((ScanResult d) => (d.device.platformName == deviceName) || (d.advertisementData.advName == deviceName)); @@ -385,27 +491,55 @@ class BlueManage { _initListenConnectionState(); } if (scanResult == null || connectDeviceMacAddress.isEmpty) { + BuglyTool.uploadException( + message: + '扫描结果scanResult == null || connectDeviceMacAddress.isEmpty不往下执行 return 上传记录当前方法是:_connectDevice', + detail: + 'scanResult:$scanResult connectDeviceMacAddress:$connectDeviceMacAddress', + upload: false); return; } AppLog.log('调用了停止扫描的方法'); await stopScan(); - if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') && isAddEquipment == false) { + if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') && + isAddEquipment == false) { // 添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 - if(isReconnect == true){ + if (isReconnect == true) { AppLog.log('该锁已被重置, 重新发送扫描命令'); + + BuglyTool.uploadException( + message: '该锁已被重置, 重新发送扫描命令startScanSingle 上传记录当前方法是:_connectDevice', + detail: + '添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 该锁已被重置, 重新发送扫描命令 serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', + upload: false); + scanDevices.clear(); startScanSingle(deviceName, 15, (List scanDevices) { - _connectDevice(scanDevices, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment, isReconnect: false); + _connectDevice(scanDevices, deviceName, connectStateCallBack, + isAddEquipment: isAddEquipment, isReconnect: false); }); - }else{ + } else { connectStateCallBack(BluetoothConnectionState.disconnected); EasyLoading.showToast('该锁已被重置'.tr, duration: 2000.milliseconds); scanDevices.clear(); + + BuglyTool.uploadException( + message: '提示该锁已被重置, 回调断开连接, 清除缓存,上传记录当前方法是:_connectDevice', + detail: + 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', + upload: false); } return; } - //尝试连接设备 + + BuglyTool.uploadException( + message: '从devicesList里面查到了设备 下一步连接设备 上传记录当前方法是:_connectDevice', + detail: + 'devicesList:$devicesList scanResult:${scanResult.toString()} bluetoothConnectDevice:${bluetoothConnectDevice.toString()} connectDeviceMacAddress:$connectDeviceMacAddress', + upload: false); + + //连接设备 await bluetoothDeviceConnect(bluetoothConnectDevice!, connectStateCallBack); } @@ -414,11 +548,22 @@ class BlueManage { String masAdds, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { await FlutterBluePlus.stopScan(); + if (bluetoothConnectDevice == null || bluetoothConnectDevice?.remoteId.str != masAdds) { bluetoothConnectDevice = BluetoothDevice.fromId(masAdds); _initGetMtuSubscription(); _initListenConnectionState(); + BuglyTool.uploadException( + message: '直接给蓝牙设备写入 上传记录当前方法是:doNotSearchBLE', + detail: '直接给蓝牙设备写入 通过fromId方法创建一个BluetoothDevice masAdds:$masAdds', + upload: false); + } else { + BuglyTool.uploadException( + message: '直接给蓝牙设备写入 上传记录当前方法是:doNotSearchBLE', + detail: + '直接给蓝牙设备写入 用传入的bluetoothConnectDevice:${bluetoothConnectDevice.toString()}连接 masAdds:$masAdds', + upload: false); } //尝试连接设备 await bluetoothDeviceConnect(bluetoothConnectDevice!, connectStateCallBack, @@ -447,30 +592,62 @@ class BlueManage { if (attempt >= maxAttempts) { AppLog.log('$maxAttempts次后尝试连接失败'); + BuglyTool.uploadException( + message: '连接三次超时断开连接 回调断开连接 上传记录当前方法是:bluetoothDeviceConnect', + detail: + 'bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} $maxAttempts次后尝试连接失败', + upload: false); + needScanSingle = true; connectStateCallBack(BluetoothConnectionState.disconnected); } if (bluetoothConnectionState == BluetoothConnectionState.connected) { try { + needScanSingle = false; final List services = await bluetoothConnectDevice.discoverServices(); //循环判断服务 for (final BluetoothService service in services) { if (service.uuid == _serviceIdConnect) { - for (final BluetoothCharacteristic characteristic in service.characteristics) { - if (characteristic.characteristicUuid == _characteristicIdSubscription) { + for (final BluetoothCharacteristic characteristic + in service.characteristics) { + if (characteristic.characteristicUuid == + _characteristicIdSubscription) { _subScribeToCharacteristic(characteristic); bluetoothConnectionState = BluetoothConnectionState.connected; connectStateCallBack(bluetoothConnectionState!); + BuglyTool.uploadException( + message: '订阅成功 上传记录当前方法是:bluetoothDeviceConnect', + detail: + '发现服务,连接成功,订阅数据 bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} ', + upload: false); + } else { + BuglyTool.uploadException( + message: '订阅失败 上传记录当前方法是:bluetoothDeviceConnect', + detail: + '失败原因: characteristic.characteristicUuid:${characteristic.characteristicUuid} != _characteristicIdSubscription:$_characteristicIdSubscription bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}', + upload: false); } } + } else { + BuglyTool.uploadException( + message: '订阅失败 上传记录当前方法是:bluetoothDeviceConnect', + detail: + '失败原因: service.uuid:${service.uuid} != _serviceIdConnect:$_serviceIdConnect bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}', + upload: false); } } } on Exception catch (e) { + needScanSingle = true; bluetoothConnectionState = BluetoothConnectionState.disconnected; connectStateCallBack(bluetoothConnectionState!); AppLog.log( '发现设备时失败 e:$e bluetoothConnectionState:$bluetoothConnectionState'); + BuglyTool.uploadException( + message: '发现服务时失败', + detail: + '发现服务时报错原因e:$e bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}', + upload: false); rethrow; } } @@ -577,6 +754,7 @@ class BlueManage { Future stopScan() async { try { await FlutterBluePlus.stopScan(); + AppLog.log('调用停止扫描成功'); } catch (e) { AppLog.log('停止扫描失败'); } diff --git a/lib/blue/entity/lock_user_no_list_entity.dart b/lib/blue/entity/lock_user_no_list_entity.dart index 513cf90f..144cfd30 100755 --- a/lib/blue/entity/lock_user_no_list_entity.dart +++ b/lib/blue/entity/lock_user_no_list_entity.dart @@ -1,8 +1,4 @@ class LockUserNoListEntity { - int? errorCode; - String? description; - String? errorMsg; - Data? data; LockUserNoListEntity( {this.errorCode, this.description, this.errorMsg, this.data}); @@ -15,6 +11,10 @@ class LockUserNoListEntity { data = Data.fromJson(json['data']); } } + int? errorCode; + String? description; + String? errorMsg; + Data? data; Map toJson() { final Map data = {}; @@ -27,7 +27,6 @@ class LockUserNoListEntity { } class Data { - List? userNos = []; Data({ this.userNos, @@ -40,6 +39,7 @@ class Data { }); } } + List? userNos = []; Map toJson() { final Map data = {}; diff --git a/lib/blue/io_gateway/io_gateway_configuringWifi.dart b/lib/blue/io_gateway/io_gateway_configuringWifi.dart new file mode 100644 index 00000000..9708c6bf --- /dev/null +++ b/lib/blue/io_gateway/io_gateway_configuringWifi.dart @@ -0,0 +1,79 @@ +// 网关配网 +import 'dart:convert'; + +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; + +class GatewayConfiguringWifiCommand extends SenderProtocol { + GatewayConfiguringWifiCommand({ + this.ssid, + this.password, + this.gatewayConfigurationStr, + }) : super(CommandType.gatewayConfiguringWifi); + + String? ssid; + String? password; + String? gatewayConfigurationStr; + + @override + String toString() { + return 'SenderConfiguringWifiCommand{ssid: $ssid, password: $password, gatewayConfigurationStr:$gatewayConfigurationStr}'; + } + + @override + List messageDetail() { + final List data = []; + List subData = []; + + // 指令类型 + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; + data.add(type1); + data.add(type2); + + //SSID 30 + final int ssidLength = utf8.encode(ssid!).length; + subData.addAll(utf8.encode(ssid!)); + subData = getFixedLengthList(subData, 30 - ssidLength); + + //Password 20 + final int passwordLength = utf8.encode(password!).length; + subData.addAll(utf8.encode(password!)); + subData = getFixedLengthList(subData, 20 - passwordLength); + + //gatewayConfigurationStr + final int clientIdLength = utf8.encode(gatewayConfigurationStr!).length; + subData.add(clientIdLength); + subData.addAll(utf8.encode(gatewayConfigurationStr!)); + // subData = getFixedLengthList(subData, 20 - clientIdLength); + + data.addAll(subData); + + printLog(data); + return data; + } +} + +class GatewayConfiguringWifiReply extends Reply { + GatewayConfiguringWifiReply.parseData( + CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + final int status = data[2]; + errorWithStstus(status); + } +} + +class GatewayConfiguringWifiResultReply extends Reply { + GatewayConfiguringWifiResultReply.parseData( + CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + final int status = data[2]; + errorWithStstus(status); + } +} diff --git a/lib/blue/io_gateway/io_gateway_getStatus.dart b/lib/blue/io_gateway/io_gateway_getStatus.dart new file mode 100644 index 00000000..d9ec1cff --- /dev/null +++ b/lib/blue/io_gateway/io_gateway_getStatus.dart @@ -0,0 +1,60 @@ +// 获取网关状态 +import 'dart:convert'; + +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; + +class GatewayGetStatusCommand extends SenderProtocol { + GatewayGetStatusCommand({ + this.lockID, + this.userID, + }) : super(CommandType.gatewayGetStatus); + + String? lockID; + String? userID; + + @override + String toString() { + return 'GatewayGetStatusCommand{lockID: $lockID, userID: $userID}'; + } + + @override + List messageDetail() { + final List data = []; + List subData = []; + + // 指令类型 + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; + data.add(type1); + data.add(type2); + + //lockID 40 + final int ssidLength = utf8.encode(lockID!).length; + subData.addAll(utf8.encode(lockID!)); + subData = getFixedLengthList(subData, 40 - ssidLength); + + //userID 20 + final int passwordLength = utf8.encode(userID!).length; + subData.addAll(utf8.encode(userID!)); + subData = getFixedLengthList(subData, 20 - passwordLength); + + data.addAll(subData); + + printLog(data); + return data; + } +} + +class GatewayGetStatusReply extends Reply { + GatewayGetStatusReply.parseData(CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + final int status = data[2]; + errorWithStstus(status); + } +} diff --git a/lib/blue/io_gateway/io_gateway_getWifiList.dart b/lib/blue/io_gateway/io_gateway_getWifiList.dart new file mode 100644 index 00000000..e291f79e --- /dev/null +++ b/lib/blue/io_gateway/io_gateway_getWifiList.dart @@ -0,0 +1,64 @@ +import 'dart:convert'; + +// import 'package:crypto/crypto.dart' as crypto; + +import '../../app_settings/app_settings.dart'; +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; + +class GatewayGetWifiCommand extends SenderProtocol { + GatewayGetWifiCommand({ + this.userID, + }) : super(CommandType.gatewayGetWifiList); + + String? userID; + + @override + String toString() { + return 'SenderGetWifiCommand{userID: $userID}'; + } + + @override + List messageDetail() { + final List data = []; + List subData = []; + + // 指令类型 + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; + data.add(type1); + data.add(type2); + + //userID 20 + final int userIDLength = utf8.encode(userID!).length; + subData.addAll(utf8.encode(userID!)); + subData = getFixedLengthList(subData, 20 - userIDLength); + AppLog.log('ebcData: $subData'); + + data.addAll(subData); + + printLog(data); + return data; + } +} + +class GatewayGetWifiReply extends Reply { + GatewayGetWifiReply.parseData(CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + final int status = data[2]; + errorWithStstus(status); + } +} + +class GatewayGetWifiListReply extends Reply { + GatewayGetWifiListReply.parseData( + CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} diff --git a/lib/blue/io_protocol/io_addCardCancel.dart b/lib/blue/io_protocol/io_addCardCancel.dart index 734bc65f..3b9ad746 100755 --- a/lib/blue/io_protocol/io_addCardCancel.dart +++ b/lib/blue/io_protocol/io_addCardCancel.dart @@ -1,22 +1,14 @@ - import 'dart:convert'; - -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:取消添加指纹 -class SenderCancelAddCardCommand extends SenderProtocol { - String? keyID; - String? userID; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; +import '../sm4Encipher/sm4.dart'; +/// 取消添加指纹 +class SenderCancelAddCardCommand extends SenderProtocol { SenderCancelAddCardCommand({ this.keyID, this.userID, @@ -25,6 +17,12 @@ class SenderCancelAddCardCommand extends SenderProtocol { this.signKey, this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { @@ -34,9 +32,9 @@ class SenderCancelAddCardCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 data.addAll(intChangList(commandType!.typeValue)); @@ -45,20 +43,20 @@ class SenderCancelAddCardCommand extends SenderProtocol { data.add(25); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); - if(needAuthor == 0){ + if (needAuthor == 0) { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -71,7 +69,7 @@ class SenderCancelAddCardCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -81,7 +79,7 @@ class SenderCancelAddCardCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_addFace.dart b/lib/blue/io_protocol/io_addFace.dart index 9383071c..99a0db40 100755 --- a/lib/blue/io_protocol/io_addFace.dart +++ b/lib/blue/io_protocol/io_addFace.dart @@ -10,29 +10,12 @@ import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -///TODO:添加人脸 +/// 添加人脸 /* 备注: 删除单个人脸规则:UseCountLimit 设置为 0。删除全部人脸规则: UseCountLimit 设置为 0,FaceNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 **/ class SenderAddFaceCommand extends SenderProtocol { - String? keyID; - String? userID; - int? faceNo; - int? useCountLimit; - int? isForce; - int? operate; - int? isAdmin; - List? token; - int? isRound; - int? weekRound; - int? startDate; - int? endDate; - String? startTime; - String? endTime; - int? needAuthor; - List? signKey; - List? privateKey; SenderAddFaceCommand({ this.keyID, @@ -53,6 +36,23 @@ class SenderAddFaceCommand extends SenderProtocol { this.signKey, this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? faceNo; + int? useCountLimit; + int? isForce; + int? operate; + int? isAdmin; + List? token; + int? isRound; + int? weekRound; + int? startDate; + int? endDate; + String? startTime; + String? endTime; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { @@ -70,9 +70,9 @@ class SenderAddFaceCommand extends SenderProtocol { @override List messageDetail() { - final List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 data.addAll(intChangList(commandType!.typeValue)); @@ -139,7 +139,7 @@ class SenderAddFaceCommand extends SenderProtocol { // AppLog.log("addFingerprint startDate:${DateTool().dateToYMDHNString(startDate.toString())} endDate:${DateTool().dateToYMDHNString(endDate.toString())}"); // startTime 4 - final List startTimeList = [0,0,0,0]; + final List startTimeList = [0,0,0,0]; if(startTime!.contains(':')){ final List getStartTimeList = startTime!.split(':'); startTimeList[2] = int.parse(getStartTimeList[0]); @@ -148,7 +148,7 @@ class SenderAddFaceCommand extends SenderProtocol { subData.addAll(startTimeList); // endTime 4 - final List endTimeList = [0,0,0,0]; + final List endTimeList = [0,0,0,0]; if(endTime!.contains(':')){ final List getendTimeList = endTime!.split(':'); endTimeList[2] = int.parse(getendTimeList[0]); @@ -160,7 +160,7 @@ class SenderAddFaceCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - final List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -173,7 +173,7 @@ class SenderAddFaceCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - final authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); diff --git a/lib/blue/io_protocol/io_addFaceCancel.dart b/lib/blue/io_protocol/io_addFaceCancel.dart index a89c2ac0..d8e9ef90 100755 --- a/lib/blue/io_protocol/io_addFaceCancel.dart +++ b/lib/blue/io_protocol/io_addFaceCancel.dart @@ -7,14 +7,8 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:取消添加人脸 +/// 取消添加人脸 class SenderCancelAddFaceCommand extends SenderProtocol { - String? keyID; - String? userID; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; SenderCancelAddFaceCommand({ this.keyID, @@ -24,6 +18,12 @@ class SenderCancelAddFaceCommand extends SenderProtocol { this.signKey, this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { @@ -33,7 +33,7 @@ class SenderCancelAddFaceCommand extends SenderProtocol { @override List messageDetail() { - List data = []; + final List data = []; List subData = []; List ebcData = []; @@ -44,12 +44,12 @@ class SenderCancelAddFaceCommand extends SenderProtocol { data.add(86); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -57,7 +57,7 @@ class SenderCancelAddFaceCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -70,7 +70,7 @@ class SenderCancelAddFaceCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -80,7 +80,7 @@ class SenderCancelAddFaceCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = 16 - data.length % 16; + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_addFaceWithTimeCycleCoercion.dart b/lib/blue/io_protocol/io_addFaceWithTimeCycleCoercion.dart deleted file mode 100755 index d10ecec2..00000000 --- a/lib/blue/io_protocol/io_addFaceWithTimeCycleCoercion.dart +++ /dev/null @@ -1,186 +0,0 @@ - -import '../io_sender.dart'; -import '../io_type.dart'; - -///TODO:添加人脸 -/* -备注: -删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 -**/ -// class SenderAddFaceWithTimeCycleCoercionCommand extends SenderProtocol { -// -// String? keyID; -// String? userID; -// int? fingerNo; -// int? useCountLimit; -// int? isForce; -// List? token; -// int? isRound; -// int? weekRound; -// int? startDate; -// int? endDate; -// String? startTime; -// String? endTime; -// int? needAuthor; -// List? signKey; -// List? privateKey; -// -// SenderAddFaceWithTimeCycleCoercionCommand({ -// this.keyID, -// this.userID, -// this.fingerNo, -// this.useCountLimit, -// this.isForce, -// this.token, -// this.isRound, -// this.weekRound, -// this.startDate, -// this.endDate, -// this.startTime, -// this.endTime, -// this.needAuthor, -// this.signKey, -// this.privateKey, -// }) : super(CommandType.generalExtendedCommond); -// -// @override -// List messageDetail() { -// List data = []; -// List subData = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 子命令类型 -// data.add(36); -// -// // keyID 40 -// int keyIDLength = utf8.encode(keyID!).length; -// subData.addAll(utf8.encode(keyID!)); -// subData = getFixedLengthList(subData, 40 - keyIDLength); -// -// //userID 20 -// int userIDLength = utf8.encode(userID!).length; -// subData.addAll(utf8.encode(userID!)); -// subData = getFixedLengthList(subData, 20 - userIDLength); -// -// // fingerNo -// subData.add(fingerNo!); -// -// // UseCountLimit -// subData.add(useCountLimit!); -// -// // isForce -// subData.add(isForce!); -// -// // token -// subData.addAll(token!); -// -// // isRound -// subData.add(isRound!); -// -// // weekRound -// subData.add(weekRound!); -// -// // startDate 4 -// subData.add((startDate! & 0xff000000) >> 24); -// subData.add((startDate! & 0xff0000) >> 16); -// subData.add((startDate! & 0xff00) >> 8); -// subData.add((startDate! & 0xff)); -// -// // endDate 4 -// subData.add((endDate! & 0xff000000) >> 24); -// subData.add((endDate! & 0xff0000) >> 16); -// subData.add((endDate! & 0xff00) >> 8); -// subData.add((endDate! & 0xff)); -// -// // startTime 4 -// List startTimeList = [0,0,0,0]; -// if(startTime!.contains(":")){ -// List getStartTimeList = startTime!.split(":"); -// startTimeList[2] = int.parse(getStartTimeList[0]); -// startTimeList[3] = int.parse(getStartTimeList[1]); -// } -// subData.addAll(startTimeList); -// -// // endTime 4 -// List endTimeList = [0,0,0,0]; -// if(endTime!.contains(":")){ -// List getendTimeList = endTime!.split(":"); -// endTimeList[2] = int.parse(getendTimeList[0]); -// endTimeList[3] = int.parse(getendTimeList[1]); -// } -// subData.addAll(endTimeList); -// -// if(needAuthor == 0){ -// //AuthCodeLen 1 -// subData.add(0); -// } else { -// List authCodeData = []; -// //KeyID -// authCodeData.addAll(utf8.encode(keyID!)); -// -// //authUserID -// authCodeData.addAll(utf8.encode(userID!)); -// -// //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 -// authCodeData.addAll(token!); -// -// authCodeData.addAll(signKey!); -// -// // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode -// var authCode = crypto.md5.convert(authCodeData); -// -// subData.add(authCode.bytes.length); -// subData.addAll(authCode.bytes); -// } -// -// data.add(subData.length); -// data.addAll(subData); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// -// Get.log("${commandType!.typeName} SM4Data:$data"); -// // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class SenderAddFingerprintWithTimeCycleCoercionReply extends Reply { -// SenderAddFingerprintWithTimeCycleCoercionReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// int status = data[2]; -// errorWithStstus(status); -// } -// } -// -// class SenderAddFingerprintProcessReply extends Reply { -// SenderAddFingerprintProcessReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// int status = data[2]; -// errorWithStstus(status); -// } -// } -// -// class SenderAddFingerprintConfirmationReply extends Reply { -// SenderAddFingerprintConfirmationReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// int status = data[2]; -// errorWithStstus(status); -// } -// } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_addFingerprint.dart b/lib/blue/io_protocol/io_addFingerprint.dart deleted file mode 100755 index fcd4d397..00000000 --- a/lib/blue/io_protocol/io_addFingerprint.dart +++ /dev/null @@ -1,148 +0,0 @@ - -import 'dart:convert'; - -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -///TODO:添加指纹 -/// 该协议已弃用 使用新协议SenderAddFingerprintWithTimeCycleCoercionCommand 2024.4.16 addby 魏少阳 -/* -备注: -删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 -**/ -// class SenderAddFingerprintCommand extends SenderProtocol { -// -// String? keyID; -// String? userID; -// int? fingerNo; -// int? useCountLimit; -// List? token; -// int? startTime; -// int? endTime; -// int? needAuthor; -// List? signKey; -// List? privateKey; -// -// SenderAddFingerprintCommand({ -// this.keyID, -// this.userID, -// this.fingerNo, -// this.useCountLimit, -// this.token, -// this.startTime, -// this.endTime, -// this.needAuthor, -// this.signKey, -// this.privateKey, -// }) : super(CommandType.generalExtendedCommond); -// -// @override -// List messageDetail() { -// List data = []; -// List subData = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 子命令类型 -// data.add(31); -// -// // keyID 40 -// int keyIDLength = utf8.encode(keyID!).length; -// subData.addAll(utf8.encode(keyID!)); -// subData = getFixedLengthList(subData, 40 - keyIDLength); -// -// //userID 20 -// int userIDLength = utf8.encode(userID!).length; -// subData.addAll(utf8.encode(userID!)); -// subData = getFixedLengthList(subData, 20 - userIDLength); -// -// // PwdNo -// subData.add(fingerNo!); -// -// // UseCountLimit -// subData.add(useCountLimit!); -// -// // token -// subData.addAll(token!); -// -// // startTime 4 -// subData.add((startTime! & 0xff000000) >> 24); -// subData.add((startTime! & 0xff0000) >> 16); -// subData.add((startTime! & 0xff00) >> 8); -// subData.add((startTime! & 0xff)); -// -// // endTime 4 -// subData.add((endTime! & 0xff000000) >> 24); -// subData.add((endTime! & 0xff0000) >> 16); -// subData.add((endTime! & 0xff00) >> 8); -// subData.add((endTime! & 0xff)); -// -// if(needAuthor == 0){ -// //AuthCodeLen 1 -// subData.add(0); -// } else { -// List authCodeData = []; -// //KeyID -// authCodeData.addAll(utf8.encode(keyID!)); -// -// //authUserID -// authCodeData.addAll(utf8.encode(userID!)); -// -// //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 -// authCodeData.addAll(token!); -// -// authCodeData.addAll(signKey!); -// -// // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode -// var authCode = crypto.md5.convert(authCodeData); -// -// subData.add(authCode.bytes.length); -// subData.addAll(authCode.bytes); -// } -// -// data.add(subData.length); -// data.addAll(subData); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class SenderAddFingerprintReply extends Reply { -// SenderAddFingerprintReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } -// -// class SenderAddFingerprintProcessReply extends Reply { -// SenderAddFingerprintProcessReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } -// -// class SenderAddFingerprintConfirmationReply extends Reply { -// SenderAddFingerprintConfirmationReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_addFingerprintCancel.dart b/lib/blue/io_protocol/io_addFingerprintCancel.dart index 36e8277d..9ecf8c6c 100755 --- a/lib/blue/io_protocol/io_addFingerprintCancel.dart +++ b/lib/blue/io_protocol/io_addFingerprintCancel.dart @@ -7,14 +7,8 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:取消添加指纹 +/// 取消添加指纹 class SenderCancelAddFingerprintCommand extends SenderProtocol { - String? keyID; - String? userID; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; SenderCancelAddFingerprintCommand({ this.keyID, @@ -24,6 +18,12 @@ class SenderCancelAddFingerprintCommand extends SenderProtocol { this.signKey, this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { @@ -33,9 +33,9 @@ class SenderCancelAddFingerprintCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 data.addAll(intChangList(commandType!.typeValue)); @@ -44,12 +44,12 @@ class SenderCancelAddFingerprintCommand extends SenderProtocol { data.add(37); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -57,7 +57,7 @@ class SenderCancelAddFingerprintCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -70,7 +70,7 @@ class SenderCancelAddFingerprintCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -80,7 +80,7 @@ class SenderCancelAddFingerprintCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart b/lib/blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart index d92547b8..7877c625 100755 --- a/lib/blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart +++ b/lib/blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart @@ -10,31 +10,12 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:添加指纹 +/// 添加指纹 /* 备注: 删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 **/ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? fingerNo; - int? useCountLimit; - int? isForce; - int? operate; - int? isAdmin; - List? token; - int? isRound; - int? weekRound; - int? startDate; - int? endDate; - String? startTime; - String? endTime; - int? needAuthor; - List? signKey; - List? privateKey; - SenderAddFingerprintWithTimeCycleCoercionCommand({ this.keyID, this.userID, @@ -55,6 +36,24 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? fingerNo; + int? useCountLimit; + int? isForce; + int? operate; + int? isAdmin; + List? token; + int? isRound; + int? weekRound; + int? startDate; + int? endDate; + String? startTime; + String? endTime; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { return 'SenderAddFingerprintWithTimeCycleCoercionCommand{keyID: $keyID, ' @@ -70,7 +69,7 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { @override List messageDetail() { - List data = []; + final List data = []; List subData = []; List ebcData = []; @@ -81,12 +80,12 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { data.add(36); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -121,27 +120,27 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { subData.add((startDate! & 0xff000000) >> 24); subData.add((startDate! & 0xff0000) >> 16); subData.add((startDate! & 0xff00) >> 8); - subData.add((startDate! & 0xff)); + subData.add(startDate! & 0xff); // endDate 4 subData.add((endDate! & 0xff000000) >> 24); subData.add((endDate! & 0xff0000) >> 16); subData.add((endDate! & 0xff00) >> 8); - subData.add((endDate! & 0xff)); + subData.add(endDate! & 0xff); // startTime 4 - List startTimeList = [0,0,0,0]; - if(startTime!.contains(":")){ - List getStartTimeList = startTime!.split(":"); + final List startTimeList = [0,0,0,0]; + if(startTime!.contains(':')){ + final List getStartTimeList = startTime!.split(':'); startTimeList[2] = int.parse(getStartTimeList[0]); startTimeList[3] = int.parse(getStartTimeList[1]); } subData.addAll(startTimeList); // endTime 4 - List endTimeList = [0,0,0,0]; - if(endTime!.contains(":")){ - List getendTimeList = endTime!.split(":"); + final List endTimeList = [0,0,0,0]; + if(endTime!.contains(':')){ + final List getendTimeList = endTime!.split(':'); endTimeList[2] = int.parse(getendTimeList[0]); endTimeList[3] = int.parse(getendTimeList[1]); } @@ -151,7 +150,7 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -164,7 +163,7 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -174,7 +173,7 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -191,7 +190,7 @@ class SenderAddFingerprintWithTimeCycleCoercionReply extends Reply { SenderAddFingerprintWithTimeCycleCoercionReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } @@ -200,7 +199,7 @@ class SenderAddFingerprintProcessReply extends Reply { SenderAddFingerprintProcessReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } @@ -209,7 +208,7 @@ class SenderAddFingerprintConfirmationReply extends Reply { SenderAddFingerprintConfirmationReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_addICCard.dart b/lib/blue/io_protocol/io_addICCard.dart deleted file mode 100755 index 740f6515..00000000 --- a/lib/blue/io_protocol/io_addICCard.dart +++ /dev/null @@ -1,142 +0,0 @@ -import 'dart:convert'; - -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_tool/io_tool.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -import '../sm4Encipher/sm4.dart'; - -///TODO:该协议已弃用 使用新协议SenderAddICCardWithTimeCycleCoercionCommand 2024.4.16 addby 魏少阳 -/// -///TODO:设置自定义密码 -// /* -// 备注: -// 删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 -// **/ -// class SenderAddICCardCommand extends SenderProtocol { -// String? keyID; -// String? userID; -// int? cardNo; -// int? useCountLimit; -// List? token; -// int? startTime; -// int? endTime; -// int? needAuthor; -// List? signKey; -// List? privateKey; -// -// SenderAddICCardCommand({ -// this.keyID, -// this.userID, -// this.cardNo, -// this.useCountLimit, -// this.token, -// this.startTime, -// this.endTime, -// this.needAuthor, -// this.signKey, -// this.privateKey, -// }) : super(CommandType.generalExtendedCommond); -// -// @override -// List messageDetail() { -// List data = []; -// List subData = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 子命令类型 -// data.add(21); -// -// // keyID 40 -// int keyIDLength = utf8.encode(keyID!).length; -// subData.addAll(utf8.encode(keyID!)); -// subData = getFixedLengthList(subData, 40 - keyIDLength); -// -// //userID 20 -// int userIDLength = utf8.encode(userID!).length; -// subData.addAll(utf8.encode(userID!)); -// subData = getFixedLengthList(subData, 20 - userIDLength); -// -// // PwdNo -// subData.add(cardNo!); -// -// // UseCountLimit -// subData.add(useCountLimit!); -// -// // token -// subData.addAll(token!); -// -// // startTime 4 -// subData.add((startTime! & 0xff000000) >> 24); -// subData.add((startTime! & 0xff0000) >> 16); -// subData.add((startTime! & 0xff00) >> 8); -// subData.add((startTime! & 0xff)); -// -// // endTime 4 -// subData.add((endTime! & 0xff000000) >> 24); -// subData.add((endTime! & 0xff0000) >> 16); -// subData.add((endTime! & 0xff00) >> 8); -// subData.add((endTime! & 0xff)); -// -// if (needAuthor == 0) { -// //AuthCodeLen 1 -// subData.add(0); -// } else { -// List authCodeData = []; -// //KeyID -// authCodeData.addAll(utf8.encode(keyID!)); -// -// //authUserID -// authCodeData.addAll(utf8.encode(userID!)); -// -// //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 -// authCodeData.addAll(token!); -// -// authCodeData.addAll(signKey!); -// -// // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode -// var authCode = crypto.md5.convert(authCodeData); -// -// subData.add(authCode.bytes.length); -// subData.addAll(authCode.bytes); -// } -// -// data.add(subData.length); -// data.addAll(subData); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class SenderAddICCardReply extends Reply { -// SenderAddICCardReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } -// -// class SenderAddICCardConfirmationReply extends Reply { -// SenderAddICCardConfirmationReply.parseData( -// CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } diff --git a/lib/blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart b/lib/blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart index 173c738e..d0a0861e 100755 --- a/lib/blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart +++ b/lib/blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart @@ -1,4 +1,3 @@ - import 'dart:convert'; import 'package:star_lock/tools/dateTool.dart'; @@ -10,31 +9,12 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:添加指纹 +/// 添加指纹 /* 备注: 删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 **/ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? cardNo; - int? useCountLimit; - int? isForce; - int? operate; - int? isAdmin; - List? token; - int? isRound; - int? weekRound; - int? startDate; - int? endDate; - String? startTime; - String? endTime; - int? needAuthor; - List? signKey; - List? privateKey; - SenderAddICCardWithTimeCycleCoercionCommand({ this.keyID, this.userID, @@ -55,6 +35,23 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? cardNo; + int? useCountLimit; + int? isForce; + int? operate; + int? isAdmin; + List? token; + int? isRound; + int? weekRound; + int? startDate; + int? endDate; + String? startTime; + String? endTime; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { @@ -71,9 +68,9 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 data.addAll(intChangList(commandType!.typeValue)); @@ -82,12 +79,12 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { data.add(24); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -122,37 +119,37 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { subData.add((startDate! & 0xff000000) >> 24); subData.add((startDate! & 0xff0000) >> 16); subData.add((startDate! & 0xff00) >> 8); - subData.add((startDate! & 0xff)); + subData.add(startDate! & 0xff); // endDate 4 subData.add((endDate! & 0xff000000) >> 24); subData.add((endDate! & 0xff0000) >> 16); subData.add((endDate! & 0xff00) >> 8); - subData.add((endDate! & 0xff)); + subData.add(endDate! & 0xff); // startTime 4 - List startTimeList = [0,0,0,0]; - if(startTime!.contains(":")){ - List getStartTimeList = startTime!.split(":"); + final List startTimeList = [0, 0, 0, 0]; + if (startTime!.contains(':')) { + final List getStartTimeList = startTime!.split(':'); startTimeList[2] = int.parse(getStartTimeList[0]); startTimeList[3] = int.parse(getStartTimeList[1]); } subData.addAll(startTimeList); // endTime 4 - List endTimeList = [0,0,0,0]; - if(endTime!.contains(":")){ - List getendTimeList = endTime!.split(":"); + final List endTimeList = [0, 0, 0, 0]; + if (endTime!.contains(':')) { + final List getendTimeList = endTime!.split(':'); endTimeList[2] = int.parse(getendTimeList[0]); endTimeList[3] = int.parse(getendTimeList[1]); } subData.addAll(endTimeList); - if(needAuthor == 0){ + if (needAuthor == 0) { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -165,7 +162,7 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -175,7 +172,7 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -189,19 +186,21 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol { } class SenderAddICCardWithTimeCycleCoercionReply extends Reply { - SenderAddICCardWithTimeCycleCoercionReply.parseData(CommandType commandType, List dataDetail) + SenderAddICCardWithTimeCycleCoercionReply.parseData( + CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } class SenderAddICCardConfirmationReply extends Reply { - SenderAddICCardConfirmationReply.parseData(CommandType commandType, List dataDetail) + SenderAddICCardConfirmationReply.parseData( + CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_addPalmCancel.dart b/lib/blue/io_protocol/io_addPalmCancel.dart index 20b5f9a9..021e6ac8 100644 --- a/lib/blue/io_protocol/io_addPalmCancel.dart +++ b/lib/blue/io_protocol/io_addPalmCancel.dart @@ -8,7 +8,7 @@ import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -/// TODO:取消添加掌纹 +/// 取消添加掌纹 class SenderCancelAddPalmCommand extends SenderProtocol { SenderCancelAddPalmCommand({ @@ -34,7 +34,7 @@ class SenderCancelAddPalmCommand extends SenderProtocol { @override List messageDetail() { - List data = []; + final List data = []; List subData = []; List ebcData = []; @@ -45,12 +45,12 @@ class SenderCancelAddPalmCommand extends SenderProtocol { data.add(44); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -58,7 +58,7 @@ class SenderCancelAddPalmCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -71,7 +71,7 @@ class SenderCancelAddPalmCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -81,7 +81,7 @@ class SenderCancelAddPalmCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = 16 - data.length % 16; + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart b/lib/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart index 7972aa83..430eb494 100644 --- a/lib/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart +++ b/lib/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart @@ -10,7 +10,7 @@ import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -///TODO:添加掌纹 +/// 添加掌纹 class SenderAddPalmWithTimeCycleCoercionCommand extends SenderProtocol { SenderAddPalmWithTimeCycleCoercionCommand({ diff --git a/lib/blue/io_protocol/io_addRemoteControlCancel.dart b/lib/blue/io_protocol/io_addRemoteControlCancel.dart index d09f64a0..46765f6b 100644 --- a/lib/blue/io_protocol/io_addRemoteControlCancel.dart +++ b/lib/blue/io_protocol/io_addRemoteControlCancel.dart @@ -8,7 +8,7 @@ import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -/// TODO:取消添加遥控 +/// 取消添加遥控 class SenderCancelAddRemoteControlCommand extends SenderProtocol { SenderCancelAddRemoteControlCommand({ @@ -34,7 +34,7 @@ class SenderCancelAddRemoteControlCommand extends SenderProtocol { @override List messageDetail() { - List data = []; + final List data = []; List subData = []; List ebcData = []; @@ -45,12 +45,12 @@ class SenderCancelAddRemoteControlCommand extends SenderProtocol { data.add(28); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -58,7 +58,7 @@ class SenderCancelAddRemoteControlCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -71,7 +71,7 @@ class SenderCancelAddRemoteControlCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -81,7 +81,7 @@ class SenderCancelAddRemoteControlCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = 16 - data.length % 16; + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart b/lib/blue/io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart index 62ff50bf..786f7ad0 100644 --- a/lib/blue/io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart +++ b/lib/blue/io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart @@ -10,7 +10,7 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:添加遥控 +/// 添加遥控 class SenderAddRemoteControlWithTimeCycleCoercionCommand extends SenderProtocol { SenderAddRemoteControlWithTimeCycleCoercionCommand({ diff --git a/lib/blue/io_protocol/io_addStressFingerprint.dart b/lib/blue/io_protocol/io_addStressFingerprint.dart deleted file mode 100755 index 0980e2c8..00000000 --- a/lib/blue/io_protocol/io_addStressFingerprint.dart +++ /dev/null @@ -1,140 +0,0 @@ - -import 'dart:convert'; - -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -///TODO:添加胁迫指纹 -/* -备注: -删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 -**/ -// class SenderAddStressFingerprintCommand extends SenderProtocol { -// -// String? keyID; -// String? userID; -// int? fingerNo; -// int? fingerType; -// int? useCountLimit; -// List? token; -// int? startTime; -// int? endTime; -// int? needAuthor; -// List? publicKey; -// List? privateKey; -// List? signKey; -// -// SenderAddStressFingerprintCommand({ -// this.keyID, -// this.userID, -// this.fingerNo, -// this.fingerType, -// this.useCountLimit, -// this.token, -// this.startTime, -// this.endTime, -// this.needAuthor, -// this.publicKey, -// this.privateKey, -// this.signKey -// }) : super(CommandType.generalExtendedCommond); -// -// @override -// List messageDetail() { -// List data = []; -// List subData = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 子命令类型 -// data.add(62); -// -// // keyID 40 -// int keyIDLength = utf8.encode(keyID!).length; -// subData.addAll(utf8.encode(keyID!)); -// subData = getFixedLengthList(subData, 40 - keyIDLength); -// -// //userID 20 -// int userIDLength = utf8.encode(userID!).length; -// subData.addAll(utf8.encode(userID!)); -// subData = getFixedLengthList(subData, 20 - userIDLength); -// -// // PwdNo -// subData.add(fingerNo!); -// -// // fingerType -// subData.add(fingerType!); -// -// // UseCountLimit -// subData.add(255); -// -// // token -// subData.addAll(token!); -// -// // startTime 4 -// subData.add((startTime! & 0xff000000) >> 24); -// subData.add((startTime! & 0xff0000) >> 16); -// subData.add((startTime! & 0xff00) >> 8); -// subData.add((startTime! & 0xff)); -// -// // endTime 4 -// subData.add((endTime! & 0xff000000) >> 24); -// subData.add((endTime! & 0xff0000) >> 16); -// subData.add((endTime! & 0xff00) >> 8); -// subData.add((endTime! & 0xff)); -// -// if(needAuthor == 0){ -// //AuthCodeLen 1 -// subData.add(0); -// } else { -// List authCodeData = []; -// -// //KeyID -// authCodeData.addAll(utf8.encode(keyID!)); -// -// //authUserID -// authCodeData.addAll(utf8.encode(userID!)); -// -// //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 -// authCodeData.addAll(token!); -// -// authCodeData.addAll(signKey!); -// -// // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode -// var authCode = crypto.md5.convert(authCodeData); -// subData.add(authCode.bytes.length); -// subData.addAll(authCode.bytes); -// } -// -// data.add(subData.length); -// data.addAll(subData); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class SenderAddStressFingerprintReply extends Reply { -// SenderAddStressFingerprintReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_addStressICCard.dart b/lib/blue/io_protocol/io_addStressICCard.dart deleted file mode 100755 index bd99ff55..00000000 --- a/lib/blue/io_protocol/io_addStressICCard.dart +++ /dev/null @@ -1,143 +0,0 @@ - -import 'dart:convert'; - -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -///TODO:该协议已弃用 使用新协议SenderAddICCardWithTimeCycleCoercionCommand 2024.4.16 addby 魏少阳 -/// -///TODO:添加胁迫卡片 -/* -备注: -删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 -**/ -// class SenderAddStressICCardCommand extends SenderProtocol { -// -// String? keyID; -// String? userID; -// int? icCardNo; -// int? cardType; -// int? useCountLimit; -// List? token; -// int? startTime; -// int? endTime; -// int? needAuthor; -// List? publicKey; -// List? privateKey; -// List? signKey; -// -// SenderAddStressICCardCommand({ -// this.keyID, -// this.userID, -// this.icCardNo, -// this.cardType, -// this.useCountLimit, -// this.token, -// this.startTime, -// this.endTime, -// this.needAuthor, -// this.publicKey, -// this.privateKey, -// this.signKey -// }) : super(CommandType.generalExtendedCommond); -// -// @override -// List messageDetail() { -// List data = []; -// List subData = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 子命令类型 -// data.add(61); -// -// // keyID 40 -// int keyIDLength = utf8.encode(keyID!).length; -// subData.addAll(utf8.encode(keyID!)); -// subData = getFixedLengthList(subData, 40 - keyIDLength); -// -// //userID 20 -// int userIDLength = utf8.encode(userID!).length; -// subData.addAll(utf8.encode(userID!)); -// subData = getFixedLengthList(subData, 20 - userIDLength); -// -// // icCardNo -// subData.add(icCardNo!); -// -// // cardType -// subData.add(cardType!); -// -// // UseCountLimit -// subData.add(0xff); -// -// // token -// subData.addAll(token!); -// -// // startTime 4 -// subData.add((startTime! & 0xff000000) >> 24); -// subData.add((startTime! & 0xff0000) >> 16); -// subData.add((startTime! & 0xff00) >> 8); -// subData.add((startTime! & 0xff)); -// -// // endTime 4 -// subData.add((endTime! & 0xff000000) >> 24); -// subData.add((endTime! & 0xff0000) >> 16); -// subData.add((endTime! & 0xff00) >> 8); -// subData.add((endTime! & 0xff)); -// -// if(needAuthor == 0){ -// //AuthCodeLen 1 -// subData.add(0); -// } else { -// List authCodeData = []; -// -// //KeyID -// authCodeData.addAll(utf8.encode(keyID!)); -// -// //authUserID -// authCodeData.addAll(utf8.encode(userID!)); -// -// //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 -// authCodeData.addAll(token!); -// -// authCodeData.addAll(signKey!); -// -// // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode -// var authCode = crypto.md5.convert(authCodeData); -// -// subData.add(authCode.bytes.length); -// subData.addAll(authCode.bytes); -// } -// -// data.add(subData.length); -// data.addAll(subData); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class SenderAddStressICCardReply extends Reply { -// SenderAddStressICCardReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_addStressPassword.dart b/lib/blue/io_protocol/io_addStressPassword.dart deleted file mode 100755 index 8d875f7c..00000000 --- a/lib/blue/io_protocol/io_addStressPassword.dart +++ /dev/null @@ -1,153 +0,0 @@ - -import 'dart:convert'; - -import 'package:star_lock/tools/dateTool.dart'; - -import '../../app_settings/app_settings.dart'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -///TODO:添加胁迫密码 -/* -备注: -删除单个指纹规则:UseCountLimit 设置为 0。删除全部指纹规则: UseCountLimit 设置为 0,FingerNo 设置为 255,userId 设置为“Delete All !@#”,只有门锁管理员才有权限 -**/ -class SenderAddStressPasswordCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? passwordNo; - int? useCountLimit; - List? token; - int? startTime; - int? endTime; - int? needAuthor; - List? publicKey; - List? privateKey; - - SenderAddStressPasswordCommand({ - this.keyID, - this.userID, - this.passwordNo, - this.useCountLimit, - this.token, - this.startTime, - this.endTime, - this.needAuthor, - this.publicKey, - this.privateKey, - }) : super(CommandType.generalExtendedCommond); - - - @override - String toString() { - return 'SenderAddStressPasswordCommand{keyID: $keyID, userID: $userID, ' - 'passwordNo: $passwordNo, useCountLimit: $useCountLimit, ' - 'token: $token, ' - 'startTime: ${DateTool().dateIntToYMDHNString(startTime)}, ' - 'endTime: ${DateTool().dateIntToYMDHNString(endTime)}, ' - 'needAuthor: $needAuthor, publicKey: $publicKey, ' - 'privateKey: $privateKey}'; - } - - @override - List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 子命令类型 - data.add(60); - - // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; - subData.addAll(utf8.encode(keyID!)); - subData = getFixedLengthList(subData, 40 - keyIDLength); - - //userID 20 - int userIDLength = utf8.encode(userID!).length; - subData.addAll(utf8.encode(userID!)); - subData = getFixedLengthList(subData, 20 - userIDLength); - - // PwdNo - subData.add(passwordNo!); - - // UseCountLimit - subData.add(0xff); - - // token - subData.addAll(token!); - - // startTime 4 - subData.add((startTime! & 0xff000000) >> 24); - subData.add((startTime! & 0xff0000) >> 16); - subData.add((startTime! & 0xff00) >> 8); - subData.add((startTime! & 0xff)); - - // endTime 4 - subData.add((endTime! & 0xff000000) >> 24); - subData.add((endTime! & 0xff0000) >> 16); - subData.add((endTime! & 0xff00) >> 8); - subData.add((endTime! & 0xff)); - - if(needAuthor == 0){ - //AuthCodeLen 1 - subData.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(userID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - subData.add(authCode.bytes.length); - subData.addAll(authCode.bytes); - } - - data.add(subData.length); - data.addAll(subData); - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class SenderAddStressPasswordReply extends Reply { - SenderAddStressPasswordReply.parseData(CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - int status = data[2]; - errorWithStstus(status); - } -} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_addUser.dart b/lib/blue/io_protocol/io_addUser.dart index e54463e6..e5616d1b 100755 --- a/lib/blue/io_protocol/io_addUser.dart +++ b/lib/blue/io_protocol/io_addUser.dart @@ -11,31 +11,8 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -//TODO:添加用户 +// 添加用户 class AddUserCommand extends SenderProtocol { - String? lockID; - String? authUserID; - String? keyID; - String? userID; - int? openMode; - int? keyType; - int? startDate; - int? expireDate; - - int? useCountLimit; - int? isRound; - int? weekRound; - int? startHour; - int? startMin; - int? endHour; - int? endMin; - - int? role; - String? password; - int? needAuthor; - List? publicKey; - List? privateKey; - List? token; AddUserCommand( {this.lockID, @@ -60,6 +37,29 @@ class AddUserCommand extends SenderProtocol { this.privateKey, this.token}) : super(CommandType.addUser); + String? lockID; + String? authUserID; + String? keyID; + String? userID; + int? openMode; + int? keyType; + int? startDate; + int? expireDate; + + int? useCountLimit; + int? isRound; + int? weekRound; + int? startHour; + int? startMin; + int? endHour; + int? endMin; + + int? role; + String? password; + int? needAuthor; + List? publicKey; + List? privateKey; + List? token; @override String toString() { @@ -78,34 +78,34 @@ class AddUserCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //authUserID 20 - int authUserIDLength = utf8.encode(authUserID!).length; + final int authUserIDLength = utf8.encode(authUserID!).length; data.addAll(utf8.encode(authUserID!)); data = getFixedLengthList(data, 20 - authUserIDLength); //KeyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; data.addAll(utf8.encode(keyID!)); data = getFixedLengthList(data, 40 - keyIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -128,18 +128,18 @@ class AddUserCommand extends SenderProtocol { data.add((d1! & 0xff000000) >> 24); data.add((d1 & 0xff0000) >> 16); data.add((d1 & 0xff00) >> 8); - data.add((d1 & 0xff)); + data.add(d1 & 0xff); // expireDate 4 data.add((d2! & 0xff000000) >> 24); data.add((d2 & 0xff0000) >> 16); data.add((d2 & 0xff00) >> 8); - data.add((d2 & 0xff)); + data.add(d2 & 0xff); //useCountLimit 2 - double useCountLimitDouble = useCountLimit! / 256; - int useCountLimit1 = useCountLimitDouble.toInt(); - int useCountLimit2 = useCountLimit! % 256; + final double useCountLimitDouble = useCountLimit! / 256; + final int useCountLimit1 = useCountLimitDouble.toInt(); + final int useCountLimit2 = useCountLimit! % 256; data.add(useCountLimit1); data.add(useCountLimit2); @@ -154,7 +154,7 @@ class AddUserCommand extends SenderProtocol { data.add(role!); //password 超级管理员领锁时需验证该密码 20 - int passwordLength = utf8.encode(password!).length; + final int passwordLength = utf8.encode(password!).length; data.addAll(utf8.encode(password!)); data = getFixedLengthList(data, 20 - passwordLength); @@ -165,7 +165,7 @@ class AddUserCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(authUserID!)); @@ -179,14 +179,14 @@ class AddUserCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_automaticPadlock.dart b/lib/blue/io_protocol/io_automaticPadlock.dart deleted file mode 100755 index cce2bfaf..00000000 --- a/lib/blue/io_protocol/io_automaticPadlock.dart +++ /dev/null @@ -1,79 +0,0 @@ - -import 'dart:convert'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -//TODO:自动落锁开关 -/// 废弃 -// class AutomaticPadlockCommand extends SenderProtocol { -// String? lockID; -// String? userID; -// int? autoLockFlag; -// List? token; -// int? needAuthor; -// List? signKey; -// List? privateKey; -// AutomaticPadlockCommand({ -// this.lockID, -// this.userID, -// this.autoLockFlag, -// this.token, -// this.needAuthor, -// this.signKey, -// this.privateKey -// }) : super(CommandType.generalExtendedCommond); -// -// @override -// List messageDetail() { -// List data = []; -// List subData = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 子命令类型 -// data.add(4); -// -// //lockID 40 -// int lockIDLength = utf8.encode(lockID!).length; -// subData.addAll(utf8.encode(lockID!)); -// subData = getFixedLengthList(subData, 40 - lockIDLength); -// -// //userID 要接受钥匙的用户的useid 20 -// int userIDLength = utf8.encode(userID!).length; -// subData.addAll(utf8.encode(userID!)); -// subData = getFixedLengthList(subData, 20 - userIDLength); -// -// // autoLockFlag 0:不自动落锁,1:自动落锁 -// subData.add(autoLockFlag!); -// -// data.add(subData.length); -// data.addAll(subData); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class AutomaticPadlockReply extends Reply { -// AutomaticPadlockReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// } -// } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_changeAdministratorPassword.dart b/lib/blue/io_protocol/io_changeAdministratorPassword.dart index 095c15c9..17862cfe 100755 --- a/lib/blue/io_protocol/io_changeAdministratorPassword.dart +++ b/lib/blue/io_protocol/io_changeAdministratorPassword.dart @@ -11,21 +11,9 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -//TODO:修改管理员密码 +// 修改管理员密码 class ChangeAdministratorPasswordCommand extends SenderProtocol { - String? keyID; - String? userID; - int? pwdNo; - String? pwd; - int? useCountLimit; - List? token; - int? startTime; - int? endTime; - int? needAuthor; - List? signKey; - List? privateKey; - ChangeAdministratorPasswordCommand({ this.keyID, this.userID, @@ -40,6 +28,18 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? pwdNo; + String? pwd; + int? useCountLimit; + List? token; + int? startTime; + int? endTime; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { @@ -53,9 +53,9 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 // int type = commandType!.typeValue; @@ -70,21 +70,20 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { data.add(2); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); // PwdNo subData.addAll(intChangList(pwdNo!)); - AppLog.log("pwdNo:$pwdNo"); // pwd 20 - int pwdLength = utf8.encode(pwd!).length; + final int pwdLength = utf8.encode(pwd!).length; subData.addAll(utf8.encode(pwd!)); subData = getFixedLengthList(subData, 20 - pwdLength); @@ -98,19 +97,19 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { subData.add((startTime! & 0xff000000) >> 24); subData.add((startTime! & 0xff0000) >> 16); subData.add((startTime! & 0xff00) >> 8); - subData.add((startTime! & 0xff)); + subData.add(startTime! & 0xff); // endTime 4 subData.add((endTime! & 0xff000000) >> 24); subData.add((endTime! & 0xff0000) >> 16); subData.add((endTime! & 0xff00) >> 8); - subData.add((endTime! & 0xff)); + subData.add(endTime! & 0xff); if(needAuthor == 0){ //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -124,7 +123,7 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -134,7 +133,7 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -151,7 +150,7 @@ class ChangeAdministratorPasswordReply extends Reply { ChangeAdministratorPasswordReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_checkingCardStatus.dart b/lib/blue/io_protocol/io_checkingCardStatus.dart deleted file mode 100755 index 2b774f48..00000000 --- a/lib/blue/io_protocol/io_checkingCardStatus.dart +++ /dev/null @@ -1,127 +0,0 @@ - -//TODO:查询指纹状态 -import 'dart:convert'; - -import '../../app_settings/app_settings.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_tool/io_tool.dart'; -import '../io_type.dart'; -import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; - -class SenderCheckingCardStatusCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? role; - int? cardCount; - int? cardNo; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - - SenderCheckingCardStatusCommand({ - this.keyID, - this.userID, - this.role, - this.cardCount, - this.cardNo, - this.token, - this.needAuthor, - this.publicKey, - this.privateKey, - }) : super(CommandType.generalExtendedCommond); - - - @override - String toString() { - return 'SenderCheckingCardStatusCommand{keyID: $keyID, userID: $userID, ' - 'role: $role, cardCount: $cardCount, cardNo: $cardNo, token: $token, ' - 'needAuthor: $needAuthor, publicKey: $publicKey, privateKey: $privateKey}'; - } - - @override - List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 子命令类型 - data.add(20); - - // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; - subData.addAll(utf8.encode(keyID!)); - subData = getFixedLengthList(subData, 40 - keyIDLength); - - //userID 20 - int userIDLength = utf8.encode(userID!).length; - subData.addAll(utf8.encode(userID!)); - subData = getFixedLengthList(subData, 20 - userIDLength); - - // role - subData.add(role!); - - // CardCount - subData.add(cardCount!); - - // CardNo - subData.add(cardNo!); - - if(needAuthor == 0){ - //AuthCodeLen 1 - subData.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(userID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - subData.add(authCode.bytes.length); - subData.addAll(authCode.bytes); - } - - data.add(subData.length); - data.addAll(subData); - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class SenderCheckingCardStatusReply extends Reply { - SenderCheckingCardStatusReply.parseData(CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - } -} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_checkingUserInfoCount.dart b/lib/blue/io_protocol/io_checkingUserInfoCount.dart deleted file mode 100755 index 6d229b46..00000000 --- a/lib/blue/io_protocol/io_checkingUserInfoCount.dart +++ /dev/null @@ -1,129 +0,0 @@ - -//TODO:查询用户、指纹、密码、卡片数量(用于判断是否同步) -import 'dart:convert'; - -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_tool/io_tool.dart'; -import '../io_type.dart'; -import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; - -class SenderCheckingUserInfoCountCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? role; - int? nowTime; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - - SenderCheckingUserInfoCountCommand({ - this.keyID, - this.userID, - this.role, - this.nowTime, - this.token, - this.needAuthor, - this.publicKey, - this.privateKey, - }) : super(CommandType.generalExtendedCommond); - - - @override - String toString() { - return 'SenderCheckingUserInfoCountCommand{keyID: $keyID, userID: $userID,' - ' role: $role, nowTime: $nowTime, token: $token, ' - 'needAuthor: $needAuthor, publicKey: $publicKey, privateKey: $privateKey}'; - } - - @override - List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 子命令类型 - data.add(15); - - // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; - subData.addAll(utf8.encode(keyID!)); - subData = getFixedLengthList(subData, 40 - keyIDLength); - - //userID 20 - int userIDLength = utf8.encode(userID!).length; - subData.addAll(utf8.encode(userID!)); - subData = getFixedLengthList(subData, 20 - userIDLength); - - // Role - subData.add(role!); - - // time - subData.add((nowTime! & 0xff000000) >> 24); - subData.add((nowTime! & 0xff0000) >> 16); - subData.add((nowTime! & 0xff00) >> 8); - subData.add((nowTime! & 0xff)); - - // token - // subData.addAll(token!); - - if(needAuthor == 0){ - //AuthCodeLen 1 - subData.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(userID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - subData.add(authCode.bytes.length); - subData.addAll(authCode.bytes); - } - - data.add(subData.length); - data.addAll(subData); - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class SenderCheckingUserInfoCountReply extends Reply { - SenderCheckingUserInfoCountReply.parseData(CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - int status = data[2]; - errorWithStstus(status); - } -} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_cleanUpUsers.dart b/lib/blue/io_protocol/io_cleanUpUsers.dart index 2e8fa383..8394eeab 100755 --- a/lib/blue/io_protocol/io_cleanUpUsers.dart +++ b/lib/blue/io_protocol/io_cleanUpUsers.dart @@ -1,30 +1,16 @@ import 'dart:convert'; import 'dart:typed_data'; -import 'package:get/get.dart'; -import 'package:star_lock/tools/dateTool.dart'; +import 'package:crypto/crypto.dart' as crypto; -import '../../app_settings/app_settings.dart'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; import '../io_reply.dart'; import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; +import '../sm4Encipher/sm4.dart'; //清理用户 class CleanUpUsersCommand extends SenderProtocol { - String? lockID; - String? authUserID; - String? keyID; - String? userID; - - List? userNoList; - List? token; - - int? needAuthor; - List? publicKey; - List? privateKey; CleanUpUsersCommand({ this.lockID, @@ -37,6 +23,17 @@ class CleanUpUsersCommand extends SenderProtocol { this.userNoList, this.token, }) : super(CommandType.cleanUpUsers); + String? lockID; + String? authUserID; + String? keyID; + String? userID; + + List? userNoList; + List? token; + + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -48,40 +45,40 @@ class CleanUpUsersCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //authUserID 20 - int authUserIDLength = utf8.encode(authUserID!).length; + final int authUserIDLength = utf8.encode(authUserID!).length; data.addAll(utf8.encode(authUserID!)); data = getFixedLengthList(data, 20 - authUserIDLength); //KeyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; data.addAll(utf8.encode(keyID!)); data = getFixedLengthList(data, 40 - keyIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); - ByteData indexBytes = ByteData(2); // 创建一个长度为2的字节数据 + final ByteData indexBytes = ByteData(2); // 创建一个长度为2的字节数据 indexBytes.setInt16(0, userNoList!.length); - List indexList = indexBytes.buffer.asUint8List(); + final List indexList = indexBytes.buffer.asUint8List(); data.addAll(indexList); data.addAll(userNoList!); @@ -93,7 +90,7 @@ class CleanUpUsersCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(authUserID!)); @@ -107,14 +104,14 @@ class CleanUpUsersCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_configuringWifi.dart b/lib/blue/io_protocol/io_configuringWifi.dart index a66d61f4..99ac0e29 100755 --- a/lib/blue/io_protocol/io_configuringWifi.dart +++ b/lib/blue/io_protocol/io_configuringWifi.dart @@ -1,29 +1,17 @@ -//TODO:WIFI配网 +// WIFI配网 import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; class SenderConfiguringWifiCommand extends SenderProtocol { - String? keyID; - String? userID; - String? ssid; - String? password; - int? numberOfServers; - List? listOfServers; - int? numberOfPhone; - List? listOfPhone; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - SenderConfiguringWifiCommand({ this.keyID, this.userID, @@ -39,6 +27,19 @@ class SenderConfiguringWifiCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + String? ssid; + String? password; + int? numberOfServers; + List? listOfServers; + int? numberOfPhone; + List? listOfPhone; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; + @override String toString() { @@ -51,15 +52,15 @@ class SenderConfiguringWifiCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -67,22 +68,22 @@ class SenderConfiguringWifiCommand extends SenderProtocol { data.add(50); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); //SSID 30 - int ssidLength = utf8.encode(ssid!).length; + final int ssidLength = utf8.encode(ssid!).length; subData.addAll(utf8.encode(ssid!)); subData = getFixedLengthList(subData, 30 - ssidLength); //Password 20 - int passwordLength = utf8.encode(password!).length; + final int passwordLength = utf8.encode(password!).length; subData.addAll(utf8.encode(password!)); subData = getFixedLengthList(subData, 20 - passwordLength); @@ -96,8 +97,8 @@ class SenderConfiguringWifiCommand extends SenderProtocol { subData.add(numberOfPhone!); // listOfPhone - listOfPhone!.forEach((element) { - int phoneLength = utf8.encode(element).length; + listOfPhone!.forEach((String element) { + final int phoneLength = utf8.encode(element).length; subData.addAll(utf8.encode(element)); subData = getFixedLengthList(subData, 20 - phoneLength); }); @@ -109,7 +110,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //userID authCodeData.addAll(utf8.encode(userID!)); @@ -123,7 +124,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -133,7 +134,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -150,7 +151,7 @@ class SenderConfiguringWifiReply extends Reply { SenderConfiguringWifiReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[5]; + final int status = data[5]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_deletUser.dart b/lib/blue/io_protocol/io_deletUser.dart index 21beb7e6..3db8226e 100755 --- a/lib/blue/io_protocol/io_deletUser.dart +++ b/lib/blue/io_protocol/io_deletUser.dart @@ -1,24 +1,16 @@ -//TODO:添加用户 +// 添加用户 import 'dart:convert'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -class DeletUserCommand extends SenderProtocol { +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; +import '../sm4Encipher/sm4.dart'; - String? lockID; - String? authUserID; - String? keyID; - String? delUserID; - int? needAuthor; - List? publicKey; - List? privateKey; - List? token; +class DeletUserCommand extends SenderProtocol { DeletUserCommand({ this.lockID, this.authUserID, @@ -30,6 +22,14 @@ class DeletUserCommand extends SenderProtocol { this.token }) : super(CommandType.deletUser); + String? lockID; + String? authUserID; + String? keyID; + String? delUserID; + int? needAuthor; + List? publicKey; + List? privateKey; + List? token; @override String toString() { @@ -40,34 +40,34 @@ class DeletUserCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //authUserID 20 - int authUserIDLength = utf8.encode(authUserID!).length; + final int authUserIDLength = utf8.encode(authUserID!).length; data.addAll(utf8.encode(authUserID!)); data = getFixedLengthList(data, 20 - authUserIDLength); //KeyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; data.addAll(utf8.encode(keyID!)); data = getFixedLengthList(data, 40 - keyIDLength); //delUserID 20 - int delUserIDLength = utf8.encode(delUserID!).length; + final int delUserIDLength = utf8.encode(delUserID!).length; data.addAll(utf8.encode(delUserID!)); data = getFixedLengthList(data, 20 - delUserIDLength); @@ -78,7 +78,7 @@ class DeletUserCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(authUserID!)); @@ -92,14 +92,14 @@ class DeletUserCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -116,7 +116,7 @@ class DeletUserReply extends Reply { DeletUserReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[6]; + final int status = data[6]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_editUser.dart b/lib/blue/io_protocol/io_editUser.dart index 97c3361e..dbf24ba7 100755 --- a/lib/blue/io_protocol/io_editUser.dart +++ b/lib/blue/io_protocol/io_editUser.dart @@ -1,33 +1,18 @@ -//TODO:修改用户 +// 修改用户 import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; import 'package:star_lock/tools/dateTool.dart'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; import '../io_reply.dart'; import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; +import '../sm4Encipher/sm4.dart'; class EditUserCommand extends SenderProtocol { - - String? lockID; - String? authUserID; - String? keyID; - String? userID; - int? openMode; - int? keyType; - int? startDate; - int? expireDate; - int? role; - String? password; - int? needAuthor; - List? publicKey; - List? privateKey; - List? token; EditUserCommand({ this.lockID, this.authUserID, @@ -45,6 +30,20 @@ class EditUserCommand extends SenderProtocol { this.token }) : super(CommandType.editUser); + String? lockID; + String? authUserID; + String? keyID; + String? userID; + int? openMode; + int? keyType; + int? startDate; + int? expireDate; + int? role; + String? password; + int? needAuthor; + List? publicKey; + List? privateKey; + List? token; @override String toString() { @@ -60,34 +59,34 @@ class EditUserCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //authUserID 20 - int authUserIDLength = utf8.encode(authUserID!).length; + final int authUserIDLength = utf8.encode(authUserID!).length; data.addAll(utf8.encode(authUserID!)); data = getFixedLengthList(data, 20 - authUserIDLength); //KeyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; data.addAll(utf8.encode(keyID!)); data = getFixedLengthList(data, 40 - keyIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -110,19 +109,19 @@ class EditUserCommand extends SenderProtocol { data.add((d1! & 0xff000000) >> 24); data.add((d1 & 0xff0000) >> 16); data.add((d1 & 0xff00) >> 8); - data.add((d1 & 0xff)); + data.add(d1 & 0xff); // expireDate 4 data.add((d2! & 0xff000000) >> 24); data.add((d2 & 0xff0000) >> 16); data.add((d2 & 0xff00) >> 8); - data.add((d2 & 0xff)); + data.add(d2 & 0xff); // role 长度1 用户角色,0:普通用户,1:管理员,0xff:超级管理员 data.add(role!); //password 超级管理员领锁时需验证该密码 20 - int passwordLength = utf8.encode(password!).length; + final int passwordLength = utf8.encode(password!).length; data.addAll(utf8.encode(password!)); data = getFixedLengthList(data, 20 - passwordLength); @@ -133,7 +132,7 @@ class EditUserCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(authUserID!)); @@ -147,14 +146,14 @@ class EditUserCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } diff --git a/lib/blue/io_protocol/io_factoryDataReset.dart b/lib/blue/io_protocol/io_factoryDataReset.dart index a2108cf8..cf495bbf 100755 --- a/lib/blue/io_protocol/io_factoryDataReset.dart +++ b/lib/blue/io_protocol/io_factoryDataReset.dart @@ -1,5 +1,5 @@ -//TODO:恢复出厂设置 +// 恢复出厂设置 import 'dart:convert'; import 'package:crypto/crypto.dart' as crypto; @@ -11,14 +11,6 @@ import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; class FactoryDataResetCommand extends SenderProtocol { - - String? lockID; - String? userID; - String? keyID; - List? publicKey; - List? privateKey; - List? token; - int? needAuthor; FactoryDataResetCommand({ this.lockID, this.userID, @@ -29,6 +21,13 @@ class FactoryDataResetCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.factoryDataReset); + String? lockID; + String? userID; + String? keyID; + List? publicKey; + List? privateKey; + List? token; + int? needAuthor; @override String toString() { @@ -39,24 +38,24 @@ class FactoryDataResetCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -67,7 +66,7 @@ class FactoryDataResetCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //userID authCodeData.addAll(utf8.encode(lockID!)); @@ -78,14 +77,14 @@ class FactoryDataResetCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -102,7 +101,7 @@ class FactoryDataResetReply extends Reply { FactoryDataResetReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[6]; + final int status = data[6]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_getLockStatu.dart b/lib/blue/io_protocol/io_getLockStatu.dart deleted file mode 100755 index cbea6f1e..00000000 --- a/lib/blue/io_protocol/io_getLockStatu.dart +++ /dev/null @@ -1,117 +0,0 @@ - -///TODO:获取锁状态 -/// 弃用 -// import 'dart:convert'; -// -// import '../io_tool/io_tool.dart'; -// import '../sm4Encipher/sm4.dart'; -// import '../io_reply.dart'; -// import '../io_sender.dart'; -// import '../io_type.dart'; -// -// class GetLockStatuCommand extends SenderProtocol { -// -// String? lockID; -// String? userID; -// List? privateKey; -// GetLockStatuCommand({ -// this.lockID, -// this.userID, -// this.privateKey -// }) : super(CommandType.readLockStatusInfo); -// -// @override -// List messageDetail() { -// List data = []; -// List ebcData = []; -// -// // 指令类型 -// int type = commandType!.typeValue; -// double typeDouble = type / 256; -// int type1 = typeDouble.toInt(); -// int type2 = type % 256; -// data.add(type1); -// data.add(type2); -// -// // 锁id 40 -// int lockIDLength = utf8.encode(lockID!).length; -// data.addAll(utf8.encode(lockID!)); -// data = getFixedLengthList(data, 40 - lockIDLength); -// -// //userID 要接受钥匙的用户的useid 20 -// int userIDLength = utf8.encode(userID!).length; -// data.addAll(utf8.encode(userID!)); -// data = getFixedLengthList(data, 20 - userIDLength); -// -// if ((data.length % 16) != 0) { -// int add = (16 - data.length % 16); -// for (int i = 0; i < add; i++) { -// data.add(0); -// } -// } -// // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 -// ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); -// return ebcData; -// } -// } -// -// class GetLockStatuReply extends Reply { -// GetLockStatuReply.parseData(CommandType commandType, List dataDetail) -// : super.parseData(commandType, dataDetail) { -// data = dataDetail; -// -// int status = data[2]; -// errorWithStstus(status); -// switch(status){ -// case 0x00: -// //成功 -// var softVersion = data.sublist(3, 7); -// -// var power = data[7]; -// -// // APP 用户数量 -// var appUserCount = data.sublist(50, 53); -// -// // 黑名单用户数量 -// var blacklistCount = data[53]; -// -// // 蓝牙钥匙数量 -// var bleKeyCount = data[54]; -// -// // 剩余可添加用户数量 -// var remainCount = data.sublist(54, 56); -// -// // 未上传开锁记录数量 -// var notUploadCount = data.sublist(56, 58); -// -// // 已设置开门密码数量 -// var pwdCount = data[58]; -// -// // 已设置开门指纹数量 -// var fingerprintCount = data[59]; -// -// // 锁当前时间 -// var lockTime = data.sublist(60, 64); -// -// // 硬件版本信息,为固件升级提供判断依据 -// var hardVersion = data.sublist(64, 68); -// break; -// case 0x06: -// //无权限 -// -// break; -// case 0x07: -// //无权限 -// -// break; -// case 0x09: -// // 权限校验错误 -// -// break; -// default: -// //失败 -// -// break; -// } -// } -// } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_getPrivateKey.dart b/lib/blue/io_protocol/io_getPrivateKey.dart index 29fde17a..757eb96e 100755 --- a/lib/blue/io_protocol/io_getPrivateKey.dart +++ b/lib/blue/io_protocol/io_getPrivateKey.dart @@ -11,16 +11,9 @@ import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -List publicKeyDataList = []; +List publicKeyDataList = []; class GetPrivateKeyCommand extends SenderProtocol { - String? lockID; - String? keyID; // 钥匙ID - String? authUserID; // 钥匙授权人ID - int? nowTime; - int? needAuthor; - List? publicKeyData; - GetPrivateKeyCommand( {this.lockID, this.keyID, @@ -29,6 +22,12 @@ class GetPrivateKeyCommand extends SenderProtocol { this.needAuthor, this.publicKeyData}) : super(CommandType.getLockPrivateKey); + String? lockID; + String? keyID; // 钥匙ID + String? authUserID; // 钥匙授权人ID + int? nowTime; + int? needAuthor; + List? publicKeyData; @override String toString() { @@ -40,8 +39,8 @@ class GetPrivateKeyCommand extends SenderProtocol { @override List messageDetail() { publicKeyDataList = publicKeyData!; - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 final int type = commandType!.typeValue; @@ -67,9 +66,6 @@ class GetPrivateKeyCommand extends SenderProtocol { data = getFixedLengthList(data, 20 - authUserIDLength); //NowTime 4 - // DateTime now = DateTime.now(); - // int timestamp = now.millisecondsSinceEpoch; - // var d1 = 0x11223344; data.add((nowTime! & 0xff000000) >> 24); data.add((nowTime! & 0xff0000) >> 16); data.add((nowTime! & 0xff00) >> 8); @@ -78,7 +74,7 @@ class GetPrivateKeyCommand extends SenderProtocol { if (needAuthor == 0) { data.add(0); } else { - final List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(authUserID!)); @@ -87,9 +83,6 @@ class GetPrivateKeyCommand extends SenderProtocol { authCodeData.addAll(utf8.encode(keyID!)); //NowTime 4 - // DateTime now = DateTime.now(); - // int timestamp = now.millisecondsSinceEpoch; - // var d1 = 0x11223344; authCodeData.add((nowTime! & 0xff000000) >> 24); authCodeData.add((nowTime! & 0xff0000) >> 16); authCodeData.add((nowTime! & 0xff00) >> 8); @@ -98,7 +91,7 @@ class GetPrivateKeyCommand extends SenderProtocol { authCodeData.addAll(publicKeyData!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - final authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); diff --git a/lib/blue/io_protocol/io_getWifiList.dart b/lib/blue/io_protocol/io_getWifiList.dart index 74fe1e0f..b01c9251 100755 --- a/lib/blue/io_protocol/io_getWifiList.dart +++ b/lib/blue/io_protocol/io_getWifiList.dart @@ -10,14 +10,6 @@ import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; class SenderGetWifiCommand extends SenderProtocol { - - String? keyID; - String? userID; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - SenderGetWifiCommand({ this.keyID, this.userID, @@ -27,6 +19,12 @@ class SenderGetWifiCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -37,15 +35,15 @@ class SenderGetWifiCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -53,23 +51,19 @@ class SenderGetWifiCommand extends SenderProtocol { data.add(53); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); - // token - // subData.addAll(token!); - if(needAuthor == 0){ - //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //userID authCodeData.addAll(utf8.encode(userID!)); @@ -83,7 +77,7 @@ class SenderGetWifiCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -93,7 +87,7 @@ class SenderGetWifiCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -110,7 +104,7 @@ class SenderGetWifiReply extends Reply { SenderGetWifiReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_openLock.dart b/lib/blue/io_protocol/io_openLock.dart index a0e89e70..22d914da 100755 --- a/lib/blue/io_protocol/io_openLock.dart +++ b/lib/blue/io_protocol/io_openLock.dart @@ -10,17 +10,8 @@ import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -//TODO:开门 +// 开门 class OpenLockCommand extends SenderProtocol { - String? lockID; - String? userID; - int? openMode; - int? openTime; - String? onlineToken; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; OpenLockCommand({ this.lockID, this.userID, @@ -32,6 +23,15 @@ class OpenLockCommand extends SenderProtocol { this.signKey, this.privateKey }) : super(CommandType.openLock); + String? lockID; + String? userID; + int? openMode; + int? openTime; + String? onlineToken; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; @override @@ -44,8 +44,8 @@ class OpenLockCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 final int type = commandType!.typeValue; @@ -84,7 +84,7 @@ class OpenLockCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - final List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -97,7 +97,7 @@ class OpenLockCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - final authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); diff --git a/lib/blue/io_protocol/io_otaUpgrade.dart b/lib/blue/io_protocol/io_otaUpgrade.dart index e8341347..deaccf8d 100755 --- a/lib/blue/io_protocol/io_otaUpgrade.dart +++ b/lib/blue/io_protocol/io_otaUpgrade.dart @@ -1,32 +1,17 @@ + import 'dart:convert'; import 'dart:typed_data'; -import 'package:get/get.dart'; +import 'package:crypto/crypto.dart' as crypto; -import '../../app_settings/app_settings.dart'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; import '../io_reply.dart'; import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; +import '../sm4Encipher/sm4.dart'; //oat升级 class OTAUpgradeCommand extends SenderProtocol { - String? lockID; - String? userID; - String? keyID; - int? platform; - int? product; - String? hwVersion; - String? fwVersion; - int? fwSize; - String? fwMD5; - int? needAuthor; - List? signKey; - List? privateKey; - List? token; - bool encrypt; OTAUpgradeCommand( {this.lockID, @@ -44,6 +29,20 @@ class OTAUpgradeCommand extends SenderProtocol { this.token, this.encrypt = true}) : super(CommandType.startOATUpgrade); + String? lockID; + String? userID; + String? keyID; + int? platform; + int? product; + String? hwVersion; + String? fwVersion; + int? fwSize; + String? fwMD5; + int? needAuthor; + List? signKey; + List? privateKey; + List? token; + bool encrypt; @override String toString() { @@ -93,10 +92,6 @@ class OTAUpgradeCommand extends SenderProtocol { data.add(platform1); //product 2 - // int product0 = (product! & 0xFF00) >> 8; - // int product1 = product! & 0xFF; - // data.add(product0); - // data.add(product1); data.addAll([0, 1]); //先默认是 01 //HwVersion 20 @@ -170,8 +165,6 @@ class OTAUpgradeCommand extends SenderProtocol { } class OTAUpgradeReply extends Reply { - List token = []; - OTAUpgradeReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; @@ -179,4 +172,5 @@ class OTAUpgradeReply extends Reply { status = data[6]; errorWithStstus(status); } + List token = []; } diff --git a/lib/blue/io_protocol/io_processOtaUpgrade.dart b/lib/blue/io_protocol/io_processOtaUpgrade.dart index ded7091a..8bfa74fc 100755 --- a/lib/blue/io_protocol/io_processOtaUpgrade.dart +++ b/lib/blue/io_protocol/io_processOtaUpgrade.dart @@ -1,26 +1,20 @@ -import 'dart:convert'; import 'dart:typed_data'; -import 'package:get/get.dart'; - -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; import '../io_reply.dart'; import '../io_sender.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; //oat升级 class ProcessOtaUpgradeCommand extends SenderProtocol { - int? index; - int? size; - List? data; ProcessOtaUpgradeCommand({ this.index, this.size, this.data, }) : super(CommandType.processOTAUpgrade); + int? index; + int? size; + List? data; @override @@ -30,26 +24,26 @@ class ProcessOtaUpgradeCommand extends SenderProtocol { @override List messageDetail() { - List data = []; + final List data = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); //index 2 - ByteData indexBytes = ByteData(2); // 创建一个长度为4的字节数据 + final ByteData indexBytes = ByteData(2); // 创建一个长度为4的字节数据 indexBytes.setInt16(0, index!); - List indexList = indexBytes.buffer.asUint8List(); + final List indexList = indexBytes.buffer.asUint8List(); data.addAll(indexList); //size 2 - ByteData bytes = ByteData(2); // 创建一个长度为4的字节数据 + final ByteData bytes = ByteData(2); // 创建一个长度为4的字节数据 bytes.setInt16(0, size!); - List byteList = bytes.buffer.asUint8List(); + final List byteList = bytes.buffer.asUint8List(); data.addAll(byteList); data.addAll(this.data!); diff --git a/lib/blue/io_protocol/io_queryingFaceStatus.dart b/lib/blue/io_protocol/io_queryingFaceStatus.dart deleted file mode 100755 index fe2b24eb..00000000 --- a/lib/blue/io_protocol/io_queryingFaceStatus.dart +++ /dev/null @@ -1,127 +0,0 @@ -//TODO:查询人脸状态 -import 'dart:convert'; - - -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_tool/io_tool.dart'; -import '../io_type.dart'; -import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; - -class SenderQueryingFaceStatusCommand extends SenderProtocol { - String? keyID; - String? userID; - int? role; - int? faceCount; - int? faceNo; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - - SenderQueryingFaceStatusCommand({ - this.keyID, - this.userID, - this.role, - this.faceCount, - this.faceNo, - this.token, - this.needAuthor, - this.publicKey, - this.privateKey, - }) : super(CommandType.generalExtendedCommond); - - - @override - String toString() { - return 'SenderQueryingFaceStatusCommand{keyID: $keyID, userID: $userID, ' - 'role: $role, faceCount: $faceCount, faceNo: $faceNo, token: $token, ' - 'needAuthor: $needAuthor, publicKey: $publicKey, privateKey: $privateKey}'; - } - - @override - List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 子命令类型--查询人脸状态 - data.add(80); - - // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; - subData.addAll(utf8.encode(keyID!)); - subData = getFixedLengthList(subData, 40 - keyIDLength); - - //userID 20 - int userIDLength = utf8.encode(userID!).length; - subData.addAll(utf8.encode(userID!)); - subData = getFixedLengthList(subData, 20 - userIDLength); - - // role - subData.add(role!); - - // fingerCount - subData.add(faceCount!); - - // FingerNo - subData.add(faceNo!); - - if (needAuthor == 0) { - //AuthCodeLen 1 - subData.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(userID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - subData.add(authCode.bytes.length); - subData.addAll(authCode.bytes); - } - - data.add(subData.length); - data.addAll(subData); - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class SenderQueryingFaceStatusReply extends Reply { - SenderQueryingFaceStatusReply.parseData( - CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - int status = data[2]; - errorWithStstus(status); - } -} diff --git a/lib/blue/io_protocol/io_queryingFingerprintStatus.dart b/lib/blue/io_protocol/io_queryingFingerprintStatus.dart deleted file mode 100755 index 8e9f546c..00000000 --- a/lib/blue/io_protocol/io_queryingFingerprintStatus.dart +++ /dev/null @@ -1,129 +0,0 @@ - -//TODO:查询指纹状态 -import 'dart:convert'; - -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_tool/io_tool.dart'; -import '../io_type.dart'; -import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; - -class SenderQueryingFingerprintStatusCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? role; - int? fingerCount; - int? fingerNo; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - - SenderQueryingFingerprintStatusCommand({ - this.keyID, - this.userID, - this.role, - this.fingerCount, - this.fingerNo, - this.token, - this.needAuthor, - this.publicKey, - this.privateKey, - }) : super(CommandType.generalExtendedCommond); - - - @override - String toString() { - return 'SenderQueryingFingerprintStatusCommand{keyID: $keyID, ' - 'userID: $userID, role: $role, fingerCount: $fingerCount, ' - 'fingerNo: $fingerNo, token: $token, needAuthor: $needAuthor, ' - 'publicKey: $publicKey, privateKey: $privateKey}'; - } - - @override - List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 子命令类型 - data.add(30); - - // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; - subData.addAll(utf8.encode(keyID!)); - subData = getFixedLengthList(subData, 40 - keyIDLength); - - //userID 20 - int userIDLength = utf8.encode(userID!).length; - subData.addAll(utf8.encode(userID!)); - subData = getFixedLengthList(subData, 20 - userIDLength); - - // role - subData.add(role!); - - // fingerCount - subData.add(fingerCount!); - - // FingerNo - subData.add(fingerNo!); - - if(needAuthor == 0){ - //AuthCodeLen 1 - subData.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(userID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - subData.add(authCode.bytes.length); - subData.addAll(authCode.bytes); - } - - data.add(subData.length); - data.addAll(subData); - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class SenderQueryingFingerprintStatusReply extends Reply { - SenderQueryingFingerprintStatusReply.parseData(CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - int status = data[2]; - errorWithStstus(status); - } -} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_readAdminPassword.dart b/lib/blue/io_protocol/io_readAdminPassword.dart index 5c020815..62560323 100755 --- a/lib/blue/io_protocol/io_readAdminPassword.dart +++ b/lib/blue/io_protocol/io_readAdminPassword.dart @@ -8,19 +8,8 @@ import '../io_sender.dart'; import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -///TODO:读取管理员密码 +/// 读取管理员密码 class SenderReadAdminPasswordCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? role; - int? pwdNum; - int? pwdNo; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - SenderReadAdminPasswordCommand({ this.keyID, this.userID, @@ -33,6 +22,15 @@ class SenderReadAdminPasswordCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? role; + int? pwdNum; + int? pwdNo; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -44,15 +42,15 @@ class SenderReadAdminPasswordCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -60,12 +58,12 @@ class SenderReadAdminPasswordCommand extends SenderProtocol { data.add(74); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -82,7 +80,7 @@ class SenderReadAdminPasswordCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(userID!)); @@ -96,7 +94,7 @@ class SenderReadAdminPasswordCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -106,7 +104,7 @@ class SenderReadAdminPasswordCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -124,7 +122,7 @@ class SenderReadAdminPasswordReply extends Reply { : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_readSupportFunctionsNoParameters.dart b/lib/blue/io_protocol/io_readSupportFunctionsNoParameters.dart index cadd430e..bf50ca47 100755 --- a/lib/blue/io_protocol/io_readSupportFunctionsNoParameters.dart +++ b/lib/blue/io_protocol/io_readSupportFunctionsNoParameters.dart @@ -1,28 +1,16 @@ import 'dart:convert'; -import 'package:get/get.dart'; +import 'package:crypto/crypto.dart' as crypto; -import '../../app_settings/app_settings.dart'; import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - import '../sm4Encipher/sm4.dart'; -///TODO:读取支持功能(不带参数)启用/禁用 +/// 读取支持功能(不带参数)启用/禁用 class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? featureBit; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - ReadSupportFunctionsNoParametersCommand({ this.keyID, this.userID, @@ -33,6 +21,13 @@ class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? featureBit; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -44,15 +39,15 @@ class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -60,12 +55,12 @@ class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { data.add(71); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -76,7 +71,7 @@ class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(userID!)); @@ -90,7 +85,7 @@ class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -100,7 +95,7 @@ class ReadSupportFunctionsNoParametersCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -117,7 +112,7 @@ class ReadSupportFunctionsNoParametersReply extends Reply { ReadSupportFunctionsNoParametersReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_readSupportFunctionsWithParameters.dart b/lib/blue/io_protocol/io_readSupportFunctionsWithParameters.dart index 56006e4d..3ed378e4 100755 --- a/lib/blue/io_protocol/io_readSupportFunctionsWithParameters.dart +++ b/lib/blue/io_protocol/io_readSupportFunctionsWithParameters.dart @@ -12,17 +12,8 @@ import 'package:crypto/crypto.dart' as crypto; import '../sm4Encipher/sm4.dart'; -///TODO:读取支持功能(带参数)启用/禁用 +// 读取支持功能(带参数)启用/禁用 class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? featureBit; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - ReadSupportFunctionsWithParametersCommand({ this.keyID, this.userID, @@ -33,6 +24,13 @@ class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? featureBit; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -44,15 +42,15 @@ class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -60,12 +58,12 @@ class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { data.add(73); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -76,7 +74,7 @@ class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(userID!)); @@ -90,7 +88,7 @@ class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -100,7 +98,7 @@ class ReadSupportFunctionsWithParametersCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -117,7 +115,7 @@ class ReadSupportFunctionsWithParametersReply extends Reply { ReadSupportFunctionsWithParametersReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_referEventRecordNumber.dart b/lib/blue/io_protocol/io_referEventRecordNumber.dart deleted file mode 100755 index 812f5d6b..00000000 --- a/lib/blue/io_protocol/io_referEventRecordNumber.dart +++ /dev/null @@ -1,127 +0,0 @@ - -//TODO:查询事件记录(序号、数量查询) -import 'dart:convert'; - -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_tool/io_tool.dart'; -import '../io_type.dart'; -import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; - -class SenderReferEventRecordNumberCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? logsCount; - int? logsNo; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - - SenderReferEventRecordNumberCommand({ - this.keyID, - this.userID, - this.logsCount, - this.logsNo, - this.token, - this.needAuthor, - this.publicKey, - this.privateKey, - }) : super(CommandType.generalExtendedCommond); - - - @override - String toString() { - return 'SenderReferEventRecordNumberCommand{keyID: $keyID, ' - 'userID: $userID, logsCount: $logsCount, logsNo: $logsNo, ' - 'token: $token, needAuthor: $needAuthor, publicKey: $publicKey, ' - 'privateKey: $privateKey}'; - } - - @override - List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 子命令类型 - data.add(40); - - // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; - subData.addAll(utf8.encode(keyID!)); - subData = getFixedLengthList(subData, 40 - keyIDLength); - - //userID 20 - int userIDLength = utf8.encode(userID!).length; - subData.addAll(utf8.encode(userID!)); - subData = getFixedLengthList(subData, 20 - userIDLength); - - // logsCount - subData.add(logsCount!); - - // logsNo - subData.add(logsNo!); - - // token - // subData.addAll(token!); - - if(needAuthor == 0){ - //AuthCodeLen 1 - subData.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(userID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - subData.add(authCode.bytes.length); - subData.addAll(authCode.bytes); - } - - data.add(subData.length); - data.addAll(subData); - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class SenderReferEventRecordNumberReply extends Reply { - SenderReferEventRecordNumberReply.parseData(CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - int status = data[2]; - errorWithStstus(status); - } -} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_referEventRecordTime.dart b/lib/blue/io_protocol/io_referEventRecordTime.dart index 304b433d..e96cbbce 100755 --- a/lib/blue/io_protocol/io_referEventRecordTime.dart +++ b/lib/blue/io_protocol/io_referEventRecordTime.dart @@ -1,6 +1,8 @@ -//TODO:查询事件记录(时间查询) + +// 查询事件记录(时间查询) import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; import 'package:star_lock/tools/dateTool.dart'; import '../io_reply.dart'; @@ -8,7 +10,6 @@ import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; -import 'package:crypto/crypto.dart' as crypto; class SenderReferEventRecordTimeCommand extends SenderProtocol { @@ -43,9 +44,9 @@ class SenderReferEventRecordTimeCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 // int type = commandType!.typeValue; @@ -60,12 +61,12 @@ class SenderReferEventRecordTimeCommand extends SenderProtocol { data.add(41); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -91,7 +92,7 @@ class SenderReferEventRecordTimeCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(userID!)); @@ -105,7 +106,7 @@ class SenderReferEventRecordTimeCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -115,7 +116,7 @@ class SenderReferEventRecordTimeCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = 16 - data.length % 16; + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -132,7 +133,7 @@ class SenderReferEventRecordTimeReply extends Reply { CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_senderCustomPasswords.dart b/lib/blue/io_protocol/io_senderCustomPasswords.dart index 9e0bb8f9..c0a7fbf0 100755 --- a/lib/blue/io_protocol/io_senderCustomPasswords.dart +++ b/lib/blue/io_protocol/io_senderCustomPasswords.dart @@ -1,34 +1,20 @@ import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; import 'package:star_lock/tools/dateTool.dart'; import '../../app_settings/app_settings.dart'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; import '../io_reply.dart'; import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; +import '../sm4Encipher/sm4.dart'; -//TODO:设置开锁密码(备注:先添加管理员密码, 管理员满了后就是开锁密码) /* -备注:删除单个密码规则:pwd 设置为 6 个 0,UseCountLimit 设置为 0。删除全部密码规则:pwd 设置为 6 个 0,UseCountLimit 设置为 0,pwdNo 设置为 255,userId 设置为“DeleteAll !@#”,只有门锁管理员才有权限 + 设置开锁密码(备注:先添加管理员密码, 管理员满了后就是开锁密码) 备注:删除单个密码规则:pwd 设置为 6 个 0,UseCountLimit 设置为 0。删除全部密码规则:pwd 设置为 6 个 0,UseCountLimit 设置为 0,pwdNo 设置为 255,userId 设置为“DeleteAll !@#”,只有门锁管理员才有权限 **/ class SenderCustomPasswordsCommand extends SenderProtocol { - String? keyID; - String? userID; - int? pwdNo; - int? operate; - int? isAdmin; - String? pwd; - int? useCountLimit; - List? token; - int? startTime; - int? endTime; - int? needAuthor; - List? signKey; - List? privateKey; SenderCustomPasswordsCommand({ this.keyID, @@ -45,6 +31,19 @@ class SenderCustomPasswordsCommand extends SenderProtocol { this.signKey, this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? pwdNo; + int? operate; + int? isAdmin; + String? pwd; + int? useCountLimit; + List? token; + int? startTime; + int? endTime; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { diff --git a/lib/blue/io_protocol/io_senderResetPasswords.dart b/lib/blue/io_protocol/io_senderResetPasswords.dart index 30de051e..676eff84 100755 --- a/lib/blue/io_protocol/io_senderResetPasswords.dart +++ b/lib/blue/io_protocol/io_senderResetPasswords.dart @@ -1,21 +1,16 @@ import 'dart:convert'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; import 'package:crypto/crypto.dart' as crypto; -//TODO:重置开锁密码(同时重置自定义密码和离线密码,绑定完锁之后第一个管理员密码不重置) +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; +import '../sm4Encipher/sm4.dart'; + +// 重置开锁密码(同时重置自定义密码和离线密码,绑定完锁之后第一个管理员密码不重置) class SenderResetPasswordsCommand extends SenderProtocol { - String? keyID; - String? userID; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; SenderResetPasswordsCommand({ this.keyID, @@ -25,6 +20,12 @@ class SenderResetPasswordsCommand extends SenderProtocol { this.signKey, this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; @override String toString() { @@ -35,9 +36,9 @@ class SenderResetPasswordsCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 data.addAll(intChangList(commandType!.typeValue)); @@ -46,12 +47,12 @@ class SenderResetPasswordsCommand extends SenderProtocol { data.add(19); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -62,7 +63,7 @@ class SenderResetPasswordsCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -76,7 +77,7 @@ class SenderResetPasswordsCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -86,7 +87,7 @@ class SenderResetPasswordsCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -104,7 +105,7 @@ class SenderResetPasswordsReply extends Reply { CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_setSupportFunctionsNoParameters.dart b/lib/blue/io_protocol/io_setSupportFunctionsNoParameters.dart index 67a00718..82a0312d 100755 --- a/lib/blue/io_protocol/io_setSupportFunctionsNoParameters.dart +++ b/lib/blue/io_protocol/io_setSupportFunctionsNoParameters.dart @@ -1,26 +1,17 @@ import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - import '../sm4Encipher/sm4.dart'; -///TODO:设置支持功能(不带参数)启用/禁用 +/// 设置支持功能(不带参数)启用/禁用 class SetSupportFunctionsNoParametersCommand extends SenderProtocol { - String? keyID; - String? userID; - int? featureBit; - int? featureEnable; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - SetSupportFunctionsNoParametersCommand({ this.keyID, this.userID, @@ -32,6 +23,14 @@ class SetSupportFunctionsNoParametersCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? featureBit; + int? featureEnable; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -44,15 +43,15 @@ class SetSupportFunctionsNoParametersCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -60,12 +59,12 @@ class SetSupportFunctionsNoParametersCommand extends SenderProtocol { data.add(70); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -79,7 +78,7 @@ class SetSupportFunctionsNoParametersCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(userID!)); @@ -93,7 +92,7 @@ class SetSupportFunctionsNoParametersCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -103,7 +102,7 @@ class SetSupportFunctionsNoParametersCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -120,7 +119,7 @@ class SetSupportFunctionsNoParametersReply extends Reply { SetSupportFunctionsNoParametersReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_setSupportFunctionsWithParameters.dart b/lib/blue/io_protocol/io_setSupportFunctionsWithParameters.dart index 05e505e8..b34cd868 100755 --- a/lib/blue/io_protocol/io_setSupportFunctionsWithParameters.dart +++ b/lib/blue/io_protocol/io_setSupportFunctionsWithParameters.dart @@ -9,19 +9,8 @@ import 'package:crypto/crypto.dart' as crypto; import '../sm4Encipher/sm4.dart'; -///TODO:设置支持功能(参数) +/// 设置支持功能(参数) class SetSupportFunctionsWithParametersCommand extends SenderProtocol { - - String? keyID; - String? userID; - int? featureBit; - int? featureParaLength; - List? featureData; - List? token; - int? needAuthor; - List? publicKey; - List? privateKey; - SetSupportFunctionsWithParametersCommand({ this.keyID, this.userID, @@ -34,6 +23,15 @@ class SetSupportFunctionsWithParametersCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.generalExtendedCommond); + String? keyID; + String? userID; + int? featureBit; + int? featureParaLength; + List? featureData; + List? token; + int? needAuthor; + List? publicKey; + List? privateKey; @override String toString() { @@ -46,15 +44,15 @@ class SetSupportFunctionsWithParametersCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List subData = []; - List ebcData = []; + final List data = []; + List subData = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); @@ -62,12 +60,12 @@ class SetSupportFunctionsWithParametersCommand extends SenderProtocol { data.add(72); // keyID 40 - int keyIDLength = utf8.encode(keyID!).length; + final int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); subData = getFixedLengthList(subData, 40 - keyIDLength); //userID 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; subData.addAll(utf8.encode(userID!)); subData = getFixedLengthList(subData, 20 - userIDLength); @@ -84,7 +82,7 @@ class SetSupportFunctionsWithParametersCommand extends SenderProtocol { //AuthCodeLen 1 subData.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //authUserID authCodeData.addAll(utf8.encode(userID!)); @@ -98,7 +96,7 @@ class SetSupportFunctionsWithParametersCommand extends SenderProtocol { authCodeData.addAll(publicKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); subData.add(authCode.bytes.length); subData.addAll(authCode.bytes); @@ -108,7 +106,7 @@ class SetSupportFunctionsWithParametersCommand extends SenderProtocol { data.addAll(subData); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -125,7 +123,7 @@ class SetSupportFunctionsWithParametersReply extends Reply { SetSupportFunctionsWithParametersReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_timing.dart b/lib/blue/io_protocol/io_timing.dart index e2764299..9574cc46 100755 --- a/lib/blue/io_protocol/io_timing.dart +++ b/lib/blue/io_protocol/io_timing.dart @@ -3,14 +3,13 @@ import 'dart:convert'; import 'package:star_lock/tools/dateTool.dart'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; import '../io_reply.dart'; import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; +import '../sm4Encipher/sm4.dart'; -//TODO:校时 +// 校时 class TimingCommand extends SenderProtocol { String? lockID; String? userID; @@ -44,32 +43,32 @@ class TimingCommand extends SenderProtocol { List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); //lockID 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); // nowTime 4 - int? d1 = nowTime; + final int? d1 = nowTime; data.add((d1! & 0xff000000) >> 24); data.add((d1 & 0xff0000) >> 16); data.add((d1 & 0xff00) >> 8); - data.add((d1 & 0xff)); + data.add(d1 & 0xff); if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -85,7 +84,7 @@ class TimingReply extends Reply { TimingReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_transferPermissions.dart b/lib/blue/io_protocol/io_transferPermissions.dart deleted file mode 100755 index 5bbffa0f..00000000 --- a/lib/blue/io_protocol/io_transferPermissions.dart +++ /dev/null @@ -1,127 +0,0 @@ - -import 'dart:convert'; - -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; -import '../io_reply.dart'; -import '../io_sender.dart'; -import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - -//TODO:转移权限 -class TransferPermissionsCommand extends SenderProtocol { - - String? lockID; - String? authUserID; - String? keyID; - String? oldUserID; - String? newUserID; - int? needAuthor; - List? publicKey; - List? privateKey; - List? token; - TransferPermissionsCommand({ - this.lockID, - this.authUserID, - this.keyID, - this.oldUserID, - this.newUserID, - this.needAuthor, - this.publicKey, - this.privateKey, - this.token - }) : super(CommandType.transferPermissions); - - - @override - String toString() { - return 'TransferPermissionsCommand{lockID: $lockID, ' - 'authUserID: $authUserID, keyID: $keyID, oldUserID: $oldUserID, ' - 'newUserID: $newUserID, needAuthor: $needAuthor, ' - 'publicKey: $publicKey, privateKey: $privateKey, token: $token}'; - } - - @override - List messageDetail() { - List data = []; - List ebcData = []; - - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; - data.add(type1); - data.add(type2); - - // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; - data.addAll(utf8.encode(lockID!)); - data = getFixedLengthList(data, 40 - lockIDLength); - - //authUserID 20 - int authUserIDLength = utf8.encode(authUserID!).length; - data.addAll(utf8.encode(authUserID!)); - data = getFixedLengthList(data, 20 - authUserIDLength); - - //KeyID 40 - int keyIDLength = utf8.encode(keyID!).length; - data.addAll(utf8.encode(keyID!)); - data = getFixedLengthList(data, 40 - keyIDLength); - - //oldUserID 20 - int oldUserIDLength = utf8.encode(oldUserID!).length; - data.addAll(utf8.encode(oldUserID!)); - data = getFixedLengthList(data, 20 - oldUserIDLength); - - //newUserID 20 - int newUserIDLength = utf8.encode(newUserID!).length; - data.addAll(utf8.encode(newUserID!)); - data = getFixedLengthList(data, 20 - newUserIDLength); - - // token 长度4 首次请求 Token 填 0,如果锁需要鉴权 操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 当token失效或者第一次发送的时候token为0 - data.addAll(token!); - - if(needAuthor == 0){ - //AuthCodeLen 1 - data.add(0); - } else { - List authCodeData = []; - - //authUserID - authCodeData.addAll(utf8.encode(authUserID!)); - - //KeyID - authCodeData.addAll(utf8.encode(keyID!)); - - //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 - authCodeData.addAll(token!); - - authCodeData.addAll(publicKey!); - - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); - - data.add(authCode.bytes.length); - data.addAll(authCode.bytes); - } - - if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); - for (int i = 0; i < add; i++) { - data.add(0); - } - } - - printLog(data); - ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); - return ebcData; - } -} - -class TransferPermissionsReply extends Reply { - TransferPermissionsReply.parseData(CommandType commandType, List dataDetail) - : super.parseData(commandType, dataDetail) { - data = dataDetail; - } -} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_transferSmartLock.dart b/lib/blue/io_protocol/io_transferSmartLock.dart index 2e3960e0..72464de4 100644 --- a/lib/blue/io_protocol/io_transferSmartLock.dart +++ b/lib/blue/io_protocol/io_transferSmartLock.dart @@ -1,5 +1,5 @@ -//TODO:转移智能锁 +// 转移智能锁 import 'dart:convert'; import 'package:crypto/crypto.dart' as crypto; @@ -11,14 +11,6 @@ import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; class TransferSmartLockCommand extends SenderProtocol { - - String? lockID; - String? userID; - String? keyID; - List? publicKey; - List? privateKey; - List? token; - int? needAuthor; TransferSmartLockCommand({ this.lockID, this.userID, @@ -29,6 +21,14 @@ class TransferSmartLockCommand extends SenderProtocol { this.privateKey, }) : super(CommandType.transferSmartLock); + String? lockID; + String? userID; + String? keyID; + List? publicKey; + List? privateKey; + List? token; + int? needAuthor; + @override String toString() { diff --git a/lib/blue/io_protocol/io_updataLockCardList.dart b/lib/blue/io_protocol/io_updataLockCardList.dart index 4f05fb30..8bc090bb 100644 --- a/lib/blue/io_protocol/io_updataLockCardList.dart +++ b/lib/blue/io_protocol/io_updataLockCardList.dart @@ -10,16 +10,6 @@ import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; class UpdataLockCardListCommand extends SenderProtocol { - - String? lockID; - String? keyID; - String? userID; - int? page; - int? countReq; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; UpdataLockCardListCommand({ this.lockID, this.keyID, @@ -32,6 +22,16 @@ class UpdataLockCardListCommand extends SenderProtocol { this.privateKey }) : super(CommandType.updataLockCardList); + String? lockID; + String? keyID; + String? userID; + int? page; + int? countReq; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { return 'UpdataLockCardListCommand{lockID: $lockID, keyID:$keyID userID: $userID, ' @@ -41,24 +41,24 @@ class UpdataLockCardListCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -75,7 +75,7 @@ class UpdataLockCardListCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -88,14 +88,14 @@ class UpdataLockCardListCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -113,7 +113,7 @@ class UpdataLockCardListReply extends Reply { : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_updataLockFaceList.dart b/lib/blue/io_protocol/io_updataLockFaceList.dart index d05003f6..67c13eaa 100644 --- a/lib/blue/io_protocol/io_updataLockFaceList.dart +++ b/lib/blue/io_protocol/io_updataLockFaceList.dart @@ -1,25 +1,15 @@ import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - import '../sm4Encipher/sm4.dart'; class UpdataLockFaceListCommand extends SenderProtocol { - - String? lockID; - String? keyID; - String? userID; - int? page; - int? countReq; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; UpdataLockFaceListCommand({ this.lockID, this.keyID, @@ -32,6 +22,16 @@ class UpdataLockFaceListCommand extends SenderProtocol { this.privateKey }) : super(CommandType.updataLockFaceList); + String? lockID; + String? keyID; + String? userID; + int? page; + int? countReq; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { return 'UpdataLockPasswordListCommand{lockID: $lockID, keyID:$keyID userID: $userID, ' @@ -41,24 +41,24 @@ class UpdataLockFaceListCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -75,7 +75,7 @@ class UpdataLockFaceListCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -88,14 +88,14 @@ class UpdataLockFaceListCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -113,7 +113,7 @@ class UpdataLockFaceListReply extends Reply { : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_updataLockFingerprintList.dart b/lib/blue/io_protocol/io_updataLockFingerprintList.dart index b52835f9..ef656367 100644 --- a/lib/blue/io_protocol/io_updataLockFingerprintList.dart +++ b/lib/blue/io_protocol/io_updataLockFingerprintList.dart @@ -1,25 +1,15 @@ import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - import '../sm4Encipher/sm4.dart'; class UpdataLockFingerprintListCommand extends SenderProtocol { - - String? lockID; - String? keyID; - String? userID; - int? page; - int? countReq; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; UpdataLockFingerprintListCommand({ this.lockID, this.keyID, @@ -32,6 +22,16 @@ class UpdataLockFingerprintListCommand extends SenderProtocol { this.privateKey }) : super(CommandType.updataLockFingerprintList); + String? lockID; + String? keyID; + String? userID; + int? page; + int? countReq; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { return 'UpdataLockPasswordListCommand{lockID: $lockID, keyID:$keyID userID: $userID, ' @@ -41,24 +41,24 @@ class UpdataLockFingerprintListCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -75,7 +75,7 @@ class UpdataLockFingerprintListCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -88,14 +88,14 @@ class UpdataLockFingerprintListCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -113,7 +113,7 @@ class UpdataLockFingerprintListReply extends Reply { : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_updataLockPalmVeinList.dart b/lib/blue/io_protocol/io_updataLockPalmVeinList.dart index 4fe979cd..b0109963 100644 --- a/lib/blue/io_protocol/io_updataLockPalmVeinList.dart +++ b/lib/blue/io_protocol/io_updataLockPalmVeinList.dart @@ -1,24 +1,15 @@ import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - import '../sm4Encipher/sm4.dart'; class UpdataLockPalmVeinListCommand extends SenderProtocol { - - String? lockID; - String? userID; - int? page; - int? countReq; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; UpdataLockPalmVeinListCommand({ this.lockID, this.userID, @@ -30,6 +21,15 @@ class UpdataLockPalmVeinListCommand extends SenderProtocol { this.privateKey }) : super(CommandType.updataLockPalmVeinList); + String? lockID; + String? userID; + int? page; + int? countReq; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { return 'UpdataLockPasswordListCommand{lockID: $lockID, userID: $userID, ' @@ -39,24 +39,24 @@ class UpdataLockPalmVeinListCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -73,7 +73,7 @@ class UpdataLockPalmVeinListCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -86,14 +86,14 @@ class UpdataLockPalmVeinListCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -111,7 +111,7 @@ class UpdataLockPalmVeinListReply extends Reply { : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_updataLockPasswordList.dart b/lib/blue/io_protocol/io_updataLockPasswordList.dart index 0f172347..0eeee8dd 100644 --- a/lib/blue/io_protocol/io_updataLockPasswordList.dart +++ b/lib/blue/io_protocol/io_updataLockPasswordList.dart @@ -10,16 +10,6 @@ import 'package:crypto/crypto.dart' as crypto; import '../sm4Encipher/sm4.dart'; class UpdataLockPasswordListCommand extends SenderProtocol { - - String? lockID; - String? keyID; - String? userID; - int? page; - int? countReq; - List? token; - int? needAuthor; - List? signKey; - List? privateKey; UpdataLockPasswordListCommand({ this.lockID, this.keyID, @@ -32,6 +22,16 @@ class UpdataLockPasswordListCommand extends SenderProtocol { this.privateKey }) : super(CommandType.updataLockPasswordList); + String? lockID; + String? keyID; + String? userID; + int? page; + int? countReq; + List? token; + int? needAuthor; + List? signKey; + List? privateKey; + @override String toString() { return 'UpdataLockPasswordListCommand{lockID: $lockID, keyID:$keyID userID: $userID, ' @@ -41,24 +41,24 @@ class UpdataLockPasswordListCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type / 256; - int type1 = typeDouble.toInt(); - int type2 = type % 256; + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; data.add(type1); data.add(type2); // 锁id 40 - int lockIDLength = utf8.encode(lockID!).length; + final int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); data = getFixedLengthList(data, 40 - lockIDLength); //userID 要接受钥匙的用户的useid 20 - int userIDLength = utf8.encode(userID!).length; + final int userIDLength = utf8.encode(userID!).length; data.addAll(utf8.encode(userID!)); data = getFixedLengthList(data, 20 - userIDLength); @@ -75,7 +75,7 @@ class UpdataLockPasswordListCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -88,14 +88,14 @@ class UpdataLockPasswordListCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - var authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); } if ((data.length % 16) != 0) { - int add = (16 - data.length % 16); + final int add = 16 - data.length % 16; for (int i = 0; i < add; i++) { data.add(0); } @@ -113,7 +113,7 @@ class UpdataLockPasswordListReply extends Reply { : super.parseData(commandType, dataDetail) { data = dataDetail; - int status = data[2]; + final int status = data[2]; errorWithStstus(status); } } \ No newline at end of file diff --git a/lib/blue/io_protocol/io_updataLockRemoteControlList.dart b/lib/blue/io_protocol/io_updataLockRemoteControlList.dart index 00b94ab8..2e1049a7 100644 --- a/lib/blue/io_protocol/io_updataLockRemoteControlList.dart +++ b/lib/blue/io_protocol/io_updataLockRemoteControlList.dart @@ -41,8 +41,8 @@ class UpdataLockRemoteControlListCommand extends SenderProtocol { @override List messageDetail() { - List data = []; - List ebcData = []; + List data = []; + List ebcData = []; // 指令类型 final int type = commandType!.typeValue; @@ -75,7 +75,7 @@ class UpdataLockRemoteControlListCommand extends SenderProtocol { //AuthCodeLen 1 data.add(0); } else { - final List authCodeData = []; + final List authCodeData = []; //KeyID authCodeData.addAll(utf8.encode(lockID!)); @@ -88,7 +88,7 @@ class UpdataLockRemoteControlListCommand extends SenderProtocol { authCodeData.addAll(signKey!); // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - final authCode = crypto.md5.convert(authCodeData); + final crypto.Digest authCode = crypto.md5.convert(authCodeData); data.add(authCode.bytes.length); data.addAll(authCode.bytes); diff --git a/lib/blue/io_reply.dart b/lib/blue/io_reply.dart index adf8c457..be395c47 100755 --- a/lib/blue/io_reply.dart +++ b/lib/blue/io_reply.dart @@ -24,27 +24,27 @@ abstract class Reply{ case 0x01: // 包格式错误 AppLog.log('$logTag ${commandType!.typeName} 0x01 包格式错误'); - showErrorMessage('包格式错误'); + // showErrorMessage('包格式错误'); break; case 0x02: // 密码错误 AppLog.log('$logTag ${commandType!.typeName} 0x02 密码错误'); - showErrorMessage('密码错误'); + showErrorMessage('密码错误'.tr); break; case 0x03: // 网络中断 AppLog.log('$logTag ${commandType!.typeName} 0x03 网络中断'); - showErrorMessage('网络中断'); + showErrorMessage('网络中断'.tr); break; case 0x04: // 用户未登记 AppLog.log('$logTag ${commandType!.typeName} 0x04 用户未登记'); - showErrorMessage('用户未登记'); + // showErrorMessage('用户未登记'); break; case 0x05: // 参数错误 AppLog.log('$logTag ${commandType!.typeName} 0x05 参数错误'); - showErrorMessage('参数错误'); + // showErrorMessage('参数错误'); break; case 0x06: // 需要鉴权 @@ -59,42 +59,42 @@ abstract class Reply{ case 0x08: // 应答超时 AppLog.log('$logTag ${commandType!.typeName} 0x08 应答超时'); - showErrorMessage('应答超时'); + // showErrorMessage('应答超时'); break; case 0x09: // 权限校验错误 AppLog.log('$logTag ${commandType!.typeName} 0x09 权限校验错误'); - showErrorMessage('权限校验错误'); + // showErrorMessage('权限校验错误'); break; case 0x0a: // 钥匙不存在 - showErrorMessage('钥匙不存在'); + showErrorMessage('钥匙不存在'.tr); AppLog.log('$logTag ${commandType!.typeName} 0x0a 钥匙不存在'); break; case 0x0b: // 钥匙过期 - showErrorMessage('钥匙过期'); + showErrorMessage('钥匙过期'.tr); AppLog.log('$logTag ${commandType!.typeName} 0x0b 钥匙过期'); break; case 0x0c: // 钥匙数量已到上限 - showErrorMessage('钥匙数量已到上限'); + // showErrorMessage('钥匙数量已到上限'); AppLog.log('$logTag ${commandType!.typeName} 0x0c 钥匙数量已到上限'); break; case 0x0d: // 钥匙无效 - showErrorMessage('钥匙无效'); + showErrorMessage('钥匙无效'.tr); AppLog.log('$logTag ${commandType!.typeName} 0x0d 钥匙无效'); break; case 0x0e: // 钥匙已存在 - showErrorMessage('钥匙已存在'); + showErrorMessage('钥匙已存在'.tr); AppLog.log('$logTag ${commandType!.typeName} 0x0e 钥匙已存在'); break; case 0x0f: // 用户已存在 AppLog.log('$logTag ${commandType!.typeName} 0x0f 用户已存在'); - showErrorMessage('用户已存在'); + // showErrorMessage('用户已存在'); break; case 0x10: // 密码失效 @@ -104,27 +104,27 @@ abstract class Reply{ case 0x11: // 无效指令 AppLog.log('$logTag ${commandType!.typeName} 0x11 无效指令'); - showErrorMessage('无效指令'); + // showErrorMessage('无效指令'); break; case 0x12: // 门锁时间异常 AppLog.log('$logTag ${commandType!.typeName} 0x12 门锁时间异常'); - showErrorMessage('门锁时间异常'); + showErrorMessage('门锁时间异常'.tr); break; case 0x15: // APP(手机)未联网 AppLog.log('$logTag ${commandType!.typeName} 0x15 APP(手机)未联网'); - showErrorMessage('APP(手机)未联网'); + showErrorMessage('APP(手机)未联网'.tr); break; case 0x16: // 正在开锁中... AppLog.log('$logTag ${commandType!.typeName} $status 正在开锁中...'); - showErrorMessage('正在开锁中...'); + showErrorMessage('正在开锁中...'.tr); break; case 0xff: // 异常,未知错误 AppLog.log('$logTag ${commandType!.typeName} 0xff 异常,未知错误'); - showErrorMessage('异常,未知错误'); + // showErrorMessage('异常,未知错误'); break; default: //失败 diff --git a/lib/blue/io_sender.dart b/lib/blue/io_sender.dart index 5270d56d..cbd1c631 100755 --- a/lib/blue/io_sender.dart +++ b/lib/blue/io_sender.dart @@ -1,37 +1,35 @@ -import 'dart:typed_data'; import 'package:star_lock/app_settings/app_settings.dart'; import 'io_tool/io_manager.dart'; -import 'io_tool/io_tool.dart'; import 'io_type.dart'; abstract class IOData { List messageDetail(); } -abstract class SenderProtocol extends IOData { +abstract class SenderProtocol extends IOData { //数据块 + // final int? tail = 0xFF; //用来校验包的完整性,采用 CRC 校验方法,长度为 2 个字节 + + SenderProtocol(this.commandType) { + _commandIndex = IoManager().commandIndex; + } // var uint8View1 = Uint8List(300); CommandType? commandType; //指令类型 - final List header = [ + final List header = [ 0XEF, 0X01, 0XEE, 0X02 ]; //帧头 固定取值 0XEF01EE02,长度 4 字节 final int ask = 0X01; // 包类型:0X01 表示请求包,0X11 表示应答包,长度 1 字节 - int? _commandIndex = 1; //包序号 + int _commandIndex = 1; //包序号 int identifier = 0x20; // 高 4 位表示包版本,低 4 位用来指示后面数据的加密类型,长度为 1 字节,加密类型取值说明,0:明文,1:AES128,2:SM4(事先约定密钥),3:SM4(设备指定密钥) - List? commandData = []; //数据块 - // final int? tail = 0xFF; //用来校验包的完整性,采用 CRC 校验方法,长度为 2 个字节 - - SenderProtocol(this.commandType) { - _commandIndex = IoManager().commandIndex; - } + List? commandData = []; void printLog(List data) { AppLog.log( @@ -39,10 +37,10 @@ abstract class SenderProtocol extends IOData { ? '子命令:${data[3]}' : ''} \n参数是:\n${toString()} \n加密之前数据是:\n$data 长度是:${data.length}"); } - //TODO:拼装数据 + // 拼装数据 List packageData() { commandData = messageDetail(); - List commandList = []; + final List commandList = []; // 帧头 commandList.addAll(header); @@ -51,24 +49,24 @@ abstract class SenderProtocol extends IOData { commandList.add(ask); //包类型 // 包序号 - int commandIndexChange = _commandIndex!; - double commandIndexChangeDouble = commandIndexChange / 256; - int commandIndexChang1 = commandIndexChangeDouble.toInt(); - int commandIndexChang2 = commandIndexChange % 256; + final int commandIndexChange = _commandIndex; + final double commandIndexChangeDouble = commandIndexChange / 256; + final int commandIndexChang1 = commandIndexChangeDouble.toInt(); + final int commandIndexChang2 = commandIndexChange % 256; commandList.add(commandIndexChang1); commandList.add(commandIndexChang2); // 包标识 // 指令类型 高 4 位表示包版本,低 4 位用来指示后面数据的加密类型,长度为 1 字节,加密类型取值说明,0:明文,1:AES128,2:SM4(事先约定密钥),3:SM4(设备指定密钥) - int value = identifierValue(); + final int value = identifierValue(); commandList.add(value); // 数据长度 - int dataLen = dataSourceLength(); + final int dataLen = dataSourceLength(); // commandList.add(dataLength); // var dataLen = 42; - double dataLength = dataLen / 256; + final double dataLength = dataLen / 256; commandList.add(dataLength.toInt()); commandList.add(dataLen % 256); commandList.add(dataLength.toInt()); @@ -78,10 +76,10 @@ abstract class SenderProtocol extends IOData { commandList.addAll(commandData!); //数据块 // 校验位 - var mcrc = crc_16(commandList); - double mcrcDouble = mcrc / 256; - int mcrcDouble1 = mcrcDouble.toInt(); - int mcrcDouble2 = mcrc % 256; + final int mcrc = crc_16(commandList); + final double mcrcDouble = mcrc / 256; + final int mcrcDouble1 = mcrcDouble.toInt(); + final int mcrcDouble2 = mcrc % 256; commandList.add(mcrcDouble1); //帧尾 commandList.add(mcrcDouble2); return commandList; @@ -91,10 +89,10 @@ abstract class SenderProtocol extends IOData { // 指令类型 高 4 位表示包版本,低 4 位用来指示后面数据的加密类型,长度为 1 字节,加密类型取值说明,0:明文,1:AES128,2:SM4(事先约定密钥),3:SM4(设备指定密钥) int identifierValue() => commandType!.identifierValue; - //TODO:长度 + // 长度 int dataSourceLength() => commandData!.length; - var crcTable = [ + List crcTable = [ 0x0000, 0x1021, 0x2042, @@ -353,11 +351,10 @@ abstract class SenderProtocol extends IOData { 0x1ef0 ]; - int crc_16(buffer) { - var len = buffer.length; - var value_ = 0x0000; //0xa635; //初始值,根据CRC类型设定 - var tmp; - for (var i = 0; i < buffer.length; i++) { + int crc_16(List buffer) { + int value_ = 0x0000; //0xa635; //初始值,根据CRC类型设定 + int tmp; + for (int i = 0; i < buffer.length; i++) { tmp = reverse8(buffer[i]); value_ = ((value_ << 8) ^ crcTable[((value_ >> 8) ^ tmp) & 0xFF]) & 0xFFFF; @@ -366,9 +363,9 @@ abstract class SenderProtocol extends IOData { return value_; } - int reverse8(data) { - var i; - var temp = 0; + int reverse8(int data) { + int i; + int temp = 0; for (i = 0; i < 8; i++) { //字节反转 temp |= ((data >> i) & 0x01) << (7 - i); @@ -376,9 +373,9 @@ abstract class SenderProtocol extends IOData { return temp; } - int reverse16(data) { - var i; - var temp = 0; + int reverse16(int data) { + int i; + int temp = 0; for (i = 0; i < 16; i++) { //反转 temp |= ((data >> i) & 0x0001) << (15 - i); diff --git a/lib/blue/io_tool/io_manager.dart b/lib/blue/io_tool/io_manager.dart index 7b8e51e8..b4d477af 100755 --- a/lib/blue/io_tool/io_manager.dart +++ b/lib/blue/io_tool/io_manager.dart @@ -4,14 +4,14 @@ enum DataTransmissionMode { } class IoManager { + factory IoManager() => share(); + IoManager._init(); static IoManager? _ioManager; - IoManager._init(); static IoManager share(){ _ioManager ??= IoManager._init(); return _ioManager!; } - factory IoManager() => share(); IoManager get manager => share(); //数据传输方式 @@ -23,7 +23,7 @@ class IoManager { ///协议帧序号 int _commandIndex = 1; - configCommandIdx(int idx) => _commandIndex = idx; + int configCommandIdx(int idx) => _commandIndex = idx; Future increaseCommandIndex() async { _commandIndex < 255 ? _commandIndex++ : _commandIndex = 0; } @@ -31,8 +31,8 @@ class IoManager { int get commandIndex => _commandIndex; /// 当前设备连接的lockId - String _currentDeviceLockId = ""; - configCurrentDeviceLockId(String lockId) => _currentDeviceLockId = lockId; + String _currentDeviceLockId = ''; + String configCurrentDeviceLockId(String lockId) => _currentDeviceLockId = lockId; String get getCurrentDeviceLockId => _currentDeviceLockId; void resetAllFlags() { diff --git a/lib/blue/io_tool/io_model.dart b/lib/blue/io_tool/io_model.dart index 018ce49d..0dc79873 100755 --- a/lib/blue/io_tool/io_model.dart +++ b/lib/blue/io_tool/io_model.dart @@ -10,14 +10,6 @@ extension Extension on DataChannel { } class EventSendModel { - List data = []; - String? topic = ''; - DataChannel? sendChannel; - - String? deviceId; - Uuid? serviceId; - Uuid? characteristicId; - bool? allowLongWrite = false; EventSendModel( {required this.data, @@ -27,31 +19,39 @@ class EventSendModel { this.serviceId, this.characteristicId, this.allowLongWrite}); + List data = []; + String? topic = ''; + DataChannel? sendChannel; + + String? deviceId; + Uuid? serviceId; + Uuid? characteristicId; + bool? allowLongWrite = false; } ///接收数据类 class EventReceiveModel { + + EventReceiveModel({required this.data, this.sendChannel, this.tag}); dynamic data; String? tag = ''; DataChannel? sendChannel; - - EventReceiveModel({required this.data, this.sendChannel, this.tag}); } ///解析数据域 class EventParseModel { + + EventParseModel({required this.type, required this.data, this.commandIndex}); int? type; int? commandIndex; dynamic data; - - EventParseModel({required this.type, required this.data, this.commandIndex}); } ///debug info model class StateModel { + + StateModel({this.title = '', this.subTitle = '', this.result = false}); final String title; final String subTitle; final bool result; - - StateModel({this.title = '', this.subTitle = '', this.result = false}); } diff --git a/lib/blue/io_tool/io_tool.dart b/lib/blue/io_tool/io_tool.dart index 698e33d3..7720ad67 100755 --- a/lib/blue/io_tool/io_tool.dart +++ b/lib/blue/io_tool/io_tool.dart @@ -1,3 +1,4 @@ + import 'dart:convert'; import 'dart:typed_data'; @@ -51,7 +52,7 @@ int _hexToInt(String hex) { // a..f val += (hexDigit - 87) * (1 << (4 * (len - 1 - i))); } else { - throw FormatException("Invalid hexadecimal value"); + throw const FormatException('Invalid hexadecimal value'); } } return val; @@ -74,13 +75,13 @@ List getFixedLengthList(List data, int length) { //int ---> 指定长度的hex (如指定长度为6的情况,0x000001 0x001234, 0xefab23) String intToFormatHex(int num, int length) { final String hexString = num.toRadixString(16); - final String formatString = hexString.padLeft(length, "0"); + final String formatString = hexString.padLeft(length, '0'); return formatString; } String uint8ToHex(Uint8List byteArr) { if (byteArr.isEmpty) { - return ""; + return ''; } final Uint8List result = Uint8List(byteArr.length << 1); final List hexTable = [ @@ -113,7 +114,7 @@ String uint8ToHex(Uint8List byteArr) { return String.fromCharCodes(result); //Unicode转回为对应字符,生成字符串返回 } -//TODO:int->两个字节 List 低字节在前,高字节在后(大端存储)=>嵌入式小端接收(协议用到) +// int->两个字节 List 低字节在前,高字节在后(大端存储)=>嵌入式小端接收(协议用到) int byteInt8(List dataDetail, int index) => _toInt8(dataDetail[index]); int _toInt8(int value) { @@ -165,7 +166,7 @@ List intToInt8List(int value) => [value]; List intToByte2ListHigh(int value) => [value, value >> 8]; -//TODO:int->4个字节List 低字节在前,高字节在后(大端存储) 1byte = 8bit +// int->4个字节List 低字节在前,高字节在后(大端存储) 1byte = 8bit List intToByte4ListHigh(int value) => [value, value >> 8, value >> 16, value >> 24]; @@ -217,9 +218,6 @@ int _toUInt32(int value) { } bool checkListIndex(List dataDetail, int index, int offsetLength) { - if (dataDetail == null) { - return true; - } final int len = dataDetail.length; final bool result = index + offsetLength > len; if (result) {} @@ -262,7 +260,7 @@ List> splitList(List list, int len) { return result; } -//TODO:int->两个字节 List 高字节在前,低字节在后(小端存储) 本工程只有配置 WiFi用到的!!!! +// int->两个字节 List 高字节在前,低字节在后(小端存储) 本工程只有配置 WiFi用到的!!!! List intToByte2ListLow(int value) => [value >> 8, value]; String radixHex16String(List codeUnits) { diff --git a/lib/blue/io_tool/manager_event_bus.dart b/lib/blue/io_tool/manager_event_bus.dart index d094cff5..f85b9bc7 100755 --- a/lib/blue/io_tool/manager_event_bus.dart +++ b/lib/blue/io_tool/manager_event_bus.dart @@ -3,19 +3,19 @@ import 'package:event_bus/event_bus.dart'; class EventBusManager { - EventBus? eventBus; - static EventBusManager? _manager; + factory EventBusManager() => shareManager(); EventBusManager._init(){ eventBus = EventBus(sync: false); } + EventBus? eventBus; + + static EventBusManager? _manager; static EventBusManager shareManager(){ _manager ??= EventBusManager._init(); return _manager!; } - - factory EventBusManager() => shareManager(); EventBusManager get manager => shareManager(); //发送事件 eventBusFir(dynamic event) { diff --git a/lib/blue/io_type.dart b/lib/blue/io_type.dart index 8e21ec5b..828176c6 100755 --- a/lib/blue/io_type.dart +++ b/lib/blue/io_type.dart @@ -1,20 +1,37 @@ -//TODO:发送指令类型 +// 设备 +enum DeviceType { + blue, // 758824 + + gateway // 758825 +} + +String getDeviceType(DeviceType deviceType) { + String t = '758824'; + switch (deviceType) { + case DeviceType.blue: + t = '758824'; + break; + case DeviceType.gateway: + t = '758825'; + break; + } + return t; +} + +// 发送指令类型 enum CommandType { addUser, //增加用户 = 0x3001 deletUser, //删除用户 = 0x3002 editUser, //修改用户 = 0x3003 - transferSmartLock, //转移智能锁 = 0x300D factoryDataReset, //恢复出厂设置 = 0x3004 openLock, //开门 = 0x3005 - readLockStatusInfo, //读取锁状态信息 = 0x300A - transferPermissions, //转移权限 = 0x300B cleanUpUsers, //转移权限 = 0x300C - reportDoorOpenRecord, //开门记录上报 = 0x3020 + transferSmartLock, //转移智能锁 = 0x300D updataLockPasswordList, //上传数据-获取锁密码列表 0x3021 updataLockCardList, //上传数据-获取锁卡片列表 0x3022 updataLockFingerprintList, //上传数据-获取锁指纹列表 0x3023 - updataLockFaceList, //上传数据-获取锁指纹列表 0x3024 - updataLockPalmVeinList, //上传数据-获取锁指纹列表 0x3025 + updataLockFaceList, //上传数据-获取锁人脸列表 0x3024 + updataLockPalmVeinList, //上传数据-获取锁掌静脉列表 0x3025 updataLockRemoteControlList, //上传数据-获取锁遥控列表 0x3026 updataLockSet, //上传数据-获取锁设置 0x302A getLockPublicKey, // 获取锁公钥 = 0x3090 @@ -22,8 +39,14 @@ enum CommandType { calibrationTime, // 校时 = 0x30f0 readStarLockStatusInfo, //读星锁状态信息 0x3040 startOATUpgrade, //OTA升级开始 0x30E0 - confirmationOTAUpgrade, //OTA升级开始 0x30E2 processOTAUpgrade, //OTA升级过程 0x30E1 + confirmationOTAUpgrade, //OTA升级确认 0x30E2 + + gatewayConfiguringWifi, //网关配网 0x30F4 + gatewayConfiguringWifiResult, //网关配网结果 0x30F5 + gatewayGetWifiList, //网关获取附近的wifi列表 0x30F6 + gatewayGetWifiListResult, //网关获取附近的wifi列表结果 0x30F7 + gatewayGetStatus, //获取网关状态 0x30F8 generalExtendedCommond, // 通用扩展指令 = 0x3030 gecChangeAdministratorPassword, // 通用扩展指令子命令-修改管理员密码 = 2 @@ -54,7 +77,7 @@ enum CommandType { extension ExtensionCommandType on CommandType { static CommandType getCommandType(int value) { - CommandType type = CommandType.readLockStatusInfo; + CommandType type = CommandType.readStarLockStatusInfo; switch (value) { case 0x3001: { @@ -91,21 +114,6 @@ extension ExtensionCommandType on CommandType { type = CommandType.transferSmartLock; } break; - case 0x300A: - { - type = CommandType.readLockStatusInfo; - } - break; - case 0x300B: - { - type = CommandType.transferPermissions; - } - break; - case 0x3020: - { - type = CommandType.reportDoorOpenRecord; - } - break; case 0x3021: { type = CommandType.updataLockPasswordList; @@ -181,9 +189,34 @@ extension ExtensionCommandType on CommandType { type = CommandType.confirmationOTAUpgrade; } break; + case 0x30F4: + { + type = CommandType.gatewayConfiguringWifi; + } + break; + case 0x30F5: + { + type = CommandType.gatewayConfiguringWifiResult; + } + break; + case 0x30F6: + { + type = CommandType.gatewayGetWifiList; + } + break; + case 0x30F7: + { + type = CommandType.gatewayGetWifiListResult; + } + break; + case 0x30F8: + { + type = CommandType.gatewayGetStatus; + } + break; default: { - type = CommandType.readLockStatusInfo; + type = CommandType.readStarLockStatusInfo; } break; } @@ -214,15 +247,6 @@ extension ExtensionCommandType on CommandType { case CommandType.transferSmartLock: type = 0x300D; break; - case CommandType.readLockStatusInfo: - type = 0x300A; - break; - case CommandType.transferPermissions: - type = 0x300B; - break; - case CommandType.reportDoorOpenRecord: - type = 0x3020; - break; case CommandType.updataLockPasswordList: type = 0x3021; break; @@ -268,6 +292,21 @@ extension ExtensionCommandType on CommandType { case CommandType.confirmationOTAUpgrade: type = 0x30E2; break; + case CommandType.gatewayConfiguringWifi: + type = 0x30F4; + break; + case CommandType.gatewayConfiguringWifiResult: + type = 0x30F5; + break; + case CommandType.gatewayGetWifiList: + type = 0x30F6; + break; + case CommandType.gatewayGetWifiListResult: + type = 0x30F7; + break; + case CommandType.gatewayGetStatus: + type = 0x30F8; + break; default: type = 0x300A; break; @@ -283,6 +322,9 @@ extension ExtensionCommandType on CommandType { switch (this) { case CommandType.getLockPublicKey: case CommandType.processOTAUpgrade: + case CommandType.gatewayGetWifiList: + case CommandType.gatewayConfiguringWifi: + case CommandType.gatewayGetStatus: //不加密 type = 0x20; break; @@ -326,9 +368,6 @@ extension ExtensionCommandType on CommandType { case 0x300B: t = '转移权限'; break; - case 0x3020: - t = '开门记录上报'; - break; case 0x3021: t = '上传数据获取锁密码列表'; break; @@ -362,18 +401,6 @@ extension ExtensionCommandType on CommandType { case 0x30f0: t = '校时'; break; - case 0x30f1: - t = '同步位置信息'; - break; - case 0x30f2: - t = '运维开锁'; - break; - case 0x3016: - t = '写酒店信息'; - break; - case 0x3017: - t = '读酒店信息'; - break; case 0x3040: t = '读星锁状态信息'; break; @@ -386,6 +413,21 @@ extension ExtensionCommandType on CommandType { case 0x30E1: t = 'oat升级过程'; break; + case 0x30F4: + t = '网关配网'; + break; + case 0x30F5: + t = '网关配网结果'; + break; + case 0x30F6: + t = '网关获取wifi列表'; + break; + case 0x30F7: + t = '网关获取附近的wifi列表结果'; + break; + case 0x30F8: + t = '获取网关状态'; + break; default: t = '读星锁状态信息'; break; diff --git a/lib/blue/reciver_data.dart b/lib/blue/reciver_data.dart index 4c11464b..08fbd978 100755 --- a/lib/blue/reciver_data.dart +++ b/lib/blue/reciver_data.dart @@ -3,6 +3,8 @@ import 'dart:convert'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/blue/blue_manage.dart'; +import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart'; +import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart'; import 'package:star_lock/blue/io_protocol/io_addFace.dart'; import 'package:star_lock/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart'; import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; @@ -12,7 +14,6 @@ import 'package:star_lock/blue/io_protocol/io_editUser.dart'; import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart'; import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart'; import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart'; -import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart'; @@ -20,24 +21,19 @@ import 'package:star_lock/blue/io_protocol/io_referEventRecordTime.dart'; import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsNoParameters.dart'; import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart'; import 'package:star_lock/blue/io_protocol/io_timing.dart'; -import 'package:star_lock/blue/io_protocol/io_transferPermissions.dart'; import '../tools/storage.dart'; +import 'io_gateway/io_gateway_getStatus.dart'; import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart'; import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart'; import 'io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart'; -import 'io_protocol/io_addStressPassword.dart'; import 'io_protocol/io_addUser.dart'; -import 'io_protocol/io_checkingCardStatus.dart'; -import 'io_protocol/io_checkingUserInfoCount.dart'; import 'io_protocol/io_configuringWifi.dart'; import 'io_protocol/io_getPrivateKey.dart'; import 'io_protocol/io_getPublicKey.dart'; import 'io_protocol/io_getStarLockStatusInfo.dart'; import 'io_protocol/io_getWifiList.dart'; import 'io_protocol/io_openLock.dart'; -import 'io_protocol/io_queryingFingerprintStatus.dart'; -import 'io_protocol/io_referEventRecordNumber.dart'; import 'io_protocol/io_senderCustomPasswords.dart'; import 'io_protocol/io_senderResetPasswords.dart'; import 'io_protocol/io_transferSmartLock.dart'; @@ -107,7 +103,8 @@ class CommandReciverManager { // 获取的加密数组 final List getDataList = data.sublist(12, 12 + dataLen); - final List? res = await Storage.getStringList(saveBluePrivateKey); + final List? res = + await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(res!); // 解密 @@ -120,8 +117,8 @@ class CommandReciverManager { parseData(oriDataList).then((Reply? value) async { EasyLoading.dismiss(); await EventBusManager().eventBusFir(value); - }).catchError((error) { - AppLog.log('APP解析数据时发生错误: $error'); + }).catchError((Object error) { + AppLog.log('APP解析数据时发生错误: ${error.toString()}'); }); } } @@ -170,11 +167,6 @@ class CommandReciverManager { reply = EditUserReply.parseData(commandType, data); } break; - case CommandType.transferPermissions: - { - reply = TransferPermissionsReply.parseData(commandType, data); - } - break; case CommandType.transferSmartLock: { reply = TransferSmartLockReply.parseData(commandType, data); @@ -242,7 +234,8 @@ class CommandReciverManager { break; case CommandType.updataLockRemoteControlList: { - reply = UpdataLockRemoteControlListReply.parseData(commandType, data); + reply = + UpdataLockRemoteControlListReply.parseData(commandType, data); } break; case CommandType.updataLockSet: @@ -250,6 +243,32 @@ class CommandReciverManager { reply = UpdataLockSetReply.parseData(commandType, data); } break; + case CommandType.gatewayConfiguringWifi: + { + reply = GatewayConfiguringWifiReply.parseData(commandType, data); + } + break; + case CommandType.gatewayConfiguringWifiResult: + { + reply = + GatewayConfiguringWifiResultReply.parseData(commandType, data); + } + break; + case CommandType.gatewayGetWifiList: + { + reply = GatewayGetWifiReply.parseData(commandType, data); + } + break; + case CommandType.gatewayGetWifiListResult: + { + reply = GatewayGetWifiListReply.parseData(commandType, data); + } + break; + case CommandType.gatewayGetStatus: + { + reply = GatewayGetStatusReply.parseData(commandType, data); + } + break; case CommandType.generalExtendedCommond: { // 子命令类型 @@ -275,25 +294,11 @@ class CommandReciverManager { // reply = AutomaticPadlockReply.parseData(commandType, data); // } // break; - case 15: - { - // 查询用户、指纹、密码、卡片数量(用于判断是否同步) - reply = SenderCheckingUserInfoCountReply.parseData( - commandType, data); - } - break; case 19: { // 重置开锁密码 - reply = SenderResetPasswordsReply.parseData( - commandType, data); - } - break; - case 20: - { - // 查询卡片状态 - reply = SenderCheckingCardStatusReply.parseData( - commandType, data); + reply = + SenderResetPasswordsReply.parseData(commandType, data); } break; // case 21: @@ -319,8 +324,8 @@ class CommandReciverManager { case 26: { // 注册遥控开始 - reply = SenderAddRemoteControlWithTimeCycleCoercionReply.parseData( - commandType, data); + reply = SenderAddRemoteControlWithTimeCycleCoercionReply + .parseData(commandType, data); } break; case 27: @@ -330,20 +335,6 @@ class CommandReciverManager { commandType, data); } break; - case 30: - { - // 查询指纹状态 - reply = SenderQueryingFingerprintStatusReply.parseData( - commandType, data); - } - break; - // case 31: - // { - // // 注册指纹开始 - // reply = - // SenderAddFingerprintReply.parseData(commandType, data); - // } - // break; case 32: { // 注册指纹确认 @@ -366,13 +357,6 @@ class CommandReciverManager { commandType, data); } break; - case 40: - { - // 事件查询记录 - reply = SenderReferEventRecordNumberReply.parseData( - commandType, data); - } - break; case 41: { // 时间条件查询事件记录 @@ -419,27 +403,6 @@ class CommandReciverManager { reply = SenderGetWifiListReply.parseData(commandType, data); } break; - case 60: - { - // 注册胁迫密码 - reply = - SenderAddStressPasswordReply.parseData(commandType, data); - } - break; - // case 61: - // { - // // 注册胁迫卡片 - // reply = - // SenderAddStressICCardReply.parseData(commandType, data); - // } - // break; - // case 62: - // { - // // 注册胁迫指纹 - // reply = SenderAddStressFingerprintReply.parseData( - // commandType, data); - // } - // break; case 70: { // 设置支持功能(不带参数)启用/禁用 @@ -475,13 +438,6 @@ class CommandReciverManager { SenderReadAdminPasswordReply.parseData(commandType, data); } break; - case 80: - { - // 查询人脸状态 - reply = SenderQueryingFaceStatusReply.parseData( - commandType, data); - } - break; case 81: { // 注册人脸开始 diff --git a/lib/blue/sender_beforeDataManage.dart b/lib/blue/sender_beforeDataManage.dart index e34ba60c..79f30b4b 100755 --- a/lib/blue/sender_beforeDataManage.dart +++ b/lib/blue/sender_beforeDataManage.dart @@ -69,9 +69,9 @@ class SenderBeforeDataManage { switch (status) { case 0x00: //成功 - var userNoData = reply.data.sublist(47, 49); - CommonDataManage().currentLockUserNo = listChangInt(userNoData); - CommonDataManage().currentKeyInfo.lockUserNo = CommonDataManage().currentLockUserNo; + final List userNoData = reply.data.sublist(47, 49); + CommonDataManage().currentLockUserNo = listChangInt(userNoData); + CommonDataManage().currentKeyInfo.lockUserNo = CommonDataManage().currentLockUserNo; _updateLockUserNo(userNoData); break; diff --git a/lib/blue/sender_data.dart b/lib/blue/sender_data.dart index 3e4986b1..f77a55be 100755 --- a/lib/blue/sender_data.dart +++ b/lib/blue/sender_data.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import '../app_settings/app_settings.dart'; @@ -21,7 +20,7 @@ class CommandSenderManager { static CommandSenderManager getInstance() => _manager; - init() { + void init() { _initLockAddUserSucceedEvent(); _initTransferSmartLockSucceedEvent(); } @@ -31,7 +30,9 @@ class CommandSenderManager { List dataBeforeAddTheUser = []; void _initLockAddUserSucceedEvent() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _passCurrentLockInformationEvent = eventBus.on().listen((LockAddUserSucceedEvent event) { + _passCurrentLockInformationEvent = eventBus + .on() + .listen((LockAddUserSucceedEvent event) { if (event.type == 0) { sendNormalData(dataBeforeAddTheUser); } else { @@ -44,7 +45,8 @@ class CommandSenderManager { List dataTransferSmartLock = []; void _initTransferSmartLockSucceedEvent() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _transferSmartLockEvent = eventBus.on().listen((LockInitUserNoEvent event) { + _transferSmartLockEvent = + eventBus.on().listen((LockInitUserNoEvent event) { sendNormalData(dataTransferSmartLock); }); } @@ -69,8 +71,9 @@ class CommandSenderManager { sendNormalData(value); } else { // 当前锁被转移了 需要更新锁的userid 调用转移锁协议 - if(CommonDataManage().initUserNo == 1){ - final List entity = await SenderBeforeDataManage().getTransferSmartLockData(); + if (CommonDataManage().initUserNo == 1) { + final List entity = + await SenderBeforeDataManage().getTransferSmartLockData(); sendNormalData(entity); dataTransferSmartLock = value; return; @@ -78,7 +81,8 @@ class CommandSenderManager { // 添加用户之后调用协议就要判断是否添加用户 if (CommonDataManage().currentLockUserNo == 0) { // 如果LockUserNo为0,先添加用户 - final List entity = await SenderBeforeDataManage().getAddUserKeyData(); + final List entity = + await SenderBeforeDataManage().getAddUserKeyData(); sendNormalData(entity); dataBeforeAddTheUser = value; } else { @@ -149,7 +153,7 @@ class CommandSenderManager { // bufferList = []; // } - dispose() { + void dispose() { _passCurrentLockInformationEvent?.cancel(); _transferSmartLockEvent?.cancel(); } diff --git a/lib/blue/sender_manage.dart b/lib/blue/sender_manage.dart index c5b39779..9255ef15 100755 --- a/lib/blue/sender_manage.dart +++ b/lib/blue/sender_manage.dart @@ -1,13 +1,14 @@ +import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart'; import 'package:star_lock/blue/io_protocol/io_addFace.dart'; - import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart'; import 'package:star_lock/blue/io_protocol/io_deletUser.dart'; import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart'; import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart'; -import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; +import 'io_gateway/io_gateway_configuringWifi.dart'; +import 'io_gateway/io_gateway_getStatus.dart'; import 'io_protocol/io_addCardCancel.dart'; import 'io_protocol/io_addFaceCancel.dart'; import 'io_protocol/io_addFingerprintCancel.dart'; @@ -17,10 +18,7 @@ import 'io_protocol/io_addPalmCancel.dart'; import 'io_protocol/io_addPalmWithTimeCycleCoercion.dart'; import 'io_protocol/io_addRemoteControlCancel.dart'; import 'io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart'; -import 'io_protocol/io_addStressPassword.dart'; import 'io_protocol/io_addUser.dart'; -import 'io_protocol/io_checkingCardStatus.dart'; -import 'io_protocol/io_checkingUserInfoCount.dart'; import 'io_protocol/io_configuringWifi.dart'; import 'io_protocol/io_editUser.dart'; import 'io_protocol/io_factoryDataReset.dart'; @@ -29,17 +27,14 @@ import 'io_protocol/io_getPublicKey.dart'; import 'io_protocol/io_getStarLockStatusInfo.dart'; import 'io_protocol/io_getWifiList.dart'; import 'io_protocol/io_openLock.dart'; -import 'io_protocol/io_queryingFingerprintStatus.dart'; import 'io_protocol/io_readSupportFunctionsNoParameters.dart'; import 'io_protocol/io_readSupportFunctionsWithParameters.dart'; -import 'io_protocol/io_referEventRecordNumber.dart'; import 'io_protocol/io_referEventRecordTime.dart'; import 'io_protocol/io_senderCustomPasswords.dart'; import 'io_protocol/io_senderResetPasswords.dart'; import 'io_protocol/io_setSupportFunctionsNoParameters.dart'; import 'io_protocol/io_setSupportFunctionsWithParameters.dart'; import 'io_protocol/io_timing.dart'; -import 'io_protocol/io_transferPermissions.dart'; import 'io_protocol/io_updataLockCardList.dart'; import 'io_protocol/io_updataLockFaceList.dart'; import 'io_protocol/io_updataLockFingerprintList.dart'; @@ -50,7 +45,7 @@ import 'io_protocol/io_updataLockSet.dart'; import 'sender_data.dart'; class IoSenderManage { - //todo:获取公钥 + // 获取公钥 static void getPublicKey({String? lockId, CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: GetPublicKeyCommand( @@ -60,7 +55,7 @@ class IoSenderManage { callBack: callBack); } - //todo:获取私钥 + // 获取私钥 static void getPrivateKey( {String? lockId, String? keyID, // 钥匙ID @@ -82,7 +77,7 @@ class IoSenderManage { callBack: callBack); } - //todo:添加用户 + // 添加用户 static void senderAddUser( {String? lockID, String? authUserID, @@ -134,7 +129,7 @@ class IoSenderManage { callBack: callBack); } - //todo:修改用户 + // 修改用户 static void senderEditUser( {String? lockID, String? authUserID, @@ -170,7 +165,7 @@ class IoSenderManage { callBack: callBack); } - //todo:删除 + // 删除 static void deletUser( {String? lockID, String? authUserID, @@ -194,7 +189,7 @@ class IoSenderManage { callBack: callBack); } - //todo:开锁 + // 开锁 static void senderOpenLock( {String? lockID, String? userID, @@ -221,7 +216,7 @@ class IoSenderManage { callBack: callBack); } - //todo:获取锁状态 弃用 + // 获取锁状态 弃用 // static void senderGetLockStatu( // {String? lockID, // String? userID, @@ -236,7 +231,7 @@ class IoSenderManage { // callBack: callBack); // } - //todo:获取星锁状态信息 + // 获取星锁状态信息 static void senderGetStarLockStatuInfo( {required String? lockID, required String? userID, @@ -257,42 +252,16 @@ class IoSenderManage { callBack: callBack); } - //todo:转移权限 - static void senderTransferPermissions( + // 转移智能锁 + static void sendTransferSmartLockCommand( {required String? lockID, - required String? authUserID, + required String? userID, required String? keyID, - required String? oldUserID, - required String? newUserID, - required int? needAuthor, required List? publicKey, required List? privateKey, required List? token, + required int? needAuthor, CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: TransferPermissionsCommand( - lockID: lockID, - authUserID: authUserID, - keyID: keyID, - oldUserID: oldUserID, - newUserID: newUserID, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - token: token), - callBack: callBack); - } - - //todo:转移智能锁 - static void sendTransferSmartLockCommand( - {required String? lockID, - required String? userID, - required String? keyID, - required List? publicKey, - required List? privateKey, - required List? token, - required int? needAuthor, - CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: FactoryDataResetCommand( lockID: lockID, @@ -305,7 +274,7 @@ class IoSenderManage { callBack: callBack); } - //todo:恢复出厂设置 + // 恢复出厂设置 static void senderFactoryDataReset( {required String? lockID, required String? userID, @@ -327,7 +296,7 @@ class IoSenderManage { callBack: callBack); } - //todo:设置开锁密码 + // 设置开锁密码 static void senderCustomPasswordsCommand( {required String? keyID, required String? userID, @@ -364,7 +333,7 @@ class IoSenderManage { callBack: callBack); } - //todo:修改管理员密码 + // 修改管理员密码 static void changeAdministratorPasswordCommand( {required String? keyID, required String? userID, @@ -397,7 +366,7 @@ class IoSenderManage { callBack: callBack); } - //todo:重置开锁密码 + // 重置开锁密码 static void senderResetPasswordsCommand( {required String? keyID, required String? userID, @@ -420,7 +389,7 @@ class IoSenderManage { callBack: callBack); } - //todo:添加指纹开始 弃用 + // 添加指纹开始 弃用 // static void senderAddFingerprintCommand( // {required String? keyID, // required String? userID, @@ -449,7 +418,7 @@ class IoSenderManage { // callBack: callBack); // } - //todo:添加指纹开始(带限时、循环、胁迫...) + // 添加指纹开始(带限时、循环、胁迫...) static void senderAddFingerprintWithTimeCycleCoercionCommand( {required String? keyID, required String? userID, @@ -468,7 +437,7 @@ class IoSenderManage { required int? needAuthor, required List? signKey, required List? privateKey, - required bool? isBeforeAddUser, + required bool? isBeforeAddUser, CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddFingerprintWithTimeCycleCoercionCommand( @@ -494,7 +463,7 @@ class IoSenderManage { callBack: callBack); } - //todo:取消添加指纹 + // 取消添加指纹 static void senderCancelAddFingerprintCommand( {required String? keyID, required String? userID, @@ -515,7 +484,7 @@ class IoSenderManage { callBack: callBack); } - //todo:添加卡开始旧版 + // 添加卡开始旧版 // static void senderAddICCardCommand( // {required String? keyID, // required String? userID, @@ -544,7 +513,7 @@ class IoSenderManage { // callBack: callBack); // } - //todo:添加卡开始(带限时、循环、胁迫...) + // 添加卡开始(带限时、循环、胁迫...) static void senderAddCardWithTimeCycleCoercionCommand( {required String? keyID, required String? userID, @@ -563,7 +532,7 @@ class IoSenderManage { required int? needAuthor, required List? signKey, required List? privateKey, - required bool? isBeforeAddUser, + required bool? isBeforeAddUser, CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddICCardWithTimeCycleCoercionCommand( @@ -589,7 +558,7 @@ class IoSenderManage { callBack: callBack); } - //todo:取消添加指纹 + // 取消添加指纹 static void senderCancelAddCardCommand( {required String? keyID, required String? userID, @@ -610,27 +579,27 @@ class IoSenderManage { callBack: callBack); } - //todo:添加遥控开始(带限时、循环、胁迫...) + // 添加遥控开始(带限时、循环、胁迫...) static void senderAddRemoteControlWithTimeCycleCoercionCommand( {required String? keyID, - required String? userID, - required int? remoteControlNo, - required int? useCountLimit, - required int? operate, - required int? isAdmin, - required int? isForce, - required List? token, - required int? isRound, - required int? weekRound, - required int? startDate, - required int? endDate, - required String? startTime, - required String? endTime, - required int? needAuthor, - required List? signKey, - required List? privateKey, - required bool? isBeforeAddUser, - CommandSendCallBack? callBack}) { + required String? userID, + required int? remoteControlNo, + required int? useCountLimit, + required int? operate, + required int? isAdmin, + required int? isForce, + required List? token, + required int? isRound, + required int? weekRound, + required int? startDate, + required int? endDate, + required String? startTime, + required String? endTime, + required int? needAuthor, + required List? signKey, + required List? privateKey, + required bool? isBeforeAddUser, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddRemoteControlWithTimeCycleCoercionCommand( keyID: keyID, @@ -655,15 +624,15 @@ class IoSenderManage { callBack: callBack); } - //todo:取消添加遥控 + // 取消添加遥控 static void senderCancelAddRemoteControlCommand( {required String? keyID, - required String? userID, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderCancelAddRemoteControlCommand( keyID: keyID, @@ -676,7 +645,7 @@ class IoSenderManage { callBack: callBack); } - //todo:添加人脸开始 + // 添加人脸开始 static void senderAddFaceCommand( {required String? keyID, required String? userID, @@ -721,7 +690,7 @@ class IoSenderManage { callBack: callBack); } - //todo:取消添加人脸 + // 取消添加人脸 static void senderCancelAddFaceCommand( {required String? keyID, required String? userID, @@ -742,27 +711,27 @@ class IoSenderManage { callBack: callBack); } - //todo:添加掌静脉开始(带限时、循环、胁迫...) + // 添加掌静脉开始(带限时、循环、胁迫...) static void senderAddPalmWithTimeCycleCoercionCommand( {required String? keyID, - required String? userID, - required int? palmNo, - required int? useCountLimit, - required int? operate, - required int? isAdmin, - required int? isForce, - required List? token, - required int? isRound, - required int? weekRound, - required int? startDate, - required int? endDate, - required String? startTime, - required String? endTime, - required int? needAuthor, - required List? signKey, - required List? privateKey, - required bool? isBeforeAddUser, - CommandSendCallBack? callBack}) { + required String? userID, + required int? palmNo, + required int? useCountLimit, + required int? operate, + required int? isAdmin, + required int? isForce, + required List? token, + required int? isRound, + required int? weekRound, + required int? startDate, + required int? endDate, + required String? startTime, + required String? endTime, + required int? needAuthor, + required List? signKey, + required List? privateKey, + required bool? isBeforeAddUser, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderAddPalmWithTimeCycleCoercionCommand( keyID: keyID, @@ -787,15 +756,15 @@ class IoSenderManage { callBack: callBack); } - //todo:取消添加掌静脉 + // 取消添加掌静脉 static void senderCancelAddPalmCommand( {required String? keyID, - required String? userID, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: SenderCancelAddPalmCommand( keyID: keyID, @@ -808,7 +777,7 @@ class IoSenderManage { callBack: callBack); } - //todo:校验时间 + // 校验时间 static void senderTimingCommand( {required String? lockID, required String? userID, @@ -831,54 +800,7 @@ class IoSenderManage { callBack: callBack); } - //todo:自动落锁 - 废弃 - // static void senderAutomaticPadlockCommand({ - // required String? lockID, - // required String? userID, - // required int? autoLockFlag, - // required List? token, - // required int? needAuthor, - // required List? signKey, - // required List? privateKey, - // CommandSendCallBack? callBack}) { - // CommandSenderManager().managerSendData( - // command: AutomaticPadlockCommand( - // lockID: lockID, - // userID: userID, - // autoLockFlag: autoLockFlag, - // token: token, - // needAuthor: needAuthor, - // signKey: signKey, - // privateKey: privateKey, - // ), callBack:callBack); - // } - - //todo:事件记录(页数查询) - static void senderReferEventRecordNumberCommand( - {required String? keyID, - required String? userID, - required int? logsCount, - required int? logsNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: SenderReferEventRecordNumberCommand( - keyID: keyID, - userID: userID, - logsCount: logsCount, - logsNo: logsNo, - token: token, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - ), - callBack: callBack); - } - - //todo:事件记录(时间查询) + // 事件记录(时间查询) static void senderReferEventRecordTimeCommand( {required String? keyID, required String? userID, @@ -905,113 +827,7 @@ class IoSenderManage { callBack: callBack); } - //todo:查询指纹状态 - static void senderQueryingFingerprintStatusCommand( - {required String? keyID, - required String? userID, - required int? role, - required int? fingerCount, - required int? fingerNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: SenderQueryingFingerprintStatusCommand( - keyID: keyID, - userID: userID, - role: role, - fingerCount: fingerCount, - fingerNo: fingerNo, - token: token, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - ), - callBack: callBack); - } - - //todo:查询卡片状态 - static void senderCheckingCardStatusCommand( - {required String? keyID, - required String? userID, - required int? role, - required int? cardCount, - required int? cardNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: SenderCheckingCardStatusCommand( - keyID: keyID, - userID: userID, - role: role, - cardCount: cardCount, - cardNo: cardNo, - token: token, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - ), - callBack: callBack); - } - - //todo:查询人脸状态 - static void senderQueryingFaceStatusCommand( - {required String? keyID, - required String? userID, - required int? role, - required int? faceCount, - required int? faceNo, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: SenderQueryingFaceStatusCommand( - keyID: keyID, - userID: userID, - role: role, - faceCount: faceCount, - faceNo: faceNo, - token: token, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - ), - callBack: callBack); - } - - //todo:查询用户、指纹、密码、卡片数量(用于判断是否同步) - static void senderCheckingUserInfoCountCommand( - {required String? keyID, - required String? userID, - required int? role, - required int? nowTime, - required List? token, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: SenderCheckingUserInfoCountCommand( - keyID: keyID, - userID: userID, - role: role, - nowTime: nowTime, - token: token, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - ), - callBack: callBack); - } - - //todo:wifi列表 + // wifi列表 static void getWifiListCommand( {required String? keyID, required String? userID, @@ -1032,7 +848,7 @@ class IoSenderManage { callBack: callBack); } - //todo:配置wifi + // 配置wifi static void senderConfiguringWifiCommand( {required String? keyID, required String? userID, @@ -1065,7 +881,7 @@ class IoSenderManage { callBack: callBack); } - //todo:添加胁迫指纹 + // 添加胁迫指纹 // static void senderAddStressFingerprintCommand( // {required String? keyID, // required String? userID, @@ -1097,7 +913,7 @@ class IoSenderManage { // callBack: callBack); // } - //todo:添加胁迫卡片 + // 添加胁迫卡片 // static void senderAddStressICCardCommand( // {required String? keyID, // required String? userID, @@ -1129,36 +945,7 @@ class IoSenderManage { // callBack: callBack); // } - //todo:添加胁迫密码 - static void senderAddStressPasswordCommand( - {required String? keyID, - required String? userID, - required int? passwordNo, - required int? useCountLimit, - required List? token, - required int? startTime, - required int? endTime, - required int? needAuthor, - required List? publicKey, - required List? privateKey, - CommandSendCallBack? callBack}) { - CommandSenderManager().managerSendData( - command: SenderAddStressPasswordCommand( - keyID: keyID, - userID: userID, - passwordNo: passwordNo, - useCountLimit: useCountLimit, - token: token, - startTime: startTime, - endTime: endTime, - needAuthor: needAuthor, - publicKey: publicKey, - privateKey: privateKey, - ), - callBack: callBack); - } - - //todo:读取支持功能(不带参数)启用/禁用 + // 读取支持功能(不带参数)启用/禁用 static void readSupportFunctionsNoParametersCommand( {required String? keyID, required String? userID, @@ -1181,7 +968,7 @@ class IoSenderManage { callBack: callBack); } - //todo:设置支持功能(不带参数)启用/禁用 + // 设置支持功能(不带参数)启用/禁用 static void setSupportFunctionsNoParametersCommand( {required String? keyID, required String? userID, @@ -1206,7 +993,7 @@ class IoSenderManage { callBack: callBack); } - //todo:读取支持功能(带参数)启用/禁用 + // 读取支持功能(带参数)启用/禁用 static void readSupportFunctionsWithParametersCommand( {required String? keyID, required String? userID, @@ -1229,7 +1016,7 @@ class IoSenderManage { callBack: callBack); } - //todo:设置支持功能(带参数)启用/禁用 + // 设置支持功能(带参数)启用/禁用 static void setSupportFunctionsWithParametersCommand( {required String? keyID, required String? userID, @@ -1256,7 +1043,7 @@ class IoSenderManage { callBack: callBack); } - //todo:读取管理员密码 + // 读取管理员密码 static void senderReadAdminPasswordCommand( {required String? keyID, required String? userID, @@ -1370,13 +1157,13 @@ class IoSenderManage { required int? needAuthor, required List? signKey, required List? privateKey, - CommandSendCallBack? callBack}) { + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockPasswordListCommand( lockID: lockID, userID: userID, - page:page, - countReq:countReq, + page: page, + countReq: countReq, token: token, needAuthor: needAuthor, signKey: signKey, @@ -1388,20 +1175,20 @@ class IoSenderManage { // 上传数据获取锁密码列表 static void updataLockCardListCommand( {required String? lockID, - required String? userID, - required int? page, - required int? countReq, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required int? page, + required int? countReq, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockCardListCommand( lockID: lockID, userID: userID, - page:page, - countReq:countReq, + page: page, + countReq: countReq, token: token, needAuthor: needAuthor, signKey: signKey, @@ -1413,20 +1200,20 @@ class IoSenderManage { // 上传数据获取锁指纹列表 static void updataLockFingerprintListCommand( {required String? lockID, - required String? userID, - required int? page, - required int? countReq, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required int? page, + required int? countReq, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockFingerprintListCommand( lockID: lockID, userID: userID, - page:page, - countReq:countReq, + page: page, + countReq: countReq, token: token, needAuthor: needAuthor, signKey: signKey, @@ -1438,20 +1225,20 @@ class IoSenderManage { // 上传数据获取锁人脸列表 static void updataLockFaceListCommand( {required String? lockID, - required String? userID, - required int? page, - required int? countReq, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required int? page, + required int? countReq, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockFaceListCommand( lockID: lockID, userID: userID, - page:page, - countReq:countReq, + page: page, + countReq: countReq, token: token, needAuthor: needAuthor, signKey: signKey, @@ -1463,20 +1250,20 @@ class IoSenderManage { // 上传数据获取锁掌静脉列表 static void updataLockPalmVeinListCommand( {required String? lockID, - required String? userID, - required int? page, - required int? countReq, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required int? page, + required int? countReq, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockPalmVeinListCommand( lockID: lockID, userID: userID, - page:page, - countReq:countReq, + page: page, + countReq: countReq, token: token, needAuthor: needAuthor, signKey: signKey, @@ -1488,20 +1275,20 @@ class IoSenderManage { // 上传数据获取锁掌静脉列表 static void updataLockRemoteControlListCommand( {required String? lockID, - required String? userID, - required int? page, - required int? countReq, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required int? page, + required int? countReq, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockRemoteControlListCommand( lockID: lockID, userID: userID, - page:page, - countReq:countReq, + page: page, + countReq: countReq, token: token, needAuthor: needAuthor, signKey: signKey, @@ -1513,12 +1300,12 @@ class IoSenderManage { // 上传数据获取锁设置 static void updataLockSetCommand( {required String? lockID, - required String? userID, - required List? token, - required int? needAuthor, - required List? signKey, - required List? privateKey, - CommandSendCallBack? callBack}) { + required String? userID, + required List? token, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( command: UpdataLockSetCommand( lockID: lockID, @@ -1531,4 +1318,40 @@ class IoSenderManage { callBack: callBack); } + // 网关获取wifi列表 + static void gatewayGetWifiCommand( + {required String? userID, CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: GatewayGetWifiCommand( + userID: userID, + ), + isBeforeAddUser: true, + callBack: callBack); + } + + // 网关配网 + static void gatewayConfiguringWifiCommand( + {required String? ssid, + required String? password, + required String? gatewayConfigurationStr, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: GatewayConfiguringWifiCommand( + ssid: ssid, + password: password, + gatewayConfigurationStr: gatewayConfigurationStr), + isBeforeAddUser: true, + callBack: callBack); + } + + // 获取网关状态 + static void gatewayGetStatusCommand( + {required String? lockID, + required String? userID, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: GatewayGetStatusCommand(lockID: lockID, userID: userID), + isBeforeAddUser: true, + callBack: callBack); + } } diff --git a/lib/blue/sm4Encipher/sm4.dart b/lib/blue/sm4Encipher/sm4.dart index d989d07b..38df45db 100755 --- a/lib/blue/sm4Encipher/sm4.dart +++ b/lib/blue/sm4Encipher/sm4.dart @@ -4,7 +4,7 @@ import 'utils/utils.dart'; enum SM4CryptoMode { ECB, CBC } class SM4 { - static const List S_BOX = [ + static const List S_BOX = [ 0xd6, 0x90, 0xe9, @@ -263,9 +263,9 @@ class SM4 { 0x48 ]; - static const List FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]; + static const List FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]; - static const List CK = [ + static const List CK = [ 0x00070e15, 0x1c232a31, 0x383f464d, @@ -306,8 +306,8 @@ class SM4 { static const int blockSize = 16; - static final _encryptKey = List.filled(32, 0); - static final _decryptKey = List.filled(32, 0); + static final List _encryptKey = List.filled(32, 0); + static final List _decryptKey = List.filled(32, 0); static int _readUint32BE(List b, int i) { return ((b[i] & 0xff) << 24) | @@ -317,20 +317,20 @@ class SM4 { } static void _writeUint32BE(int n, List b, int i) { - b[i] = ((n >> 24) & 0xff); - b[i + 1] = ((n >> 16) & 0xff); - b[i + 2] = ((n >> 8) & 0xff); + b[i] = (n >> 24) & 0xff; + b[i + 1] = (n >> 16) & 0xff; + b[i + 2] = (n >> 8) & 0xff; b[i + 3] = n & 0xff; } static int _Sbox(int inch) => S_BOX[inch & 0xFF]; static int _sm4F(int x0, int x1, int x2, int x3, int rk) { - final x = x1 ^ x2 ^ x3 ^ rk; + final int x = x1 ^ x2 ^ x3 ^ rk; int bb = 0; int c = 0; - List a = List.filled(4, 0); - List b = List.filled(4, 0); + final List a = List.filled(4, 0); + final List b = List.filled(4, 0); _writeUint32BE(x, a, 0); b[0] = _Sbox(a[0]); b[1] = _Sbox(a[1]); @@ -348,20 +348,20 @@ class SM4 { static int _calculateRoundKey(int key) { int roundKey = 0; - List keyBytes = List.filled(4, 0); - List sboxBytes = List.filled(4, 0); + final List keyBytes = List.filled(4, 0); + final List sboxBytes = List.filled(4, 0); _writeUint32BE(key, keyBytes, 0); for (int i = 0; i < 4; i++) { sboxBytes[i] = _Sbox(keyBytes[i]); } - int temp = _readUint32BE(sboxBytes, 0); + final int temp = _readUint32BE(sboxBytes, 0); roundKey = temp ^ SMUtils.leftShift(temp, 13) ^ SMUtils.leftShift(temp, 23); return roundKey; } static void setKey(List key) { - List keyBytes = key; - List intermediateKeys = List.filled(36, 0); + final List keyBytes = key; + final List intermediateKeys = List.filled(36, 0); for (int i = 0; i < 4; i++) { intermediateKeys[i] = _readUint32BE(keyBytes, i * 4) ^ FK[i]; } @@ -375,7 +375,7 @@ class SM4 { } for (int i = 0; i < 16; i++) { - int temp = _encryptKey[i]; + final int temp = _encryptKey[i]; _decryptKey[i] = _encryptKey[31 - i]; _decryptKey[31 - i] = temp; } @@ -383,7 +383,7 @@ class SM4 { static void _round(List sk, List input, List output) { int i = 0; - List ulbuf = List.filled(36, 0); + final List ulbuf = List.filled(36, 0); ulbuf[0] = _readUint32BE(input, 0); ulbuf[1] = _readUint32BE(input, 4); ulbuf[2] = _readUint32BE(input, 8); @@ -404,7 +404,7 @@ class SM4 { final int padLen = blockSize - (input.length % blockSize); if (mode == SM4_ENCRYPT) { - final paddedList = List.filled(input.length + padLen, 0); + final List paddedList = List.filled(input.length + padLen, 0); paddedList.setRange(0, input.length, input); for (int i = input.length; i < paddedList.length; i++) { paddedList[i] = padLen; @@ -423,23 +423,24 @@ class SM4 { List data, int flag, SM4CryptoMode mode, String? iv) { late List lastVector; if (mode == SM4CryptoMode.CBC) { - if (iv == null || iv.length != 32) - throw Exception("IV must be a string of length 16"); - else + if (iv == null || iv.length != 32) { + throw Exception('IV must be a string of length 16'); + } else { lastVector = SMUtils.hexStringToBytes(iv); + } } - final key = (flag == SM4_ENCRYPT) ? _encryptKey : _decryptKey; + final List key = (flag == SM4_ENCRYPT) ? _encryptKey : _decryptKey; if (flag == SM4_ENCRYPT) { data = _padding(data, SM4_ENCRYPT); } - final length = data.length; - final List output = []; + final int length = data.length; + final List output = []; for (int offset = 0; offset < length; offset += blockSize) { - final outData = List.filled(blockSize, 0); - final copyLen = + final List outData = List.filled(blockSize, 0); + final int copyLen = (offset + blockSize <= length) ? blockSize : length - offset; - final input = data.sublist(offset, offset + copyLen); + final List input = data.sublist(offset, offset + copyLen); if (mode == SM4CryptoMode.CBC && flag == SM4_ENCRYPT) { for (int i = 0; i < blockSize; i++) { input[i] = input[i] ^ lastVector[i]; @@ -476,18 +477,18 @@ class SM4 { // /// auto add 0x00 static List _autoAddZero(List list) { /// supplementary list - List supplementList = List.filled(16, 0x00); + final List supplementList = List.filled(16, 0x00); /// complete list - List completeList = [...list, ...supplementList].sublist(0, 16); + final List completeList = [...list, ...supplementList].sublist(0, 16); return completeList; } /// hex byte list to hex string static String _listToHex(List arr) { - String hexString = arr - .map((item) { - String itemHexString = item.toRadixString(16); + final String hexString = arr + .map((int item) { + final String itemHexString = item.toRadixString(16); // The hexadecimal notation is 0123456789ABCDEF //if there is a single one, add 0 if (itemHexString.length == 1) { @@ -504,7 +505,7 @@ class SM4 { static String createHexKey({ required String key, - autoPushZero = true, + bool autoPushZero = true, }) { List keyList = _utf8ToArray(key); @@ -521,9 +522,11 @@ class SM4 { static List encrypt(List data, {List? key, SM4CryptoMode mode = SM4CryptoMode.ECB, String? iv}) { - if (key != null) setKey(key); - List input = data; - List output = _crypto(input, SM4_ENCRYPT, mode, iv); + if (key != null) { + setKey(key); + } + final List input = data; + final List output = _crypto(input, SM4_ENCRYPT, mode, iv); return output; } @@ -535,11 +538,13 @@ class SM4 { // return utf8.decode(output); // } - static decrypt(List data, + static List decrypt(List data, {List? key, SM4CryptoMode mode = SM4CryptoMode.ECB, String? iv}) { - if (key != null) setKey(key); - List input = data; - List output = _crypto(input, SM4_DECRYPT, mode, iv); + if (key != null) { + setKey(key); + } + final List input = data; + final List output = _crypto(input, SM4_DECRYPT, mode, iv); return output; } } diff --git a/lib/blue/sm4Encipher/utils/asn1.dart b/lib/blue/sm4Encipher/utils/asn1.dart index 144578a7..cb38619e 100755 --- a/lib/blue/sm4Encipher/utils/asn1.dart +++ b/lib/blue/sm4Encipher/utils/asn1.dart @@ -1,14 +1,14 @@ class _ASN1Object { - String? tlv; - String t = '00'; - String l = '00'; - String v = ''; _ASN1Object() { tlv = null; } + String? tlv; + String t = '00'; + String l = '00'; + String v = ''; /// 获取 der 编码比特流16进制串 String getEncodedHex() { @@ -84,11 +84,11 @@ class _DERInteger extends _ASN1Object { } class _DERSequence extends _ASN1Object { - List<_ASN1Object> asn1Array; _DERSequence(this.asn1Array) : super() { t = '30'; // 序列标签说明 } + List<_ASN1Object> asn1Array; @override String getValue() { diff --git a/lib/blue/sm4Encipher/utils/ec.dart b/lib/blue/sm4Encipher/utils/ec.dart index 66d137c7..234ecfb8 100755 --- a/lib/blue/sm4Encipher/utils/ec.dart +++ b/lib/blue/sm4Encipher/utils/ec.dart @@ -1,15 +1,17 @@ class ECFieldElementFp { + + ECFieldElementFp(this.q, this.x) { + // if (x.compareTo(q) >= 0) error + } final BigInt x; final BigInt q; - ECFieldElementFp(this.q, this.x) { - // TODO if (x.compareTo(q) >= 0) error - } - /// 判断相等 bool equals(ECFieldElementFp other) { - if (other == this) return true; - return (q == other.q && x == other.x); + if (other == this) { + return true; + } + return q == other.q && x == other.x; } /// 返回具体数值 @@ -49,16 +51,16 @@ class ECFieldElementFp { } class ECPointFp { - final ECCurveFp curve; - late final ECFieldElementFp? x; - late final ECFieldElementFp? y; - late final BigInt z; - BigInt? zinv; ECPointFp(this.curve, this.x, this.y, [BigInt? z]) { this.z = z ?? BigInt.one; zinv = null; } + final ECCurveFp curve; + late final ECFieldElementFp? x; + late final ECFieldElementFp? y; + late final BigInt z; + BigInt? zinv; ECFieldElementFp getX() { zinv ??= z.modInverse(curve.q); @@ -71,19 +73,29 @@ class ECPointFp { } bool equals(ECPointFp other) { - if (other == this) return true; - if (isInfinity()) return other.isInfinity(); - if (other.isInfinity()) return isInfinity(); + if (other == this) { + return true; + } + if (isInfinity()) { + return other.isInfinity(); + } + if (other.isInfinity()) { + return isInfinity(); + } - final u = (other.y!.toBigInteger() * z - y!.toBigInteger() * other.z) % curve.q; - if (u != BigInt.zero) return false; + final BigInt u = (other.y!.toBigInteger() * z - y!.toBigInteger() * other.z) % curve.q; + if (u != BigInt.zero) { + return false; + } - final v = (other.x!.toBigInteger() * z - x!.toBigInteger() * other.z) % curve.q; + final BigInt v = (other.x!.toBigInteger() * z - x!.toBigInteger() * other.z) % curve.q; return v == BigInt.zero; } bool isInfinity() { - if (x == null && y == null) return true; + if (x == null && y == null) { + return true; + } return z == BigInt.zero && y!.toBigInteger() != BigInt.zero; } @@ -92,21 +104,25 @@ class ECPointFp { } ECPointFp add(ECPointFp b) { - if (isInfinity()) return b; - if (b.isInfinity()) return this; - final x1 = x!.toBigInteger(); - final y1 = y!.toBigInteger(); - final z1 = z; - final x2 = b.x!.toBigInteger(); - final y2 = b.y!.toBigInteger(); - final z2 = b.z; - final q = curve.q; - final w1 = (x1 * z2) % q; - final w2 = (x2 * z1) % q; - final w3 = (w1 - w2) % q; - final w4 = (y1 * z2) % q; - final w5 = (y2 * z1) % q; - final w6 = (w4 - w5) % q; + if (isInfinity()) { + return b; + } + if (b.isInfinity()) { + return this; + } + final BigInt x1 = x!.toBigInteger(); + final BigInt y1 = y!.toBigInteger(); + final BigInt z1 = z; + final BigInt x2 = b.x!.toBigInteger(); + final BigInt y2 = b.y!.toBigInteger(); + final BigInt z2 = b.z; + final BigInt q = curve.q; + final BigInt w1 = (x1 * z2) % q; + final BigInt w2 = (x2 * z1) % q; + final BigInt w3 = (w1 - w2) % q; + final BigInt w4 = (y1 * z2) % q; + final BigInt w5 = (y2 * z1) % q; + final BigInt w6 = (w4 - w5) % q; if (w3 == BigInt.zero) { if (w6 == BigInt.zero) { @@ -115,49 +131,57 @@ class ECPointFp { return curve.infinity; } - final w7 = (w1 + w2) % q; - final w8 = (z1 * z2) % q; - final w9 = (w3 * w3) % q; - final w10 = (w3 * w9) % q; - final w11 = (w8 * (w6 * w6) % q - w7 * w9) % q; + final BigInt w7 = (w1 + w2) % q; + final BigInt w8 = (z1 * z2) % q; + final BigInt w9 = (w3 * w3) % q; + final BigInt w10 = (w3 * w9) % q; + final BigInt w11 = (w8 * (w6 * w6) % q - w7 * w9) % q; - final x3 = (w3 * w11) % q; - final y3 = (w6 * (w9 * w1 % q - w11) - w4 * w10) % q; - final z3 = (w10 * w8) % q; + final BigInt x3 = (w3 * w11) % q; + final BigInt y3 = (w6 * (w9 * w1 % q - w11) - w4 * w10) % q; + final BigInt z3 = (w10 * w8) % q; return ECPointFp(curve, curve.fromBigInteger(x3), curve.fromBigInteger(y3), z3); } ECPointFp twice() { - if (isInfinity()) return this; - if (y!.toBigInteger().sign == 0) return curve.infinity; + if (isInfinity()) { + return this; + } + if (y!.toBigInteger().sign == 0) { + return curve.infinity; + } - final x1 = x!.toBigInteger(); - final y1 = y!.toBigInteger(); - final z1 = z; - final q = curve.q; - final a = curve.a.toBigInteger(); + final BigInt x1 = x!.toBigInteger(); + final BigInt y1 = y!.toBigInteger(); + final BigInt z1 = z; + final BigInt q = curve.q; + final BigInt a = curve.a.toBigInteger(); - final w1 = (x1 * x1 * BigInt.from(3) + a * (z1 * z1)) % q; - final w2 = (y1 * BigInt.from(2) * z1) % q; - final w3 = (y1 * y1) % q; - final w4 = (w3 * x1 * z1) % q; - final w5 = (w2 * w2) % q; - final w6 = (w1 * w1 - w4 * BigInt.from(8)) % q; + final BigInt w1 = (x1 * x1 * BigInt.from(3) + a * (z1 * z1)) % q; + final BigInt w2 = (y1 * BigInt.from(2) * z1) % q; + final BigInt w3 = (y1 * y1) % q; + final BigInt w4 = (w3 * x1 * z1) % q; + final BigInt w5 = (w2 * w2) % q; + final BigInt w6 = (w1 * w1 - w4 * BigInt.from(8)) % q; - final x3 = (w2 * w6) % q; - final y3 = (w1 * (w4 * BigInt.from(4) - w6) - w5 * BigInt.from(2) * w3) % q; - final z3 = (w2 * w5) % q; + final BigInt x3 = (w2 * w6) % q; + final BigInt y3 = (w1 * (w4 * BigInt.from(4) - w6) - w5 * BigInt.from(2) * w3) % q; + final BigInt z3 = (w2 * w5) % q; return ECPointFp(curve, curve.fromBigInteger(x3), curve.fromBigInteger(y3), z3); } ECPointFp multiply(BigInt k) { - if (isInfinity()) return this; - if (k.sign == 0) return curve.infinity; + if (isInfinity()) { + return this; + } + if (k.sign == 0) { + return curve.infinity; + } - final k3 = k * BigInt.from(3); - final neg = negate(); + final BigInt k3 = k * BigInt.from(3); + final ECPointFp neg = negate(); ECPointFp Q = this; for (int i = k3.bitLength - 2; i > 0; i--) { @@ -166,9 +190,8 @@ class ECPointFp { /*final k3Bit = (k3 >> i) & BigInt.one == BigInt.one; final kBit = (k >> i) & BigInt.one == BigInt.zero;*/ - final k3Bit = (k3 >> i).isOdd; - ; - final kBit = (k >> i).isOdd; + final bool k3Bit = (k3 >> i).isOdd; + final bool kBit = (k >> i).isOdd; if (k3Bit != kBit) { Q = Q.add(k3Bit ? this : neg); @@ -192,8 +215,12 @@ class ECCurveFp { late ECPointFp infinity; bool equals(Object? other) { - if (identical(this, other)) return true; - if (other is! ECCurveFp) return false; + if (identical(this, other)) { + return true; + } + if (other is! ECCurveFp) { + return false; + } return q == other.q && a == other.a && b == other.b; } @@ -207,8 +234,8 @@ class ECCurveFp { return infinity; case 2: case 3: - final x = fromBigInteger(BigInt.parse(s.substring(2), radix: 16)); - var y = fromBigInteger(x + final ECFieldElementFp x = fromBigInteger(BigInt.parse(s.substring(2), radix: 16)); + ECFieldElementFp y = fromBigInteger(x .multiply(x.square()) .add(x.multiply(a)) .add(b) @@ -228,9 +255,9 @@ class ECCurveFp { case 4: case 6: case 7: - final len = (s.length - 2) ~/ 2; - final xHex = s.substring(2, 2 + len); - final yHex = s.substring(2 + len, 2 + 2 * len); + final int len = (s.length - 2) ~/ 2; + final String xHex = s.substring(2, 2 + len); + final String yHex = s.substring(2 + len, 2 + 2 * len); /*print("xHex: ${BigInt.parse(xHex, radix: 16).toRadixString(16)}"); print("yHex: ${BigInt.parse(yHex, radix: 16).toRadixString(16)}");*/ return ECPointFp(this, fromBigInteger(BigInt.parse(xHex, radix: 16)), @@ -242,7 +269,9 @@ class ECCurveFp { } String leftPad(String input, int num) { - if (input.length >= num) return input; + if (input.length >= num) { + return input; + } return List.filled(num - input.length, '0').join() + input; } diff --git a/lib/blue/sm4Encipher/utils/utils.dart b/lib/blue/sm4Encipher/utils/utils.dart index 5ed948db..d65034df 100755 --- a/lib/blue/sm4Encipher/utils/utils.dart +++ b/lib/blue/sm4Encipher/utils/utils.dart @@ -3,41 +3,41 @@ import 'dart:convert'; class SMUtils{ static int leftShift(int x, int n){ - int s = n & 31; + final int s = n & 31; x = (x & 0xFFFFFFFF).toSigned(32); return (((x << s) | ((x & 0xFFFFFFFF) >> (32 - s))) & 0xFFFFFFFF).toSigned(32); } static int rightShift(int x, int n) { - int s = n & 31; + final int s = n & 31; x = (x & 0xFFFFFFFF).toSigned(32); return ((x >> s) | ((x << (32 - s)) & 0xFFFFFFFF)).toSigned(32); } static String bytesToHexString(List bytes) { - final buffer = StringBuffer(); - for (final byte in bytes) { + final StringBuffer buffer = StringBuffer(); + for (final int byte in bytes) { buffer.write(byte.toRadixString(16).padLeft(2, '0')); } return buffer.toString(); } static List hexStringToBytes(String hexString) { - final length = hexString.length ~/ 2; - final bytes = List.filled(length, 0); + final int length = hexString.length ~/ 2; + final List bytes = List.filled(length, 0); for (int i = 0; i < length; i++) { - final byteString = hexString.substring(i * 2, i * 2 + 2); + final String byteString = hexString.substring(i * 2, i * 2 + 2); bytes[i] = int.parse(byteString, radix: 16); } return bytes; } static String utf8ToHexString(String input) { - List utf8Encoded = utf8.encode(input); + final List utf8Encoded = utf8.encode(input); // 转换到16进制 - StringBuffer hexChars = StringBuffer(); + final StringBuffer hexChars = StringBuffer(); for (int i = 0; i < utf8Encoded.length; i++) { - int bite = utf8Encoded[i]; + final int bite = utf8Encoded[i]; hexChars.write((bite >> 4).toRadixString(16)); hexChars.write((bite & 0x0f).toRadixString(16)); } diff --git a/lib/common/XSConstantMacro/XSConstantMacro.dart b/lib/common/XSConstantMacro/XSConstantMacro.dart index 32ebcf6b..7db9f6e0 100755 --- a/lib/common/XSConstantMacro/XSConstantMacro.dart +++ b/lib/common/XSConstantMacro/XSConstantMacro.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; +import 'package:get/get.dart'; import '../../flavors.dart'; @@ -46,19 +47,19 @@ class XSConstantMacro { // 正常使用 return ''; case 110402: - return '待接收'; + return '待接收'.tr; case 110403: - return '未生效'; + return '未生效'.tr; case 110405: - return '已冻结'; + return '已冻结'.tr; case 110408: - return '已删除'; + return '已删除'.tr; // case 110410: // return "已重置"; case 110412: - return '已过期'; + return '已过期'.tr; default: - return '未知'; + return '未知'.tr; } } diff --git a/lib/common/safetyVerification/safetyVerification_page.dart b/lib/common/safetyVerification/safetyVerification_page.dart index 65359b74..425ec3c5 100755 --- a/lib/common/safetyVerification/safetyVerification_page.dart +++ b/lib/common/safetyVerification/safetyVerification_page.dart @@ -1,15 +1,19 @@ + +import 'dart:convert'; +import 'dart:math'; + import 'package:flustars/flustars.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/common/safetyVerification/entity/CheckSafetyVerificationEntity.dart'; +import 'package:star_lock/common/safetyVerification/entity/SafetyVerificationEntity.dart'; import 'package:star_lock/common/safetyVerification/safetyVerification_logic.dart'; -import 'dart:convert'; -import 'dart:math'; +import 'package:star_lock/common/safetyVerification/safetyVerification_state.dart'; import '../../app_settings/app_colors.dart'; import '../../network/api_repository.dart'; import '../../tools/titleAppBar.dart'; -import '../../translations/trans_lib.dart'; class SafetyVerificationPage extends StatefulWidget { const SafetyVerificationPage({Key? key}) : super(key: key); @@ -20,11 +24,11 @@ class SafetyVerificationPage extends StatefulWidget { class _SafetyVerificationPageState extends State with TickerProviderStateMixin { - final logic = Get.put(SafetyVerificationLogic()); - final state = Get.find().state; + final SafetyVerificationLogic logic = Get.put(SafetyVerificationLogic()); + final SafetyVerificationState state = Get.find().state; - String baseImageBase64 = ""; - String slideImageBase64 = ""; + String baseImageBase64 = ''; + String slideImageBase64 = ''; Size baseSize = Size.zero; //底部基类图片 Size slideSize = Size.zero; //滑块图片 @@ -51,7 +55,7 @@ class _SafetyVerificationPageState extends State with Ti checkResultAfterDrag = false; }); - var entity = await ApiRepository.to.getSliderVerifyImg(state.getData["countryCode"].toString(), state.getData["account"].toString()); + final SafetyVerificationEntity entity = await ApiRepository.to.getSliderVerifyImg(state.getData['countryCode'].toString(), state.getData['account'].toString()); if(entity.errorCode! == 0){ state.sliderXMoved.value = 0; sliderStartX = 0; @@ -60,11 +64,11 @@ class _SafetyVerificationPageState extends State with Ti baseImageBase64 = entity.data!.bigImg!; slideImageBase64 = entity.data!.smallImg!; - var baseR = await WidgetUtil.getImageWH( + final Rect baseR = await WidgetUtil.getImageWH( image: Image.memory(const Base64Decoder().convert(baseImageBase64))); baseSize = baseR.size; - var silderR = await WidgetUtil.getImageWH( + final Rect silderR = await WidgetUtil.getImageWH( image: Image.memory(const Base64Decoder().convert(slideImageBase64))); slideSize = silderR.size; @@ -80,9 +84,9 @@ class _SafetyVerificationPageState extends State with Ti sliderMoveFinish = true; }); - var entity = await ApiRepository.to.checkSliderVerifyImg(state.getData["countryCode"].toString(), state.getData["account"].toString(), sliderMovedX.toString()); + final CheckSafetyVerificationEntity entity = await ApiRepository.to.checkSliderVerifyImg(state.getData['countryCode'].toString(), state.getData['account'].toString(), sliderMovedX.toString()); if(entity.errorCode! == 0){ - checkSuccess("captchaVerification"); + checkSuccess('captchaVerification'); }else{ state.sliderXMoved.value = 0; sliderStartX = 0; @@ -112,7 +116,6 @@ class _SafetyVerificationPageState extends State with Ti @override void didUpdateWidget(SafetyVerificationPage oldWidget) { - // TODO: implement didUpdateWidget super.didUpdateWidget(oldWidget); } @@ -125,8 +128,8 @@ class _SafetyVerificationPageState extends State with Ti } Widget buildContent(BuildContext context) { - var mediaQuery = MediaQuery.of(context); - var dialogWidth = 0.9 * mediaQuery.size.width; + final MediaQueryData mediaQuery = MediaQuery.of(context); + double dialogWidth = 0.9 * mediaQuery.size.width; if (dialogWidth < 330) { dialogWidth = mediaQuery.size.width; } @@ -134,7 +137,7 @@ class _SafetyVerificationPageState extends State with Ti return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "安全验证", + barTitle: '安全验证'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( @@ -171,7 +174,7 @@ class _SafetyVerificationPageState extends State with Ti _showTimeLine = false; }); //关闭验证码 - Navigator.pop(context, {'xWidth': state.sliderXMoved.value.toString()}); + Navigator.pop(context, {'xWidth': state.sliderXMoved.value.toString()}); }); }); } @@ -186,7 +189,7 @@ class _SafetyVerificationPageState extends State with Ti _forwardAnimation(); //刷新验证码 - Future.delayed(Duration(milliseconds: 1000)).then((v) { + Future.delayed(const Duration(milliseconds: 1000)).then((v) { _reverseAnimation().then((v) { setState(() { _showTimeLine = false; @@ -221,15 +224,12 @@ class _SafetyVerificationPageState extends State with Ti child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('拖动下方滑块完成拼图', style: TextStyle(fontSize: 26.sp),), + Text('拖动下方滑块完成拼图'.tr, style: TextStyle(fontSize: 26.sp),), IconButton( icon: const Icon(Icons.refresh), iconSize: 30, color: Colors.black54, - onPressed: () { - //刷新 - loadCaptcha(); - }), + onPressed: loadCaptcha), ], ), ); @@ -242,14 +242,12 @@ class _SafetyVerificationPageState extends State with Ti child: Stack( children: [ ///底图 310*155 - baseImageBase64.isNotEmpty ? - Image.memory( + if (baseImageBase64.isNotEmpty) Image.memory( const Base64Decoder().convert(baseImageBase64), fit: BoxFit.fitWidth, // key: _baseImageKey, gaplessPlayback: true, - ): - Container( + ) else Container( width: 310, height: 155, alignment: Alignment.center, @@ -257,15 +255,14 @@ class _SafetyVerificationPageState extends State with Ti ), ///滑块图 - slideImageBase64.isNotEmpty ? - Obx(() => Container( + if (slideImageBase64.isNotEmpty) Obx(() => Container( margin: EdgeInsets.fromLTRB(state.sliderXMoved.value, 0, 0, 0), child: Image.memory(const Base64Decoder().convert(slideImageBase64), fit: BoxFit.fitHeight, // key: _slideImageKey, gaplessPlayback: true, ), - )) : Container(), + )) else Container(), Positioned( bottom: 0, left: -10, @@ -281,8 +278,8 @@ class _SafetyVerificationPageState extends State with Ti alignment: Alignment.centerLeft, child: Text( _checkSuccess - ? "${(_checkMilliseconds / (60.0 * 12)).toStringAsFixed(2)}s验证成功" - : "验证失败", + ? '${(_checkMilliseconds / (60.0 * 12)).toStringAsFixed(2)}s${'验证成功'.tr}' + : '验证失败', style: const TextStyle(color: Colors.white), ), ), @@ -306,9 +303,9 @@ class _SafetyVerificationPageState extends State with Ti } ///底部,滑动区域 - _bottomContainer() { + Widget _bottomContainer() { return baseSize.width >0 ? - Container( + SizedBox( height: 70, width: baseSize.width, child: Stack( @@ -326,7 +323,7 @@ class _SafetyVerificationPageState extends State with Ti ), Container( alignment: Alignment.center, - child: Text('向右拖动滑块填充拼图', style: TextStyle(fontSize: 16),), + child: Text('向右拖动滑块填充拼图'.tr, style: const TextStyle(fontSize: 16),), ), Obx(() => Container( width: state.sliderXMoved.value, @@ -334,12 +331,12 @@ class _SafetyVerificationPageState extends State with Ti color: const Color(0xfff3fef1), )), GestureDetector( - onPanStart: (startDetails) { + onPanStart: (DragStartDetails startDetails) { ///开始 _checkMilliseconds = DateTime.now().millisecondsSinceEpoch; sliderStartX = startDetails.localPosition.dx; }, - onPanUpdate: (updateDetails) { + onPanUpdate: (DragUpdateDetails updateDetails) { ///更新 double offset = updateDetails.localPosition.dx - sliderStartX; if(offset < 0){ @@ -349,9 +346,9 @@ class _SafetyVerificationPageState extends State with Ti state.sliderXMoved.value = offset; }); }, - onPanEnd: (endDetails) { //结束 + onPanEnd: (DragEndDetails endDetails) { //结束 checkCaptcha(state.sliderXMoved.value); - int nowTime = DateTime.now().millisecondsSinceEpoch; + final int nowTime = DateTime.now().millisecondsSinceEpoch; _checkMilliseconds = nowTime - _checkMilliseconds; }, child: Obx(() { @@ -389,15 +386,14 @@ class _SafetyVerificationPageState extends State with Ti class MaxScaleTextWidget extends StatelessWidget { + const MaxScaleTextWidget({Key? key, this.max = 1.0, required this.child}) : super(key: key); final double max; final Widget child; - const MaxScaleTextWidget({Key? key, this.max = 1.0, required this.child}) : super(key: key); - @override Widget build(BuildContext context) { - var data = MediaQuery.of(context); - var textScaleFactor = min(max, data.textScaleFactor); + final MediaQueryData data = MediaQuery.of(context); + final double textScaleFactor = min(max, data.textScaleFactor); return MediaQuery(data: data.copyWith(textScaleFactor: textScaleFactor), child: child); } } diff --git a/lib/common/safetyVerification/safetyVerification_state.dart b/lib/common/safetyVerification/safetyVerification_state.dart index d553bf65..691f62e3 100755 --- a/lib/common/safetyVerification/safetyVerification_state.dart +++ b/lib/common/safetyVerification/safetyVerification_state.dart @@ -4,15 +4,14 @@ import 'package:get/get.dart'; import 'entity/SafetyVerificationEntity.dart'; class SafetyVerificationState{ - - // Rx safetyVerificationEntity = SafetyVerificationEntity().obs; - var sliderXMoved = 0.0.obs; - var getData = {}.obs; - SafetyVerificationState() { getData.value = Get.arguments as Map; } + // Rx safetyVerificationEntity = SafetyVerificationEntity().obs; + RxDouble sliderXMoved = 0.0.obs; + RxMap getData = {}.obs; + void onClose() { } diff --git a/lib/flavors.dart b/lib/flavors.dart index 75a93ebf..5123fbfa 100755 --- a/lib/flavors.dart +++ b/lib/flavors.dart @@ -65,11 +65,11 @@ class F { static String get title { switch (appFlavor) { case Flavor.local: - return '星锁-local'; + return '${'星锁'.tr}-local'; case Flavor.dev: - return '星锁-dev'; + return '${'星锁'.tr}-dev'; case Flavor.pre: - return '星锁-pre'; + return '${'星锁'.tr}-pre'; case Flavor.sky: case Flavor.sky_dev: case Flavor.sky_pre: @@ -107,9 +107,9 @@ class F { static String get apiPrefix { switch (appFlavor) { case Flavor.local: - // return 'https://ge.lock.star-lock.cn'; // 葛工 - // return 'http://192.168.1.15:8022'; // 谢工 - return 'http://zhou.lock.star-lock.cn'; // 周工 + return 'http://lock.ge.star-lock.cn'; // 葛工 + // return 'http://192.168.1.15:8022'; // 谢工 + // return 'http://zhou.lock.star-lock.cn'; // 周工 case Flavor.dev: case Flavor.xhj_dev: @@ -133,6 +133,9 @@ class F { static StarLockAMapKey get aMapKey { switch (appFlavor) { case Flavor.local: + return const StarLockAMapKey( + androidKey: '9388ca47f9674b447a17eff82bc0e2ea', + iosKey: 'cdec0512564baa58be26b2e2ac5ef3b7'); case Flavor.dev: return const StarLockAMapKey( androidKey: 'b56b681ee89f4db43a5aa1879ae8cbfe', @@ -141,16 +144,39 @@ class F { return const StarLockAMapKey( androidKey: '11d49b3f4fc09c04a02bbb7500925ba2', iosKey: '883a3355d2d77c2fdc2667030dc97ffe'); + case Flavor.sky_dev: + return const StarLockAMapKey( + androidKey: '', + iosKey: '', + ); + case Flavor.sky_pre: + return const StarLockAMapKey( + androidKey: '7d59c7416c455af3cf80bfb02478e733', + iosKey: 'a5c6c62386aa2b8285b5f8c2cd0597df', + ); case Flavor.sky: return const StarLockAMapKey( androidKey: 'fb0d2a3e4208b36452cf636aa025a24f', iosKey: '86ca725a12a629c280e116a317aaba19'); + case Flavor.xhj_dev: + return const StarLockAMapKey( + androidKey: '', + iosKey: '', + ); + case Flavor.xhj_pre: + return const StarLockAMapKey( + androidKey: '9d96095a53f46f5e323a5e9e7f3eaae2', + iosKey: '57f81124738270472558c685199c9a6a', + ); case Flavor.xhj: return const StarLockAMapKey( androidKey: '9dd8073a2e96870b206269bb562a887a', iosKey: 'c70047e60ce704d945ea89d6c2763b82'); default: - throw Exception('flavor[$name] aMapKey not found'); + return const StarLockAMapKey( + androidKey: 'no valied key', + iosKey: 'no valied key', + ); } } diff --git a/lib/login/forgetPassword/starLock_forgetPassword_logic.dart b/lib/login/forgetPassword/starLock_forgetPassword_logic.dart index c9119cdf..3566ba34 100755 --- a/lib/login/forgetPassword/starLock_forgetPassword_logic.dart +++ b/lib/login/forgetPassword/starLock_forgetPassword_logic.dart @@ -6,9 +6,11 @@ import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_state.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../network/api_repository.dart'; import '../../tools/baseGetXController.dart'; +import '../../tools/dateTool.dart'; import '../../tools/regularExpression.dart'; import '../../tools/showTipView.dart'; import '../register/entity/checkIP_entity.dart'; @@ -53,8 +55,20 @@ class StarLockForgetPasswordLogic extends BaseGetXController { 'B748F838-94EE-4BDB-A0E6-7B2D16849792', state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('resetPassword_result', { + 'account':state.phoneStr.value, + 'date':DateTool().getNowDateWithType(1), + 'resetPassword_res':'成功', + }); + showToast('重置成功'.tr); Get.back(); + }else{ + UmengCommonSdk.onEvent('resetPassword_result', { + 'account':state.phoneStr.value, + 'date':DateTool().getNowDateWithType(1), + 'resetPassword_res':'${entity.errorCode}--${entity.errorMsg}', + }); } } diff --git a/lib/login/forgetPassword/starLock_forgetPassword_page.dart b/lib/login/forgetPassword/starLock_forgetPassword_page.dart index 59065cd0..9e20dc8f 100755 --- a/lib/login/forgetPassword/starLock_forgetPassword_page.dart +++ b/lib/login/forgetPassword/starLock_forgetPassword_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -11,7 +12,6 @@ import '../../app_settings/app_colors.dart'; import '../../tools/submitBtn.dart'; import '../../tools/tf_loginInput.dart'; import '../../tools/titleAppBar.dart'; -import '../../translations/trans_lib.dart'; class StarLockForgetPasswordPage extends StatefulWidget { const StarLockForgetPasswordPage({Key? key}) : super(key: key); @@ -59,7 +59,7 @@ class _StarLockForgetPasswordPageState SizedBox(width: 5.w), Expanded( child: Text( - TranslationLoader.lanKeys!.countryAndRegion!.tr, + '国家/地区'.tr, style: TextStyle( fontSize: 26.sp, color: AppColors.blackColor))), SizedBox(width: 20.w), @@ -93,7 +93,7 @@ class _StarLockForgetPasswordPageState ), LoginInput( controller: state.phoneController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.phoneController); }, leftWidget: Padding( @@ -113,7 +113,7 @@ class _StarLockForgetPasswordPageState SizedBox(height: 10.h), LoginInput( controller: state.pwdController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.pwdController); }, isPwd: true, @@ -133,14 +133,14 @@ class _StarLockForgetPasswordPageState ]), SizedBox(height: 15.w), Text( - TranslationLoader.lanKeys!.registerPasswordTip!.tr, + '密码必须是8-20位,至少包括数字/字母/符号中的2种'.tr, style: TextStyle( color: AppColors.placeholderTextColor, fontSize: 20.sp), ), SizedBox(height: 10.w), LoginInput( controller: state.sureController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.sureController); }, isPwd: true, @@ -164,7 +164,7 @@ class _StarLockForgetPasswordPageState Expanded( child: LoginInput( controller: state.codeController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.codeController); }, leftWidget: Padding( diff --git a/lib/login/forgetPassword/starLock_forgetPassword_state.dart b/lib/login/forgetPassword/starLock_forgetPassword_state.dart index 686802f9..b2f948f2 100755 --- a/lib/login/forgetPassword/starLock_forgetPassword_state.dart +++ b/lib/login/forgetPassword/starLock_forgetPassword_state.dart @@ -1,12 +1,7 @@ - import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../../translations/trans_lib.dart'; -import '../selectCountryRegion/common/index.dart'; - class StarLockForgetPasswordState { - StarLockForgetPasswordState() { resetResend(); } @@ -27,25 +22,29 @@ class StarLockForgetPasswordState { RxString verificationCode = ''.obs; RxString xWidth = ''.obs; // 滑动验证码滑动位置 RxString phoneStr = ''.obs; - RxBool canSub = false.obs;// 是否能点击发送按钮 - RxBool canSendCode = false.obs;// 是否能店家获取验证码按钮 + RxBool canSub = false.obs; // 是否能点击发送按钮 + RxBool canSendCode = false.obs; // 是否能店家获取验证码按钮 RxString date = currentTimeMillis().toString().obs; // bool get isEmail => RegexUtil.isEmail(phoneStr.value); // bool get isIphone => RegexUtil.isMobileSimple(phoneStr.value); - bool get pwdIsOK => pwd.value.isNotEmpty && surePwd.value.isNotEmpty && pwd.value.length >= 8 && surePwd.value.length >= 8; - bool get codeIsOK => verificationCode.value.isNotEmpty && verificationCode.value.length >= 6; + bool get pwdIsOK => + pwd.value.isNotEmpty && + surePwd.value.isNotEmpty && + pwd.value.length >= 8 && + surePwd.value.length >= 8; + bool get codeIsOK => + verificationCode.value.isNotEmpty && verificationCode.value.length >= 6; - RxBool canResend = false.obs;// 是否能重新发送,就是验证码倒计时之后的重新发送 + RxBool canResend = false.obs; // 是否能重新发送,就是验证码倒计时之后的重新发送 RxString btnText = ''.obs; int totalSeconds = 120; int currentSecond = 120; void resetResend() { canResend.value = totalSeconds == currentSecond; - btnText.value = !canResend.value - ? '$currentSecond s' - : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + btnText.value = + !canResend.value ? '$currentSecond s' : btnText.value = '获取验证码'.tr; } void onClose() { diff --git a/lib/login/forgetPassword/starLock_forgetPassword_xhj_page.dart b/lib/login/forgetPassword/starLock_forgetPassword_xhj_page.dart index 8c9ea551..35ef3fed 100755 --- a/lib/login/forgetPassword/starLock_forgetPassword_xhj_page.dart +++ b/lib/login/forgetPassword/starLock_forgetPassword_xhj_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -6,11 +7,9 @@ import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_logic.dart'; import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_state.dart'; -import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart'; import 'package:star_lock/tools/submitBtn.dart'; import 'package:star_lock/tools/tf_loginInput.dart'; import 'package:star_lock/tools/titleAppBar.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class StarLockForgetPasswordXHJPage extends StatefulWidget { const StarLockForgetPasswordXHJPage({Key? key}) : super(key: key); @@ -57,7 +56,7 @@ class _StarLockForgetPasswordPageState child: Row( children: [ SizedBox(width: 5.w), - Text(TranslationLoader.lanKeys!.countryAndRegion!.tr, + Text('国家/地区'.tr, style: TextStyle( fontSize: 26.sp, color: AppColors.blackColor)), SizedBox(width: 60.w), @@ -82,7 +81,7 @@ class _StarLockForgetPasswordPageState ), LoginInput( controller: state.phoneController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.phoneController); }, leftWidget: Padding( @@ -95,7 +94,7 @@ class _StarLockForgetPasswordPageState ]), LoginInput( controller: state.pwdController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.pwdController); }, isPwd: true, @@ -108,13 +107,13 @@ class _StarLockForgetPasswordPageState LengthLimitingTextInputFormatter(20), ]), Text( - TranslationLoader.lanKeys!.registerPasswordTip!.tr, + '密码必须是8-20位,至少包括数字/字母/符号中的2种'.tr, style: TextStyle( color: AppColors.placeholderTextColor, fontSize: 20.sp), ), LoginInput( controller: state.sureController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.sureController); }, isPwd: true, @@ -132,10 +131,10 @@ class _StarLockForgetPasswordPageState Expanded( child: LoginInput( controller: state.codeController, - onchangeAction: (v) { + onchangeAction: (dynamic v) { logic.checkNext(state.codeController); }, - leftWidget: SizedBox(), + leftWidget: const SizedBox(), hintText: '请输入验证码'.tr, inputFormatters: [ diff --git a/lib/login/login/starLock_login_binding.dart b/lib/login/login/starLock_login_binding.dart index 9cba24cc..f017e5c0 100755 --- a/lib/login/login/starLock_login_binding.dart +++ b/lib/login/login/starLock_login_binding.dart @@ -1,9 +1,7 @@ import 'package:get/get.dart'; - import 'starLock_login_logic.dart'; - class StarLockLoginBinding extends Bindings { @override void dependencies() { diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index a5e2fa90..c7e64334 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; @@ -9,11 +7,12 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/mine/mine/starLockMine_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; -import 'package:star_lock/tools/push/xs_jPhush.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../main/lockMian/lockMain/lockMain_logic.dart'; import '../../mine/mine/starLockMine_logic.dart'; import '../../network/api_repository.dart'; +import '../../tools/dateTool.dart'; import '../../tools/eventBusEventManage.dart'; import '../../tools/showTipView.dart'; import '../../tools/storage.dart'; @@ -51,6 +50,12 @@ class StarLockLoginLogic extends BaseGetXController { username: state.emailOrPhone.value, deviceInfo: state.deviceInfoMap); if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('login_result', { + 'account': state.emailOrPhone.value, + 'date': DateTool().getNowDateWithType(1), + 'login_res': '成功', + }); + Storage.saveLoginData(entity.data); Storage.setBool(saveIsVip, entity.data!.isVip == 1); eventBus.fire(MineInfoChangeRefreshUI()); @@ -59,13 +64,19 @@ class StarLockLoginLogic extends BaseGetXController { } Get.offNamedUntil(Routers.starLockMain, (Route route) => false); BlueManage().scanDevices.clear(); //清除设备缓存 + } else { + UmengCommonSdk.onEvent('login_result', { + 'account': state.emailOrPhone.value, + 'date': DateTool().getNowDateWithType(1), + 'login_res': '${entity.errorCode}--${entity.errorMsg}', + }); } } Future checkIpAction() async { final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); if (entity.errorCode!.codeIsSuccessful) { - if (state.countryName.value == entity.data!.name) { + if (state.countryName == entity.data!.name) { ShowTipView().showSureAlertDialog( '国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续'.tr, tipTitle: '确认国家或地区'.tr, diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index 960763d5..143ffb90 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -5,8 +5,8 @@ import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/login/login/starLock_login_state.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart'; -import 'package:star_lock/tools/wechat/customer_tool.dart'; import 'package:star_lock/tools/storage.dart'; +import 'package:star_lock/tools/wechat/customer_tool.dart'; import '../../appRouters.dart'; import '../../app_settings/app_colors.dart'; @@ -47,21 +47,23 @@ class _StarLockLoginPageState extends State { haveBack: false, backgroundColor: AppColors.mainColor, actionsList: [ - IconButton( - onPressed: (){ - WechatManageTool.getAppInfo(CustomerTool.openCustomerService); - }, - icon: const Icon( - Icons.support_agent, - color: Colors.white, - )), + if (state.isChina == true) + IconButton( + onPressed: () { + WechatManageTool.getAppInfo( + CustomerTool.openCustomerService); + }, + icon: const Icon( + Icons.support_agent, + color: Colors.white, + )), TextButton( child: Text( '注册'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () async { - var data = await Get.toNamed(Routers.starLockRegisterPage); + final data = await Get.toNamed(Routers.starLockRegisterPage); if (data != null) { state.emailOrPhoneController.text = data['phoneOrEmailStr']; logic.checkNext(state.emailOrPhoneController); @@ -83,26 +85,25 @@ class _StarLockLoginPageState extends State { width: 110.w, height: 110.w))), SizedBox(height: 50.w), Obx(() => CommonItem( - leftTitel: - '你所在的国家/地区'.tr, + leftTitel: '你所在的国家/地区'.tr, rightTitle: '', isHaveLine: true, isPadding: false, isHaveRightWidget: true, isHaveDirection: true, rightWidget: Text( - '${state.countryName.value} +${state.countryCode.value}', + '${state.countryName} +${state.countryCode.value}', textAlign: TextAlign.end, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), ), action: () async { - var result = + final result = await Get.toNamed(Routers.selectCountryRegionPage); if (result != null) { result as Map; state.countryCode.value = result['code']; - state.countryName.value = result['countryName']; + state.countryKey = result['countryName']; logic.checkIpAction(); } }, @@ -122,7 +123,7 @@ class _StarLockLoginPageState extends State { height: 36.w, ), ), - hintText:'请输入手机号或者邮箱'.tr, + hintText: '请输入手机号或者邮箱'.tr, // keyboardType: TextInputType.number, inputFormatters: [ // FilteringTextInputFormatter.allow(RegExp('[0-9]')), @@ -184,8 +185,7 @@ class _StarLockLoginPageState extends State { WidgetSpan( alignment: PlaceholderAlignment.middle, child: GestureDetector( - child: Text( - '《${'用户协议'.tr}》', + child: Text('《${'用户协议'.tr}》', style: TextStyle( color: AppColors.mainColor, fontSize: 20.sp)), @@ -200,8 +200,7 @@ class _StarLockLoginPageState extends State { WidgetSpan( alignment: PlaceholderAlignment.middle, child: GestureDetector( - child: Text( - '《${'隐私政策'.tr}》', + child: Text('《${'隐私政策'.tr}》', style: TextStyle( color: AppColors.mainColor, fontSize: 20.sp)), @@ -245,8 +244,7 @@ class _StarLockLoginPageState extends State { height: 50.h, // color: Colors.red, child: Center( - child: Text( - '${'忘记密码'.tr}?', + child: Text('${'忘记密码'.tr}?', style: TextStyle( fontSize: 22.sp, color: AppColors.mainColor)), ), diff --git a/lib/login/login/starLock_login_state.dart b/lib/login/login/starLock_login_state.dart index 793ae233..41bc0fef 100755 --- a/lib/login/login/starLock_login_state.dart +++ b/lib/login/login/starLock_login_state.dart @@ -1,16 +1,35 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../../translations/current_locale_tool.dart'; + class StarLockLoginState { - var passwordShow = true.obs; - var agree = false.obs; + StarLockLoginState() { + // emailOrPhone.value = StoreService.to.getLastUserAccount() as String; + emailOrPhoneController.text = emailOrPhone.value; + } + RxBool passwordShow = true.obs; + RxBool agree = false.obs; - var countryCode = '86'.obs; - var countryName = '中国'.obs; + RxString countryCode = '86'.obs; + RxString countryKey = '中国'.tr.obs; - var emailOrPhone = ''.obs; - var pwd = ''.obs; - var canNext = false.obs; + /// 获取翻译后的国家名称 + String get countryName => countryKey.value.tr; + + /// + bool get isChina { + if (CurrentLocaleTool.convertLocale(Get.deviceLocale!) == + const Locale('zh', 'CN')) { + return true; + } else { + return false; + } + } + + RxString emailOrPhone = ''.obs; + RxString pwd = ''.obs; + RxBool canNext = false.obs; bool get isEmailOrPhone => emailOrPhone.value.isNotEmpty; bool get pwdIsOK => pwd.value.isNotEmpty; @@ -26,11 +45,6 @@ class StarLockLoginState { 'deviceType': 0 }.obs; - StarLockLoginState() { - // emailOrPhone.value = StoreService.to.getLastUserAccount() as String; - emailOrPhoneController.text = emailOrPhone.value; - } - void onClose() { // emailOrPhoneController.dispose(); // pwdController.dispose(); diff --git a/lib/login/login/starLock_login_xhj_page.dart b/lib/login/login/starLock_login_xhj_page.dart index 7e05b386..8138db92 100755 --- a/lib/login/login/starLock_login_xhj_page.dart +++ b/lib/login/login/starLock_login_xhj_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -6,8 +5,8 @@ import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/login/login/starLock_login_state.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart'; -import 'package:star_lock/tools/wechat/customer_tool.dart'; import 'package:star_lock/tools/storage.dart'; +import 'package:star_lock/tools/wechat/customer_tool.dart'; import '../../appRouters.dart'; import '../../app_settings/app_colors.dart'; @@ -64,14 +63,16 @@ class _StarLockLoginPageState extends State { ), ), ), - IconButton( - onPressed: (){ - WechatManageTool.getAppInfo(CustomerTool.openCustomerService); - }, - icon: Icon( - Icons.support_agent, - color: AppColors.mainColor, - )), + if (state.isChina == true) + IconButton( + onPressed: () { + WechatManageTool.getAppInfo( + CustomerTool.openCustomerService); + }, + icon: Icon( + Icons.support_agent, + color: AppColors.mainColor, + )), ], ), SizedBox(height: 30.h), @@ -82,7 +83,7 @@ class _StarLockLoginPageState extends State { if (result != null) { result as Map; state.countryCode.value = result['code']; - state.countryName.value = result['countryName']; + state.countryKey.value = result['countryName']; logic.checkIpAction(); } }, @@ -104,7 +105,7 @@ class _StarLockLoginPageState extends State { ), Obx(() { return Text( - '${state.countryName.value} +${state.countryCode.value}', + '${state.countryName} +${state.countryCode.value}', style: TextStyle( fontSize: 22.sp, color: AppColors.mainColor), @@ -327,7 +328,8 @@ class _StarLockLoginPageState extends State { Widget _buildBottomAgreement() { return Container( width: 1.sw, - padding: EdgeInsets.only(left: 40.w, bottom:30.w, right: 40.w, top: 40.h), + padding: + EdgeInsets.only(left: 40.w, bottom: 30.w, right: 40.w, top: 40.h), child: Wrap( // mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -351,40 +353,32 @@ class _StarLockLoginPageState extends State { width: 20.w, height: 20.w, ), - ) - )), + ))), SizedBox( width: 10.w, ), Text( - '我已阅读并同意'.tr, - style: - TextStyle(color: const Color(0xff333333), fontSize: 20.sp), + '我已阅读并同意'.tr, + style: TextStyle(color: const Color(0xff333333), fontSize: 20.sp), ), GestureDetector( - child: Text( - '《${'用户协议'.tr}》', - style: TextStyle( - color: AppColors.mainColor, fontSize: 20.sp)), + child: Text('《${'用户协议'.tr}》', + style: TextStyle(color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { - Get.toNamed(Routers.webviewShowPage, - arguments: { - 'url': XSConstantMacro.userAgreementURL, - 'title': '用户协议'.tr - }); + Get.toNamed(Routers.webviewShowPage, arguments: { + 'url': XSConstantMacro.userAgreementURL, + 'title': '用户协议'.tr + }); }, ), GestureDetector( - child: Text( - '《${'隐私政策'.tr}》', - style: TextStyle( - color: AppColors.mainColor, fontSize: 20.sp)), + child: Text('《${'隐私政策'.tr}》', + style: TextStyle(color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { - Get.toNamed(Routers.webviewShowPage, - arguments: { - 'url': XSConstantMacro.privacyPolicyURL, - 'title': '隐私政策'.tr - }); + Get.toNamed(Routers.webviewShowPage, arguments: { + 'url': XSConstantMacro.privacyPolicyURL, + 'title': '隐私政策'.tr + }); }, ) diff --git a/lib/login/register/starLock_register_logic.dart b/lib/login/register/starLock_register_logic.dart index 22d05cab..69a653d7 100755 --- a/lib/login/register/starLock_register_logic.dart +++ b/lib/login/register/starLock_register_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/material.dart'; @@ -11,9 +12,11 @@ import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../network/api_repository.dart'; import '../../tools/baseGetXController.dart'; +import '../../tools/dateTool.dart'; import '../../tools/regularExpression.dart'; import '../../tools/showTipView.dart'; import 'entity/checkIP_entity.dart'; @@ -58,12 +61,24 @@ class StarLockRegisterLogic extends BaseGetXController { verificationCode: state.verificationCode.value, deviceInfo: state.deviceInfoMap.value); if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('register_result', { + 'account':state.phoneOrEmailStr.value, + 'date':DateTool().getNowDateWithType(1), + 'register_res':'成功', + }); + Storage.saveLoginData(entity.data); Storage.setBool(saveIsVip, entity.data!.isVip == 1); eventBus.fire(MineInfoChangeRefreshUI()); XSJPushProvider().initLocalNotification(isCancelLocalPush: false); Get.offNamedUntil(Routers.starLockMain, (Route route) => false); BlueManage().scanDevices.clear(); //清除设备缓存 + }else{ + UmengCommonSdk.onEvent('register_result', { + 'account':state.phoneOrEmailStr.value, + 'date':DateTool().getNowDateWithType(1), + 'register_res':'${entity.errorCode}--${entity.errorMsg}', + }); } } diff --git a/lib/login/register/starLock_register_page.dart b/lib/login/register/starLock_register_page.dart index b9af45d5..2e8174df 100755 --- a/lib/login/register/starLock_register_page.dart +++ b/lib/login/register/starLock_register_page.dart @@ -12,7 +12,6 @@ import '../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../tools/submitBtn.dart'; import '../../tools/tf_loginInput.dart'; import '../../tools/titleAppBar.dart'; -import '../../translations/trans_lib.dart'; import 'starLock_register_logic.dart'; class StarLockRegisterPage extends StatefulWidget { @@ -32,7 +31,7 @@ class _StarLockRegisterPageState extends State { resizeToAvoidBottomInset: false, backgroundColor: const Color(0xFFFFFFFF), appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.register!.tr, + barTitle: '注册'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( @@ -42,7 +41,7 @@ class _StarLockRegisterPageState extends State { middleTFWidget(), Obx(() { return SubmitBtn( - btnName: TranslationLoader.lanKeys!.register!.tr, + btnName: '注册'.tr, // backgroundColorList: state.canSub.value ? [AppColors.mainColor] :[Colors.grey], fontSize: 30.sp, borderRadius: 20.w, @@ -101,7 +100,7 @@ class _StarLockRegisterPageState extends State { : null, child: Center( child: Text( - TranslationLoader.lanKeys!.iphone!.tr, + '手机'.tr, style: TextStyle( color: state.isIphoneType.value ? Colors.white @@ -127,7 +126,7 @@ class _StarLockRegisterPageState extends State { color: AppColors.greyLineColor)), child: Center( child: Text( - TranslationLoader.lanKeys!.email!.tr, + '邮箱'.tr, style: TextStyle( color: state.isIphoneType.value ? Colors.black @@ -150,8 +149,7 @@ class _StarLockRegisterPageState extends State { state.countryName.value = result['countryName']; logic.checkIpAction(); } - AppLog.log( - '路由返回值: $result, countryCode:${logic.state.countryCode}'); + // AppLog.log('路由返回值: $result, countryCode:${logic.state.countryCode}'); }, child: Obx(() => SizedBox( height: 70.h, @@ -160,7 +158,7 @@ class _StarLockRegisterPageState extends State { SizedBox(width: 5.w), Expanded( child: Text( - "${"你所在的".tr}${TranslationLoader.lanKeys!.countryAndRegion!.tr}", + '你所在的国家/地区'.tr, style: TextStyle( fontSize: 26.sp, color: AppColors.blackColor))), SizedBox(width: 20.w), @@ -216,7 +214,7 @@ class _StarLockRegisterPageState extends State { ), ), hintText: - "${"请输入".tr}${state.isIphoneType.value ? "手机号".tr : TranslationLoader.lanKeys!.email!.tr}", + state.isIphoneType.value ? '请输入手机号'.tr : '请输入邮箱'.tr, keyboardType: TextInputType.number, inputFormatters: [ // FilteringTextInputFormatter.allow(RegExp('[0-9]')), @@ -244,7 +242,7 @@ class _StarLockRegisterPageState extends State { ]), SizedBox(height: 15.w), Text( - TranslationLoader.lanKeys!.registerPasswordTip!.tr, + '密码必须是8-20位,至少包括数字/字母/符号中的2种'.tr, style: TextStyle(color: AppColors.placeholderTextColor, fontSize: 20.sp), ), @@ -357,14 +355,14 @@ class _StarLockRegisterPageState extends State { Flexible( child: RichText( text: TextSpan( - text: TranslationLoader.lanKeys!.readAndAgree!.tr, + text: '我已阅读并同意'.tr, style: TextStyle(color: const Color(0xff333333), fontSize: 20.sp), children: [ WidgetSpan( alignment: PlaceholderAlignment.middle, child: GestureDetector( child: Text( - '《${TranslationLoader.lanKeys!.userAgreement!.tr}》', + '《${'用户协议'.tr}》', style: TextStyle( color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { @@ -378,7 +376,7 @@ class _StarLockRegisterPageState extends State { alignment: PlaceholderAlignment.middle, child: GestureDetector( child: Text( - '《${TranslationLoader.lanKeys!.privacyPolicy!.tr}》', + '《${'隐私政策'.tr}》', style: TextStyle( color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { diff --git a/lib/login/register/starLock_register_state.dart b/lib/login/register/starLock_register_state.dart index c3c01120..3555bd0c 100755 --- a/lib/login/register/starLock_register_state.dart +++ b/lib/login/register/starLock_register_state.dart @@ -2,8 +2,6 @@ import 'package:flustars/flustars.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../../translations/trans_lib.dart'; - class StarLockRegisterState { StarLockRegisterState() { @@ -43,7 +41,7 @@ class StarLockRegisterState { canResend.value = totalSeconds == currentSecond; btnText.value = !canResend.value ? '$currentSecond s' - : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + : btnText.value = '获取验证码'.tr; } void onClose() { diff --git a/lib/login/register/starLock_register_xhj_page.dart b/lib/login/register/starLock_register_xhj_page.dart index 811fe1bd..de914623 100755 --- a/lib/login/register/starLock_register_xhj_page.dart +++ b/lib/login/register/starLock_register_xhj_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -10,7 +11,6 @@ import '../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../tools/submitBtn.dart'; import '../../tools/tf_loginInput.dart'; import '../../tools/titleAppBar.dart'; -import '../../translations/trans_lib.dart'; import 'starLock_register_logic.dart'; class StarLockRegisterXHJPage extends StatefulWidget { @@ -30,7 +30,7 @@ class _StarLockRegisterPageState extends State { resizeToAvoidBottomInset: false, backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.register!.tr, + barTitle: '注册'.tr, haveBack: true, iconColor: AppColors.blackColor, titleColor: AppColors.blackColor, @@ -46,7 +46,7 @@ class _StarLockRegisterPageState extends State { ), Obx(() { return SubmitBtn( - btnName: TranslationLoader.lanKeys!.register!.tr, + btnName: '注册'.tr, // backgroundColorList: state.canSub.value ? [AppColors.mainColor] :[Colors.grey], fontSize: 30.sp, borderRadius: 20.w, @@ -85,8 +85,8 @@ class _StarLockRegisterPageState extends State { dividerHeight: 0, indicatorSize: TabBarIndicatorSize.tab, tabs: [ - Text(TranslationLoader.lanKeys!.iphone!.tr), - Text(TranslationLoader.lanKeys!.email!.tr) + Text('手机'.tr), + Text('邮箱'.tr) ], indicatorColor: AppColors.mainColor, labelStyle: @@ -113,24 +113,22 @@ class _StarLockRegisterPageState extends State { child: Obx(() => Container( color: Colors.white, height: 70.h, - child: Visibility( - visible: state.isIphoneType.value, - child: Row( - children: [ - SizedBox(width: 5.w), - Text(TranslationLoader.lanKeys!.countryAndRegion!.tr, - style: TextStyle( - fontSize: 26.sp, color: AppColors.blackColor)), - SizedBox(width: 50.w), - Text( - state.isIphoneType.value - ? '${state.countryName.value} +${state.countryCode.value}' - : state.countryName.value, - style: TextStyle( - fontSize: 26.sp, color: AppColors.mainColor), - ), - ], - )), + child: Row( + children: [ + SizedBox(width: 5.w), + Text('国家/地区'.tr, + style: TextStyle( + fontSize: 26.sp, color: AppColors.blackColor)), + SizedBox(width: 50.w), + Text( + state.isIphoneType.value + ? '${state.countryName.value} +${state.countryCode.value}' + : state.countryName.value, + style: TextStyle( + fontSize: 26.sp, color: AppColors.mainColor), + ), + ], + ), )), ) ], @@ -146,8 +144,7 @@ class _StarLockRegisterPageState extends State { logic.checkNext(state.phoneOrEmailController); }, leftWidget: SizedBox(), - label: - "${'请输入'.tr}${state.isIphoneType.value ? "手机号".tr : TranslationLoader.lanKeys!.email!.tr}", + label:state.isIphoneType.value ? '请输入手机号'.tr : '请输入邮箱'.tr, keyboardType: TextInputType.number, inputFormatters: [ LengthLimitingTextInputFormatter(30), @@ -164,9 +161,9 @@ class _StarLockRegisterPageState extends State { LengthLimitingTextInputFormatter(20), ]), Text( - TranslationLoader.lanKeys!.registerPasswordTip!.tr, + '密码必须是8-20位,至少包括数字/字母/符号中的2种'.tr, style: - TextStyle(color: AppColors.placeholderTextColor, fontSize: 20.sp), + TextStyle(color: AppColors.placeholderTextColor, fontSize: 20.sp), ), LoginInput( controller: state.sureController, @@ -237,68 +234,77 @@ class _StarLockRegisterPageState extends State { } Widget _buildBottomAgreement() { - return GestureDetector( - onTap: () { - state.agree.value = !state.agree.value; - logic.changeAgreeState(); - }, - child: Padding( - padding: EdgeInsets.symmetric(vertical: 16.h), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Obx(() => Image.asset( - state.agree.value - ? 'images/icon_round_select.png' - : 'images/icon_round_unSelect.png', - width: 20.w, - height: 20.w, - )), - SizedBox( - width: 15.w, - ), - Flexible( - child: RichText( - text: TextSpan( - text: TranslationLoader.lanKeys!.readAndAgree!.tr, - style: - TextStyle(color: const Color(0xff333333), fontSize: 20.sp), - children: [ - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: GestureDetector( - child: Text( - '《${TranslationLoader.lanKeys!.userAgreement!.tr}》', - style: TextStyle( - color: AppColors.mainColor, fontSize: 20.sp)), - onTap: () { - Get.toNamed(Routers.webviewShowPage, - arguments: { - 'url': XSConstantMacro.userAgreementURL, - 'title': '用户协议'.tr - }); - }, - )), - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: GestureDetector( - child: Text( - '《${TranslationLoader.lanKeys!.privacyPolicy!.tr}》', - style: TextStyle( - color: AppColors.mainColor, fontSize: 20.sp)), - onTap: () { - Get.toNamed(Routers.webviewShowPage, - arguments: { - 'url': XSConstantMacro.privacyPolicyURL, - 'title': '隐私政策'.tr - }); - }, - )), - ], - )), + return Padding( + padding: EdgeInsets.only(bottom:20.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Obx(() => GestureDetector( + onTap: () { + state.agree.value = !state.agree.value; + logic.changeAgreeState(); + }, + child: Container( + width: 40.w, + height: 40.w, + // color: Colors.red, + padding: EdgeInsets.only( + left: 5.w, + right: 10.w, + ), + child: Image.asset( + state.agree.value + ? 'images/icon_round_select.png' + : 'images/icon_round_unSelect.png', + width: 20.w, + height: 20.w, + ), ) - ], - ), + )), + SizedBox( + width: 10.w, + ), + Flexible( + child: RichText( + text: TextSpan( + text: '我已阅读并同意'.tr, + style: + TextStyle(color: const Color(0xff333333), fontSize: 20.sp), + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: GestureDetector( + child: Text( + '《${'用户协议'.tr}》', + style: TextStyle( + color: AppColors.mainColor, fontSize: 20.sp)), + onTap: () { + Get.toNamed(Routers.webviewShowPage, + arguments: { + 'url': XSConstantMacro.userAgreementURL, + 'title': '用户协议'.tr + }); + }, + )), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: GestureDetector( + child: Text( + '《${'隐私政策'.tr}》', + style: TextStyle( + color: AppColors.mainColor, fontSize: 20.sp)), + onTap: () { + Get.toNamed(Routers.webviewShowPage, + arguments: { + 'url': XSConstantMacro.privacyPolicyURL, + 'title': '隐私政策'.tr + }); + }, + )), + ], + )), + ) + ], ), ); } diff --git a/lib/login/selectCountryRegion/common/utils.dart b/lib/login/selectCountryRegion/common/utils.dart index 08556380..95c6ad52 100755 --- a/lib/login/selectCountryRegion/common/utils.dart +++ b/lib/login/selectCountryRegion/common/utils.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/login/selectCountryRegion/common/countryRegionEntity.dart'; @@ -20,7 +21,7 @@ class Utils { static Widget getSusItem(BuildContext context, String tag, {double susHeight = 40}) { if (tag == '★') { - tag = '★ 热门城市'; + tag = '★ ${'热门城市'.tr}'; } return Container( height: susHeight, diff --git a/lib/login/selectCountryRegion/selectCountryRegion_page.dart b/lib/login/selectCountryRegion/selectCountryRegion_page.dart index c04ecfbb..08d9de36 100755 --- a/lib/login/selectCountryRegion/selectCountryRegion_page.dart +++ b/lib/login/selectCountryRegion/selectCountryRegion_page.dart @@ -10,37 +10,43 @@ import 'package:star_lock/tools/baseGetXController.dart'; import '../../app_settings/app_colors.dart'; import '../../tools/keySearchWidget.dart'; import '../../tools/titleAppBar.dart'; -import '../../translations/trans_lib.dart'; +import '../../translations/current_locale_tool.dart'; import 'common/index.dart'; class SelectCountryRegionPage extends StatefulWidget { const SelectCountryRegionPage({Key? key}) : super(key: key); @override - State createState() => _SelectCountryRegionPageState(); + State createState() => + _SelectCountryRegionPageState(); } class _SelectCountryRegionPageState extends State { List countriesList = []; List topCountriesList = []; TextEditingController searchController = TextEditingController(); + String currentLanguage = ''; @override void initState() { super.initState(); - SuspensionUtil.setShowSuspensionStatus(countriesList.cast()); + currentLanguage = CurrentLocaleTool.getCurrentLocaleString(); + + SuspensionUtil.setShowSuspensionStatus( + countriesList.cast()); Future.delayed(const Duration(milliseconds: 20), getCountriesListRequest); } //请求国家/地区json文件 Future getCountriesListRequest() async { - final CountryRegionEntity entity = await ApiRepository.to.getCountryRegion('1'); + final CountryRegionEntity entity = + await ApiRepository.to.getCountryRegion('1'); countriesList.clear(); if (entity.errorCode!.codeIsSuccessful) { countriesList.addAll(entity.dataList!); - for(final CountryRegionModel model in countriesList){ - if(model.name! == '中国'){ + for (final CountryRegionModel model in countriesList) { + if (model.code! == '86') { topCountriesList.add(model); break; } @@ -77,15 +83,14 @@ class _SelectCountryRegionPageState extends State { @override Widget build(BuildContext context) { return GestureDetector( - onTap: (){ + onTap: () { FocusScope.of(context).unfocus(); }, child: Scaffold( resizeToAvoidBottomInset: false, backgroundColor: const Color(0xFFFFFFFF), appBar: TitleAppBar( - barTitle: - '${TranslationLoader.lanKeys!.select!.tr} ${TranslationLoader.lanKeys!.countryAndRegion!.tr}', + barTitle: '选择国家/地区'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -95,38 +100,43 @@ class _SelectCountryRegionPageState extends State { editingController: searchController, backgroundColor: AppColors.mainBackgroundColor, onSubmittedAction: () { - if(searchController.text.isEmpty){ + if (searchController.text.isEmpty) { getCountriesListRequest(); - }else{ - final List searchList = []; - for (int i = 0, length = countriesList.length; i < length; i++) { + } else { + final List searchList = + []; + for (int i = 0, length = countriesList.length; + i < length; + i++) { final CountryRegionModel countryModel = countriesList[i]; - if(countryModel.name!.contains(searchController.text) || countryModel.code!.contains(searchController.text)){ + if (countryModel.name!.contains(searchController.text) || + countryModel.code!.contains(searchController.text)) { searchList.add(countryModel); } } - countriesList= searchList; + countriesList = searchList; _handleList(searchList); } setState(() {}); }, ), - SizedBox(height:20.h), + SizedBox(height: 20.h), Visibility( visible: searchController.text.isEmpty, - child: Utils.getSusItem(context, '★') - ), - if (countriesList.isNotEmpty) Visibility( - visible: searchController.text.isEmpty, - child: Utils.getListItem(context, topCountriesList[0], () { - final CountryRegionModel model = topCountriesList[0]; - final Map resultMap = {}; - resultMap['code'] = model.code ?? ''; - resultMap['countryId'] = model.countryId.toString() ?? ''; - resultMap['countryName'] = model.name ?? '' ; - Navigator.pop(context, resultMap); - }) - ) else Container(), + child: Utils.getSusItem(context, '★')), + if (countriesList.isNotEmpty) + Visibility( + visible: searchController.text.isEmpty, + child: Utils.getListItem(context, topCountriesList[0], () { + final CountryRegionModel model = topCountriesList[0]; + final Map resultMap = {}; + resultMap['code'] = model.code ?? ''; + resultMap['countryId'] = model.countryId.toString() ?? ''; + resultMap['countryName'] = model.name ?? ''; + Navigator.pop(context, resultMap); + })) + else + Container(), Expanded( child: AzListView( data: countriesList, @@ -148,7 +158,9 @@ class _SelectCountryRegionPageState extends State { final String tag = model.getSuspensionTag(); return Utils.getSusItem(context, tag); }, - indexBarData: const ['★', ...kIndexBarData], + indexBarData: currentLanguage == 'zh_CN' + ? const ['★', ...kIndexBarData] + : [], ), ), ], diff --git a/lib/main.dart b/lib/main.dart index 4db2742f..c5f0db2a 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_bugly/flutter_bugly.dart'; import 'package:get/get.dart'; import 'package:path/path.dart' as path; import 'package:star_lock/flavors.dart'; @@ -16,6 +17,7 @@ import 'package:star_lock/tools/platform_info_services.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/translations/trans_lib.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import 'app.dart'; import 'app_settings/app_settings.dart'; @@ -23,30 +25,31 @@ import 'tools/store_service.dart'; // 该文件不可作为编译入口,请查看 flavorizr.yaml 中的说明 FutureOr main() async { - WidgetsFlutterBinding.ensureInitialized(); + FlutterBugly.postCatchedException(() async { + WidgetsFlutterBinding.ensureInitialized(); - await _setCommonServices(); + await _setCommonServices(); - // 设置国际化信息 - await _initTranslation(); + // 设置国际化信息 + await _initTranslation(); - final bool isLogin = await getLoginStatus(); - if (isLogin) { - await privacySDKInitialization(); - } - - WidgetsBinding.instance.addPostFrameCallback((_) async { - final bool? openDeBug = await Storage.getBool(isOpenDeBug); - if (openDeBug == true) { - DeBug.showFloatWidget(); + final bool isLogin = await getLoginStatus(); + if (isLogin) { + await privacySDKInitialization(); } - }); - runApp(MyApp(isLogin: isLogin)); + WidgetsBinding.instance.addPostFrameCallback((_) async { + final bool? openDeBug = await Storage.getBool(isOpenDeBug); + if (openDeBug == true) { + DeBug.showFloatWidget(); + } + }); + runApp(MyApp(isLogin: isLogin)); + }); if (AppPlatform.isAndroid) { const SystemUiOverlayStyle systemUiOverlayStyle = - SystemUiOverlayStyle(statusBarColor: Colors.transparent); + SystemUiOverlayStyle(statusBarColor: Colors.transparent); SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle); } @@ -54,11 +57,7 @@ FutureOr main() async { } // 设置国际化信息 -Future _initTranslation() async => TranslationLoader.loadTranslation( - zhSource: 'lan/lan_zh.json', - enSource: 'lan/lan_en.json', - keySource: 'lan/lan_keys.json', - ); +Future _initTranslation() async => TranslationLoader.loadTranslation(); // 设置包名服务设备信息 Future _setCommonServices() async { @@ -75,33 +74,13 @@ Future _setCommonServices() async { //关于隐私协议的初始化 Future privacySDKInitialization() async { + UmengCommonSdk.initCommon( + '671244cf80464b33f6df9648', '671244ae80464b33f6df9646', 'Product'); + UmengCommonSdk.setPageCollectionModeManual(); + await Get.putAsync(() => PlatformInfoService().init()); await BuglyTool.init(); // 初始化JPush服务 final XSJPushProvider jpushProvider = XSJPushProvider(); await jpushProvider.initJPushService(); } - -void checkChinese(){ - // 获取当前脚本的目录 - final String scriptDir = path.dirname(Platform.script.path); - - // 遍历这个目录下的所有 .dart 文件 - findChineseCharacters(Directory(scriptDir)); -} - -void findChineseCharacters(Directory directory) { - final List files = directory.listSync(recursive: true); - for (FileSystemEntity file in files) { - if (file is File && file.path.endsWith('.dart')) { - final String content = file.readAsStringSync(encoding: utf8); - if (hasChineseCharacters(content)) { - print('Found Chinese characters in ${file.path}'); - } - } - } -} - -bool hasChineseCharacters(String input) { - return RegExp(r'[\u4e00-\u9fa5]').hasMatch(input); -} \ No newline at end of file diff --git a/lib/main/lockDetail/accessoriesList/accessoriesList_logic.dart b/lib/main/lockDetail/accessoriesList/accessoriesList_logic.dart index f9956641..fd16e53a 100755 --- a/lib/main/lockDetail/accessoriesList/accessoriesList_logic.dart +++ b/lib/main/lockDetail/accessoriesList/accessoriesList_logic.dart @@ -6,18 +6,15 @@ class AccessoriesListLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); } @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose } } diff --git a/lib/main/lockDetail/accessoriesList/accessoriesList_page.dart b/lib/main/lockDetail/accessoriesList/accessoriesList_page.dart index bfde46dd..1c7f1ae9 100755 --- a/lib/main/lockDetail/accessoriesList/accessoriesList_page.dart +++ b/lib/main/lockDetail/accessoriesList/accessoriesList_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/accessoriesList/accessoriesList_logic.dart'; +import 'package:star_lock/main/lockDetail/accessoriesList/accessoriesList_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../baseWidget.dart'; @@ -16,31 +17,31 @@ class AccessoriesListPage extends StatefulWidget { class _AccessoriesListPageState extends State with BaseWidget { - final logic = Get.put(AccessoriesListLogic()); - final state = Get.find().state; + final AccessoriesListLogic logic = Get.put(AccessoriesListLogic()); + final AccessoriesListState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: '选择设备类型', + barTitle: '选择设备类型'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( - children: [ + children: [ _accessoriesItem( - 'images/main/icon_main_attachment_lighting.png', "照明灯具", true), + 'images/main/icon_main_attachment_lighting.png', '照明灯具'.tr, true), _accessoriesItem( - 'images/main/icon_main_attachment_doorOpener.png', "开门器", false), + 'images/main/icon_main_attachment_doorOpener.png', '开门器'.tr, false), _accessoriesItem( 'images/main/icon_main_attachment_ElectricCurtain.png', - "电动窗帘", + '电动窗帘'.tr, true), _accessoriesItem('images/main/icon_main_attachment_doorSensor.png', - "门窗传感器", false), + '门窗传感器'.tr, false), _accessoriesItem( - 'images/main/icon_main_attachment_sensor.png', "传感器", true), + 'images/main/icon_main_attachment_sensor.png', '传感器'.tr, true), ], ), ); @@ -50,7 +51,7 @@ class _AccessoriesListPageState extends State Widget _accessoriesItem(String iconStr, String gatewayType, bool isWhite) { return GestureDetector( onTap: () { - logic.showToast("该功能暂未开放"); + logic.showToast('功能暂未开放'.tr); }, child: Container( color: isWhite == true ? Colors.white : AppColors.mainBackgroundColor, @@ -59,7 +60,7 @@ class _AccessoriesListPageState extends State padding: EdgeInsets.all(30.w), child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ SizedBox( width: 30.w, ), diff --git a/lib/main/lockDetail/accessoriesList/accessoriesList_state.dart b/lib/main/lockDetail/accessoriesList/accessoriesList_state.dart index b737db94..df20216d 100755 --- a/lib/main/lockDetail/accessoriesList/accessoriesList_state.dart +++ b/lib/main/lockDetail/accessoriesList/accessoriesList_state.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; class AccessoriesListState { - var getLockType = 1.obs; //0-所有锁;1-门锁;2-NFC无源锁;3-挂锁;4-保险箱锁;5-车位锁;6-智能门禁;7-网关 - var lockTypeImg = 'images/lockType/addLock_touchScreen.png'.obs; //不同类型锁图片更换 + RxInt getLockType = 1.obs; //0-所有锁;1-门锁;2-NFC无源锁;3-挂锁;4-保险箱锁;5-车位锁;6-智能门禁;7-网关 + RxString lockTypeImg = 'images/lockType/addLock_touchScreen.png'.obs; //不同类型锁图片更换 } diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart index 1719a67f..209e9024 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart @@ -12,9 +12,9 @@ import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction import 'package:star_lock/tools/NativeInteractionTool.dart'; import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../../blue/blue_manage.dart'; -import '../../../../blue/io_protocol/io_transferPermissions.dart'; import '../../../../blue/io_reply.dart'; import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; @@ -33,91 +33,89 @@ class AuthorizedAdminLogic extends BaseGetXController { int? keyId; // 监听设备返回的数据 - late StreamSubscription _replySubscription; - - void _initReplySubscription() { - _replySubscription = - EventBusManager().eventBus!.on().listen((Reply reply) async { - // 转移权限 - if (reply is TransferPermissionsReply) { - final List token = reply.data.sublist(2, 6); - final List saveStrList = changeIntListToStringList(token); - Storage.setStringList(saveBlueToken, saveStrList); - - final int status = reply.data[6]; - - switch (status) { - case 0x00: - //成功 - break; - case 0x06: - //无权限 - final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = - changeStringListToIntList(privateKey!); - - final List? publicKey = - await Storage.getStringList(saveBluePublicKey); - final List publicKeyDataList = - changeStringListToIntList(publicKey!); - - final List? token = - await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); - - IoSenderManage.senderFactoryDataReset( - lockID: BlueManage().connectDeviceName, - userID: await Storage.getUid(), - keyID: '1', - needAuthor: 1, - publicKey: publicKeyDataList, - privateKey: getPrivateKeyList, - token: getTokenList); - break; - default: - break; - } - } - }); - } + // late StreamSubscription _replySubscription; + // void _initReplySubscription() { + // _replySubscription = + // EventBusManager().eventBus!.on().listen((Reply reply) async { + // // 转移权限 + // if (reply is TransferPermissionsReply) { + // final List token = reply.data.sublist(2, 6); + // final List saveStrList = changeIntListToStringList(token); + // Storage.setStringList(saveBlueToken, saveStrList); + // + // final int status = reply.data[6]; + // switch (status) { + // case 0x00: + // //成功 + // break; + // case 0x06: + // //无权限 + // final List? privateKey = + // await Storage.getStringList(saveBluePrivateKey); + // final List getPrivateKeyList = + // changeStringListToIntList(privateKey!); + // + // final List? publicKey = + // await Storage.getStringList(saveBluePublicKey); + // final List publicKeyDataList = + // changeStringListToIntList(publicKey!); + // + // final List? token = + // await Storage.getStringList(saveBlueToken); + // final List getTokenList = changeStringListToIntList(token!); + // + // IoSenderManage.senderFactoryDataReset( + // lockID: BlueManage().connectDeviceName, + // userID: await Storage.getUid(), + // keyID: '1', + // needAuthor: 1, + // publicKey: publicKeyDataList, + // privateKey: getPrivateKeyList, + // token: getTokenList); + // break; + // default: + // break; + // } + // } + // }); + // } // 转移权限 - Future transferPermissionsAction() async { - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState state) async { - if (state == BluetoothConnectionState.connected) { - final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = - changeStringListToIntList(privateKey!); - - final List? publicKey = - await Storage.getStringList(saveBluePublicKey); - final List publicKeyDataList = - changeStringListToIntList(publicKey!); - - final List? token = await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); - - IoSenderManage.senderTransferPermissions( - lockID: BlueManage().connectDeviceName, - authUserID: await Storage.getUid(), - keyID: '1', - oldUserID: await Storage.getUid(), - newUserID: '100002', - needAuthor: 1, - publicKey: publicKeyDataList, - privateKey: getPrivateKeyList, - token: getTokenList); - } - }); - } + // Future transferPermissionsAction() async { + // BlueManage().blueSendData(BlueManage().connectDeviceName, + // (BluetoothConnectionState state) async { + // if (state == BluetoothConnectionState.connected) { + // final List? privateKey = + // await Storage.getStringList(saveBluePrivateKey); + // final List getPrivateKeyList = + // changeStringListToIntList(privateKey!); + // + // final List? publicKey = + // await Storage.getStringList(saveBluePublicKey); + // final List publicKeyDataList = + // changeStringListToIntList(publicKey!); + // + // final List? token = await Storage.getStringList(saveBlueToken); + // final List getTokenList = changeStringListToIntList(token!); + // + // IoSenderManage.senderTransferPermissions( + // lockID: BlueManage().connectDeviceName, + // authUserID: await Storage.getUid(), + // keyID: '1', + // oldUserID: await Storage.getUid(), + // newUserID: '100002', + // needAuthor: 1, + // publicKey: publicKeyDataList, + // privateKey: getPrivateKeyList, + // token: getTokenList); + // } + // }); + // } //发送授权管理员列表请求 Future sendElectronicKeyRequest() async { if (state.emailOrPhoneController.text.isEmpty) { - showToast('请输入接收者账号'); + showToast('请输入接收者账号'.tr); return; } // if (state.keyNameController.text.isEmpty) { @@ -141,16 +139,16 @@ class AuthorizedAdminLogic extends BaseGetXController { endTime = '0'; if (startDate.isEmpty) { - showToast('请选择开始时间'); + showToast('请选择开始时间'.tr); return; } if (endDate.isEmpty) { - showToast('请选择结束时间'); + showToast('请选择结束时间'.tr); return; } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'); + showToast('失效时间需晚于生效时间'.tr); return; } } @@ -222,7 +220,16 @@ class AuthorizedAdminLogic extends BaseGetXController { idCardNumber: state.isRequireAuth.value == true ? state.idCardController.text : ''); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('add_authorizedAdmin', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_password_result': '添加授权管理员成功', + }); + state.createUser.value = 0; state.isSendSuccess.value = true; state.addUserId.value = entity.data!.receiverUser!.id.toString(); @@ -237,6 +244,14 @@ class AuthorizedAdminLogic extends BaseGetXController { state.createUser.value = 1; sendElectronicKeyRequest(); }); + } else { + UmengCommonSdk.onEvent('add_authorizedAdmin', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_password_result': '添加授权管理员失败:${entity.errorMsg}', + }); } } } @@ -274,7 +289,7 @@ class AuthorizedAdminLogic extends BaseGetXController { roomStatus: 1, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('标记成功'); + showToast('标记成功'.tr); } } @@ -316,10 +331,10 @@ class AuthorizedAdminLogic extends BaseGetXController { final String template = item.template ?? ''; NativeInteractionTool().loadNativeShare(shareText: template); } else { - showToast('获取模板失败 0x02'); + showToast('获取模板失败'.tr); } } else { - showToast('获取模板失败 0x01'); + showToast('获取模板失败'.tr); } } @@ -327,11 +342,11 @@ class AuthorizedAdminLogic extends BaseGetXController { void onReady() { super.onReady(); - _initReplySubscription(); + // _initReplySubscription(); } @override void onClose() { - _replySubscription.cancel(); + // _replySubscription.cancel(); } } diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart index 0270b018..c9e4ff0f 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart @@ -18,9 +18,9 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../tools/NativeInteractionTool.dart'; import '../../../../tools/commonItem.dart'; +import '../../../../tools/key_name_item.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'authorizedAdmin_logic.dart'; class AuthorizedAdminPage extends StatefulWidget { @@ -57,7 +57,7 @@ class _AuthorizedAdminPageState extends State return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.authorizedAdmin!.tr, + barTitle: '授权管理员'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -83,8 +83,7 @@ class _AuthorizedAdminPageState extends State keyInfoWidget(), keyTimeWidget(), keyOnlyManageWidget(), - keyBottomWidget( - TranslationLoader.lanKeys!.authorizedAdminTip!.tr) + keyBottomWidget('授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人'.tr) ], ), ); @@ -96,8 +95,7 @@ class _AuthorizedAdminPageState extends State children: [ keyInfoWidget(), keyOnlyManageWidget(), - keyBottomWidget( - TranslationLoader.lanKeys!.authorizedAdminTip!.tr) + keyBottomWidget('授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人'.tr) ], ), ); @@ -109,14 +107,15 @@ class _AuthorizedAdminPageState extends State Widget keyInfoWidget() { return Column( children: [ + // CommonItem( + // leftTitel: '接收者'.tr, + // rightTitle: '', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)), + perpetualKeyWidget('接收者'.tr, '请输入手机号或者邮箱'.tr), CommonItem( - leftTitel: '接收者'.tr, - rightTitle: '', - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -138,12 +137,15 @@ class _AuthorizedAdminPageState extends State } }, ), - CommonItem( + KeyNameItem( leftTitel: '姓名'.tr, - rightTitle: '', - isHaveRightWidget: true, - rightWidget: getTFWidget( - false, '请输入姓名'.tr, 2)), + rightTitle: '请输入'.tr, + controller: state.keyNameController), + // CommonItem( + // leftTitel: '姓名'.tr, + // rightTitle: '', + // isHaveRightWidget: true, + // rightWidget: getTFWidget(false, '请输入姓名'.tr, 2)), Container(height: 10.h), ], ); @@ -189,22 +191,105 @@ class _AuthorizedAdminPageState extends State ); } + Widget perpetualKeyWidget(String titleStr, String rightTitle) { + return Column( + children: [ + Container( + height: 65.h, + padding: EdgeInsets.only(left: 20.w, right: 20.w), + color: Colors.white, + child: Row( + children: [ + Text(titleStr, style: TextStyle(fontSize: 22.sp)), + SizedBox(width: 6.w), + Expanded( + child: TextField( + controller: logic.getCurrentController(1), + //输入框一行 + maxLines: 1, + inputFormatters: [ + FilteringTextInputFormatter.deny('\n'), + LengthLimitingTextInputFormatter(30), + ], + // controller: _controller, + autofocus: false, + textAlign: TextAlign.end, + decoration: InputDecoration( + //输入里面输入文字内边距设置 + hintText: rightTitle, + hintStyle: TextStyle(fontSize: 22.sp), + focusedBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + disabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + enabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + border: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + contentPadding: const EdgeInsets.symmetric(vertical: 0), + ), + style: TextStyle( + fontSize: 22.sp, textBaseline: TextBaseline.alphabetic), + ), + ), + SizedBox( + width: 10.w, + ), + Container( + width: 32.w, + height: 32.w, + decoration: const BoxDecoration( + color: Colors.white, + image: DecorationImage( + image: AssetImage('images/icon_addressBook.png'), + fit: BoxFit.fill), + ), + alignment: Alignment.center, + child: InkWell( + onTap: () async { + final Contact? currentContact = + await logic.state.contactPicker.selectContact(); + logic.state.contact = currentContact!; + if (currentContact.phoneNumbers!.isNotEmpty) { + logic.state.emailOrPhoneController.text = currentContact + .phoneNumbers![0] + .replaceAll(RegExp(r'\s+\b|\b\s'), ''); + } + if (currentContact.fullName!.isNotEmpty) { + logic.state.keyNameController.text = + currentContact.fullName!; + } + }, + ), + ) + ], + ), + ) + ], + ); + } + // 实名认证 Widget keyOnlyManageWidget() { return Column( children: [ - CommonItem( - leftTitel: '仅管理自己创建的用户', - rightTitle: '', - isHaveRightWidget: true, - isTipsImg: true, - tipsImgAction: () { - ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'); - }, - rightWidget: SizedBox( - width: 60.w, - height: 50.h, - child: _onlyManageYouCreatesUserSwitch())), + // CommonItem( + // leftTitel: '仅管理自己创建的用户'.tr, + // rightTitle: '', + // isHaveRightWidget: true, + // isTipsImg: true, + // tipsImgAction: () { + // ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr); + // }, + // rightWidget: SizedBox( + // width: 60.w, + // height: 50.h, + // child: _onlyManageYouCreatesUserSwitch())), + onlyManageSelf('仅管理自己创建的用户'.tr), Container(height: 10.h), keyRealNameWidget(), Container(height: 10.h), @@ -212,6 +297,67 @@ class _AuthorizedAdminPageState extends State ); } + Widget onlyManageSelf(String leftTitel) { + return Container( + // height: 65.h, + width: 1.sw, + padding: EdgeInsets.only(left: 20.w, right: 5.w, top: 10.h, bottom: 10.h), + color: Colors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 1.sw - 150.w, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Flexible( + child: Text(leftTitel ?? '', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 22.sp)), + ), + SizedBox(width: 5.w), + GestureDetector( + onTap: () { + ShowTipView() + .showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr); + }, + child: Container( + width: 50.h, + height: 50.h, + // color: Colors.red, + padding: + EdgeInsets.only(right: 10.h, top: 15.h, bottom: 10.h), + child: Image.asset( + 'images/icon_tips_Q.png', + width: 20.w, + height: 20.w, + ), + ), + ), + ], + ), + ), + // SizedBox(width: 6.w), + // Spacer(), + CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: state.onlyManageYouCreatesUser.value, + onChanged: (bool value) { + setState(() { + state.onlyManageYouCreatesUser.value = + !state.onlyManageYouCreatesUser.value; + }); + }, + ), + ], + ), + ); + } + Widget keyBottomWidget(String tipStr) { return Column( children: [ @@ -240,7 +386,7 @@ class _AuthorizedAdminPageState extends State //发送钥匙请求 logic.sendElectronicKeyRequest(); } else { - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }), Container( @@ -255,11 +401,11 @@ class _AuthorizedAdminPageState extends State if (isDemoMode == false) { Get.toNamed(Routers.volumeAuthorizationLockManagePage); } else { - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }, child: Text( - TranslationLoader.lanKeys!.volumeAuthorizationLock!.tr, + '批量授权锁'.tr, style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp), )), @@ -331,7 +477,7 @@ class _AuthorizedAdminPageState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '发送成功', + '发送成功'.tr, style: TextStyle( fontSize: 26.sp, color: Colors.black, @@ -355,8 +501,9 @@ class _AuthorizedAdminPageState extends State height: 10.h, ), OutLineBtn( - btnName: - state.emailOrPhoneController.text.contains('@') ? '邮件通知' : '短信通知', + btnName: state.emailOrPhoneController.text.contains('@') + ? '邮件通知'.tr + : '短信通知'.tr, onClick: () { Get.toNamed(Routers.sendEmailNotificationPage, arguments: { @@ -372,7 +519,7 @@ class _AuthorizedAdminPageState extends State height: 10.h, ), OutLineBtn( - btnName: '微信通知', + btnName: '微信通知'.tr, onClick: () { logic.sendMsg( isPhone: state.emailOrPhoneController.text.contains('@')); @@ -486,20 +633,20 @@ class _AuthorizedAdminPageState extends State } //仅管理自己创建的用户 - CupertinoSwitch _onlyManageYouCreatesUserSwitch() { - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: state.onlyManageYouCreatesUser.value, - onChanged: (bool value) { - setState(() { - state.onlyManageYouCreatesUser.value = - !state.onlyManageYouCreatesUser.value; - }); - }, - ); - } + // CupertinoSwitch _onlyManageYouCreatesUserSwitch() { + // return CupertinoSwitch( + // activeColor: CupertinoColors.activeBlue, + // trackColor: CupertinoColors.systemGrey5, + // thumbColor: CupertinoColors.white, + // value: state.onlyManageYouCreatesUser.value, + // onChanged: (bool value) { + // setState(() { + // state.onlyManageYouCreatesUser.value = + // !state.onlyManageYouCreatesUser.value; + // }); + // }, + // ); + // } Future _openModalBottomSheet() async { showModalBottomSheet( @@ -647,11 +794,11 @@ class _AuthorizedAdminPageState extends State TabBar _tabBar() { return TabBar( controller: state.tabController, - tabs: _itemTabs.map(_tab).toList(), onTap: (int index) { FocusScope.of(context).requestFocus(FocusNode()); }, - isScrollable: true, + tabs: _itemTabs.map(_tab).toList(), + isScrollable: false, indicatorColor: Colors.red, unselectedLabelColor: Colors.black, unselectedLabelStyle: TextStyle( @@ -668,20 +815,19 @@ class _AuthorizedAdminPageState extends State borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, width: 30.w), + labelPadding: EdgeInsets.symmetric(horizontal: 10.w), + padding: EdgeInsets.zero, // 去除TabBar两侧的间隙 ); } Tab _tab(ItemView item) { return Tab( - child: Container( - width: 1.sw / 4, - margin: EdgeInsets.all(10.w), - child: Text( - item.title, - textAlign: TextAlign.center, - ), - ), - ); + child: Container( + // color: Colors.red, + width: (1.sw - 10.w * 3) / 2, + // width: 1.sw / 4, + alignment: Alignment.center, + child: Text(item.title, textAlign: TextAlign.center))); } Widget _pageWidget() { diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart index 2d6591d5..3b092812 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart @@ -26,13 +26,13 @@ class AuthorizedAdminState { .obs; //默认为当前时间 结束时间 RxBool isSendSuccess = false.obs; - RxString countryName = '中国'.obs; + RxString countryName = '中国'.tr.obs; RxString countryCode = '86'.obs; RxList weekdaysList = [].obs; RxInt createUser = 0.obs; //用户未注册时传1 已注册传0 RxInt seletType = 0.obs; - String pwdShareStr = '您好,您的授权管理员生成成功'; + String pwdShareStr = '您好,您的授权管理员生成成功'.tr; RxString addUserId = ''.obs; RxBool isRequireAuth = false.obs; //是否需要实名认证的必填项 diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_logic.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_logic.dart index e1da3b71..4cd5df65 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_logic.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_logic.dart @@ -1,6 +1,7 @@ import 'dart:async'; +import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_state.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; @@ -44,7 +45,7 @@ class AuthorizedAdminListLogic extends BaseGetXController { final ElectronicKeyListEntity entity = await ApiRepository.to.deleteElectronicKey( keyId: keyId, includeUnderlings: includeUnderlings); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功'); + showToast('删除成功'.tr); pageNo = 1; mockNetworkDataRequest(); } diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_page.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_page.dart index 28daf30b..ec5adf83 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_page.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_page.dart @@ -17,7 +17,6 @@ import '../../../../tools/customNetworkImage.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class AuthorizedAdminListPage extends StatefulWidget { const AuthorizedAdminListPage({Key? key}) : super(key: key); @@ -54,7 +53,7 @@ class _AuthorizedAdminListPageState extends State { backgroundColor: AppColors.mainBackgroundColor, resizeToAvoidBottomInset: false, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.authorizedAdmin!.tr, + barTitle: '授权管理员'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -73,7 +72,7 @@ class _AuthorizedAdminListPageState extends State { height: 20.h, ), AddBottomWhiteBtn( - btnName: TranslationLoader.lanKeys!.addAuthorizedAdmin!.tr, + btnName: '添加授权管理员'.tr, onClick: () { Navigator.pushNamed(context, Routers.authorizedAdminPage) .then((Object? val) { @@ -129,14 +128,14 @@ class _AuthorizedAdminListPageState extends State { onPressed: (BuildContext context) { ShowTipView() .showDeleteAdministratorIsHaveAllDataDialog( - '同时删除其发送的所有钥匙,钥匙删除后不能恢复', (bool isAllData) { + '同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (bool isAllData) { logic.deleteKeyRequest(indexEntity.keyId.toString(), isAllData ? 1 : 0); }); }, backgroundColor: Colors.red, foregroundColor: Colors.white, - label: '删除', + label: '删除'.tr, padding: EdgeInsets.only(left: 5.w, right: 5.w), ), ], @@ -206,7 +205,7 @@ class _AuthorizedAdminListPageState extends State { padding: EdgeInsets.only(top: 20.h, bottom: 20.h), child: Row( children: [ - SizedBox(width: 30.w), + SizedBox(width: 20.w), SizedBox( width: 60.w, height: 60.w, @@ -215,36 +214,31 @@ class _AuthorizedAdminListPageState extends State { child: CustomNetworkImage( url: avatarURL, defaultUrl: 'images/controls_user.png', - width: 105.w, - height: 105.h, + width: 60.w, + height: 60.h, ), ), ), SizedBox(width: 20.w), - Expanded( + SizedBox( + width: 1.sw - 120.w, child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox( - width: 1.sw - 110.w - 100.w, - child: Row( - children: [ - Flexible( - child: Text(receiveUser, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor)), - ), - ], - ), - ), - SizedBox(width: 10.w), + Text(receiveUser, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 24.sp, + color: AppColors.blackColor)), + const Spacer(), Text( keyStatus, + textAlign: TextAlign.end, style: TextStyle(fontSize: 18.sp, color: Colors.red), ), ], @@ -261,11 +255,11 @@ class _AuthorizedAdminListPageState extends State { ), ], ), - SizedBox(width: 20.h), + // SizedBox(width: 20.h), ], ), ), - SizedBox(width: 20.h), + // SizedBox(width: 20.h), ], ), ), diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_page.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_page.dart index 60eb53ce..56e25421 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_page.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_page.dart @@ -1,10 +1,10 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_tabbar.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class VolumeAuthorizationLockManagePage extends StatefulWidget { const VolumeAuthorizationLockManagePage({Key? key}) : super(key: key); diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_tabbar.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_tabbar.dart index d62562af..d31d0096 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_tabbar.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_tabbar.dart @@ -1,10 +1,10 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/CustomUnderlineTabIndicator.dart'; -import '../../../../../translations/trans_lib.dart'; import '../volumeAuthorizationLock_page.dart'; class VolumeAuthorizationLockManageTabbar extends StatefulWidget { diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart index c1aa86c4..4db8d338 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart @@ -13,7 +13,7 @@ class VolumeAuthorizationLockLogic extends BaseGetXController { //发送批量授权管理员 Future addAuthorizedAdminRequest() async { if (state.keyNameController.text.isEmpty) { - showToast('请输入接收者姓名'); + showToast('请输入接收者姓名'.tr); return; } diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart index 09e671c6..0f035940 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -15,7 +16,6 @@ import 'package:star_lock/tools/showTipView.dart'; import '../../../../appRouters.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; -import '../../../../translations/trans_lib.dart'; import 'volumeAuthorizationLock_logic.dart'; class VolumeAuthorizationLockPage extends StatefulWidget { @@ -85,7 +85,7 @@ class _VolumeAuthorizationLockPageState return Column( children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.accountNumber!.tr, + leftTitel: '账号'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -94,7 +94,7 @@ class _VolumeAuthorizationLockPageState '请输入手机号或者邮箱'.tr, state.emailOrPhoneController)), CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -203,12 +203,12 @@ class _VolumeAuthorizationLockPageState }), Container(height: 10.h), CommonItem( - leftTitel: '仅管理自己创建的用户', + leftTitel: '仅管理自己创建的用户'.tr, rightTitle: '', isHaveRightWidget: true, isTipsImg: true, tipsImgAction: () { - ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'); + ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr); }, rightWidget: SizedBox( width: 60.w, @@ -335,7 +335,7 @@ class _VolumeAuthorizationLockPageState mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '发送成功', + '发送成功'.tr, style: TextStyle( fontSize: 26.sp, color: Colors.black, diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart index 8e1a79a3..84229d0c 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart @@ -18,7 +18,7 @@ class VolumeAuthorizationLockState { RxString selectFailureDate = ''.obs; //失效时间 Rx effectiveDateTime = DateTime.now().obs; Rx failureDateTime = DateTime.now().obs; - RxString countryName = '中国'.obs; + RxString countryName = '中国'.tr.obs; RxString countryCode = '86'.obs; RxString selectWidgetType = '0'.obs; } diff --git a/lib/main/lockDetail/card/addCardType/addCardType_logic.dart b/lib/main/lockDetail/card/addCardType/addCardType_logic.dart index af92363d..1027a50c 100755 --- a/lib/main/lockDetail/card/addCardType/addCardType_logic.dart +++ b/lib/main/lockDetail/card/addCardType/addCardType_logic.dart @@ -51,7 +51,7 @@ class AddCardTypeLogic extends BaseGetXController{ // } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } // AppLog.log("state.timeLimitBeginTime.value:${state.timeLimitBeginTime.value} startDate:$startDate"); diff --git a/lib/main/lockDetail/card/addCardType/addCardType_page.dart b/lib/main/lockDetail/card/addCardType/addCardType_page.dart index 061c2aed..52f3d3ba 100755 --- a/lib/main/lockDetail/card/addCardType/addCardType_page.dart +++ b/lib/main/lockDetail/card/addCardType/addCardType_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -15,10 +14,10 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; +import '../../../../tools/key_name_item.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'addCardType_logic.dart'; class AddCardPage extends StatefulWidget { @@ -79,10 +78,10 @@ class _AddCardPageState extends State return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyBottomWidget() ], ), @@ -94,10 +93,10 @@ class _AddCardPageState extends State return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyTimeLimitWidget(), // SizedBox(height: 10.h), keyBottomWidget() @@ -111,10 +110,10 @@ class _AddCardPageState extends State return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyCyclicDate(), SizedBox(height: 10.h), keyBottomWidget() @@ -127,21 +126,6 @@ class _AddCardPageState extends State } } - // 密码命名输入框 - Widget perpetualKeyWidget( - String titleStr, String rightTitle, TextEditingController controller) { - return Column( - children: [ - CommonItem( - leftTitel: titleStr, - rightTitle: '', - isHaveRightWidget: true, - rightWidget: getTFWidget(rightTitle)), - Container(height: 10.h), - ], - ); - } - // 限时顶部选择日期 Widget keyTimeLimitWidget() { return Column( @@ -155,7 +139,8 @@ class _AddCardPageState extends State final PDuration selectDate = PDuration.parse( DateTime.parse(state.timeLimitBeginTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { state.timeLimitBeginTime.value = DateTool().getYMDHNDateString(p, 1); }); @@ -165,10 +150,11 @@ class _AddCardPageState extends State rightTitle: state.timeLimitEndTime.value, isHaveDirection: true, action: () { - final PDuration selectDate = - PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value)); + final PDuration selectDate = PDuration.parse( + DateTime.tryParse(state.timeLimitEndTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { state.timeLimitEndTime.value = DateTool().getYMDHNDateString(p, 1); }); @@ -189,14 +175,14 @@ class _AddCardPageState extends State isHaveDirection: true, isHaveLine: true, action: () async { - final result = - await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -213,7 +199,8 @@ class _AddCardPageState extends State isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -233,10 +220,12 @@ class _AddCardPageState extends State visible: state.effectiveDateTime.value.isNotEmpty, child: CommonItem( leftTitel: '有效时间'.tr, - rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}', + rightTitle: + '${state.effectiveDateTime.value}-${state.failureDateTime.value}', isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -270,7 +259,7 @@ class _AddCardPageState extends State SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.stressCard!.tr, + leftTitel: '胁迫卡'.tr, rightTitle: '', isTipsImg: false, isHaveRightWidget: true, @@ -286,7 +275,7 @@ class _AddCardPageState extends State )), SizedBox(height: 30.h), SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { @@ -305,59 +294,6 @@ class _AddCardPageState extends State ); } - // 接受者信息输入框 - Widget getTFWidget(String tfStr) { - return Container( - // color: Colors.red, - height: 65.h, - width: 300.w, - padding: EdgeInsets.only(top: 5.h), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: TextField( - //输入框一行 - maxLines: 1, - inputFormatters: [ - FilteringTextInputFormatter.deny('\n'), - LengthLimitingTextInputFormatter(50), - ], - style: TextStyle( - fontSize: 22.sp, color: AppColors.darkGrayTextColor), - controller: state.nameController, - autofocus: false, - textAlign: TextAlign.end, - decoration: InputDecoration( - //输入里面输入文字内边距设置 - // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), - hintText: tfStr, - hintStyle: TextStyle(fontSize: 22.sp), - focusedBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - disabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - enabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - border: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - contentPadding: const EdgeInsets.symmetric(vertical: 0), - ), - ), - ), - SizedBox( - width: 10.w, - ), - ], - ), - ); - } - //isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹 CupertinoSwitch _isStressFingerprint() { return CupertinoSwitch( @@ -403,10 +339,8 @@ class _AddCardPageState extends State }, tabs: state.fromType.value == 1 ? _itemTabs.map(_tab).toList() - : _fromCheckInTypeItemTabs - .map(_tab) - .toList(), - isScrollable: true, + : _fromCheckInTypeItemTabs.map(_tab).toList(), + isScrollable: false, indicatorColor: Colors.red, unselectedLabelColor: Colors.black, unselectedLabelStyle: TextStyle( @@ -423,13 +357,18 @@ class _AddCardPageState extends State borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, width: 30.w), + labelPadding: EdgeInsets.symmetric(horizontal: 10.w), + padding: EdgeInsets.zero, // 去除TabBar两侧的间隙 ); } Tab _tab(ItemView item) { return Tab( - child: SizedBox( - width: 1.sw / 5, + child: Container( + // color: Colors.red, + width: (1.sw - 10.w * 5) / 3, + // width: 1.sw / 4, + alignment: Alignment.center, child: Text(item.title, textAlign: TextAlign.center))); } @@ -438,9 +377,7 @@ class _AddCardPageState extends State child: TabBarView( controller: state.tabController, children: state.fromType.value == 1 - ? _itemTabs - .map((ItemView item) => Obx(indexChangeWidget)) - .toList() + ? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList() : _fromCheckInTypeItemTabs .map((ItemView item) => Obx(indexChangeWidget)) .toList(), diff --git a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart index 9884cbd3..8e0df9c7 100755 --- a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart +++ b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart @@ -7,6 +7,7 @@ import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/card/addICCard/addICCard_entity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart'; @@ -15,6 +16,7 @@ import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/sender_manage.dart'; import '../../../../network/api_repository.dart'; +import '../../../../tools/bugly/bugly_tool.dart'; import '../../../../tools/dateTool.dart'; import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/storage.dart'; @@ -41,6 +43,11 @@ class AddICCardLogic extends BaseGetXController{ Future _replyAddICCardBegin(Reply reply) async { final int status = reply.data[2]; + BuglyTool.uploadException( + message: '添加卡开始,解析数据', + detail: '添加卡开始,解析数据 _replyAddICCardBegin:${reply.data}', + upload: false + ); switch(status){ case 0x00: @@ -68,7 +75,7 @@ class AddICCardLogic extends BaseGetXController{ final List token = reply.data.sublist(5, 9); final List saveStrList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, saveStrList); - AppLog.log('添加卡token:$token'); + // AppLog.log('添加卡token:$token'); IoSenderManage.senderAddCardWithTimeCycleCoercionCommand( keyID:'1', @@ -101,10 +108,24 @@ class AddICCardLogic extends BaseGetXController{ Future _replyAddICCardConfirmation(Reply reply) async { final int status = reply.data[2]; state.ifAddState.value = false; + + BuglyTool.uploadException( + message: '添加卡结果,解析数据', + detail: '添加卡结果,解析数据 _replyAddICCardConfirmation:${reply.data}', + eventStr: '添加卡事件结果', + upload: true + ); + + final String getMobile = (await Storage.getMobile())!; switch(status){ case 0x00: //成功 - //成功 + UmengCommonSdk.onEvent('add_card', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_card_result':'成功', + }); switch(reply.data[5]){ case 0xff: // 注册指纹失败 @@ -139,28 +160,69 @@ class AddICCardLogic extends BaseGetXController{ break; default: //失败 + UmengCommonSdk.onEvent('add_card', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_card_result':reply.data[2], + }); break; } } // 添加卡片 Future senderAddICCard() async { - showBlueConnetctToastTimer(action: (){ + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); + + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + final String command = SenderAddICCardWithTimeCycleCoercionCommand( + keyID:'1', + userID:await Storage.getUid(), + cardNo:0, + useCountLimit:0xffff, + operate:0, // 0:注册 1:修改 2:删除 3:删除全部 + isAdmin:state.isAdministrator.value == '2' ? 1 : 0, + isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫 + isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环 + weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环 + startDate: int.parse(state.startDate.value)~/1000, + endDate: int.parse(state.endDate.value)~/1000, + startTime:DateTool().dateToHNString(state.effectiveDateTime.value), + endTime:DateTool().dateToHNString(state.failureDateTime.value), + needAuthor:1, + signKey:signKeyDataList, + privateKey:getPrivateKeyList, + token: getTokenList, + ).toString(); + + showBlueConnetctToastTimer(action: () async { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('add_card', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_card_result':'添加卡超时', + }); + + BuglyTool.uploadException( + message: '添加卡超时处理-添加卡失败', + detail: '添加卡超时处理,断开连接,添加卡失败--SenderAddICCardWithTimeCycleCoercionCommand:$command', + eventStr: '添加卡事件超时', + upload: true + ); + Get.close(1); }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected){ cancelBlueConnetctToastTimer(); - final List? signKey = await Storage.getStringList(saveBlueSignKey); - final List signKeyDataList = changeStringListToIntList(signKey!); - - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); - - final List? token = await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); - IoSenderManage.senderAddCardWithTimeCycleCoercionCommand( keyID:'1', userID:await Storage.getUid(), @@ -182,6 +244,21 @@ class AddICCardLogic extends BaseGetXController{ isBeforeAddUser: false ); } else if (deviceConnectionState == BluetoothConnectionState.disconnected){ + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('add_card', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_card_result':'添加卡断开连接', + }); + + BuglyTool.uploadException( + message: '添加卡超时处理-添加卡失败', + detail: '添加卡超时处理,断开连接,添加卡失败--SenderAddICCardWithTimeCycleCoercionCommand:$command', + eventStr: '添加卡事件断开连接', + upload: true + ); + if(state.ifCurrentScreen.value == true){ showBlueConnetctToast(); } diff --git a/lib/main/lockDetail/card/addICCard/addICCard_page.dart b/lib/main/lockDetail/card/addICCard/addICCard_page.dart index b10c0169..565270df 100755 --- a/lib/main/lockDetail/card/addICCard/addICCard_page.dart +++ b/lib/main/lockDetail/card/addICCard/addICCard_page.dart @@ -60,7 +60,7 @@ class _AddICCardPageState extends State with RouteAware { child: Center( child: Obx(() => Text( state.ifConnectScuess.value - ? '已连接到锁,请将卡靠近锁的读卡区'.tr + ? '已连接到锁,请将卡靠近门锁的读卡区'.tr : '尝试连接设备...'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp)))), ), diff --git a/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart b/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart index 3ec4635b..bc2fd663 100755 --- a/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart +++ b/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart @@ -15,7 +15,6 @@ import '../../../../tools/dateTool.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; import 'cardDetail_logic.dart'; @@ -113,7 +112,7 @@ class _CardDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + leftTitel: '有效日'.tr, rightTitle: logic.weekDayStr.join(','), isHaveDirection: true, isHaveLine: true, @@ -173,7 +172,7 @@ class _CardDetailPageState extends State with RouteAware { )), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.stressCard!.tr, + leftTitel: '胁迫卡'.tr, rightTitle: '', isTipsImg: false, isHaveLine: true, diff --git a/lib/main/lockDetail/card/cardList/cardList_logic.dart b/lib/main/lockDetail/card/cardList/cardList_logic.dart index f57cde7c..a11cd18c 100755 --- a/lib/main/lockDetail/card/cardList/cardList_logic.dart +++ b/lib/main/lockDetail/card/cardList/cardList_logic.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'dart:convert'; @@ -131,7 +130,8 @@ class CardListLogic extends BaseGetXController { privateKey: getPrivateKeyList, token: getTokenList, isBeforeAddUser: false); - } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); if (state.ifCurrentScreen.value == true) { @@ -218,51 +218,17 @@ class CardListLogic extends BaseGetXController { String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4 if (fingerprintItemData.cardType! == 1) { keyDateTypeStr = - '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久'; + '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}'; } else if (fingerprintItemData.cardType! == 2) { keyDateTypeStr = - '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时'; + '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}'; } else if (fingerprintItemData.cardType! == 4) { keyDateTypeStr = - '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环'; + '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}'; } return keyDateTypeStr; } - void signBlue(){ - // final authCode = crypto.md5.convert([48,50,57,52,102,179,68,85,170,30,0,0,111,9,183,38,188,37,220,154,158,173,242,98]); - // AppLog.log('authCode:$authCode'); - - // final ebcData = SM4.encrypt([48, 145, 84, 77, 72, 95, 49, 101, 48, 54, 56, 57, 97, 56, 56, 54, 102, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 57, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 179, 68, 85, 32, 98, 99, 101, 101, 56, 97, 50, 51, 51, 99, 102, 51, 52, 53, 48, 101, 57, 53, 52, 51, 98, 49, 51, 56, 53, 52, 49, 48, 57, 100, 56, 54], key: utf8.encode('TMH_1e0689a886f8'), mode: SM4CryptoMode.ECB); - // AppLog.log('ebcData:$ebcData'); - - // final oriDataList = SM4.decrypt([103, 213, 54, 227, 120, 57, 155, 4, 31, 95, 214, 233, 229, 100, 85, 18], key: utf8.encode('TMH_1e0689a886f8'), mode: SM4CryptoMode.ECB); - // AppLog.log('oriDataList:$oriDataList'); - - final List authCodeData = []; - //authUserID - authCodeData.addAll(utf8.encode('294')); - - //KeyID - authCodeData.addAll(utf8.encode('0')); - - //NowTime 4 - // DateTime now = DateTime.now(); - // int timestamp = now.millisecondsSinceEpoch; - var nowTime = 1723083753; - authCodeData.add((nowTime & 0xff000000) >> 24); - authCodeData.add((nowTime & 0xff0000) >> 16); - authCodeData.add((nowTime & 0xff00) >> 8); - authCodeData.add(nowTime & 0xff); - - authCodeData.addAll([168, 37, 0, 0, 190, 240, 188, 129, 150, 249, 113, 15, 44, 243, 227, 30]); - - AppLog.log('authCodeData:$authCodeData'); - // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode - final authCode = crypto.md5.convert(authCodeData); - AppLog.log('authCode:$authCode authCode.bytes.length:${authCode.bytes.length} authCode.bytes:${authCode.bytes}'); - } - @override Future onReady() async { super.onReady(); @@ -274,8 +240,6 @@ class CardListLogic extends BaseGetXController { _initRefreshAction(); } - - // signBlue(); } @override diff --git a/lib/main/lockDetail/card/cardList/cardList_page.dart b/lib/main/lockDetail/card/cardList/cardList_page.dart index 9dc6a76f..705d5c8c 100755 --- a/lib/main/lockDetail/card/cardList/cardList_page.dart +++ b/lib/main/lockDetail/card/cardList/cardList_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -15,7 +16,6 @@ import '../../../../tools/showTipView.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; import '../../fingerprint/fingerprintList/fingerprintListData_entity.dart'; import 'cardList_logic.dart'; @@ -62,7 +62,8 @@ class _CardListPageState extends State with RouteAware { backgroundColor: AppColors.mainColor, actionsList: [ TextButton( - child: Text('重置'.tr, + child: Text( + '重置'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () async { @@ -107,14 +108,13 @@ class _CardListPageState extends State with RouteAware { SizedBox(height: 20.h), Expanded(child: _buildMainUI()), AddBottomWhiteBtn( - btnName: - '添加卡'.tr, + btnName: '添加卡'.tr, onClick: () async { - await Get.toNamed(Routers.addCardPage, - arguments: { - 'lockId': state.lockId.value, - 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 - })!.then((value) { + await Get.toNamed(Routers.addCardPage, arguments: { + 'lockId': state.lockId.value, + 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 + })! + .then((value) { getHttpData(isRefresh: true); }); // if (data != null) { @@ -176,10 +176,11 @@ class _CardListPageState extends State with RouteAware { fingerprintItemData.cardName!, logic.getKeyType(fingerprintItemData), logic.getKeyDateType(fingerprintItemData), () async { - await Get.toNamed(Routers.cardDetailPage, + await Get.toNamed(Routers.cardDetailPage, arguments: { - 'fingerprintItemData': fingerprintItemData, - })!.then((value) => getHttpData(isRefresh: true)); + 'fingerprintItemData': fingerprintItemData, + })! + .then((value) => getHttpData(isRefresh: true)); // if (data != null) { // getHttpData(isRefresh: true); // } @@ -207,39 +208,34 @@ class _CardListPageState extends State with RouteAware { return GestureDetector( onTap: action, child: Container( - height: 90.h, + // height: 90.h, // margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w), + padding: EdgeInsets.only(top: 10.h, bottom: 10.h), color: Colors.white, child: Row( children: [ SizedBox(width: 30.w), Image.asset(lockTypeIcon, width: 60.w, height: 60.w), SizedBox(width: 20.w), - Expanded( + SizedBox( + width: 1.sw - 30.w - 20.w - 60.w - 20.w, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox( - width: 1.sw - 110.w - 100.w, - child: Row( - children: [ - Flexible( - child: Text(lockTypeTitle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor)), - ), - ], - ), + Expanded( + child: Text(lockTypeTitle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor)), ), + SizedBox(width: 10.w), Text(ifInvalidation, style: TextStyle(fontSize: 22.sp, color: Colors.red)), - SizedBox(width: 10.w), + // SizedBox(width: 10.w), ], ), SizedBox(height: 5.h), @@ -248,19 +244,17 @@ class _CardListPageState extends State with RouteAware { children: [ Flexible( child: Text(showTime, - maxLines: 1, - overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 18.sp, color: AppColors.placeholderTextColor)), ), ], ), - SizedBox(width: 20.h), + // SizedBox(width: 20.h), ], ), ), - SizedBox(width: 20.h), + SizedBox(width: 20.w), ], ), ), diff --git a/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart b/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart index 8c399193..d96c04a9 100755 --- a/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart +++ b/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart @@ -13,7 +13,6 @@ import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'otherTypeKeyChangeDate_logic.dart'; class OtherTypeKeyChangeDatePage extends StatefulWidget { @@ -51,13 +50,13 @@ class _OtherTypeKeyChangeDatePageState extends State state.endTimeTimestamp.value || state.beginTimeTimestamp.value == state.endTimeTimestamp.value) { - logic.showToast('失效时间需大于生效时间'.tr); + logic.showToast('失效时间需晚于生效时间'.tr); return; } if (state.endTimeTimestamp.value < DateTime.now().millisecondsSinceEpoch) { - logic.showToast('生效时间需大于当前时间'.tr); + logic.showToast('生效时间需晚于当前时间'.tr); return; } switch (state.pushType.value) { diff --git a/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart b/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart index d6e609f2..dd652865 100755 --- a/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart +++ b/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -12,7 +13,6 @@ import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'otherTypeKeyChangeValidityDate_logic.dart'; class OtherTypeKeyChangeValidityDatePage extends StatefulWidget { @@ -45,7 +45,7 @@ class _OtherTypeKeyChangeValidityDatePageState extends State state.endDateTimestamp.value) { - logic.showToast('失效日期要大于生效日期'.tr); + logic.showToast('失效日期需晚于生效日期'.tr); return; } @@ -69,7 +69,7 @@ class _OtherTypeKeyChangeValidityDatePageState extends State= state.endTimeTimestamp.value) { - logic.showToast('失效时间要大于生效时间'.tr); + logic.showToast('失效时间需晚于生效时间'.tr); return; } @@ -116,7 +116,7 @@ class _OtherTypeKeyChangeValidityDatePageState extends State[ Obx(() => CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.begin!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '开始时间'.tr, rightTitle: state.starTime.value, isHaveDirection: true, isHaveLine: true, action: () { - PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.starTime.value, 0)); + final PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.starTime.value, 0)); Pickers.showDatePicker(context, selectDate: selectDate, mode: DateMode.HM, onConfirm: (PDuration p) { @@ -265,12 +264,11 @@ class _OtherTypeKeyChangeValidityDatePageState extends State CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.end!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '结束时间'.tr, rightTitle: state.endTime.value, isHaveDirection: true, action: () { - PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.endTime.value, 0)); + final PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.endTime.value, 0)); Pickers.showDatePicker(context, selectDate: selectDate, mode: DateMode.HM, onConfirm: (PDuration p) { diff --git a/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_logic.dart b/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_logic.dart index 346d6767..c8802569 100755 --- a/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_logic.dart @@ -1,4 +1,5 @@ +import 'package:star_lock/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_entity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../network/api_repository.dart'; @@ -10,7 +11,7 @@ class CheckingInDetailLogic extends BaseGetXController{ // 获取考勤详情 Future getCheckInDetailData(BlockLoadSuccssCallback loadSuccssCallback) async{ - var entity = await ApiRepository.to.getCheckInDetailData( + final CheckingInDetailEntity entity = await ApiRepository.to.getCheckInDetailData( companyId: state.companyId.value, attendanceDate:state.checkDate.value.toString(), staffId: state.staffId.value.toString(), diff --git a/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_page.dart b/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_page.dart index 2f83b3b0..80667af3 100755 --- a/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInDetail/checkingInDetail_page.dart @@ -5,7 +5,6 @@ import 'package:star_lock/main/lockDetail/checkingIn/checkingInDetail/checkingIn import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'checkingInDetail_logic.dart'; class CheckingInDetailPage extends StatefulWidget { diff --git a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_logic.dart b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_logic.dart index 7216cf81..145f92d9 100755 --- a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_logic.dart @@ -11,11 +11,11 @@ class CheckingInAddHolidaysLogic extends BaseGetXController{ // 添加假期 Future editStaffLoadData() async{ if(state.staffNameController.text.isEmpty){ - showToast('请输入姓名'); + showToast('请输入姓名'.tr); return; } - LoginEntity entity = await ApiRepository.to.addHolidaysData( + final LoginEntity entity = await ApiRepository.to.addHolidaysData( companyId: state.companyId.value, fillClassDate: state.makeUpWorkDate.value.isNotEmpty ? DateTime.parse(state.makeUpWorkDate.value).millisecondsSinceEpoch.toString() : '', vacationEndDate: DateTime.parse(state.endDate.value).millisecondsSinceEpoch.toString(), @@ -23,8 +23,9 @@ class CheckingInAddHolidaysLogic extends BaseGetXController{ vacationStartDate: DateTime.parse(state.beginDate.value).millisecondsSinceEpoch.toString() ); if(entity.errorCode!.codeIsSuccessful){ - showToast('添加成功'); - Get.back(result: 'addScuess'); + showToast('添加成功'.tr, something: (){ + Get.back(result: 'addScuess'); + }); } } diff --git a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_page.dart b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_page.dart index 91535149..b504e3db 100755 --- a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_page.dart @@ -4,13 +4,15 @@ import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/checkingIn/checkingInHolidays/checkingInAddHolidays/checkingInAddHolidays_state.dart'; +import 'package:star_lock/tools/pickers/pickers.dart'; +import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; +import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/showCalendar.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'checkingInAddHolidays_logic.dart'; class CheckingInAddHolidaysPage extends StatefulWidget { @@ -32,7 +34,7 @@ class _CheckingInAddHolidaysPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.addedHoliday!.tr, + barTitle: '添加假日'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -43,70 +45,46 @@ class _CheckingInAddHolidaysPageState extends State { isHaveLine: true, isHaveRightWidget: true, setHeight: false, - rightWidget: getTFWidget( - '(${TranslationLoader.lanKeys!.mustFillIn!.tr})', - maxSize: 50)), + rightWidget: getTFWidget('(${"必填".tr})', maxSize: 50)), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.startDate!.tr, + leftTitel: '开始日期'.tr, rightTitle: state.beginDate.value.isEmpty - ? '(${TranslationLoader.lanKeys!.mustFillIn!.tr})' + ? '(${'必填'.tr})' : state.beginDate.value, isHaveLine: true, isHaveDirection: false, action: () async { - await showDialog( - context: context, - builder: (BuildContext context) { - return ShowCalendar( - datePickerMode: DatePickerMode.day, - selectAction: (DateTime dateTime) { - final String beginDate = formatDate( - dateTime, [yyyy, '-', mm, '-', dd]); - state.beginDate.value = beginDate; - Get.back(); - // Navigator.of(context).pop(true); - }); - }); + Pickers.showDatePicker(context, + selectDate: PDuration.now(), + mode: DateMode.YMD, onConfirm: (PDuration p) { + state.beginDate.value = formatDate(p); + }); })), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.endDate!.tr, + leftTitel: '结束日期'.tr, rightTitle: state.endDate.value.isEmpty - ? '(${TranslationLoader.lanKeys!.mustFillIn!.tr})' + ? '(${"必填".tr})' : state.endDate.value, isHaveLine: true, isHaveDirection: false, action: () async { - await showDialog( - context: context, - builder: (BuildContext context) { - return ShowCalendar( - datePickerMode: DatePickerMode.day, - selectAction: (DateTime dateTime) { - final String endDate = formatDate( - dateTime, [yyyy, '-', mm, '-', dd]); - state.endDate.value = endDate; - Get.back(); - }); - }); + Pickers.showDatePicker(context, + selectDate: PDuration.now(), + mode: DateMode.YMD, onConfirm: (PDuration p) { + state.endDate.value = formatDate(p); + }); })), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.coverDate!.tr, + leftTitel: '补班日期'.tr, rightTitle: state.makeUpWorkDate.value, isHaveLine: false, isHaveDirection: false, action: () async { - await showDialog( - context: context, - builder: (BuildContext context) { - return ShowCalendar( - datePickerMode: DatePickerMode.day, - selectAction: (DateTime dateTime) { - final String makeUpWorkDate = formatDate( - dateTime, [yyyy, '-', mm, '-', dd]); - state.makeUpWorkDate.value = makeUpWorkDate; - Get.back(); - }); - }); + Pickers.showDatePicker(context, + selectDate: PDuration.now(), + mode: DateMode.YMD, onConfirm: (PDuration p) { + state.makeUpWorkDate.value = formatDate(p); + }); })), SizedBox( height: 50.w, @@ -168,4 +146,21 @@ class _CheckingInAddHolidaysPageState extends State { ), ); } + + String formatDate(PDuration p) { + if (p == null) { + throw ArgumentError('Input must be a valid DateTime object'); + } + + String formatPart(int part) { + return part.toString().padLeft(2, '0'); + } + + String monthFormatted = formatPart(p.month!); + String dayFormatted = formatPart(p.day!); + String hourFormatted = formatPart(p.hour!); + String minuteFormatted = formatPart(p.minute!); + + return '${p.year}-${monthFormatted}-${dayFormatted}'; + } } diff --git a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_logic.dart b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_logic.dart index cff44450..8becd761 100755 --- a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_logic.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../../network/api_repository.dart'; import 'checkingInDeletHolidays_state.dart'; @@ -9,11 +10,11 @@ class CheckingInDeletHolidaysLogic extends BaseGetXController{ // 删除假期 Future deletStaffLoadData() async{ - var entity = await ApiRepository.to.deletHolidaysData( + final LoginEntity entity = await ApiRepository.to.deletHolidaysData( vacationId: state.listItem.value.vacationId.toString() ); if(entity.errorCode!.codeIsSuccessful){ - showToast('删除成功'); + showToast('删除成功'.tr); Get.back(result: 'deletScuess'); } } diff --git a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_page.dart b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_page.dart index 74608576..6fd5222b 100755 --- a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInDeletHolidays/checkingInDeletHolidays_page.dart @@ -8,7 +8,6 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'checkingInDeletHolidays_logic.dart'; class CheckingInDeletHolidaysPage extends StatefulWidget { @@ -27,7 +26,7 @@ class _CheckingInDeletHolidaysPageState extends State[ @@ -58,16 +57,16 @@ class _CheckingInDeletHolidaysPageState extends State editStaffLoadData() async{ - var entity = await ApiRepository.to.holidaysListData( + final CheckingInSetHolidaysInfoDataEntity entity = await ApiRepository.to.holidaysListData( companyId: state.companyId.value, vacationYear: state.selectYear.value.toString(), ); diff --git a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInSetHolidays/checkingInSetHolidays_page.dart b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInSetHolidays/checkingInSetHolidays_page.dart index 2042376e..1f2515ca 100755 --- a/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInSetHolidays/checkingInSetHolidays_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInHolidays/checkingInSetHolidays/checkingInSetHolidays_page.dart @@ -13,7 +13,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'checkingInSetHolidays_entity.dart'; import 'checkingInSetHolidays_logic.dart'; @@ -100,7 +99,7 @@ class _CheckingInSetHolidaysPageState extends State { width: l, child: Center( child: Text( - '${holidaysMonthListData.listItem![0].month}\n${TranslationLoader.lanKeys!.month!.tr}', + '${holidaysMonthListData.listItem![0].month}\n${"月".tr}', textAlign: TextAlign.center, style: TextStyle(fontSize: 28.sp, color: Colors.white), ))), @@ -165,7 +164,7 @@ class _CheckingInSetHolidaysPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - '${TranslationLoader.lanKeys!.libertyDay!.tr}:$vacationStartDate - $vacationEndDate', + '${"放假日期".tr}:$vacationStartDate - $vacationEndDate', style: TextStyle(fontSize: 20.sp), ), ], @@ -175,7 +174,7 @@ class _CheckingInSetHolidaysPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - '${TranslationLoader.lanKeys!.coverDate!.tr}:$makeUpClass', + '${"补班日期".tr}:$makeUpClass', style: TextStyle(fontSize: 20.sp), ), ], @@ -197,7 +196,7 @@ class _CheckingInSetHolidaysPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '${state.selectYear.value}${TranslationLoader.lanKeys!.year!.tr}', + '${state.selectYear.value}${'年'.tr}', style: TextStyle(color: Colors.white, fontSize: 26.sp), ), SizedBox( @@ -219,8 +218,6 @@ class _CheckingInSetHolidaysPageState extends State { context, // 模式,详见下方 mode: DateMode.Y, - // 后缀 默认Suffix.normal(),为空的话Suffix() - suffix: Suffix(years: ' 年'), // 样式 详见下方样式 pickerStyle: PickerStyle( cancelButton: GestureDetector( diff --git a/lib/main/lockDetail/checkingIn/checkingInList/checkingInListSeletMonth_page.dart b/lib/main/lockDetail/checkingIn/checkingInList/checkingInListSeletMonth_page.dart index 0931ead4..f11d4796 100644 --- a/lib/main/lockDetail/checkingIn/checkingInList/checkingInListSeletMonth_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInList/checkingInListSeletMonth_page.dart @@ -19,7 +19,7 @@ class _CheckingInListSeletMonthPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ // SizedBox(width: 30.w,), - Row( - children: [ - SizedBox( - width: 20.w, - ), - GestureDetector( - onTap: () async { - final bool? isDemoMode = - await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - setState(() { - state.isDay.value = true; - final DateTime dateTime = - DateTime.fromMillisecondsSinceEpoch( - state.checkListDateTimestamp.value); - final String beginDate = - formatDate(dateTime, [mm, '-', dd]); - state.checkListDate.value = beginDate; - logic.loadDataByType(); - }); - } else { - // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'.tr); - } - }, - child: Container( - width: 90.w, - // height: 100.h, - color: Colors.white, - child: Obx(() => Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text(TranslationLoader.lanKeys!.dailyCharts!.tr, - style: TextStyle( - color: state.isDay.value - ? AppColors.mainColor - : Colors.black, - fontSize: 22.sp)), - SizedBox(height: 10.h), - Visibility( - visible: state.isDay.value, - child: Container( - width: 20.w, - height: 2.h, - color: state.isDay.value - ? AppColors.mainColor - : Colors.black), - ) - ], - )), + Expanded( + child: Row( + children: [ + SizedBox( + width: 20.w, ), - ), - // SizedBox(width: 20.w,), - GestureDetector( - onTap: () async { - final bool? isDemoMode = - await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - setState(() { - state.isDay.value = false; - final DateTime dateTime = - DateTime.fromMillisecondsSinceEpoch( - state.checkListDateTimestamp.value); - final String beginDate = - formatDate(dateTime, [mm]); - state.checkListDate.value = beginDate; - logic.loadDataByType(); - }); - } else { - // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); - } - }, - child: Container( - width: 90.w, - // height: 100.h, - color: Colors.white, - child: Obx(() => Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text( - TranslationLoader - .lanKeys!.monthlyLeaderboard!.tr, - style: TextStyle( - color: !state.isDay.value - ? AppColors.mainColor - : Colors.black, - fontSize: 22.sp)), - SizedBox(height: 10.h), - Visibility( - visible: !state.isDay.value, + GestureDetector( + onTap: () async { + final bool? isDemoMode = + await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + setState(() { + state.isDay.value = true; + final DateTime dateTime = + DateTime.fromMillisecondsSinceEpoch( + state.checkListDateTimestamp.value); + final String beginDate = + formatDate(dateTime, [mm, '-', dd]); + state.checkListDate.value = beginDate; + logic.loadDataByType(); + }); + } else { + // Get.toNamed(Routers.selectLockTypePage); + logic.showToast('演示模式'.tr); + } + }, + child: Container( + + // height: 100.h, + color: Colors.white, + child: Obx(() => Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text('日榜'.tr, + style: TextStyle( + color: state.isDay.value + ? AppColors.mainColor + : Colors.black, + fontSize: 22.sp)), + SizedBox(height: 10.h), + Visibility( + visible: state.isDay.value, child: Container( width: 20.w, height: 2.h, - color: !state.isDay.value + color: state.isDay.value ? AppColors.mainColor - : Colors.black)) - ], - )), + : Colors.black), + ) + ], + )), + ), ), - ), - ], + SizedBox(width: 20.w,), + GestureDetector( + onTap: () async { + final bool? isDemoMode = + await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + setState(() { + state.isDay.value = false; + final DateTime dateTime = + DateTime.fromMillisecondsSinceEpoch( + state.checkListDateTimestamp.value); + final String beginDate = + formatDate(dateTime, [mm]); + state.checkListDate.value = beginDate; + logic.loadDataByType(); + }); + } else { + // Get.toNamed(Routers.selectLockTypePage); + logic.showToast('演示模式'.tr); + } + }, + child: Container( + + // height: 100.h, + color: Colors.white, + child: Obx(() => Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text('月榜'.tr, + style: TextStyle( + color: !state.isDay.value + ? AppColors.mainColor + : Colors.black, + fontSize: 22.sp)), + SizedBox(height: 10.h), + Visibility( + visible: !state.isDay.value, + child: Container( + width: 20.w, + height: 2.h, + color: !state.isDay.value + ? AppColors.mainColor + : Colors.black)) + ], + )), + ), + ), + ], + ), ), GestureDetector( onTap: () async { @@ -239,7 +239,7 @@ class _CheckingInListPageState extends State { }); } else { // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }, child: Row( @@ -284,7 +284,7 @@ class _CheckingInListPageState extends State { SizedBox(height: 5.h), Text(state.lateTimes.value, style: TextStyle(color: Colors.black, fontSize: 20.sp)), - Text(TranslationLoader.lanKeys!.beLate!.tr, + Text('迟到'.tr, style: TextStyle(color: Colors.black, fontSize: 22.sp)), SizedBox(height: 5.h), ], @@ -295,7 +295,7 @@ class _CheckingInListPageState extends State { SizedBox(height: 5.h), Text(state.earlyTimes.value, style: TextStyle(color: Colors.black, fontSize: 20.sp)), - Text(TranslationLoader.lanKeys!.leaveEarly!.tr, + Text('早退'.tr, style: TextStyle(color: Colors.black, fontSize: 22.sp)), SizedBox(height: 5.h), ], @@ -306,7 +306,7 @@ class _CheckingInListPageState extends State { SizedBox(height: 5.h), Text(state.noPunchTimes.value, style: TextStyle(color: Colors.black, fontSize: 20.sp)), - Text(TranslationLoader.lanKeys!.noCardPunched!.tr, + Text('未打卡'.tr, style: TextStyle(color: Colors.black, fontSize: 22.sp)), SizedBox(height: 5.h), ], @@ -525,16 +525,16 @@ class _CheckingInListPageState extends State { void showListType() { final List list = [ - TranslationLoader.lanKeys!.earlyArrivalList!.tr, - TranslationLoader.lanKeys!.lateList!.tr, - TranslationLoader.lanKeys!.hardWorkingList!.tr + '早到榜'.tr, + '迟到榜'.tr, + '勤奋榜'.tr ]; ShowBottomSheetTool().showSingleRowPicker( //上下文 context, //默认的索引 normalIndex: 0, - title: TranslationLoader.lanKeys!.rankingList!.tr, + title: '排列方式'.tr, cancelTitle: '取消'.tr, sureTitle: '确定'.tr, //要显示的列表 diff --git a/lib/main/lockDetail/checkingIn/checkingInList/checkingInList_state.dart b/lib/main/lockDetail/checkingIn/checkingInList/checkingInList_state.dart index 21726b4b..ca5010b3 100755 --- a/lib/main/lockDetail/checkingIn/checkingInList/checkingInList_state.dart +++ b/lib/main/lockDetail/checkingIn/checkingInList/checkingInList_state.dart @@ -2,7 +2,6 @@ import 'package:date_format/date_format.dart'; import 'package:get/get.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/entity/lockListInfo_entity.dart'; import 'checkingInListDay_entity.dart'; import 'checkingInListMonth_entity.dart'; @@ -16,7 +15,7 @@ class CheckingInListState{// 未打车 final RxString companyId = ''.obs; final RxString listType = '1'.obs;// 1早到榜 2迟到榜 3勤奋榜 - final RxString listTypeStr = TranslationLoader.lanKeys!.earlyArrivalList!.tr.obs;// 1早到榜 2迟到榜 3勤奋榜 + final RxString listTypeStr = '早到榜'.tr.obs;// 1早到榜 2迟到榜 3勤奋榜 final RxBool isDay = true.obs;// 日榜还是月榜 final RxInt checkListDateTimestamp = DateTime.now().millisecondsSinceEpoch.obs;// 查询日期时间戳 final RxString checkListDate = formatDate(DateTime.now(), [mm,'-',dd]).obs;// 查询日期 diff --git a/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_logic.dart b/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_logic.dart index 6d61b06d..e3b49ce6 100755 --- a/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_logic.dart @@ -66,7 +66,7 @@ class CheckingInSetLogic extends BaseGetXController { ); if (entity.errorCode!.codeIsSuccessful) { state.companyName.value = state.changeNameController.text; - showToast('修改成功'); + showToast('修改成功'.tr); } } diff --git a/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_page.dart b/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_page.dart index f96de974..c88e7740 100755 --- a/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInSet/checkingInSet_page.dart @@ -12,7 +12,6 @@ import '../../../../tools/showTFView.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'checkingInSet_logic.dart'; class CheckingInSetPage extends StatefulWidget { @@ -37,8 +36,7 @@ class _CheckingInSetPageState extends State { body: Column( children: [ Obx(() => CommonItem( - leftTitel: - '公司名称'.tr, + leftTitel: '公司名称'.tr, rightTitle: state.companyName.value ?? '', // isHaveRightWidget: true, // rightWidget: getTFWidget(), @@ -48,63 +46,70 @@ class _CheckingInSetPageState extends State { showCupertinoAlertDialog(context); })), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.staff!.tr, + leftTitel: '员工'.tr, rightTitle: state.staffNumber.value, isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.checkingInStaffManagePage, arguments: { - 'getKeyInfosData': state.getKeyInfosData.value, - 'companyId': state.companyId.value - }); + Get.toNamed(Routers.checkingInStaffManagePage, + arguments: { + 'getKeyInfosData': state.getKeyInfosData.value, + 'companyId': state.companyId.value + }); })), Obx(() => CommonItem( - leftTitel: - '${TranslationLoader.lanKeys!.work!.tr}${TranslationLoader.lanKeys!.time!.tr}', - rightTitle: (state.beginTime.value.isNotEmpty) ? '${state.beginTime.value} - ${state.endTime.value}' : '', + leftTitel: '工作时间'.tr, + rightTitle: (state.beginTime.value.isNotEmpty) + ? '${state.beginTime.value} - ${state.endTime.value}' + : '', isHaveLine: true, isHaveDirection: true, action: () async { - var data = await Get.toNamed(Routers.checkingInSetWorkTimePage, arguments: { - // "getKeyInfosData": state.getKeyInfosData.value, - 'companyId': state.companyId.value, - 'pushType': '2', - 'checkingInSetInfo': state.checkingInSetInfo.value, - }); - if(data != null) { + var data = await Get.toNamed(Routers.checkingInSetWorkTimePage, + arguments: { + // "getKeyInfosData": state.getKeyInfosData.value, + 'companyId': state.companyId.value, + 'pushType': '2', + 'checkingInSetInfo': state.checkingInSetInfo.value, + }); + if (data != null) { setState(logic.getCheckInSetInfoData); } })), Obx(() => CommonItem( - leftTitel: - '${TranslationLoader.lanKeys!.workday!.tr}${TranslationLoader.lanKeys!.set!.tr}', - rightTitle: state.isCustom.value == true ? state.weekDaysStr.value : (state.weekDays.value.length == 6 ? '单休' : '双休'), + leftTitel: '工作日设置'.tr, + rightTitle: state.isCustom.value == true + ? state.weekDaysStr.value + : (state.weekDays.value.length == 6 ? '单休'.tr : '双休'.tr), isHaveLine: true, isHaveDirection: true, action: () async { - var data = await Get.toNamed(Routers.checkingInSetWorkdaySet, arguments: { - 'getKeyInfosData': state.getKeyInfosData.value, - 'companyId': state.companyId.value, - 'pushType': '2', - 'checkingInSetInfo': state.checkingInSetInfo.value, - }); - if(data != null) { + var data = await Get.toNamed(Routers.checkingInSetWorkdaySet, + arguments: { + 'getKeyInfosData': state.getKeyInfosData.value, + 'companyId': state.companyId.value, + 'pushType': '2', + 'checkingInSetInfo': state.checkingInSetInfo.value, + }); + if (data != null) { state.isCustom.value = data['attendanceType']; state.weekDays.value = data['weekDays']; state.weekDaysStr.value = state.weekDays.join(','); - AppLog.log('state.weekDays.value:${state.weekDays.value} state.weekDaysStr.value:${state.weekDaysStr.value}'); + AppLog.log( + 'state.weekDays.value:${state.weekDays.value} state.weekDaysStr.value:${state.weekDaysStr.value}'); setState(() {}); } })), CommonItem( - leftTitel: TranslationLoader.lanKeys!.holidays!.tr, + leftTitel: '节假日'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, action: () { - Get.toNamed(Routers.checkingInSetHolidaysPage, arguments: { - 'companyId': state.companyId.value - }); + Get.toNamed(Routers.checkingInSetHolidaysPage, + arguments: { + 'companyId': state.companyId.value + }); }), SizedBox( height: 30.h, @@ -119,7 +124,8 @@ class _CheckingInSetPageState extends State { margin: EdgeInsets.only(left: 30.w, right: 30.w, top: 20.w), padding: EdgeInsets.only(top: 20.w, bottom: 20.w), onClick: () { - ShowTipView().showIosTipWithContentDialog('是否删除?'.tr, logic.deletCompanyData); + ShowTipView().showIosTipWithContentDialog( + '是否删除?'.tr, logic.deletCompanyData); // showDeletCompanyAlertDialog(context); }), ), @@ -133,18 +139,18 @@ class _CheckingInSetPageState extends State { context: context, builder: (BuildContext context) { return ShowTFView( - title: '修改公司名字'.tr, + title: '修改名字'.tr, tipTitle: '', controller: state.changeNameController, inputFormatters: [ - LengthLimitingTextInputFormatter(30), + LengthLimitingTextInputFormatter(30), ], sureClick: () { - if(state.changeNameController.text.isEmpty){ + if (state.changeNameController.text.isEmpty) { logic.showToast('请输入公司名字'.tr); return; } - if(state.changeNameController.text.length <6){ + if (state.changeNameController.text.length < 6) { logic.showToast('公司名字长度不能小于 6 '.tr); return; } @@ -153,7 +159,8 @@ class _CheckingInSetPageState extends State { }, cancelClick: () { Get.back(); - },); + }, + ); }); } @@ -177,7 +184,8 @@ class _CheckingInSetPageState extends State { FilteringTextInputFormatter.deny('\n'), LengthLimitingTextInputFormatter(30), ], - style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), controller: state.nameController, autofocus: false, enabled: false, @@ -187,10 +195,18 @@ class _CheckingInSetPageState extends State { // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), // hintText: state.companyName.value ?? "", hintStyle: TextStyle(fontSize: 22.sp), - focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - enabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - border: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), + focusedBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + disabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + enabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + border: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), contentPadding: const EdgeInsets.symmetric(vertical: 0), ), ), @@ -202,5 +218,4 @@ class _CheckingInSetPageState extends State { ), ); } - } diff --git a/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_logic.dart b/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_logic.dart index 8a4a2cdd..1eca168f 100755 --- a/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_logic.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../network/api_repository.dart'; @@ -10,7 +11,7 @@ class CheckingInSetWorkTimeLogic extends BaseGetXController{ // 编辑考勤设置信息 Future editCheckInSetInfoData() async{ - var entity = await ApiRepository.to.editCheckInSetInfoData( + final LoginEntity entity = await ApiRepository.to.editCheckInSetInfoData( attendanceType: state.checkingInSetInfo.value.attendanceType.toString(), companyId: state.checkingInSetInfo.value.companyId.toString(), type: '2', @@ -20,7 +21,7 @@ class CheckingInSetWorkTimeLogic extends BaseGetXController{ workDay:state.checkingInSetInfo.value.workDay!, ); if(entity.errorCode!.codeIsSuccessful){ - showToast('修改成功', something: (){ + showToast('修改成功'.tr, something: (){ Get.back(result: 'scuess'); }); } diff --git a/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_page.dart b/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_page.dart index fde37ccc..63208ef0 100755 --- a/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInSetWorkTime/checkingInSetWorkTime_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -11,7 +12,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'checkingInSetWorkTime_logic.dart'; class CheckingInSetWorkTimePage extends StatefulWidget { @@ -31,8 +31,7 @@ class _CheckingInSetWorkTimePageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: - '${TranslationLoader.lanKeys!.work!.tr} ${TranslationLoader.lanKeys!.time!.tr} ${TranslationLoader.lanKeys!.set!.tr}', + barTitle: '工作时间设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: buildMainUI(), @@ -43,7 +42,7 @@ class _CheckingInSetWorkTimePageState extends State { return Column( children: [ Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.officeHours!.tr, + leftTitel: '上班时间'.tr, rightTitle: state.beginTime.value, isHaveDirection: true, isHaveLine: true, @@ -60,7 +59,7 @@ class _CheckingInSetWorkTimePageState extends State { }); })), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.closingTime!.tr, + leftTitel: '下班时间'.tr, rightTitle: state.endTime.value, isHaveDirection: true, action: () { @@ -86,18 +85,18 @@ class _CheckingInSetWorkTimePageState extends State { padding: EdgeInsets.only(top: 20.w, bottom: 20.w), onClick: () { if (state.beginTimeTimestamp.value.isEmpty) { - logic.showToast('请选择开始时间'); + logic.showToast('请选择开始时间'.tr); return; } if (state.endTimeTimestamp.value.isEmpty) { - logic.showToast('请选择结束时间'); + logic.showToast('请选择结束时间'.tr); return; } if (int.parse(state.beginTimeTimestamp.value) >= int.parse(state.endTimeTimestamp.value)) { - logic.showToast('结束时间必须要比开始时间晚,请重新选择'); + logic.showToast('结束时间不能小于开始时间哦'.tr); return; } if (state.pushType.value == '2') { diff --git a/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_logic.dart b/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_logic.dart index f1581530..323e0a7d 100755 --- a/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_logic.dart @@ -21,7 +21,7 @@ class CheckingInSetWorkdaySetLogic extends BaseGetXController{ workDay:state.weekDays.value, ); if(entity.errorCode!.codeIsSuccessful){ - showToast('修改成功', something: (){ + showToast('修改成功'.tr, something: (){ eventBus.fire(RefreshCheckInSetDataEvent()); Get.back(result: { 'attendanceType':state.isCustom.value, diff --git a/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_page.dart b/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_page.dart index c5279af1..a3a058a8 100755 --- a/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdaySet_page.dart @@ -7,7 +7,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'checkingInSetWorkdaySet_logic.dart'; class CheckingInSetWorkdaySet extends StatefulWidget { @@ -19,37 +18,44 @@ class CheckingInSetWorkdaySet extends StatefulWidget { } class _CheckingInSetWorkdaySetState extends State { - final CheckingInSetWorkdaySetLogic logic = Get.put(CheckingInSetWorkdaySetLogic()); - final CheckingInSetWorkdaySetState state = Get.find().state; + final CheckingInSetWorkdaySetLogic logic = + Get.put(CheckingInSetWorkdaySetLogic()); + final CheckingInSetWorkdaySetState state = + Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: - '${TranslationLoader.lanKeys!.workday!.tr} ${TranslationLoader.lanKeys!.set!.tr}', + barTitle: '工作日设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( children: [ topBtnWidget(), - Obx(() => Visibility(visible: state.isCustom.value, child: bottomCustomSelectBtn())), - Obx(() => Visibility(visible: !state.isCustom.value, child: bottomOddOrEvenDaysOffSelectBtn())), - SizedBox(height: 50.h,), + Obx(() => Visibility( + visible: state.isCustom.value, child: bottomCustomSelectBtn())), + Obx(() => Visibility( + visible: !state.isCustom.value, + child: bottomOddOrEvenDaysOffSelectBtn())), + SizedBox( + height: 50.h, + ), Container( margin: EdgeInsets.only(left: 20.w, right: 20.w), - child: SubmitBtn(btnName: '确定'.tr, onClick: () { - if(state.pushType.value == '2'){ - logic.editCheckInSetInfoData(); - }else{ - Get.back(result: { - 'attendanceType':state.isCustom.value, - 'weekDays':state.weekDays.value, - }); - } - - }), + child: SubmitBtn( + btnName: '确定'.tr, + onClick: () { + if (state.pushType.value == '2') { + logic.editCheckInSetInfoData(); + } else { + Get.back(result: { + 'attendanceType': state.isCustom.value, + 'weekDays': state.weekDays.value, + }); + } + }), ), ], ), @@ -59,58 +65,64 @@ class _CheckingInSetWorkdaySetState extends State { Widget topBtnWidget() { return Container( width: 1.sw, - height: 100.h, + constraints: BoxConstraints(minHeight: 100.h), // color: Colors.red, padding: EdgeInsets.all(10.w), child: Obx(() => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: (){ - setState(() { - state.isCustom.value = true; - }); - }, - child: Container( - width: (1.sw - 5.w * 2) / 2, - height: 100.h, - color: state.isCustom.value ? AppColors.mainColor : AppColors.btnDisableColor, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Center(child: Text('自定义'.tr, style: TextStyle(fontSize: 26.sp, color: Colors.white))), - ], + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + setState(() { + state.isCustom.value = true; + }); + }, + child: Container( + width: (1.sw - 5.w * 2) / 2, + height: 100.h, + color: state.isCustom.value + ? AppColors.mainColor + : AppColors.btnDisableColor, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Text('自定义'.tr, + style: TextStyle( + fontSize: 26.sp, color: Colors.white))), + ], + ), + ), ), - ), - ), - // SizedBox(width: 10.w,), - GestureDetector( - onTap: (){ - setState(() { - state.isCustom.value = false; - }); - }, - child: Container( - width: (1.sw - 10 * 3) / 2, - height: 100.h, - color: state.isCustom.value ? AppColors.btnDisableColor : AppColors.mainColor, - padding: EdgeInsets.all(10.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Center( - child: Text( - TranslationLoader.lanKeys!.oddOrEvenDaysOff!.tr, - style: TextStyle(fontSize: 26.sp, color: Colors.white), - textAlign: TextAlign.center, - ))), - ], + // SizedBox(width: 10.w,), + GestureDetector( + onTap: () { + setState(() { + state.isCustom.value = false; + }); + }, + child: Container( + width: (1.sw - 10 * 3) / 2, + color: state.isCustom.value + ? AppColors.btnDisableColor + : AppColors.mainColor, + padding: EdgeInsets.all(10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Center( + child: Text( + '单双休'.tr, + style: TextStyle(fontSize: 26.sp, color: Colors.white), + textAlign: TextAlign.center, + ))), + ], + ), + ), ), - ), - ), - ], - )), + ], + )), ); } @@ -120,46 +132,56 @@ class _CheckingInSetWorkdaySetState extends State { child: Column( children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.thisWeek!.tr, + leftTitel: '本周'.tr, rightTitle: '', allHeight: 60.h, isHaveLine: true), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.singleDayWeekend!.tr, + leftTitel: '单休'.tr, rightTitle: '', allHeight: 60.h, isHaveLine: true, isHaveRightWidget: true, - action: (){ + action: () { setState(() { state.isSingledayWeekend.value = 0; - state.weekDays.value = [1, 2 , 3, 4, 5, 6]; + state.weekDays.value = [1, 2, 3, 4, 5, 6]; }); }, rightWidget: Row( children: [ - Image.asset(state.isSingledayWeekend.value == 0 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, height: 30.w,), + Image.asset( + state.isSingledayWeekend.value == 0 + ? 'images/icon_round_select.png' + : 'images/icon_round_unSelect.png', + width: 30.w, + height: 30.w, + ), ], - ) - )), + ))), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.twoDaysOff!.tr, + leftTitel: '双休'.tr, rightTitle: '', allHeight: 60.h, isHaveLine: false, isHaveRightWidget: true, - action: (){ + action: () { setState(() { state.isSingledayWeekend.value = 1; - state.weekDays.value = [1, 2 , 3, 4, 5]; + state.weekDays.value = [1, 2, 3, 4, 5]; }); }, rightWidget: Row( children: [ - Image.asset(state.isSingledayWeekend.value == 1 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, height: 30.w,), + Image.asset( + state.isSingledayWeekend.value == 1 + ? 'images/icon_round_select.png' + : 'images/icon_round_unSelect.png', + width: 30.w, + height: 30.w, + ), ], - ) - )), + ))), ], ), ); @@ -207,12 +229,12 @@ class _CheckingInSetWorkdaySetState extends State { allHeight: 60.h, isHaveLine: true, isHaveRightWidget: true, - action: (){ + action: () { setState(() { state.isSingledayWeekend.value = 2; - if(state.weekDays.value.contains(index)){ + if (state.weekDays.value.contains(index)) { state.weekDays.value.remove(index); - }else{ + } else { state.weekDays.value.add(index); } state.weekDays.value.sort(); @@ -220,13 +242,16 @@ class _CheckingInSetWorkdaySetState extends State { }, rightWidget: Row( children: [ - Image.asset(state.weekDays.value.contains(index) ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, height: 30.w,), + Image.asset( + state.weekDays.value.contains(index) + ? 'images/icon_round_select.png' + : 'images/icon_round_unSelect.png', + width: 30.w, + height: 30.w, + ), ], - ) - )); - } - ), + ))); + }), ); } - } diff --git a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_logic.dart b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_logic.dart index 5646051e..08ef0c38 100755 --- a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_logic.dart +++ b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_logic.dart @@ -107,7 +107,7 @@ class CheckingInAddStaffLogic extends BaseGetXController { //获取密码请求 Future getKeyboardPwdRequest() async { if (state.staffNameController.text.isEmpty) { - showToast('请输入姓名'); + showToast('请输入姓名'.tr); return; } final PasswordKeyEntity entity = await ApiRepository.to.getPasswordKey( diff --git a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart index 839054b7..6c958d48 100755 --- a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart @@ -13,7 +13,6 @@ import '../../../../../tools/commonItem.dart'; import '../../../../../tools/showBottomSheetTool.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'checkingInAddStaff_logic.dart'; class CheckingInAddStaffPage extends StatefulWidget { @@ -33,8 +32,7 @@ class _CheckingInAddStaffPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: - "${state.isAdd.value == "1" ? '添加'.tr : "编辑".tr}${TranslationLoader.lanKeys!.staff!.tr}", + barTitle: state.isAdd.value == '1' ? '添加员工'.tr : '员工信息'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -50,7 +48,7 @@ class _CheckingInAddStaffPageState extends State { state.staffNameController)), // 选择打卡方式 Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.punchingMode!.tr, + leftTitel: '打卡方式'.tr, rightTitle: state.selectPrintingMethodStr.value, isHaveLine: false, isHaveDirection: true, @@ -106,16 +104,15 @@ class _CheckingInAddStaffPageState extends State { child: Column( children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.accountNumber!.tr, + leftTitel: '账号'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: getTFWidget( - "${'请输入'.tr}${"员工".tr}${TranslationLoader.lanKeys!.accountNumber!.tr}", + '请输入员工账号'.tr, state.staffAccountController)), CommonItem( - leftTitel: - TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel:'国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -172,8 +169,7 @@ class _CheckingInAddStaffPageState extends State { final dynamic data = await Get.toNamed( Routers.addCardPage, arguments: { - 'lockId': - state.getKeyInfosData.value.lockId, + 'lockId': state.getKeyInfosData.value.lockId, 'fromType': 2, // 1从添加钥匙列表进入 2从考勤添加员工入口进入 'fromTypeTwoStaffName': state.staffNameController.text @@ -425,16 +421,16 @@ class _CheckingInAddStaffPageState extends State { String title = ''; switch (int.parse(state.selectPrintingMethodType.value)) { case 1: - title = TranslationLoader.lanKeys!.whetherTheEmployeeHasAKey!.tr; + title = '员工是否有钥匙'.tr; break; case 2: - title = TranslationLoader.lanKeys!.whetherTheEmployeeHasPassword!.tr; + title = '员工是否有密码'.tr; break; case 3: - title = TranslationLoader.lanKeys!.whetherTheEmployeeHasCard!.tr; + title = '员工是否有卡'.tr; break; case 4: - title = TranslationLoader.lanKeys!.whetherTheEmployeeHasFingerprint!.tr; + title = '员工是否有指纹'.tr; break; case 4: title = '员工是否有人脸'.tr; @@ -447,7 +443,7 @@ class _CheckingInAddStaffPageState extends State { String title = ''; switch (int.parse(state.selectPrintingMethodType.value)) { case 1: - title = TranslationLoader.lanKeys!.accountNumber!.tr; + title = '账号'.tr; break; case 2: title = '密码'.tr; @@ -459,7 +455,7 @@ class _CheckingInAddStaffPageState extends State { title = '指纹'.tr; break; case 5: - title = TranslationLoader.lanKeys!.humanFace!.tr; + title = '人脸'.tr; break; } return title; @@ -469,16 +465,16 @@ class _CheckingInAddStaffPageState extends State { String title = ''; switch (int.parse(state.selectPrintingMethodType.value)) { case 1: - title = TranslationLoader.lanKeys!.getKey!.tr; + title = '获取钥匙'.tr; break; case 2: title = '获取密码'.tr; break; case 3: - title = TranslationLoader.lanKeys!.getCard!.tr; + title = '获取卡'.tr; break; case 4: - title = TranslationLoader.lanKeys!.getFingerprint!.tr; + title = '获取指纹'.tr; break; case 5: title = '获取人脸'.tr; diff --git a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart index 49d7c06f..b27c4735 100755 --- a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart @@ -11,7 +11,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/noData.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'checkingInStaffList_entity.dart'; import 'checkingInStaffList_logic.dart'; @@ -34,7 +33,7 @@ class _CheckingInStaffListPageState extends State { return Scaffold( backgroundColor: AppColors.greyBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.staff!.tr, + barTitle: '员工'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ diff --git a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart index a0a40fcc..e36759c2 100755 --- a/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart +++ b/lib/main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart @@ -8,7 +8,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'checkingInStaffDetail_logic.dart'; class CheckingInStaffDetailPage extends StatefulWidget { @@ -33,7 +32,7 @@ class _CheckingInStaffDetailPageState extends State { actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.edit!.tr, + '编辑'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { @@ -53,7 +52,7 @@ class _CheckingInStaffDetailPageState extends State { rightTitle: state.staffListItemData.value.staffName, isHaveLine: true)), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.punchingMode!.tr, + leftTitel: '打卡方式'.tr, rightTitle: state.attendanceType.value, isHaveLine: true)), // Obx(() => CommonItem( @@ -73,7 +72,7 @@ class _CheckingInStaffDetailPageState extends State { ), )), CommonItem( - leftTitel: TranslationLoader.lanKeys!.attendanceRecord!.tr, + leftTitel: '考勤记录'.tr, rightTitle: '', isHaveDirection: true, action: (){ diff --git a/lib/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_page.dart b/lib/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_page.dart index 659dd965..d86056c2 100644 --- a/lib/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_page.dart +++ b/lib/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -12,7 +13,6 @@ import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import 'package:star_lock/tools/submitBtn.dart'; import 'package:star_lock/tools/titleAppBar.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class BatchExportLogPage extends StatefulWidget { const BatchExportLogPage({Key? key}) : super(key: key); diff --git a/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart index 574c760e..6bae44f5 100644 --- a/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart @@ -25,7 +25,7 @@ class _DoorLockLogDetailPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '操作记录详情', + barTitle: '操作记录详情'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -36,7 +36,7 @@ class _DoorLockLogDetailPageState extends State { children: [ Container( padding: EdgeInsets.all(20.w), - child: Text('操作时间:${DateTool().dateIntToYMDHNString(state.timelineDataItem.value.operateDate)}', style: TextStyle(fontSize: 23.sp)), + child: Text('操作时间'.tr +':${DateTool().dateIntToYMDHNString(state.timelineDataItem.value.operateDate)}', style: TextStyle(fontSize: 23.sp)), ), Container( width: 1.sw, diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart index a5780ab3..23d9a38e 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart @@ -1,13 +1,17 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_state.dart'; import 'package:star_lock/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart'; import 'package:star_lock/tools/commonDataManage.dart'; +import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../blue/blue_manage.dart'; import '../../../blue/io_protocol/io_referEventRecordTime.dart'; @@ -17,14 +21,16 @@ import '../../../blue/io_tool/manager_event_bus.dart'; import '../../../blue/sender_manage.dart'; import '../../../network/api_repository.dart'; import '../../../tools/baseGetXController.dart'; +import '../../../tools/bugly/bugly_tool.dart'; import '../../../tools/storage.dart'; import '../lockOperatingRecord/keyOperationRecord_entity.dart'; class DoorLockLogLogic extends BaseGetXController { - DoorLockLogState state = DoorLockLogState(); + final DoorLockLogState state = DoorLockLogState(); // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { @@ -37,8 +43,16 @@ class DoorLockLogLogic extends BaseGetXController { // 根据时间查解析数据 Future _replyReferEventRecordTime(Reply reply) async { + BuglyTool.uploadException( + message: '查询锁记录结果,解析数据', + detail: '查询锁记录结果,解析数据:${reply.data}', + eventStr: '查询锁记录事件结果', + upload: true); + + state.isLockReceiveResponse = true; cancelBlueConnetctToastTimer(); final int status = reply.data[2]; + switch (status) { case 0x00: //成功 @@ -75,10 +89,10 @@ class DoorLockLogLogic extends BaseGetXController { (0xff & indexList[4]) << 16 | (0xff & indexList[5]) << 8 | (0xFF & indexList[6]); - final operateDate = time * 1000; - final serverTime = state.currentDate; + final int operateDate = time * 1000; + final int serverTime = state.currentDate; if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( - DateTime.fromMillisecondsSinceEpoch(serverTime*1000))) { + DateTime.fromMillisecondsSinceEpoch(serverTime * 1000))) { // AppLog.log('operateDate:$operateDate state.currentDate:${state.currentDate}'); continue; } @@ -99,16 +113,62 @@ class DoorLockLogLogic extends BaseGetXController { break; default: //失败 + dismissEasyLoading(); break; } } // 查询事件记录(时间查询) Future senderReferEventRecordTime() async { + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); + + final String command = SenderReferEventRecordTimeCommand( + keyID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + logsCount: state.logCountPage, + // time:DateTime.now().millisecondsSinceEpoch~/1000, + time: state.operateDate, + currentDate: state.currentDate, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList, + ).toString(); + showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); + showBlueConnetctToastTimer( + isShowBlueConnetctToast: true, + action: () async { + cancelBlueConnetctToastTimer(); + + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('check_doorLockLog', { + 'lockName': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '超时', + }); + + BuglyTool.uploadException( + message: '查询锁记录超时-查询锁记录失败', + detail: + '添加密码超时,查询锁记录失败--senderReferEventRecordTimeCommand:$command', + eventStr: '查询锁记录事件超时', + upload: true); + if (state.isLockReceiveResponse == false) { + dismissEasyLoading(); + } + }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionStateState) async { if (connectionStateState == BluetoothConnectionState.connected) { @@ -139,11 +199,26 @@ class DoorLockLogLogic extends BaseGetXController { ); } else if (connectionStateState == BluetoothConnectionState.disconnected) { - dismissEasyLoading(); - cancelBlueConnetctToastTimer(); if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } + cancelBlueConnetctToastTimer(); + + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('check_doorLockLog', { + 'lockName': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '断开连接', + }); + + BuglyTool.uploadException( + message: '查询锁记录超时-查询锁记录失败', + detail: + '添加密码超时,查询锁记录失败--senderReferEventRecordTimeCommand:$command', + eventStr: '查询锁记录事件断开连接', + upload: true); } }); } @@ -173,19 +248,20 @@ class DoorLockLogLogic extends BaseGetXController { /// 刷新门锁日志列表 StreamSubscription? _getDoorLockLogListRefreshUIEvent; - void _getDoorLockLogListRefreshUIAction() { _getDoorLockLogListRefreshUIEvent = eventBus .on() .listen((DoorLockLogListRefreshUI event) { state.currentSelectDate.value = event.getDoorLockLogTime; -// 设置startDate为当天的0点 + + // 设置startDate为当天的0点 state.startDate.value = DateTime( state.currentSelectDate.value.year, state.currentSelectDate.value.month, state.currentSelectDate.value.day) .millisecondsSinceEpoch; -// 设置endDate为下一天的0点,然后减去1毫秒 + + // 设置endDate为下一天的0点,然后减去1毫秒 state.endDate.value = DateTime( state.currentSelectDate.value.year, state.currentSelectDate.value.month, @@ -206,28 +282,46 @@ class DoorLockLogLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) { state.operateDate = entity.data!.operateDate! ~/ 1000; state.currentDate = entity.data!.currentDate! ~/ 1000; - AppLog.log( - 'entity.data!.currentDate!:${entity.data!.currentDate!} currentDate:${state.currentDate}'); + // AppLog.log('entity.data!.currentDate!:${entity.data!.currentDate!} currentDate:${state.currentDate}'); senderReferEventRecordTime(); } } // 操作记录上传 Future lockRecordUploadData(List list) async { - AppLog.log('上传数据:$list'); + // AppLog.log('上传数据:$list'); // 无数据时不上传 - if(list.isEmpty){ + if (list.isEmpty) { return; } final KeyOperationRecordEntity entity = await ApiRepository.to .lockRecordUploadData( lockId: state.keyInfos.value.lockId.toString(), records: list); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { if (state.ifHaveNext == true) { + showEasyLoading(); getLockRecordLastUploadDataTime(); } else { + UmengCommonSdk.onEvent('check_doorLockLog', { + 'lockName': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '成功', + }); mockNetworkDataRequest(isRefresh: true); } + dismissEasyLoading(); + } else { + UmengCommonSdk.onEvent('check_doorLockLog', { + 'lockName': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '上传数据接口失败', + }); + dismissEasyLoading(); } } @@ -237,7 +331,7 @@ class DoorLockLogLogic extends BaseGetXController { .clearOperationRecord( CommonDataManage().currentKeyInfo.lockId.toString()); if (entity.errorCode!.codeIsSuccessful) { - showToast('清除数据成功', something: () { + showToast('清除数据成功'.tr, something: () { pageNo = 1; mockNetworkDataRequest(isRefresh: true); }); @@ -265,9 +359,10 @@ class DoorLockLogLogic extends BaseGetXController { // 获取是否是演示模式 演示模式不获取接口 final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { - getLockRecordLastUploadDataTime(); - _initReplySubscription(); mockNetworkDataRequest(isRefresh: true); + + // getLockRecordLastUploadDataTime(); + _initReplySubscription(); } } diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart index 3221ec45..561cf30b 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart @@ -19,7 +19,6 @@ import 'package:timelines/timelines.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/appRouteObserver.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class DoorLockLogPage extends StatefulWidget { const DoorLockLogPage({Key? key}) : super(key: key); @@ -53,8 +52,10 @@ class _DoorLockLogPageState extends State with RouteAware { ), onTap: () { ShowTipView().showSureAlertDialog( - '1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。\n2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录', - tipTitle: '看不到操作记录,可能原因有', + '1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。'.tr + + '\n' + + '2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录'.tr, + tipTitle: '看不到操作记录,可能原因有'.tr, sureStr: '我知道了'.tr); }, )), @@ -66,13 +67,13 @@ class _DoorLockLogPageState extends State with RouteAware { color: Colors.black, itemBuilder: (BuildContext context) { return >[ - _buildCustomPopupMenuItem('读取记录'), + _buildCustomPopupMenuItem('读取记录'.tr), if (CommonDataManage().currentKeyInfo.isLockOwner == 1) const PopupMenuDivider(), if (CommonDataManage().currentKeyInfo.isLockOwner == 1) - _buildCustomPopupMenuItem('清空记录'), + _buildCustomPopupMenuItem('清空记录'.tr), const PopupMenuDivider(), - _buildCustomPopupMenuItem('导出记录'), + _buildCustomPopupMenuItem('导出记录'.tr), ]; }, icon: Image.asset( @@ -88,7 +89,7 @@ class _DoorLockLogPageState extends State with RouteAware { body: Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ topAdvancedCalendarWidget(), Divider( height: 1, @@ -121,37 +122,57 @@ class _DoorLockLogPageState extends State with RouteAware { } void _onMenuItemSelected(String value) { - switch (value) { - case '读取记录': - { - logic.mockNetworkDataRequest(isRefresh: true); - } - break; - case '清空记录': - { - ShowCupertinoAlertView().showClearOperationRecordAlert( - clearClick: () { - logic.clearOperationRecordRequest(); - }); - } - break; - case '导出记录': - { - showDialog( - context: context, - builder: (BuildContext context) { - return ExportRecordDialog( - onExport: (String filePath) { - Get.toNamed(Routers.exportSuccessPage, - arguments: {'filePath': filePath}); - }, - ); + if (value == '读取记录'.tr) { + logic.mockNetworkDataRequest(isRefresh: true); + } else if (value == '清空记录'.tr) { + ShowCupertinoAlertView().showClearOperationRecordAlert(clearClick: () { + logic.clearOperationRecordRequest(); + }); + } else if (value == '导出记录'.tr) { + showDialog( + context: context, + builder: (BuildContext context) { + return ExportRecordDialog( + onExport: (String filePath) { + Get.toNamed(Routers.exportSuccessPage, + arguments: {'filePath': filePath}); }, ); - } - break; + }, + ); } } + // switch (value) { + // case "读取记录".tr: + // { + // logic.mockNetworkDataRequest(isRefresh: true); + // } + // break; + // case '清空记录'.tr: + // { + // ShowCupertinoAlertView().showClearOperationRecordAlert( + // clearClick: () { + // logic.clearOperationRecordRequest(); + // }); + // } + // break; + // case '导出记录': + // { + // showDialog( + // context: context, + // builder: (BuildContext context) { + // return ExportRecordDialog( + // onExport: (String filePath) { + // Get.toNamed(Routers.exportSuccessPage, + // arguments: {'filePath': filePath}); + // }, + // ); + // }, + // ); + // } + // break; + // } + // } //顶部日历小部件 Widget topAdvancedCalendarWidget() { @@ -177,7 +198,7 @@ class _DoorLockLogPageState extends State with RouteAware { disabledColor: Colors.grey, ), child: Stack( - children: [ + children: [ AdvancedCalendar( controller: state.calendarControllerCustom, events: state.events, @@ -196,7 +217,7 @@ class _DoorLockLogPageState extends State with RouteAware { top: 8.0, right: 8.0, child: Obx(() => Text( - '${state.currentSelectDate.value.year}年${state.currentSelectDate.value.month}月', + '${state.currentSelectDate.value.year}${'年'.tr}${state.currentSelectDate.value.month}${'月'.tr}', style: theme.textTheme.titleMedium!.copyWith( fontSize: 16, color: theme.colorScheme.secondary, @@ -338,7 +359,6 @@ class _DoorLockLogPageState extends State with RouteAware { @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -347,7 +367,6 @@ class _DoorLockLogPageState extends State with RouteAware { @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); @@ -365,7 +384,9 @@ class _DoorLockLogPageState extends State with RouteAware { void didPop() { super.didPop(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; } diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart index e4ff3970..722e605e 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart @@ -1,3 +1,4 @@ + import 'package:get/get.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart'; @@ -67,4 +68,5 @@ class DoorLockLogState { bool ifHaveNext = false; // 页码 int logCountPage = 10; // 蓝牙记录一页多少个 Rx currentSelectDate = DateTime.now().obs; + bool isLockReceiveResponse = false; // 是否收到回复 } diff --git a/lib/main/lockDetail/doorLockLog/exportRecordDialog/exportRecordDialog_page.dart b/lib/main/lockDetail/doorLockLog/exportRecordDialog/exportRecordDialog_page.dart index 015ac1f5..0126280b 100644 --- a/lib/main/lockDetail/doorLockLog/exportRecordDialog/exportRecordDialog_page.dart +++ b/lib/main/lockDetail/doorLockLog/exportRecordDialog/exportRecordDialog_page.dart @@ -1,3 +1,4 @@ + import 'dart:io'; import 'package:flutter/material.dart'; diff --git a/lib/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_page.dart b/lib/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_page.dart index 9a249136..9c5840b7 100644 --- a/lib/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_page.dart +++ b/lib/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; diff --git a/lib/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_page.dart b/lib/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_page.dart index 8d2ff415..465ff109 100644 --- a/lib/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_page.dart +++ b/lib/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_logic.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_logic.dart index bb24a222..f611e416 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_logic.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_logic.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; @@ -129,7 +130,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { } } - //取消冻结 + //解除冻结 Future cancelFreeze(int includeUnderlings) async { final ElectronicKeyListEntity entity = await ApiRepository.to.cancelFreeze( keyId: state.itemData.value.keyId.toString(), @@ -268,7 +269,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { // 授权管理员 textList = [ if (state.itemData.value.keyStatus == XSConstantMacro.keyStatusFrozen) - '取消冻结'.tr + '解除冻结'.tr else '冻结'.tr, if (isLockOwner) '取消授权'.tr @@ -278,7 +279,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { if (state.keyType.value == 1 || state.keyType.value == 2) { textList = [ if (state.itemData.value.keyStatus == XSConstantMacro.keyStatusFrozen) - '取消冻结'.tr + '解除冻结'.tr else '冻结'.tr, if (state.itemData.value.keyRight == 1) '取消授权'.tr else '授权'.tr @@ -286,7 +287,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { } else if (state.keyType.value == 4) { textList = [ if (state.itemData.value.keyStatus == XSConstantMacro.keyStatusFrozen) - '取消冻结'.tr + '解除冻结'.tr else '冻结'.tr ]; @@ -294,7 +295,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { } else { textList = [ if (state.itemData.value.keyStatus == XSConstantMacro.keyStatusFrozen) - '取消冻结'.tr + '解除冻结'.tr else '冻结'.tr, ]; @@ -312,7 +313,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { if (index == 0) { if (state.itemData.value.keyStatus == XSConstantMacro.keyStatusFrozen) { - // 取消冻结 + // 解除冻结 if (state.itemData.value.keyRight == 1) { // 管理员 ShowTipView().showDeleteAdministratorIsHaveAllDataDialog( @@ -321,7 +322,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController { }); } else { ShowTipView() - .showIosTipWithContentDialog('取消冻结会在用户APP连网后生效'.tr, () { + .showIosTipWithContentDialog('会在用户APP连网后生效'.tr, () { cancelFreeze(0); }); } @@ -420,21 +421,4 @@ class ElectronicKeyDetailLogic extends BaseGetXController { } } - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - } } diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_state.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_state.dart index 63ae8a72..7f1a8dc6 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_state.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_state.dart @@ -2,50 +2,40 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; -class ElectronicKeyDetailState { - final itemData = ElectronicKeyListItem().obs; - // final keyInfo = LockListInfoItemEntity().obs; - - final keyName = "".obs; - final TextEditingController changeNameController = TextEditingController(); - final TextEditingController changeRealNameController = - TextEditingController(); - final TextEditingController changeIDCardController = TextEditingController(); - - var starDate = "".obs; // 开始时间 - var endDate = "".obs; // 结束时间 - var starTime = "".obs; // 生效时间 - var endTime = "".obs; // 失效时间 - final keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 - var weekDay = [].obs; // 有效日 - - var onlyManageYouCreatesUser = false.obs; // 0:可以管理所有用户 1:只能管理自己创建的用户 - var isRemoteUnlock = false.obs; //是否允许远程开锁 0:不允许 1:允许 - var isRealNameAuth = false.obs; //是否实名认证 0:不需要 1:需要 - var getRealName = ''.obs; //真实姓名 - var getIDCardNumber = ''.obs; //身份证号 - var isRequireAuth = false.obs; //是否必须输入身份信息 +class ElectronicKeyDetailState { //是否必须输入身份信息 ElectronicKeyDetailState() { Map map = Get.arguments; - itemData.value = map["itemData"]; + itemData.value = map['itemData']; // if(map["keyInfo"]!=null){ // keyInfo.value = map["keyInfo"]; // } changeNameController.text = itemData.value.keyName!; keyName.value = itemData.value.keyName!; if (itemData.value.userIdCard != null) { - getRealName.value = itemData.value.userIdCard!.realName ?? ""; + getRealName.value = itemData.value.userIdCard!.realName ?? ''; changeRealNameController.text = getRealName.value; - getIDCardNumber.value = itemData.value.userIdCard!.idCardNumber ?? ""; + getIDCardNumber.value = itemData.value.userIdCard!.idCardNumber ?? ''; changeIDCardController.text = getIDCardNumber.value; } - isRemoteUnlock.value = itemData.value.remoteEnable! == 1 ? true : false; - isRealNameAuth.value = - itemData.value.faceAuthentication == 1 ? true : false; - onlyManageYouCreatesUser.value = - itemData.value.isOnlyManageSelf! == 0 ? false : true; + if (itemData.value.remoteEnable! == 1) { + isRemoteUnlock.value = true; + } else { + isRemoteUnlock.value = false; + } + + if (itemData.value.faceAuthentication == 1) { + isRealNameAuth.value = true; + } else { + isRealNameAuth.value = false; + } + + if (itemData.value.isOnlyManageSelf! == 0) { + onlyManageYouCreatesUser.value = false; + } else { + onlyManageYouCreatesUser.value = true; + } starDate.value = itemData.value.startDate!.toString(); endDate.value = itemData.value.endDate!.toString(); @@ -54,4 +44,26 @@ class ElectronicKeyDetailState { weekDay.value = itemData.value.weekDays!; keyType.value = itemData.value.keyType!; } + final Rx itemData = ElectronicKeyListItem().obs; + // final keyInfo = LockListInfoItemEntity().obs; + + final RxString keyName = ''.obs; + final TextEditingController changeNameController = TextEditingController(); + final TextEditingController changeRealNameController = + TextEditingController(); + final TextEditingController changeIDCardController = TextEditingController(); + + RxString starDate = ''.obs; // 开始时间 + RxString endDate = ''.obs; // 结束时间 + RxString starTime = ''.obs; // 生效时间 + RxString endTime = ''.obs; // 失效时间 + final RxInt keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 + RxList weekDay = [].obs; // 有效日 + + RxBool onlyManageYouCreatesUser = false.obs; // 0:可以管理所有用户 1:只能管理自己创建的用户 + RxBool isRemoteUnlock = false.obs; //是否允许远程开锁 0:不允许 1:允许 + RxBool isRealNameAuth = false.obs; //是否实名认证 0:不需要 1:需要 + RxString getRealName = ''.obs; //真实姓名 + RxString getIDCardNumber = ''.obs; //身份证号 + RxBool isRequireAuth = false.obs; } diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart index bb13f8f7..d29fe052 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart @@ -1,3 +1,4 @@ + import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -14,18 +15,18 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController { //编辑电子钥匙有效期请求 Future updateKeyDateRequest() async { - var beginTimeTimestamp = DateTool().dateToTimestamp(state.beginTime.value, 1); - var endTimeTimestamp = DateTool().dateToTimestamp(state.endTime.value, 1); + final int beginTimeTimestamp = DateTool().dateToTimestamp(state.beginTime.value, 1); + final int endTimeTimestamp = DateTool().dateToTimestamp(state.endTime.value, 1); if (beginTimeTimestamp > endTimeTimestamp || beginTimeTimestamp == endTimeTimestamp) { - showToast("失效时间需大于生效时间".tr); + showToast('失效时间需晚于生效时间'.tr); return; } if (endTimeTimestamp < DateTime.now().millisecondsSinceEpoch) { - showToast("生效时间需大于当前时间".tr); + showToast('生效时间需晚于当前时间'.tr); return; } - KeyOperationRecordEntity entity = await ApiRepository.to.updateKeyDate( + final KeyOperationRecordEntity entity = await ApiRepository.to.updateKeyDate( keyId:state.keyId.value.toString(), lockId:state.lockId.value.toString(), endDate:endTimeTimestamp.toString(), @@ -38,12 +39,12 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController { remoteEnable: state.remoteEnable!.value ); if (entity.errorCode!.codeIsSuccessful) { - showToast("修改成功".tr, something: () { + showToast('修改成功'.tr, something: () { eventBus.fire(ElectronicKeyListRefreshUI()); eventBus.fire(AuthorizedAdminPageRefreshUI()); Get.back(result: { - "beginTimeTimestamp": beginTimeTimestamp, - "endTimeTimestamp": endTimeTimestamp, + 'beginTimeTimestamp': beginTimeTimestamp, + 'endTimeTimestamp': endTimeTimestamp, }); }); } diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart index ce9dd77c..07dacaa4 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -11,7 +12,6 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class ElectronicKeyDetailChangeDate extends StatefulWidget { const ElectronicKeyDetailChangeDate({Key? key}) : super(key: key); diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart index 5d215e3d..4d787076 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart @@ -6,25 +6,13 @@ import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireElect import '../../../../../tools/dateTool.dart'; class ElectronicKeyDetailChangeDateState { - final itemData = ElectronicKeyListItem().obs; - final expireLockItem = ExpireLockItem().obs; - - var beginTime = "".obs;// 开始时间 - var endTime = "".obs;// 结束时间 - - var pushType = 0.obs;// 0电子钥匙 1授权管理员 - - var keyId = 0.obs; - var lockId = 0.obs; - var isOnlyManageSelf = 0.obs; - var remoteEnable = 0.obs; ElectronicKeyDetailChangeDateState() { Map map = Get.arguments; - if ((map["itemData"] != null)) { - itemData.value = map["itemData"]; - if(map["pushType"] != null){ - pushType.value = map["pushType"]; + if (map['itemData'] != null) { + itemData.value = map['itemData']; + if(map['pushType'] != null){ + pushType.value = map['pushType']; } keyId.value = itemData.value.keyId!; @@ -41,8 +29,8 @@ class ElectronicKeyDetailChangeDateState { } } - if ((map["expireLockItem"] != null)) { - expireLockItem.value = map["expireLockItem"]; + if (map['expireLockItem'] != null) { + expireLockItem.value = map['expireLockItem']; keyId.value = expireLockItem.value.keyId!; lockId.value = expireLockItem.value.lockId!; @@ -59,4 +47,16 @@ class ElectronicKeyDetailChangeDateState { } } + final Rx itemData = ElectronicKeyListItem().obs; + final Rx expireLockItem = ExpireLockItem().obs; + + RxString beginTime = ''.obs;// 开始时间 + RxString endTime = ''.obs;// 结束时间 + + RxInt pushType = 0.obs;// 0电子钥匙 1授权管理员 + + RxInt keyId = 0.obs; + RxInt lockId = 0.obs; + RxInt isOnlyManageSelf = 0.obs; + RxInt remoteEnable = 0.obs; } diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/KeyPeriodValidityModel.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/KeyPeriodValidityModel.dart index d26c8b17..18178891 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/KeyPeriodValidityModel.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/KeyPeriodValidityModel.dart @@ -1,8 +1,4 @@ -class KeyPeriodValidityModel { - late String validityText; //有效期时间 - late int validityIndex; //有效期的index - late bool isValidity; //是否选中为有效 - late int validityValue; //有效期值 +class KeyPeriodValidityModel { //有效期值 KeyPeriodValidityModel(this.validityText, this.validityIndex, this.isValidity, this.validityValue); @@ -13,6 +9,10 @@ class KeyPeriodValidityModel { isValidity = json['isValidity']; validityValue = json['validityValue']; } + late String validityText; //有效期时间 + late int validityIndex; //有效期的index + late bool isValidity; //是否选中为有效 + late int validityValue; Map toJson() { final Map data = {}; diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_logic.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_logic.dart index ec6d0330..dec445b6 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_logic.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_logic.dart @@ -1,3 +1,4 @@ + import 'package:get/get.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -13,21 +14,21 @@ class ElectronicKeyPeriodValidityLogic extends BaseGetXController { //编辑电子钥匙有效期请求 Future updateKeyDateRequest() async { - var starDateTimestamp = DateTool().dateToTimestamp(state.starDate.value, 1); - var endDateTimestamp = DateTool().dateToTimestamp(state.endDate.value, 1); - var starTimeTimestamp = DateTool().dateToTimestamp(state.starTime.value, 0); - var endTimeTimestamp = DateTool().dateToTimestamp(state.endTime.value, 0); + final int starDateTimestamp = DateTool().dateToTimestamp(state.starDate.value, 1); + final int endDateTimestamp = DateTool().dateToTimestamp(state.endDate.value, 1); + final int starTimeTimestamp = DateTool().dateToTimestamp(state.starTime.value, 0); + final int endTimeTimestamp = DateTool().dateToTimestamp(state.endTime.value, 0); if (starDateTimestamp >= endDateTimestamp) { - showToast("失效日期要大于生效日期".tr); + showToast('失效日期需晚于生效日期'.tr); return; } if (starTimeTimestamp >= endTimeTimestamp) { - showToast("失效时间要大于生效时间".tr); + showToast('失效时间需晚于生效时间'.tr); return; } - KeyOperationRecordEntity entity = await ApiRepository.to.updateKeyDate( + final KeyOperationRecordEntity entity = await ApiRepository.to.updateKeyDate( keyId:state.keyId.value.toString(), lockId:state.lockId.value.toString(), endDate:endDateTimestamp.toString(), @@ -39,15 +40,15 @@ class ElectronicKeyPeriodValidityLogic extends BaseGetXController { isOnlyManageSelf: state.isOnlyManageSelf.value!, remoteEnable: state.remoteEnable.value!); if (entity.errorCode!.codeIsSuccessful) { - showToast("修改成功".tr, something: () { + showToast('修改成功'.tr, something: () { eventBus.fire(ElectronicKeyListRefreshUI()); eventBus.fire(AuthorizedAdminPageRefreshUI()); - Get.back(result: { - "starDate":starDateTimestamp.toString(), - "endDate":endDateTimestamp.toString(), - "starTime":starTimeTimestamp.toString(), - "endTime":endTimeTimestamp.toString(), - "validityValue":state.weekDay.value, + Get.back(result: { + 'starDate':starDateTimestamp.toString(), + 'endDate':endDateTimestamp.toString(), + 'starTime':starTimeTimestamp.toString(), + 'endTime':endTimeTimestamp.toString(), + 'validityValue':state.weekDay.value, }); }); } diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart index 4ef35035..174abe66 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -11,7 +12,6 @@ import '../../../../../tools/commonItem.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'electronicKeyPeriodValidity_logic.dart'; class ElectronicKeyPeriodValidityPage extends StatefulWidget { @@ -45,7 +45,7 @@ class _ElectronicKeyPeriodValidityPageState Container( margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 30.h), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.save!.tr, + btnName: '保存'.tr, onClick: () { if (state.pushType.value == 0) { logic.updateKeyDateRequest(); @@ -69,7 +69,7 @@ class _ElectronicKeyPeriodValidityPageState isHaveDirection: true, isHaveLine: true, action: () { - PDuration selectDate = + final PDuration selectDate = PDuration.parse(DateTime.tryParse(state.endTime.value)); Pickers.showDatePicker(context, selectDate: selectDate, @@ -83,7 +83,7 @@ class _ElectronicKeyPeriodValidityPageState rightTitle: state.endDate.value, isHaveDirection: true, action: () { - PDuration selectDate = + final PDuration selectDate = PDuration.parse(DateTime.tryParse(state.endDate.value)); Pickers.showDatePicker(context, selectDate: selectDate, @@ -111,7 +111,7 @@ class _ElectronicKeyPeriodValidityPageState height: 60.h, // color: Colors.red, padding: EdgeInsets.only(left: 30.w, top: 15.h), - child: Text(TranslationLoader.lanKeys!.effectiveDay!.tr, + child: Text('有效日'.tr, style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600))), Container( @@ -202,13 +202,12 @@ class _ElectronicKeyPeriodValidityPageState child: Column( children: [ Obx(() => CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.begin!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '开始时间'.tr, rightTitle: state.starTime.value, isHaveDirection: true, isHaveLine: true, action: () { - PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.starTime.value, 0)); + final PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.starTime.value, 0)); Pickers.showDatePicker(context, selectDate: selectDate, mode: DateMode.HM, onConfirm: (PDuration p) { @@ -219,12 +218,11 @@ class _ElectronicKeyPeriodValidityPageState }); })), Obx(() => CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.end!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '结束时间'.tr, rightTitle: state.endTime.value, isHaveDirection: true, action: () { - PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.endTime.value, 0)); + final PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.endTime.value, 0)); Pickers.showDatePicker(context, selectDate: selectDate, mode: DateMode.HM, onConfirm: (PDuration p) { diff --git a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_state.dart b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_state.dart index 372d381f..f7c10b48 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_state.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_state.dart @@ -6,30 +6,13 @@ import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireElect import '../../../../../tools/dateTool.dart'; class ElectronicKeyPeriodValidityState { - TextEditingController searchController = TextEditingController(); //邮箱/手机号输入框 - final itemData = ElectronicKeyListItem().obs; - final expireLockItem = ExpireLockItem().obs; - - var starDate = "".obs;// 开始时间 - var endDate = "".obs;// 结束时间 - var starTime = "".obs;// 生效时间 - var endTime = "".obs;// 失效时间 - - var pushType = 0.obs;// 0电子钥匙 1授权管理员 - var weekDay = [].obs; - - var keyId = 0.obs; - var lockId = 0.obs; - var isOnlyManageSelf = 0.obs; - var remoteEnable = 0.obs; - var keyType = 0.obs; ElectronicKeyPeriodValidityState() { Map map = Get.arguments; - if ((map["itemData"] != null)) { - itemData.value = map["itemData"]; + if (map['itemData'] != null) { + itemData.value = map['itemData']; - if(map["pushType"] != null){ - pushType.value = map["pushType"]; + if(map['pushType'] != null){ + pushType.value = map['pushType']; } keyId.value = itemData.value.keyId!; @@ -45,8 +28,8 @@ class ElectronicKeyPeriodValidityState { weekDay.value = itemData.value.weekDays!; } - if ((map["expireLockItem"] != null)) { - expireLockItem.value = map["expireLockItem"]; + if (map['expireLockItem'] != null) { + expireLockItem.value = map['expireLockItem']; keyId.value = expireLockItem.value.keyId!; lockId.value = expireLockItem.value.lockId!; @@ -62,4 +45,21 @@ class ElectronicKeyPeriodValidityState { } } + TextEditingController searchController = TextEditingController(); //邮箱/手机号输入框 + final Rx itemData = ElectronicKeyListItem().obs; + final Rx expireLockItem = ExpireLockItem().obs; + + RxString starDate = ''.obs;// 开始时间 + RxString endDate = ''.obs;// 结束时间 + RxString starTime = ''.obs;// 生效时间 + RxString endTime = ''.obs;// 失效时间 + + RxInt pushType = 0.obs;// 0电子钥匙 1授权管理员 + RxList weekDay = [].obs; + + RxInt keyId = 0.obs; + RxInt lockId = 0.obs; + RxInt isOnlyManageSelf = 0.obs; + RxInt remoteEnable = 0.obs; + RxInt keyType = 0.obs; } diff --git a/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_logic.dart b/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_logic.dart index d5ee3643..9444de80 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_logic.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:get/get.dart'; diff --git a/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_page.dart b/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_page.dart index ceb90990..c10bcd24 100755 --- a/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_page.dart +++ b/lib/main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -18,7 +19,6 @@ import '../../../../tools/keySearchWidget.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class ElectronicKeyListPage extends StatefulWidget { const ElectronicKeyListPage({Key? key}) : super(key: key); @@ -69,7 +69,7 @@ class _ElectronicKeyListPageState extends State { await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { final bool isNetWork = - await LockMainLogic.to()?.judgeTheNetwork() ?? false; + await LockMainLogic.to()?.judgeTheNetwork() ?? false; if (!isNetWork) { return; } @@ -191,9 +191,8 @@ class _ElectronicKeyListPageState extends State { }).then((Object? val) { if (val == 'deletScuess') { state.itemDataList.removeWhere( - ( ElectronicKeyListItem item) => - item.keyId == - indexEntity.keyId!); + (ElectronicKeyListItem item) => + item.keyId == indexEntity.keyId!); setState(() {}); } else if (val != null) { logic @@ -258,10 +257,10 @@ class _ElectronicKeyListPageState extends State { onTap: action, child: Container( color: Colors.white, - padding: EdgeInsets.only(top: 20.h, bottom: 20.h), + padding: EdgeInsets.only(top: 15.h, bottom: 15.h), child: Row( children: [ - SizedBox(width: 30.w), + SizedBox(width: 20.w), SizedBox( width: 60.w, height: 60.w, @@ -270,56 +269,46 @@ class _ElectronicKeyListPageState extends State { child: CustomNetworkImage( url: avatarURL, defaultUrl: 'images/controls_user.png', - width: 105.w, - height: 105.h, + width: 60.w, + height: 60.h, ), ), ), SizedBox(width: 20.w), - Expanded( + SizedBox( + width: 1.sw - 20.w - 60.w - 20.w - 20.w, child: Column( - mainAxisAlignment: MainAxisAlignment.center, children: [ Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox( - width: 1.sw - 110.w - 34.w - 60.w, - child: Row( - children: [ - Flexible( - child: Text(receiveUser, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor)), - ), - SizedBox(width: 5.w), - if (isRemteUnlocking) - Image.asset( - 'images/icon_electronicKey_remteUnlocking.png', - width: 24.w, - height: 20.w, - ) - else - Container(), - SizedBox(width: 5.w), - if (isAdminKey) - Image.asset( - 'images/icon_electronicKey_admin.png', - width: 24.w, - height: 20.w, - ) - else - Container(), - ], - ), + Expanded( + child: Text(receiveUser, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor)), ), + if (isRemteUnlocking) SizedBox(width: 5.w), + if (isRemteUnlocking) + Image.asset( + 'images/icon_electronicKey_remteUnlocking.png', + width: 24.w, + height: 20.w, + ), + if (isRemteUnlocking) SizedBox(width: 5.w), + if (isAdminKey) + Image.asset( + 'images/icon_electronicKey_admin.png', + width: 24.w, + height: 20.w, + ), // Expanded(child: SizedBox(width: 20.w,)), SizedBox(width: 10.w), + // const Spacer(), Text( keyStatus, + textAlign: TextAlign.end, style: TextStyle(fontSize: 18.sp, color: Colors.red), ), ], @@ -340,7 +329,7 @@ class _ElectronicKeyListPageState extends State { ], ), ), - SizedBox(width: 20.h), + SizedBox(width: 20.w), ], ), ), diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart index fc26449c..07242ab2 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart @@ -50,7 +50,7 @@ class MassSendElectronicKeyLogic extends BaseGetXController { } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } } @@ -112,7 +112,7 @@ class MassSendElectronicKeyLogic extends BaseGetXController { } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } } diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart index 931d3b52..d9722f2e 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart @@ -13,7 +13,6 @@ import '../../../../../../tools/submitBtn.dart'; import '../../../../../appRouters.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/storage.dart'; -import '../../../../../translations/trans_lib.dart'; import 'massSendElectronicKey_logic.dart'; import 'massSendElectronicKey_state.dart'; @@ -174,7 +173,7 @@ class _MassSendElectronicKeyPageState extends State { }, )), CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupCell.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupCell.dart index ee8e011b..1900e285 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupCell.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupCell.dart @@ -44,11 +44,11 @@ class massSendLockGroupCell extends StatelessWidget { child: Container( height: 60.h, color: Colors.white, - width: ScreenUtil().screenWidth, + width: 1.sw, child: Row( children: [ SizedBox( - width: 30.w, + width: 20.w, ), Image.asset( 'images/mine/icon_mine_gatewaySignal_prompt.png', @@ -56,17 +56,21 @@ class massSendLockGroupCell extends StatelessWidget { height: 36.w, ), SizedBox( - width: 10.w, - ), - Text( - itemData.lockAlias!, - style: TextStyle( - fontSize: 20.sp, color: AppColors.darkGrayTextColor), + width: 5.w, ), Expanded( - child: SizedBox( - width: 20.w, - )), + child: Text( + itemData.lockAlias!, + style: TextStyle( + fontSize: 20.sp, color: AppColors.darkGrayTextColor), + overflow: TextOverflow.ellipsis, + ), + ), + SizedBox(width: 20.w), + // Expanded( + // child: SizedBox( + // width: 20.w, + // )), Visibility( visible: isShowBtn, child: Image.asset( @@ -78,7 +82,7 @@ class massSendLockGroupCell extends StatelessWidget { color: !isVip ? Colors.grey : AppColors.mainColor, ),), SizedBox( - width: 30.w, + width: 20.w, ) ], ), diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart index dc5437b7..2f691c56 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart @@ -10,7 +10,6 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/tools/ExpandedListView.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class MassSendLockGroupListPage extends StatefulWidget { const MassSendLockGroupListPage({Key? key}) : super(key: key); diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart index c5ad733a..540d4a3e 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart'; @@ -117,7 +118,7 @@ class _MassSendReceiverCellState extends State { isContactPickerEnabled: false, onSubmitted: (String text) { if (text.trim() == '') { - errorTxt.value = '请输入姓名'; + errorTxt.value = '请输入姓名'.tr; } else if (text.length > 50) { errorTxt.value = '姓名长度不能超过50个字符哦'; } diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart index 7194b393..4a578129 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart @@ -10,9 +10,7 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_logic.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_state.dart'; import 'package:star_lock/tools/commonItem.dart'; -import 'package:star_lock/tools/regexp_tool.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class MassSendReceiverPage extends StatefulWidget { const MassSendReceiverPage({Key? key}) : super(key: key); @@ -54,7 +52,7 @@ class _MassSendReceiverPageState extends State { actions: [ TextButton( child: Text( - TranslationLoader.lanKeys!.save!.tr, + '保存'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { @@ -111,7 +109,7 @@ class _MassSendReceiverPageState extends State { Obx(() => Visibility( visible: state.isVip.value, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart index 44c5368c..13ee46ed 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart @@ -8,7 +8,6 @@ import 'package:star_lock/main/lockDetail/electronicKey/sendElectronicKey/sendEl import '../../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class SendElectronicKeyPage extends StatefulWidget { const SendElectronicKeyPage({Key? key}) : super(key: key); @@ -63,9 +62,9 @@ class _SendElectronicKeyPageState extends State automaticIndicatorColorAdjustment: true, labelColor: AppColors.mainColor, labelStyle: TextStyle( - color: AppColors.mainColor, - fontSize: 24.sp, - fontWeight: FontWeight.w600), + color: AppColors.mainColor, + fontSize: 24.sp, + ), indicator: CustomUnderlineTabIndicator( borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart index 95940e3c..17ecf89e 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart'; +import 'package:get/get.dart'; class SendElectronicKeyState { late TabController tabController; @@ -7,10 +8,9 @@ class SendElectronicKeyState { final FlutterContactPicker contactPicker = FlutterContactPicker(); late Contact contact; - final timeLimitTips = '接收者在有效期内可以不限次数使用'; //限时 - final permanentTips = '接收者可以使用此App开关锁'; //永久 - final onceLimitTips = '单次钥匙有效期为1小时,只能使用一次'; //单次 - final cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'; //循环 + final String timeLimitTips = '接收者在有效期内可以不限次数使用'.tr; //限时 + final String permanentTips = '接收者可以使用此App开关锁'.tr; //永久 + final String onceLimitTips = '单次钥匙有效期为1小时,只能使用一次'.tr; //单次 + final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr; //循环 - SendElectronicKeyState() {} } diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart index 0f5ef873..e7eb9336 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart @@ -17,6 +17,9 @@ import 'package:star_lock/tools/regularExpression.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/storage.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; + +import '../../../../../../blue/blue_manage.dart'; class SendElectronicKeyViewLogic extends BaseGetXController { SendElectronicKeyViewLogic(this.type); @@ -28,7 +31,7 @@ class SendElectronicKeyViewLogic extends BaseGetXController { List get weekDayStr { return state.weekdaysList - .map((e) => TimeUtils.translateWeekday(e)) + .map((int e) => TimeUtils.translateWeekday(e)) .toList(); } @@ -47,10 +50,10 @@ class SendElectronicKeyViewLogic extends BaseGetXController { return; } - var startDate = '0'; - var endDate = '0'; - var startTime = '0'; - var endTime = '0'; + String startDate = '0'; + String endDate = '0'; + String startTime = '0'; + String endTime = '0'; int typeValue; switch (type) { case '0': @@ -73,7 +76,7 @@ class SendElectronicKeyViewLogic extends BaseGetXController { endTime = '0'; if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } @@ -180,7 +183,15 @@ class SendElectronicKeyViewLogic extends BaseGetXController { idCardNumber: state.isRequireAuth.value == true ? state.idCardController.text : ''); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('add_electronic_key', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_electronic_key_result':'成功', + }); + emailOrPhone = state.emailOrPhoneController.text; state.createUser.value = 0; state.isSendSuccess = true; @@ -190,6 +201,13 @@ class SendElectronicKeyViewLogic extends BaseGetXController { update(); eventBus.fire(ElectronicKeyListRefreshUI()); } else { + UmengCommonSdk.onEvent('add_electronic_key', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_electronic_key_result':'${entity.errorCode}--${entity.errorMsg}', + }); + emailOrPhone = null; if (entity.errorCode == 425) { //用户未注册 @@ -267,10 +285,10 @@ class SendElectronicKeyViewLogic extends BaseGetXController { final String template = item.template ?? ''; NativeInteractionTool().loadNativeShare(shareText: template); } else { - showToast('获取模板失败 0x02'); + showToast('获取模板失败'.tr); } } else { - showToast('获取模板失败 0x01'); + showToast('获取模板失败'.tr); } } @@ -287,7 +305,7 @@ class SendElectronicKeyViewLogic extends BaseGetXController { state.cycleEndTime = ''; // 循环结束时间 state.effectiveDateTime = ''; // 生效时间 state.failureDateTime = ''; // 失效时间 - state.weekdaysList = []; + state.weekdaysList = []; state.createUser.value = 0; update(); } diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart index 15103080..4aa39e86 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart @@ -19,10 +19,8 @@ import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class SendElectronicKeyView extends StatefulWidget { - SendElectronicKeyView({required this.type, Key? key}) : super(key: key); String type; @@ -105,18 +103,19 @@ class _SendElectronicKeyViewState extends State return Column( children: [ // Container(height: 10.h), + // CommonItem( + // leftTitel: '接收者'.tr, + // rightTitle: '', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: getTFWidget( + // true, + // '请输入手机号或者邮箱'.tr, + // 1, + // logic)), + perpetualKeyWidget(logic, '接收者'.tr, '请输入手机号或者邮箱'.tr), CommonItem( - leftTitel: '接收者'.tr, - rightTitle: '', - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: getTFWidget( - true, - '请输入手机号或者邮箱'.tr, - 1, - logic)), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -142,14 +141,95 @@ class _SendElectronicKeyViewState extends State leftTitel: '姓名'.tr, rightTitle: '', isHaveRightWidget: true, - rightWidget: getTFWidget( - false, '请输入姓名'.tr, 2, logic, - maxSize: 50)), + rightWidget: getTFWidget(false, '请输入'.tr, 2, logic, maxSize: 50)), Container(height: 10.h), ], ); } + Widget perpetualKeyWidget( + SendElectronicKeyViewLogic logic, String titleStr, String rightTitle) { + return Column( + children: [ + Container( + height: 65.h, + padding: EdgeInsets.only(left: 20.w, right: 20.w), + color: Colors.white, + child: Row( + children: [ + Text(titleStr, style: TextStyle(fontSize: 22.sp)), + SizedBox(width: 6.w), + Expanded( + child: TextField( + controller: logic.getCurrentController(1), + //输入框一行 + maxLines: 1, + inputFormatters: [ + FilteringTextInputFormatter.deny('\n'), + LengthLimitingTextInputFormatter(30), + ], + // controller: _controller, + autofocus: false, + textAlign: TextAlign.end, + decoration: InputDecoration( + //输入里面输入文字内边距设置 + hintText: rightTitle, + hintStyle: TextStyle(fontSize: 22.sp), + focusedBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + disabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + enabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + border: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + contentPadding: const EdgeInsets.symmetric(vertical: 0), + ), + style: TextStyle( + fontSize: 22.sp, textBaseline: TextBaseline.alphabetic), + ), + ), + SizedBox( + width: 10.w, + ), + Container( + width: 32.w, + height: 32.w, + decoration: const BoxDecoration( + color: Colors.white, + image: DecorationImage( + image: AssetImage('images/icon_addressBook.png'), + fit: BoxFit.fill), + ), + alignment: Alignment.center, + child: InkWell( + onTap: () async { + final Contact? currentContact = + await logic.state.contactPicker.selectContact(); + logic.state.contact = currentContact!; + if (currentContact.phoneNumbers!.isNotEmpty) { + logic.state.emailOrPhoneController.text = currentContact + .phoneNumbers![0] + .replaceAll(RegExp(r'\s+\b|\b\s'), ''); + } + if (currentContact.fullName!.isNotEmpty) { + logic.state.keyNameController.text = + currentContact.fullName!; + } + }, + ), + ) + ], + ), + ) + ], + ); + } + // 生效失效时间 Widget keyTimeWidget(SendElectronicKeyViewLogic logic) { return Column( @@ -163,7 +243,8 @@ class _SendElectronicKeyViewState extends State final PDuration selectDate = PDuration.parse( DateTime.parse(logic.state.timeLimitBeginTime)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { logic.state.timeLimitBeginTime = DateTool().getYMDHNDateString(p, 1); logic.update(); @@ -177,7 +258,8 @@ class _SendElectronicKeyViewState extends State final PDuration selectDate = PDuration.parse( DateTime.tryParse(logic.state.timeLimitEndTime)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { logic.state.timeLimitEndTime = DateTool().getYMDHNDateString(p, 1); logic.update(); @@ -237,14 +319,14 @@ class _SendElectronicKeyViewState extends State isHaveDirection: true, isHaveLine: true, action: () async { - final result = - await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': logic.state.weekdaysList, - 'starDate': logic.state.cycleBeginTime, - 'endDate': logic.state.cycleEndTime, - 'starTime': logic.state.effectiveDateTime, - 'endTime': logic.state.failureDateTime - }); + final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': logic.state.weekdaysList, + 'starDate': logic.state.cycleBeginTime, + 'endDate': logic.state.cycleEndTime, + 'starTime': logic.state.effectiveDateTime, + 'endTime': logic.state.failureDateTime + }); if (result != null && result.isNotEmpty) { logic.state.weekdaysList = result['validityValue']; logic.state.cycleBeginTime = result['starDate']; @@ -418,7 +500,8 @@ class _SendElectronicKeyViewState extends State ), if (logic.emailOrPhone != null) OutLineBtn( - btnName: logic.state.userNameType.value == 1 ? '短信通知' : '邮件通知', + btnName: + logic.state.userNameType.value == 1 ? '短信通知'.tr : '邮件通知'.tr, onClick: () { Get.toNamed(Routers.sendEmailNotificationPage, arguments: { @@ -434,7 +517,7 @@ class _SendElectronicKeyViewState extends State ), if (logic.emailOrPhone != null) OutLineBtn( - btnName: '微信通知', + btnName: '微信通知'.tr, onClick: () { logic.sendMsg(isPhone: logic.emailOrPhone!.contains('@')); }, diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart index 86ee7dce..8f8244bc 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart @@ -34,8 +34,8 @@ class SendElectronicKeyViewState { RxBool isRequireAuth = false.obs; //是否需要实名认证的必填项 RxInt userNameType = 0.obs; //1:手机号 2:邮箱 - final String timeLimitTips = '接收者在有效期内可以不限次数使用'; //限时 - final String permanentTips = '接收者可以使用此App开关锁'; //永久 - final String onceLimitTips = '单次钥匙有效期为1小时,只能使用一次'; //单次 - final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'; //循环 + final String timeLimitTips = '接收者在有效期内可以不限次数使用'.tr; //限时 + final String permanentTips = '接收者可以使用此App开关锁'.tr; //永久 + final String onceLimitTips = '单次钥匙有效期为1小时,只能使用一次'.tr; //单次 + final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr; //循环 } diff --git a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_logic.dart b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_logic.dart index 2fdfe8d9..74cb3546 100644 --- a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_logic.dart +++ b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_logic.dart @@ -40,7 +40,7 @@ class SendEmailNotificationLogic extends BaseGetXController { Future keyNoticeSubmitRequest() async { if (state.receiverController.text.isEmpty && state.getReceiver.value.isEmpty) { - showToast('请输入接收者'); + showToast('请输入接收者'.tr); return; } final SendEmailNotificationEntity entity; @@ -70,7 +70,7 @@ class SendEmailNotificationLogic extends BaseGetXController { ); } if (entity.errorCode!.codeIsSuccessful) { - showToast('发送成功'); + showToast('发送成功'.tr); Get.back(); } } @@ -79,7 +79,7 @@ class SendEmailNotificationLogic extends BaseGetXController { Future sendPersonalSMSOrEmail() async { if (state.receiverController.text.isEmpty && state.getReceiver.value.isEmpty) { - showToast('请输入接收者'); + showToast('请输入接收者账号'.tr); return; } diff --git a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart index efd97a26..a398986a 100755 --- a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart +++ b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -43,7 +44,7 @@ class _SendEmailNotificationPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: state.channelType.value == 1 ? '短信通知' : '邮件通知', + barTitle: state.channelType.value == 1 ? '短信通知'.tr : '邮件通知'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: SingleChildScrollView( @@ -61,7 +62,7 @@ class _SendEmailNotificationPageState extends State { isHaveRightWidget: true, rightWidget: _buildReceiverItemWidget())), Obx(() => CommonItem( - leftTitel: '类型', + leftTitel: '类型'.tr, rightTitle: state.getNotifyTypeText.value, isHaveDirection: true, action: () { @@ -75,7 +76,7 @@ class _SendEmailNotificationPageState extends State { )), Container(height: 10.h), Obx(() => CommonItem( - leftTitel: '模板', + leftTitel: '模板'.tr, rightTitle: state.currentNotifyItem.value.name ?? '', isHaveDirection: true, isHaveLine: true, @@ -193,7 +194,7 @@ class _SendEmailNotificationPageState extends State { width: 6.w, ), Text( - '新建模版', + '新建模版'.tr, style: TextStyle( color: AppColors.mainColor, fontSize: 24.sp, diff --git a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_state.dart b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_state.dart index f253f513..83103dd0 100644 --- a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_state.dart +++ b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_state.dart @@ -43,15 +43,15 @@ class SendEmailNotificationState { Future updateNotifyTypeText() async { if (channelType.value == 1) { if (notifyTypeSelect.value == 1) { - getNotifyTypeText.value = '系统短信'; + getNotifyTypeText.value = '系统短信'.tr; } else { - getNotifyTypeText.value = '个人短信'; + getNotifyTypeText.value = '个人短信'.tr; } } else { if (notifyTypeSelect.value == 1) { - getNotifyTypeText.value = '系统邮件'; + getNotifyTypeText.value = '系统邮件'.tr; } else { - getNotifyTypeText.value = '个人邮件'; + getNotifyTypeText.value = '个人邮件'.tr; } } } diff --git a/lib/main/lockDetail/face/addFace/addFace_logic.dart b/lib/main/lockDetail/face/addFace/addFace_logic.dart index 2a5c17d9..d7fe6bd3 100755 --- a/lib/main/lockDetail/face/addFace/addFace_logic.dart +++ b/lib/main/lockDetail/face/addFace/addFace_logic.dart @@ -54,7 +54,7 @@ class AddFaceLogic extends BaseGetXController { // 最大图片数 state.maxRegCount.value = reply.data[11]; - AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}'); + // AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}'); break; case 0x06: //无权限 @@ -92,7 +92,7 @@ class AddFaceLogic extends BaseGetXController { default: //失败 state.ifAddState.value = false; - showToast('添加人脸失败', something: (){ + showToast('添加人脸失败'.tr, something: (){ Get.back(); }); break; @@ -138,7 +138,7 @@ class AddFaceLogic extends BaseGetXController { // 添加人脸中 // 当前注册数 state.regIndex.value = reply.data[6]; - AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}'); + // AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}'); break; } @@ -296,7 +296,7 @@ class AddFaceLogic extends BaseGetXController { faceUserNo: state.faceNumber.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('添加成功'); + showToast('添加成功'.tr); if (state.fromType.value == 2) { // 回调人脸号 eventBus.fire(ChickInAddStaffCardAndFingerprintBlockNumberEvent( @@ -318,7 +318,7 @@ class AddFaceLogic extends BaseGetXController { @override void onInit() { super.onInit(); -//开始添加后发送指令 + //开始添加后发送指令 // senderAddFace(); } diff --git a/lib/main/lockDetail/face/addFace/addFace_page.dart b/lib/main/lockDetail/face/addFace/addFace_page.dart index 92c51fa6..08b1342c 100755 --- a/lib/main/lockDetail/face/addFace/addFace_page.dart +++ b/lib/main/lockDetail/face/addFace/addFace_page.dart @@ -8,7 +8,6 @@ import 'package:star_lock/main/lockDetail/face/addFace/addFace_state.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/appRouteObserver.dart'; class AddFacePage extends StatefulWidget { @@ -53,7 +52,7 @@ class _AddFacePageState extends State with RouteAware { children: [ Expanded( child: Text( - '请单人正对门锁,距离一个成年人手臂长度\n(约0.6米)。\n保持脸部无遮挡,露出五官。', + '请单人正对门锁,距离一个成年人手臂长度'.tr + '\n' + '(约0.6米)。'.tr + '\n' + '保持脸部无遮挡,露出五官。'.tr, textAlign: TextAlign.left, maxLines: null, style: @@ -71,7 +70,7 @@ class _AddFacePageState extends State with RouteAware { ? Container( padding: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: '准备好了,开始添加', + btnName: '准备好了,开始添加'.tr, borderRadius: 20.w, onClick: () { state.isClickAddFace.value = true; @@ -84,7 +83,7 @@ class _AddFacePageState extends State with RouteAware { Column( children: [ Text( - '正在录入中...', + '正在录入中...'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 22.sp), diff --git a/lib/main/lockDetail/face/addFace/addFace_state.dart b/lib/main/lockDetail/face/addFace/addFace_state.dart index 1cf9301c..fd00bc11 100755 --- a/lib/main/lockDetail/face/addFace/addFace_state.dart +++ b/lib/main/lockDetail/face/addFace/addFace_state.dart @@ -3,33 +3,7 @@ import 'package:get/get.dart'; import '../../../../tools/commonDataManage.dart'; -class AddFaceState { - RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - RxBool ifAddState = false.obs;// 是否是添加状态,如果是添加状态,返回上级界面发送取消添加指令 - - RxBool ifConnectScuess = false.obs; - RxInt maxRegCount = 0.obs; // 最大注册次数 - RxInt regIndex = 0.obs; // 当前注册次数 - - RxString faceNumber = ''.obs; - - final RxInt lockId = 0.obs; - final RxString endDate = ''.obs; - final RxString addType = ''.obs; - final RxString faceName = ''.obs; - final RxInt faceType = 0.obs; - // final cyclicConfig = [].obs; - final RxString featureData = ''.obs; - final RxBool isClickAddFace = false.obs; - - final RxString isCoerced = ''.obs; - final RxString isAdministrator = ''.obs; - final RxString startDate = ''.obs; - final RxList weekDay = [].obs; - final RxInt fromType = 0.obs; - final RxString effectiveDateTime = ''.obs; // 生效时间 - final RxString failureDateTime = ''.obs; // 失效时间 - final RxString selectType = '0'.obs; // 0永久 1显示 2循环 +class AddFaceState { // 0永久 1显示 2循环 AddFaceState() { Map map = Get.arguments; @@ -56,4 +30,30 @@ class AddFaceState { endDate.value = map['endDate']; } } + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxBool ifAddState = false.obs;// 是否是添加状态,如果是添加状态,返回上级界面发送取消添加指令 + + RxBool ifConnectScuess = false.obs; + RxInt maxRegCount = 0.obs; // 最大注册次数 + RxInt regIndex = 0.obs; // 当前注册次数 + + RxString faceNumber = ''.obs; + + final RxInt lockId = 0.obs; + final RxString endDate = ''.obs; + final RxString addType = ''.obs; + final RxString faceName = ''.obs; + final RxInt faceType = 0.obs; + // final cyclicConfig = [].obs; + final RxString featureData = ''.obs; + final RxBool isClickAddFace = false.obs; + + final RxString isCoerced = ''.obs; + final RxString isAdministrator = ''.obs; + final RxString startDate = ''.obs; + final RxList weekDay = [].obs; + final RxInt fromType = 0.obs; + final RxString effectiveDateTime = ''.obs; // 生效时间 + final RxString failureDateTime = ''.obs; // 失效时间 + final RxString selectType = '0'.obs; } diff --git a/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart b/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart index 1191ac29..b4ca7e14 100755 --- a/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart +++ b/lib/main/lockDetail/face/addFaceType/addFaceType_logic.dart @@ -49,7 +49,7 @@ class AddFaceTypeLogic extends BaseGetXController { // } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } } else if (state.selectType.value == '2') { diff --git a/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart b/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart index 3522e66d..0c446bb7 100755 --- a/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart +++ b/lib/main/lockDetail/face/addFaceType/addFaceType_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -15,10 +14,10 @@ import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../tools/commonItem.dart'; +import '../../../../tools/key_name_item.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'addFaceType_logic.dart'; class AddFaceTypePage extends StatefulWidget { @@ -28,7 +27,8 @@ class AddFaceTypePage extends StatefulWidget { State createState() => _AddFaceTypePageState(); } -class _AddFaceTypePageState extends State with SingleTickerProviderStateMixin { +class _AddFaceTypePageState extends State + with SingleTickerProviderStateMixin { final AddFaceTypeLogic logic = Get.put(AddFaceTypeLogic()); final AddFaceTypeState state = Get.find().state; @@ -78,10 +78,10 @@ class _AddFaceTypePageState extends State with SingleTickerProv return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyBottomWidget() ], ), @@ -93,10 +93,10 @@ class _AddFaceTypePageState extends State with SingleTickerProv return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyTimeLimitWidget(), keyBottomWidget() ], @@ -109,10 +109,10 @@ class _AddFaceTypePageState extends State with SingleTickerProv return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyCyclicDate(), SizedBox(height: 10.h), keyBottomWidget() @@ -125,22 +125,6 @@ class _AddFaceTypePageState extends State with SingleTickerProv } } - // 密码命名输入框 - Widget perpetualKeyWidget( - String titleStr, String rightTitle, TextEditingController controller) { - return Column( - children: [ - // Container(height: 10.h), - CommonItem( - leftTitel: titleStr, - rightTitle: '', - isHaveRightWidget: true, - rightWidget: getTFWidget(rightTitle)), - Container(height: 10.h), - ], - ); - } - // 限时顶部选择日期 Widget keyTimeLimitWidget() { return Column( @@ -154,7 +138,8 @@ class _AddFaceTypePageState extends State with SingleTickerProv final PDuration selectDate = PDuration.parse( DateTime.parse(state.timeLimitBeginTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { state.timeLimitBeginTime.value = DateTool().getYMDHNDateString(p, 1); }); @@ -167,7 +152,8 @@ class _AddFaceTypePageState extends State with SingleTickerProv final PDuration selectDate = PDuration.parse( DateTime.tryParse(state.timeLimitEndTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { state.timeLimitEndTime.value = DateTool().getYMDHNDateString(p, 1); }); @@ -188,14 +174,14 @@ class _AddFaceTypePageState extends State with SingleTickerProv isHaveDirection: true, isHaveLine: true, action: () async { - final result = - await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -212,7 +198,8 @@ class _AddFaceTypePageState extends State with SingleTickerProv isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -236,7 +223,8 @@ class _AddFaceTypePageState extends State with SingleTickerProv '${state.effectiveDateTime.value}-${state.failureDateTime.value}', isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -266,81 +254,28 @@ class _AddFaceTypePageState extends State with SingleTickerProv rightTitle: '', isTipsImg: false, isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, height: 50.h, child: _isAdmin())))), + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))), SizedBox(height: 30.h), SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { if (state.nameController.text.isEmpty) { - logic.showToast('请输入姓名'); + logic.showToast('请输入姓名'.tr); return; } logic.checkFaceNameDuplicated(state.nameController.text); } else { // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }), ], ); } - // 接受者信息输入框 - Widget getTFWidget(String tfStr) { - return Container( - // color: Colors.red, - height: 65.h, - width: 300.w, - padding: EdgeInsets.only(top: 5.h), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: TextField( - //输入框一行 - maxLines: 1, - inputFormatters: [ - FilteringTextInputFormatter.deny('\n'), - LengthLimitingTextInputFormatter(50), - ], - style: TextStyle( - fontSize: 22.sp, color: AppColors.darkGrayTextColor), - controller: state.nameController, - autofocus: false, - textAlign: TextAlign.end, - decoration: InputDecoration( - //输入里面输入文字内边距设置 - // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), - hintText: tfStr, - hintStyle: TextStyle(fontSize: 22.sp), - focusedBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - disabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - enabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - border: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - contentPadding: const EdgeInsets.symmetric(vertical: 0), - ), - ), - ), - SizedBox( - width: 10.w, - ), - ], - ), - ); - } - // 是否为管理员 CupertinoSwitch _isAdmin() { return CupertinoSwitch( @@ -373,10 +308,8 @@ class _AddFaceTypePageState extends State with SingleTickerProv }, tabs: state.fromType.value == 1 ? _itemTabs.map(_tab).toList() - : _fromCheckInTypeItemTabs - .map(_tab) - .toList(), - isScrollable: true, + : _fromCheckInTypeItemTabs.map(_tab).toList(), + isScrollable: false, indicatorColor: Colors.red, unselectedLabelColor: Colors.black, unselectedLabelStyle: TextStyle( @@ -393,13 +326,18 @@ class _AddFaceTypePageState extends State with SingleTickerProv borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, width: 30.w), + labelPadding: EdgeInsets.symmetric(horizontal: 10.w), + padding: EdgeInsets.zero, // 去除TabBar两侧的间隙 ); } Tab _tab(ItemView item) { return Tab( - child: SizedBox( - width: 1.sw / 5, + child: Container( + // color: Colors.red, + width: (1.sw - 10.w * 5) / 3, + // width: 1.sw / 4, + alignment: Alignment.center, child: Text(item.title, textAlign: TextAlign.center))); } @@ -408,9 +346,7 @@ class _AddFaceTypePageState extends State with SingleTickerProv child: TabBarView( controller: state.tabController, children: state.fromType.value == 1 - ? _itemTabs - .map((ItemView item) => Obx(indexChangeWidget)) - .toList() + ? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList() : _fromCheckInTypeItemTabs .map((ItemView item) => Obx(indexChangeWidget)) .toList(), diff --git a/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart b/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart index 83e31b1e..388c6588 100755 --- a/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart +++ b/lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; @@ -163,7 +164,7 @@ class FaceDetailLogic extends BaseGetXController { lockId: state.faceItemData.value.lockId!, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功', something: () { + showToast('删除成功'.tr, something: () { Get.back(result: 'addScuess'); }); } @@ -178,7 +179,7 @@ class FaceDetailLogic extends BaseGetXController { ); if (entity.errorCode!.codeIsSuccessful) { state.faceItemData.value.faceName = state.changeNameController.text; - showToast('修改成功', something: () { + showToast('修改成功'.tr, something: () { Get.back(result: 'addScuess'); }); } else { diff --git a/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart b/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart index b83b7863..766e81ab 100755 --- a/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart +++ b/lib/main/lockDetail/face/faceDetail/faceDetail_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -15,7 +16,6 @@ import '../../../../tools/dateTool.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; class FaceDetailPage extends StatefulWidget { @@ -41,7 +41,7 @@ class _FaceDetailPageState extends State with RouteAware { body: ListView( children: [ Obx(() => CommonItem( - leftTitel: '人脸号', + leftTitel: '人脸号'.tr, rightTitle: state.typeNumber.value, isHaveDirection: false, isHaveLine: true)), @@ -111,7 +111,7 @@ class _FaceDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + leftTitel: '有效日'.tr, rightTitle: logic.weekDayStr.join(','), isHaveDirection: true, isHaveLine: true, @@ -135,7 +135,7 @@ class _FaceDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: '有效时间', + leftTitel: '有效时间'.tr, rightTitle: '${DateTool().dateToHNString(state.startTime.value)}-${DateTool().dateToHNString(state.endTime.value)}', isHaveDirection: true, diff --git a/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart b/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart index 75af93b1..b53bed1b 100755 --- a/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart +++ b/lib/main/lockDetail/face/faceDetail/faceDetail_state.dart @@ -2,32 +2,11 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/fingerprint/fingerprintList/fingerprintListData_entity.dart'; -class FaceDetailState { - final faceItemData = FingerprintItemData().obs; - - final TextEditingController changeNameController = TextEditingController(); - - final typeNumber = "".obs; // 人脸号 - final typeName = "".obs; // 人脸名字 - var startDate = "".obs; // 开始时间 - var endDate = "".obs; // 结束时间 - var startTime = "".obs; // 生效时间 - var endTime = "".obs; // 失效时间 - final keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 - var weekDay = [].obs; // 有效日 - var adder = "".obs; // 添加者 - var addTime = 0.obs; // 添加时间 - var keyId = 0.obs; - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) - var isDeletFace = true.obs; // 是否删除卡 - var isStressFace = false.obs; // 是否胁迫 - var isAdministrator = false.obs; // 是否为管理员 +class FaceDetailState { // 是否为管理员 FaceDetailState() { Map map = Get.arguments; - faceItemData.value = map["faceItemData"]; + faceItemData.value = map['faceItemData']; keyId.value = faceItemData.value.faceId!; typeNumber.value = faceItemData.value.faceNumber!; typeName.value = faceItemData.value.faceName!; @@ -40,7 +19,36 @@ class FaceDetailState { adder.value = faceItemData.value.senderUsername!; addTime.value = faceItemData.value.createDate!; weekDay.value = faceItemData.value.weekDay!; - isStressFace.value = faceItemData.value.isCoerced! == 2 ? true : false; - isAdministrator.value = faceItemData.value.faceRight! == 1 ? true : false; + if (faceItemData.value.isCoerced! == 2) { + isStressFace.value = true; + } else { + isStressFace.value = false; + } + if (faceItemData.value.faceRight! == 1) { + isAdministrator.value = true; + } else { + isAdministrator.value = false; + } } + final Rx faceItemData = FingerprintItemData().obs; + + final TextEditingController changeNameController = TextEditingController(); + + final RxString typeNumber = ''.obs; // 人脸号 + final RxString typeName = ''.obs; // 人脸名字 + RxString startDate = ''.obs; // 开始时间 + RxString endDate = ''.obs; // 结束时间 + RxString startTime = ''.obs; // 生效时间 + RxString endTime = ''.obs; // 失效时间 + final RxInt keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 + RxList weekDay = [].obs; // 有效日 + RxString adder = ''.obs; // 添加者 + RxInt addTime = 0.obs; // 添加时间 + RxInt keyId = 0.obs; + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) + RxBool isDeletFace = true.obs; // 是否删除卡 + RxBool isStressFace = false.obs; // 是否胁迫 + RxBool isAdministrator = false.obs; } diff --git a/lib/main/lockDetail/face/faceList/faceList_logic.dart b/lib/main/lockDetail/face/faceList/faceList_logic.dart index c03900a0..debdc5ce 100755 --- a/lib/main/lockDetail/face/faceList/faceList_logic.dart +++ b/lib/main/lockDetail/face/faceList/faceList_logic.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; @@ -24,9 +23,11 @@ class FaceListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) { // 添加人脸开始(此处用作删除人脸) - if ((reply is SenderAddFaceReply) && (state.ifCurrentScreen.value == true)) { + if ((reply is SenderAddFaceReply) && + (state.ifCurrentScreen.value == true)) { _replyAddFaceBegin(reply); } @@ -58,10 +59,13 @@ class FaceListLogic extends BaseGetXController { break; case 0x06: //无权限 - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final List token = reply.data.sublist(5, 9); @@ -69,25 +73,24 @@ class FaceListLogic extends BaseGetXController { Storage.setStringList(saveBlueToken, saveStrList); IoSenderManage.senderAddFaceCommand( - keyID:state.deletKeyID, - userID:(await Storage.getUid())!, - faceNo:state.deletFaceNo, - useCountLimit:0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 - isAdmin:0, - isForce:0, // 是否是胁迫 - isRound:0, // 是否是循环 - weekRound:0, // 周循环 - startDate: 0x11223344, - endDate: 0x11223344, - startTime:'0', - endTime:'0', - needAuthor:1, - signKey:signKeyDataList, - privateKey:getPrivateKeyList, - token: token, - isBeforeAddUser: false - ); + keyID: state.deletKeyID, + userID: (await Storage.getUid())!, + faceNo: state.deletFaceNo, + useCountLimit: 0xffff, + operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + isAdmin: 0, + isForce: 0, // 是否是胁迫 + isRound: 0, // 是否是循环 + weekRound: 0, // 周循环 + startDate: 0x11223344, + endDate: 0x11223344, + startTime: '0', + endTime: '0', + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: token, + isBeforeAddUser: false); break; default: //失败 @@ -257,37 +260,39 @@ class FaceListLogic extends BaseGetXController { BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { - - final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); IoSenderManage.senderAddFaceCommand( - keyID:state.deletKeyID, - userID:(await Storage.getUid())!, - faceNo:state.deletFaceNo, - useCountLimit:0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 - isAdmin:0, - isForce:0, // 是否是胁迫 - isRound:0, // 是否是循环 - weekRound:0, // 周循环 - startDate: 0x11223344, - endDate: 0x11223344, - startTime:'0', - endTime:'0', - needAuthor:1, - signKey:signKeyDataList, - privateKey:getPrivateKeyList, - token: getTokenList, - isBeforeAddUser: false - ); - } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { + keyID: state.deletKeyID, + userID: (await Storage.getUid())!, + faceNo: state.deletFaceNo, + useCountLimit: 0xffff, + operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + isAdmin: 0, + isForce: 0, // 是否是胁迫 + isRound: 0, // 是否是循环 + weekRound: 0, // 周循环 + startDate: 0x11223344, + endDate: 0x11223344, + startTime: '0', + endTime: '0', + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + isBeforeAddUser: false); + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); if (state.ifCurrentScreen.value == true) { @@ -298,12 +303,14 @@ class FaceListLogic extends BaseGetXController { } // 获取人脸列表 - Future getFaceListData({required bool isRefresh}) async { + Future getFaceListData( + {required bool isRefresh}) async { if (isRefresh) { state.faceItemListData.clear(); pageNo = 1; } - final FingerprintListDataEntity entity = await ApiRepository.to.getFaceListData( + final FingerprintListDataEntity entity = + await ApiRepository.to.getFaceListData( lockId: state.lockId.value.toString(), pageNo: pageNo.toString(), pageSize: pageSize.toString(), @@ -341,7 +348,7 @@ class FaceListLogic extends BaseGetXController { lockId: state.lockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功'.tr, something: (){ + showToast('删除成功'.tr, something: () { getFaceListData(isRefresh: true); }); } @@ -359,34 +366,37 @@ class FaceListLogic extends BaseGetXController { lockId: state.lockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('重置成功'.tr, something: (){ + showToast('重置成功'.tr, something: () { getFaceListData(isRefresh: true); }); } } - String getKeyType(FingerprintItemData fingerprintItemData){ + String getKeyType(FingerprintItemData fingerprintItemData) { // fingerprintStatus 1:正常 2:失效 - String keyTypeStr = '';// - if(fingerprintItemData.status == 1){ - if(fingerprintItemData.startDate! > DateTime.now().millisecondsSinceEpoch){ + String keyTypeStr = ''; // + if (fingerprintItemData.status == 1) { + if (fingerprintItemData.startDate! > + DateTime.now().millisecondsSinceEpoch) { keyTypeStr = '未生效'.tr; } - - }else if(fingerprintItemData.status == 2){ + } else if (fingerprintItemData.status == 2) { keyTypeStr = '已失效'.tr; } return keyTypeStr; } - String getKeyDateType(FingerprintItemData fingerprintItemData){ - String keyDateTypeStr = '';// 永久:1;限时2,单次3,循环:4 - if(fingerprintItemData.faceType! == 1){ - keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久'; - }else if(fingerprintItemData.faceType! == 2){ - keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时'; - }else if(fingerprintItemData.faceType! == 4){ - keyDateTypeStr = '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环'; + String getKeyDateType(FingerprintItemData fingerprintItemData) { + String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4 + if (fingerprintItemData.faceType! == 1) { + keyDateTypeStr = + '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}'; + } else if (fingerprintItemData.faceType! == 2) { + keyDateTypeStr = + '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}'; + } else if (fingerprintItemData.faceType! == 4) { + keyDateTypeStr = + '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}'; } return keyDateTypeStr; } @@ -394,7 +404,9 @@ class FaceListLogic extends BaseGetXController { // 监听修改完详情之后刷新列表 late StreamSubscription _teamEvent; void _initRefreshAction() { - _teamEvent = eventBus.on().listen((OtherTypeRefreshListEvent event) { + _teamEvent = eventBus + .on() + .listen((OtherTypeRefreshListEvent event) { getFaceListData(isRefresh: true); }); } diff --git a/lib/main/lockDetail/face/faceList/faceList_page.dart b/lib/main/lockDetail/face/faceList/faceList_page.dart index 0303ea41..5758785b 100755 --- a/lib/main/lockDetail/face/faceList/faceList_page.dart +++ b/lib/main/lockDetail/face/faceList/faceList_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -16,7 +17,6 @@ import '../../../../tools/noData.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; import 'faceList_logic.dart'; @@ -75,7 +75,7 @@ class _FaceListPageState extends State with RouteAware { // showDeletAlertDialog(context); ShowTipView().showIosTipWithContentDialog( - '重置后,该锁的人脸都将被删除哦,确认要重置吗?', () async { + '重置后,该锁的人脸都将被删除哦,确认要重置吗?'.tr, () async { state.isDeletAll = true; state.deletKeyID = '1'; state.deletFaceNo = 0; @@ -84,7 +84,7 @@ class _FaceListPageState extends State with RouteAware { }); } else { // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }, ), @@ -196,9 +196,9 @@ class _FaceListPageState extends State with RouteAware { width: 60, color: const Color(0xFFF20101), alignment: Alignment.center, - child: const Text( - '删除', - style: TextStyle( + child: Text( + '删除'.tr, + style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Colors.white, diff --git a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart index 72dfe924..b657a491 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart @@ -3,9 +3,11 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/fingerprint/addFingerprint/addFingerprint_entity.dart'; import 'package:star_lock/tools/dateTool.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../../../blue/blue_manage.dart'; import '../../../../../blue/io_reply.dart'; @@ -17,6 +19,7 @@ import '../../../../../tools/baseGetXController.dart'; import '../../../../../tools/eventBusEventManage.dart'; import '../../../../../tools/storage.dart'; import '../../../../blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart'; +import '../../../../tools/bugly/bugly_tool.dart'; import 'addFingerprint_state.dart'; class AddFingerprintLogic extends BaseGetXController { @@ -44,8 +47,13 @@ class AddFingerprintLogic extends BaseGetXController { } Future _replyAddFingerprintBegin(Reply reply) async { - final int status = reply.data[2]; + BuglyTool.uploadException( + message: '添加指纹开始,解析数据', + detail: '添加指纹开始,解析数据 _replyAddFingerprintBegin:${reply.data}', + upload: false + ); + final int status = reply.data[2]; switch(status){ case 0x00: //成功 @@ -94,7 +102,7 @@ class AddFingerprintLogic extends BaseGetXController { default: //失败 state.ifAddState.value = false; - showToast('添加指纹失败', something: (){ + showToast('添加指纹失败'.tr, something: (){ Get.back(); }); break; @@ -102,8 +110,12 @@ class AddFingerprintLogic extends BaseGetXController { } Future _replyAddFingerprintProcess(Reply reply) async { + BuglyTool.uploadException( + message: '添加指纹过程,解析数据', + detail: '添加指纹过程,解析数据 _replyAddFingerprintProcess:${reply.data}', + upload: false + ); final int status = reply.data[2]; - switch(status){ case 0x00: //成功 @@ -154,13 +166,27 @@ class AddFingerprintLogic extends BaseGetXController { Future _replyAddFingerprintConfirmation(Reply reply) async { final int status = reply.data[2]; + final String getMobile = (await Storage.getMobile())!; switch(status){ case 0x00: //成功 // var fingerprintNum = listChangInt(reply.data.sublist(9, 11)).toString(); - final List fingerprintList = reply.data.sublist(reply.data.length - 2); - final String fingerprintNum = listChangInt(fingerprintList).toString(); - state.regIndex.value++; + UmengCommonSdk.onEvent('add_fingerprint', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_fingerprint_result':'成功', + }); + + BuglyTool.uploadException( + message: '添加指纹确认结果,解析数据', + detail: '添加指纹确认结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}', + upload: false + ); + + final List fingerprintList = reply.data.sublist(reply.data.length - 2); + final String fingerprintNum = listChangInt(fingerprintList).toString(); + state.regIndex.value++; if(state.fingerprintNumber.value == fingerprintNum){ return; }else{ @@ -177,6 +203,19 @@ class AddFingerprintLogic extends BaseGetXController { break; default: //失败 + UmengCommonSdk.onEvent('add_fingerprint', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_fingerprint_result':'失败-${reply.data}', + }); + + BuglyTool.uploadException( + message: '添加指纹确认结果,解析数据', + detail: '添加指纹确认结果蓝牙返回失败结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}', + eventStr: '添加指纹事件蓝牙返回失败结果', + upload: true + ); state.ifAddState.value = false; break; } @@ -184,7 +223,50 @@ class AddFingerprintLogic extends BaseGetXController { // 添加指纹开始 Future senderAddFingerprint() async { - showBlueConnetctToastTimer(action: (){ + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); + + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + final String command = SenderAddFingerprintWithTimeCycleCoercionCommand( + keyID:'1', + userID:await Storage.getUid(), + fingerNo:0, + useCountLimit:0xffff, + isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫 + isAdmin: state.isAdministrator.value == '2' ? 1 : 0, + operate: 0, + isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环 + weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环 + startDate: int.parse(state.startDate.value)~/1000, + endDate: int.parse(state.endDate.value)~/1000, + startTime:DateTool().dateToHNString(state.effectiveDateTime.value), + endTime:DateTool().dateToHNString(state.failureDateTime.value), + needAuthor:1, + signKey:signKeyDataList, + privateKey:getPrivateKeyList, + token: getTokenList, + ).toString(); + + showBlueConnetctToastTimer(action: () async { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('add_fingerprint', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_fingerprint_result':'超时', + }); + + BuglyTool.uploadException( + message: '添加指纹超时处理-添加指纹失败', + detail: '添加指纹超时处理,断开连接,添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command', + eventStr: '添加指纹事件超时', + upload: true + ); Get.close(1); }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { @@ -219,6 +301,21 @@ class AddFingerprintLogic extends BaseGetXController { isBeforeAddUser: false ); }else if (deviceConnectionState == BluetoothConnectionState.disconnected){ + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('add_fingerprint', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_fingerprint_result':'断开', + }); + + BuglyTool.uploadException( + message: '添加指纹断开连接-添加指纹失败', + detail: '添加指纹断开连接-添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command', + eventStr: '添加指纹事件断开连接', + upload: true + ); + if(state.ifCurrentScreen.value == true){ showBlueConnetctToast(); } @@ -277,6 +374,20 @@ class AddFingerprintLogic extends BaseGetXController { ); if(entity.errorCode!.codeIsSuccessful){ updateFingerprintUserNoLoadData(entity.data!.fingerprintId.toString()); + BuglyTool.uploadException( + message: '添加指纹调用接口成功', + detail: '添加指纹调用接口成功', + eventStr: '添加指纹事件用接口成功', + upload: true + ); + }else{ + updateFingerprintUserNoLoadData(entity.data!.fingerprintId.toString()); + BuglyTool.uploadException( + message: '添加指纹调用接口失败', + detail: '添加指纹调用接口添加指纹调用接口失败 - ${entity.errorMsg}', + eventStr: '添加指纹事件接口失败', + upload: true + ); } } diff --git a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_page.dart b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_page.dart index 37b278b7..5eb834b1 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_page.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_page.dart @@ -6,7 +6,6 @@ import 'package:star_lock/main/lockDetail/fingerprint/addFingerprint/addFingerpr import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/appRouteObserver.dart'; import 'addFingerprint_logic.dart'; @@ -35,7 +34,7 @@ class _AddFingerprintPageState extends State with RouteAware height: 50.h, ), Obx(() => Visibility( - visible: logic.state.ifConnectScuess.value, + visible: state.ifConnectScuess.value, child: Container( padding: EdgeInsets.only(left: 20.w, right: 20.w), child: Column( @@ -68,7 +67,7 @@ class _AddFingerprintPageState extends State with RouteAware ), )), Obx(() => Visibility( - visible: !logic.state.ifConnectScuess.value, + visible: !state.ifConnectScuess.value, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_logic.dart b/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_logic.dart index caff99d5..8fe56f5d 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_logic.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_logic.dart @@ -50,7 +50,7 @@ class AddFingerprintTypeLogic extends BaseGetXController{ // } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } } else if (state.selectType.value == '2') { diff --git a/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_page.dart b/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_page.dart index 8317abaa..ce684a51 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_page.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_page.dart @@ -14,10 +14,10 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; +import '../../../../tools/key_name_item.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'addFingerprintType_logic.dart'; class AddFingerprintTypePage extends StatefulWidget { @@ -27,7 +27,8 @@ class AddFingerprintTypePage extends StatefulWidget { State createState() => _AddFingerprintTypePageState(); } -class _AddFingerprintTypePageState extends State with SingleTickerProviderStateMixin{ +class _AddFingerprintTypePageState extends State + with SingleTickerProviderStateMixin { final AddFingerprintTypeLogic logic = Get.put(AddFingerprintTypeLogic()); final AddFingerprintState state = Get.find().state; @@ -37,7 +38,9 @@ class _AddFingerprintTypePageState extends State with Si state.tabController = TabController( vsync: this, - length: state.fromType.value == 1 ? _itemTabs.length : _fromCheckInTypeItemTabs.length, + length: state.fromType.value == 1 + ? _itemTabs.length + : _fromCheckInTypeItemTabs.length, initialIndex: 0); state.tabController.addListener(() { WidgetsBinding.instance.addPostFrameCallback((_) { @@ -55,7 +58,7 @@ class _AddFingerprintTypePageState extends State with Si return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle:'添加指纹'.tr, + barTitle: '添加指纹'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -76,10 +79,10 @@ class _AddFingerprintTypePageState extends State with Si return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyBottomWidget() ], ), @@ -91,10 +94,10 @@ class _AddFingerprintTypePageState extends State with Si return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyTimeLimitWidget(), keyBottomWidget() ], @@ -107,10 +110,10 @@ class _AddFingerprintTypePageState extends State with Si return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyCyclicDate(), SizedBox(height: 10.h), keyBottomWidget() @@ -123,21 +126,6 @@ class _AddFingerprintTypePageState extends State with Si } } - // 密码命名输入框 - Widget perpetualKeyWidget( - String titleStr, String rightTitle, TextEditingController controller) { - return Column( - children: [ - CommonItem( - leftTitel: titleStr, - rightTitle: '', - isHaveRightWidget: true, - rightWidget: getTFWidget(rightTitle)), - Container(height: 10.h), - ], - ); - } - // 限时顶部选择日期 Widget keyTimeLimitWidget() { return Column( @@ -148,24 +136,28 @@ class _AddFingerprintTypePageState extends State with Si isHaveLine: true, isHaveDirection: true, action: () async { - final PDuration selectDate = - PDuration.parse(DateTime.tryParse(state.timeLimitBeginTime.value)); - Pickers.showDatePicker(context,selectDate:selectDate, mode: DateMode.YMDHM, - onConfirm: (PDuration p) { - state.timeLimitBeginTime.value = DateTool().getYMDHNDateString(p, 1); - }); + final PDuration selectDate = PDuration.parse( + DateTime.tryParse(state.timeLimitBeginTime.value)); + Pickers.showDatePicker(context, + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { + state.timeLimitBeginTime.value = + DateTool().getYMDHNDateString(p, 1); + }); })), Obx(() => CommonItem( leftTitel: '失效时间'.tr, rightTitle: state.timeLimitEndTime.value, isHaveDirection: true, action: () { - final PDuration selectDate = - PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value)); - Pickers.showDatePicker(context,selectDate:selectDate, mode: DateMode.YMDHM, - onConfirm: (PDuration p) { - state.timeLimitEndTime.value = DateTool().getYMDHNDateString(p, 1); - }); + final PDuration selectDate = PDuration.parse( + DateTime.tryParse(state.timeLimitEndTime.value)); + Pickers.showDatePicker(context, + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { + state.timeLimitEndTime.value = + DateTool().getYMDHNDateString(p, 1); + }); })), Container(height: 10.h), ], @@ -178,17 +170,19 @@ class _AddFingerprintTypePageState extends State with Si children: [ Obx(() => CommonItem( leftTitel: '有效期'.tr, - rightTitle:'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}', + rightTitle: + '${state.cycleBeginTime.value}\n${state.cycleEndTime.value}', isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -205,13 +199,15 @@ class _AddFingerprintTypePageState extends State with Si isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -224,16 +220,19 @@ class _AddFingerprintTypePageState extends State with Si visible: state.effectiveDateTime.value.isNotEmpty, child: CommonItem( leftTitel: '有效时间'.tr, - rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}', + rightTitle: + '${state.effectiveDateTime.value}-${state.failureDateTime.value}', isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -260,7 +259,7 @@ class _AddFingerprintTypePageState extends State with Si SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.stressFingerprint!.tr, + leftTitel: '胁迫指纹'.tr, rightTitle: '', isTipsImg: false, isHaveRightWidget: true, @@ -268,16 +267,15 @@ class _AddFingerprintTypePageState extends State with Si width: 60.w, height: 50.h, child: _isStressFingerprint()))), Container( color: Colors.white, - padding: EdgeInsets.only(left:20.w, right: 20.w, bottom: 20.h), + padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 20.h), child: Text( "${"当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。".tr}\n${"请不要将胁迫指纹用于日常开锁".tr}", style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), - ) - ), + )), SizedBox(height: 30.h), SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { @@ -365,54 +363,6 @@ class _AddFingerprintTypePageState extends State with Si // ); // } - // 接受者信息输入框 - Widget getTFWidget(String tfStr) { - return Container( - // color: Colors.red, - height: 65.h, - width: 300.w, - padding: EdgeInsets.only(top: 5.h), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: TextField( - //输入框一行 - maxLines: 1, - inputFormatters: [ - FilteringTextInputFormatter.deny('\n'), - LengthLimitingTextInputFormatter(50), - ], - style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), - controller: state.nameController, - // autofocus: false, - textAlign: TextAlign.end, - decoration: InputDecoration( - //输入里面输入文字内边距设置 - // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), - hintText: tfStr, - hintStyle: TextStyle(fontSize: 22.sp), - focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - enabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - border: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), - contentPadding: const EdgeInsets.symmetric(vertical: 0), - // suffixIcon: IconButton( - // icon: const Icon(Icons.clear), - // onPressed: state.nameController.clear, - // ), - ), - ), - ), - SizedBox( - width: 10.w, - ), - ], - ), - ); - } - //isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹 CupertinoSwitch _isStressFingerprint() { return CupertinoSwitch( @@ -439,13 +389,13 @@ class _AddFingerprintTypePageState extends State with Si ); } - final List _itemTabs = [ + final List _itemTabs = [ ItemView(title: '永久'.tr, selectType: '0'), ItemView(title: '限时'.tr, selectType: '1'), ItemView(title: '循环'.tr, selectType: '2'), ]; - final List _fromCheckInTypeItemTabs = [ + final List _fromCheckInTypeItemTabs = [ ItemView(title: '永久'.tr, selectType: '0'), ItemView(title: '限时'.tr, selectType: '1'), ]; @@ -456,8 +406,10 @@ class _AddFingerprintTypePageState extends State with Si onTap: (int index) { FocusScope.of(context).requestFocus(FocusNode()); }, - tabs: state.fromType.value == 1 ? _itemTabs.map(_tab).toList() : _fromCheckInTypeItemTabs.map(_tab).toList(), - isScrollable: true, + tabs: state.fromType.value == 1 + ? _itemTabs.map(_tab).toList() + : _fromCheckInTypeItemTabs.map(_tab).toList(), + isScrollable: false, indicatorColor: Colors.red, unselectedLabelColor: Colors.black, unselectedLabelStyle: TextStyle( @@ -474,13 +426,18 @@ class _AddFingerprintTypePageState extends State with Si borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, width: 30.w), + labelPadding: EdgeInsets.symmetric(horizontal: 10.w), + padding: EdgeInsets.zero, // 去除TabBar两侧的间隙 ); } Tab _tab(ItemView item) { return Tab( - child: SizedBox( - width: 1.sw / 5, + child: Container( + // color: Colors.red, + width: (1.sw - 10.w * 5) / 3, + // width: 1.sw / 4, + alignment: Alignment.center, child: Text(item.title, textAlign: TextAlign.center))); } @@ -488,14 +445,14 @@ class _AddFingerprintTypePageState extends State with Si return Expanded( child: TabBarView( controller: state.tabController, - children: - state.fromType.value == 1 + children: state.fromType.value == 1 ? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList() - : _fromCheckInTypeItemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList(), + : _fromCheckInTypeItemTabs + .map((ItemView item) => Obx(indexChangeWidget)) + .toList(), ), ); } - } class ItemView { diff --git a/lib/main/lockDetail/fingerprint/addFingerprintTip/addFingerprintTip_page.dart b/lib/main/lockDetail/fingerprint/addFingerprintTip/addFingerprintTip_page.dart index 816537b4..171b996e 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprintTip/addFingerprintTip_page.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprintTip/addFingerprintTip_page.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/fingerprint/addFingerprintTip/addFingerprintTip_state.dart'; import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'addFingerprintTip_logic.dart'; class AddFingerprintTipPage extends StatefulWidget { @@ -18,21 +18,21 @@ class AddFingerprintTipPage extends StatefulWidget { } class _AddFingerprintTipPageState extends State { - final logic = Get.put(AddFingerprintTipLogic()); - final state = Get.find().state; + final AddFingerprintTipLogic logic = Get.put(AddFingerprintTipLogic()); + final AddFingerprintTipState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.addLock!.tr, + barTitle: '添加锁'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ SizedBox( height: 50.h, ), @@ -40,10 +40,10 @@ class _AddFingerprintTipPageState extends State { padding: EdgeInsets.only(left: 20.w, right: 20.w), child: Row( mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ Expanded( child: Text( - "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压".tr, + '添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压'.tr, // TranslationLoader.lanKeys!.lightTouchScreenTip!.tr, textAlign: TextAlign.center, maxLines:null, @@ -67,20 +67,20 @@ class _AddFingerprintTipPageState extends State { Container( padding: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: "开始添加".tr,//TranslationLoader.lanKeys!.next!.tr, + btnName: '开始添加'.tr,//TranslationLoader.lanKeys!.next!.tr, borderRadius: 20.w, onClick: () { - Get.toNamed(Routers.addFingerprintPage, arguments: { - "lockId": state.lockId.value, - "endDate": state.endDate.value, - "addType": state.addType.value, - "fingerprintName": state.fingerprintName.value, - "fingerprintNumber": state.fingerprintNumber.value, - "fingerprintType": state.fingerprintType.value, - "isCoerced": state.isCoerced.value, - "startDate": state.startDate.value, - "weekDay": state.weekDay.value, - "fromType": state.fromType.value, + Get.toNamed(Routers.addFingerprintPage, arguments: { + 'lockId': state.lockId.value, + 'endDate': state.endDate.value, + 'addType': state.addType.value, + 'fingerprintName': state.fingerprintName.value, + 'fingerprintNumber': state.fingerprintNumber.value, + 'fingerprintType': state.fingerprintType.value, + 'isCoerced': state.isCoerced.value, + 'startDate': state.startDate.value, + 'weekDay': state.weekDay.value, + 'fromType': state.fromType.value, }); }), ), diff --git a/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart b/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart index 126bba47..b3f66632 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart @@ -14,7 +14,6 @@ import '../../../../tools/dateTool.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; import 'fingerprintDetail_logic.dart'; @@ -39,18 +38,16 @@ class _FingerprintDetailPageState extends State haveBack: true, backgroundColor: AppColors.mainColor, ), - body: Column( + body: ListView( children: [ Obx(() => CommonItem( - leftTitel:'指纹号'.tr, + leftTitel: '指纹号'.tr, rightTitle: state.typeNumber.value, isHaveDirection: false, isHaveLine: true)), Obx(() => lockDataListItem('姓名'.tr, state.typeName.value, () { ShowTipView().showTFViewAlertDialog( - state.changeNameController, - '修改姓名'.tr, - '修改姓名'.tr, () { + state.changeNameController, '修改姓名'.tr, '修改姓名'.tr, () { if (state.changeNameController.text.isEmpty) { logic.showToast('请输入姓名'.tr); return; @@ -114,7 +111,7 @@ class _FingerprintDetailPageState extends State Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + leftTitel: '有效日'.tr, rightTitle: logic.weekDayStr.join(','), isHaveDirection: true, isHaveLine: true, @@ -174,7 +171,7 @@ class _FingerprintDetailPageState extends State )), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.stressFingerprint!.tr, + leftTitel: '胁迫指纹'.tr, rightTitle: '', isTipsImg: false, isHaveRightWidget: true, diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart index 84237ed4..37d56740 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart @@ -4,7 +4,6 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/fingerprint/fingerprintList/fingerprint_entity.dart'; -import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart'; @@ -328,7 +327,8 @@ class FingerprintListLogic extends BaseGetXController { */ // 获取指纹列表 - Future getFingerprintsListData({required bool isRefresh}) async { + Future getFingerprintsListData( + {required bool isRefresh}) async { // 如果是下拉刷新,清空已有数据 if (isRefresh) { state.fingerprintItemListData.clear(); @@ -420,22 +420,21 @@ class FingerprintListLogic extends BaseGetXController { "${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${"永久".tr}"; } else if (fingerprintItemData.fingerprintType! == 2) { keyDateTypeStr = - '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时'; + '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}'; } else if (fingerprintItemData.fingerprintType! == 4) { keyDateTypeStr = - '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环'; + '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}'; } return keyDateTypeStr; } //刷新单条信息 - Future refreshIndividualKeys( - {required int fingerprintId}) async { + Future refreshIndividualKeys({required int fingerprintId}) async { final FingerprintEntity entity = - await ApiRepository.to.getFingerprintsData(fingerprintId); + await ApiRepository.to.getFingerprintsData(fingerprintId); if (entity.errorCode!.codeIsSuccessful) { - final int index = state.fingerprintItemListData - .indexWhere((FingerprintItemData item) => item.fingerprintId == fingerprintId); + final int index = state.fingerprintItemListData.indexWhere( + (FingerprintItemData item) => item.fingerprintId == fingerprintId); state.fingerprintItemListData.removeAt(index); state.fingerprintItemListData.insert(index, entity.data!); } diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart index 9049dd12..acfb8e9a 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart @@ -16,7 +16,6 @@ import '../../../../tools/showTipView.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'fingerprintListData_entity.dart'; import 'fingerprintList_logic.dart'; @@ -110,14 +109,14 @@ class _FingerprintListPageState extends State ), Expanded(child: _buildMainUI()), AddBottomWhiteBtn( - btnName: - '添加指纹'.tr, + btnName: '添加指纹'.tr, onClick: () async { await Get.toNamed(Routers.addFingerprintTypePage, - arguments: { + arguments: { 'lockId': state.lockId.value, 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 - })!.then((value) => getHttpData(isRefresh: true)); + })! + .then((value) => getHttpData(isRefresh: true)); // if (data != null) { // getHttpData(isRefresh: true); // } @@ -175,11 +174,13 @@ class _FingerprintListPageState extends State fingerprintItemData.fingerprintName!, logic.getKeyType(fingerprintItemData), logic.getKeyDateType(fingerprintItemData), () async { - await Get.toNamed(Routers.fingerprintDetailPage, arguments: { + await Get.toNamed(Routers.fingerprintDetailPage, + arguments: { 'fingerprintItemData': fingerprintItemData, - })!.then((value) { - getHttpData(isRefresh: true); - }); + })! + .then((value) { + getHttpData(isRefresh: true); + }); // if (data == 'deletScuess') { // // state.fingerprintItemListData.removeWhere((FingerprintItemData item) => item.fingerprintId == fingerprintItemData.fingerprintId!); // // setState(() {}); @@ -214,45 +215,34 @@ class _FingerprintListPageState extends State return GestureDetector( onTap: action, child: Container( - height: 90.h, + // height: 90.h, // margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w), + padding: EdgeInsets.only(top: 10.h, bottom: 10.h), color: Colors.white, - // decoration: BoxDecoration( - // color: Colors.white, - // // borderRadius: BorderRadius.circular(10.w), - // ), child: Row( children: [ SizedBox(width: 30.w), Image.asset(lockTypeIcon, width: 60.w, height: 60.w), SizedBox(width: 20.w), - Expanded( + SizedBox( + width: 1.sw - 30.w - 20.w - 60.w - 20.w, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox( - width: ifInvalidation.isNotEmpty - ? 1.sw - 110.w - 100.w - : 1.sw - 110.w - 50.w, - child: Row( - children: [ - Flexible( - child: Text(lockTypeTitle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor)), - ), - ], - ), + Expanded( + child: Text(lockTypeTitle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor)), ), + SizedBox(width: 10.w), Text(ifInvalidation, style: TextStyle(fontSize: 22.sp, color: Colors.red)), - SizedBox(width: 10.w), + // SizedBox(width: 10.w), ], ), SizedBox(height: 5.h), @@ -261,19 +251,17 @@ class _FingerprintListPageState extends State children: [ Flexible( child: Text(showTime, - maxLines: 1, - overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 18.sp, color: AppColors.placeholderTextColor)), ), ], ), - SizedBox(width: 20.h), + // SizedBox(width: 20.h), ], ), ), - SizedBox(width: 20.h), + SizedBox(width: 20.w), ], ), ), diff --git a/lib/main/lockDetail/iris/addIris/addIris_logic.dart b/lib/main/lockDetail/iris/addIris/addIris_logic.dart index e2756289..06054378 100755 --- a/lib/main/lockDetail/iris/addIris/addIris_logic.dart +++ b/lib/main/lockDetail/iris/addIris/addIris_logic.dart @@ -7,7 +7,6 @@ class AddIrisLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); // _initReplySubscription(); @@ -15,7 +14,6 @@ class AddIrisLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); //开始添加后发送指令 // senderAddFace(); @@ -23,7 +21,6 @@ class AddIrisLogic extends BaseGetXController { @override void onClose() { - // TODO: implement onClose super.onClose(); // _replySubscription.cancel(); diff --git a/lib/main/lockDetail/iris/addIris/addIris_page.dart b/lib/main/lockDetail/iris/addIris/addIris_page.dart index 6dce7aae..adc75d76 100755 --- a/lib/main/lockDetail/iris/addIris/addIris_page.dart +++ b/lib/main/lockDetail/iris/addIris/addIris_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -7,7 +8,6 @@ import 'package:star_lock/main/lockDetail/iris/addIris/addIris_state.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class AddIrisPage extends StatefulWidget { const AddIrisPage({Key? key}) : super(key: key); @@ -51,7 +51,8 @@ class _AddIrisPageState extends State { children: [ Expanded( child: Text( - '请单人正对门锁,距离一个成年人手臂长度\n(约0.6米)。\n保持脸部无遮挡,露出五官。', + // 虹膜提示需要国际化 + '', textAlign: TextAlign.left, maxLines: null, style: @@ -69,7 +70,7 @@ class _AddIrisPageState extends State { ? Container( padding: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: '准备好了,开始添加', + btnName: '准备好了,开始添加'.tr, borderRadius: 20.w, onClick: () { state.isClickAddFace.value = true; @@ -79,7 +80,7 @@ class _AddIrisPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '正在录入中...', + '正在录入中...'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 22.sp), diff --git a/lib/main/lockDetail/iris/addIris/addIris_state.dart b/lib/main/lockDetail/iris/addIris/addIris_state.dart index 6dbf77d0..d0711734 100755 --- a/lib/main/lockDetail/iris/addIris/addIris_state.dart +++ b/lib/main/lockDetail/iris/addIris/addIris_state.dart @@ -1,37 +1,37 @@ + import 'package:get/get.dart'; class AddIrisState { - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - - var ifConnectScuess = false.obs; - var maxRegCount = 0.obs; // 最大注册次数 - var regIndex = 0.obs; // 当前注册次数 - - var faceNumber = "".obs; - - final lockId = 0.obs; - final endDate = 0.obs; - final addType = "".obs; - final faceName = "".obs; - final faceType = 0.obs; - final startDate = 0.obs; - final cyclicConfig = [].obs; - final fromType = 1.obs; - final featureData = ''.obs; - final isClickAddFace = false.obs; - final isAdministrator = false.obs; - AddIrisState() { Map map = Get.arguments; - lockId.value = map["lockId"]; - endDate.value = map["endDate"]; - addType.value = map["addType"]; - faceName.value = map["faceName"]; - faceType.value = map["faceType"]; - startDate.value = map["startDate"]; - lockId.value = map["lockId"]; - cyclicConfig.value = map["cyclicConfig"]; - fromType.value = map["fromType"]; - isAdministrator.value = map["isAdministrator"]; + lockId.value = map['lockId']; + endDate.value = map['endDate']; + addType.value = map['addType']; + faceName.value = map['faceName']; + faceType.value = map['faceType']; + startDate.value = map['startDate']; + lockId.value = map['lockId']; + cyclicConfig.value = map['cyclicConfig']; + fromType.value = map['fromType']; + isAdministrator.value = map['isAdministrator']; } + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + + RxBool ifConnectScuess = false.obs; + RxInt maxRegCount = 0.obs; // 最大注册次数 + RxInt regIndex = 0.obs; // 当前注册次数 + + RxString faceNumber = ''.obs; + + final RxInt lockId = 0.obs; + final RxInt endDate = 0.obs; + final RxString addType = ''.obs; + final RxString faceName = ''.obs; + final RxInt faceType = 0.obs; + final RxInt startDate = 0.obs; + final RxList cyclicConfig = [].obs; + final RxInt fromType = 1.obs; + final RxString featureData = ''.obs; + final RxBool isClickAddFace = false.obs; + final RxBool isAdministrator = false.obs; } diff --git a/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_page.dart b/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_page.dart index 5805c261..6f7a816d 100755 --- a/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_page.dart +++ b/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_page.dart @@ -4,7 +4,6 @@ import 'package:star_lock/main/lockDetail/iris/addIrisType/addIrisTypeManage/add import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class AddIrisTypeManagePage extends StatefulWidget { const AddIrisTypeManagePage({Key? key}) : super(key: key); @@ -28,7 +27,7 @@ class _AddIrisTypeManagePageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: "${"添加".tr}${'虹膜'.tr}", + barTitle: '${'添加'.tr}${'虹膜'.tr}', haveBack: true, backgroundColor: AppColors.mainColor), body: Column( diff --git a/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_tabbar.dart b/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_tabbar.dart index d8200b5e..abdd0efc 100755 --- a/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_tabbar.dart +++ b/lib/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_tabbar.dart @@ -5,7 +5,6 @@ import 'package:star_lock/main/lockDetail/iris/addIrisType/addIrisType_page.dart import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/CustomUnderlineTabIndicator.dart'; -import '../../../../../translations/trans_lib.dart'; class AddIrisTypeManageTabbar extends StatefulWidget { // 从添加员工进入 传入员工名字 AddIrisTypeManageTabbar( diff --git a/lib/main/lockDetail/iris/addIrisType/addIrisType_logic.dart b/lib/main/lockDetail/iris/addIrisType/addIrisType_logic.dart index 2efdbdb7..b6d9986e 100755 --- a/lib/main/lockDetail/iris/addIrisType/addIrisType_logic.dart +++ b/lib/main/lockDetail/iris/addIrisType/addIrisType_logic.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/iris/addIrisType/addIrisType_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/dateTool.dart'; @@ -15,31 +16,31 @@ class AddIrisTypeLogic extends BaseGetXController { // 添加虹膜 void addIrisData() async { - var irisType = 0; // 永久:1;限时2,单次3,循环:4 - var startDate = ""; - var endDate = ""; - var startTime = ""; - var endTime = ""; - if (state.selectType.value == "0") { + int irisType = 0; // 永久:1;限时2,单次3,循环:4 + String startDate = ''; + String endDate = ''; + // String startTime = ''; + // String endTime = ''; + if (state.selectType.value == '0') { irisType = 1; - startDate = "0"; - endDate = "0"; - startTime = "0"; - endTime = "0"; - } else if (state.selectType.value == "1") { + startDate = '0'; + endDate = '0'; + // startTime = '0'; + // endTime = '0'; + } else if (state.selectType.value == '1') { irisType = 2; startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); - startTime = "0"; - endTime = "0"; + // startTime = '0'; + // endTime = '0'; if (startDate.isEmpty) { - showToast("请选择开始时间".tr); + showToast('请选择开始时间'.tr); return; } if (endDate.isEmpty) { - showToast("请选择结束时间".tr); + showToast('请选择结束时间'.tr); return; } @@ -49,42 +50,42 @@ class AddIrisTypeLogic extends BaseGetXController { // } if (int.parse(startDate) >= int.parse(endDate)) { - showToast("失效时间要大于生效时间".tr); + showToast('失效时间需晚于生效时间'.tr); return; } - } else if (state.selectType.value == "2") { + } else if (state.selectType.value == '2') { if (state.beginTime.value.isEmpty) { - showToast("请选择有效期".tr); + showToast('请选择有效期'.tr); return; } startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); - startTime = DateTool() - .dateToTimestamp(state.effectiveDateTime.value, 0) - .toString(); - endTime = - DateTool().dateToTimestamp(state.failureDateTime.value, 0).toString(); + // startTime = DateTool() + // .dateToTimestamp(state.effectiveDateTime.value, 0) + // .toString(); + // endTime = + // DateTool().dateToTimestamp(state.failureDateTime.value, 0).toString(); irisType = 4; } // 虹膜 - Get.toNamed(Routers.addIrisPage, arguments: { - "lockId": state.lockId.value, - "endDate": int.parse(endDate), - "addType": "1", - "faceName": state.nameController.text, - "faceNumber": "123456", - "faceType": irisType, - "startDate": int.parse(startDate), - "cyclicConfig": state.weekdaysList.value, - "fromType": state.fromType.value, - "isAdministrator": state.isAdministrator.value, + Get.toNamed(Routers.addIrisPage, arguments: { + 'lockId': state.lockId.value, + 'endDate': int.parse(endDate), + 'addType': '1', + 'faceName': state.nameController.text, + 'faceNumber': '123456', + 'faceType': irisType, + 'startDate': int.parse(startDate), + 'cyclicConfig': state.weekdaysList.value, + 'fromType': state.fromType.value, + 'isAdministrator': state.isAdministrator.value, }); } // 校验指纹名字是否重复 - void checkIrisNameDuplicated(String irisName) async { - var entity = await ApiRepository.to.checkFaceNameDuplicatedData( + Future checkIrisNameDuplicated(String irisName) async { + final LoginEntity entity = await ApiRepository.to.checkFaceNameDuplicatedData( lockId: state.lockId.value.toString(), faceName: irisName, ); diff --git a/lib/main/lockDetail/iris/addIrisType/addIrisType_page.dart b/lib/main/lockDetail/iris/addIrisType/addIrisType_page.dart index e17320f3..3285b06b 100755 --- a/lib/main/lockDetail/iris/addIrisType/addIrisType_page.dart +++ b/lib/main/lockDetail/iris/addIrisType/addIrisType_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -16,7 +17,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; -import '../../../../translations/trans_lib.dart'; class AddIrisTypePage extends StatefulWidget { // 从添加员工进入 传入员工名字 const AddIrisTypePage( @@ -256,18 +256,18 @@ class _AddIrisTypePageState extends State { SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))), SizedBox(height: 30.h), SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { if (state.nameController.text.isEmpty) { - logic.showToast('请输入姓名'); + logic.showToast('请输入姓名'.tr); return; } logic.checkIrisNameDuplicated(state.nameController.text); } else { // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }), ], diff --git a/lib/main/lockDetail/iris/addIrisType/addIrisType_state.dart b/lib/main/lockDetail/iris/addIrisType/addIrisType_state.dart index a2fb8c31..e667913d 100755 --- a/lib/main/lockDetail/iris/addIrisType/addIrisType_state.dart +++ b/lib/main/lockDetail/iris/addIrisType/addIrisType_state.dart @@ -2,20 +2,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class AddIrisTypeState { - final lockId = 0.obs; - final selectType = "0".obs; // 0永久 1显示 2循环 - final fromType = 1.obs; // // 1从添加钥匙列表进入 2从考勤添加员工入口进入 - var fromTypeTwoStaffName = "".obs; // 考勤添加人脸员工名字 - final isStressFingerprint = false.obs; - final isAdministrator = false.obs; // 是否为管理员 - - var beginTime = "".obs; // 开始时间 - var endTime = "".obs; // 结束时间 - var effectiveDateTime = "".obs; // 生效时间 - var failureDateTime = "".obs; // 失效时间 - var weekdaysList = [].obs; - - final TextEditingController nameController = TextEditingController(); AddIrisTypeState() { // Map map = Get.arguments; // lockId.value = map["lockId"]; @@ -25,4 +11,18 @@ class AddIrisTypeState { // // nameController.text = fromTypeTwoStaffName.value; // } } + final RxInt lockId = 0.obs; + final RxString selectType = '0'.obs; // 0永久 1显示 2循环 + final RxInt fromType = 1.obs; // // 1从添加钥匙列表进入 2从考勤添加员工入口进入 + RxString fromTypeTwoStaffName = ''.obs; // 考勤添加人脸员工名字 + final RxBool isStressFingerprint = false.obs; + final RxBool isAdministrator = false.obs; // 是否为管理员 + + RxString beginTime = ''.obs; // 开始时间 + RxString endTime = ''.obs; // 结束时间 + RxString effectiveDateTime = ''.obs; // 生效时间 + RxString failureDateTime = ''.obs; // 失效时间 + RxList weekdaysList = [].obs; + + final TextEditingController nameController = TextEditingController(); } diff --git a/lib/main/lockDetail/iris/irisDetail/irisDetail_logic.dart b/lib/main/lockDetail/iris/irisDetail/irisDetail_logic.dart index 2a31cd67..7814dadb 100755 --- a/lib/main/lockDetail/iris/irisDetail/irisDetail_logic.dart +++ b/lib/main/lockDetail/iris/irisDetail/irisDetail_logic.dart @@ -1,19 +1,18 @@ + import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; -import 'package:star_lock/blue/io_type.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/iris/irisDetail/irisDetail_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/pickers/time_picker/time_utils.dart'; import '../../../../blue/blue_manage.dart'; -// import '../../../../blue/io_protocol/io_addICCard.dart'; import '../../../../blue/io_reply.dart'; import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; -import '../../../../blue/sender_manage.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/dateTool.dart'; import '../../../../tools/storage.dart'; @@ -29,7 +28,7 @@ class IrisDetailLogic extends BaseGetXController { late StreamSubscription _replySubscription; void _initReplySubscription() { _replySubscription = - EventBusManager().eventBus!.on().listen((reply) async { + EventBusManager().eventBus!.on().listen((Reply reply) async { // 添加卡片开始(重置锁里面所有卡) // if ((reply is SenderAddICCardReply)) { // _replyAddICCardBegin(reply); @@ -39,7 +38,7 @@ class IrisDetailLogic extends BaseGetXController { // 添加卡片开始(此处用作删除卡片) Future _replyAddICCardBegin(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch (status) { case 0x00: @@ -50,19 +49,19 @@ class IrisDetailLogic extends BaseGetXController { break; case 0x06: //无权限 - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var signKey = await Storage.getStringList(saveBlueSignKey); - List signKeyDataList = changeStringListToIntList(signKey!); + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); // var publicKey = await Storage.getStringList(saveBluePublicKey); // List publicKeyDataList = changeStringListToIntList(publicKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - String? userID = await Storage.getUid(); + final String? userID = await Storage.getUid(); // IoSenderManage.senderAddICCardCommand( // keyID: state.keyId.value.toString(), // userID: userID, @@ -101,16 +100,16 @@ class IrisDetailLogic extends BaseGetXController { // var publicKey = await Storage.getStringList(saveBluePublicKey); // List publicKeyDataList = changeStringListToIntList(publicKey!); - var signKey = await Storage.getStringList(saveBlueSignKey); - List signKeyDataList = changeStringListToIntList(signKey!); + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - String? userID = await Storage.getUid(); + final String? userID = await Storage.getUid(); // IoSenderManage.senderAddICCardCommand( // keyID: state.keyId.value.toString(), // userID: userID, @@ -137,22 +136,22 @@ class IrisDetailLogic extends BaseGetXController { // 编辑iC卡 void editICCardData() async { - var entity = await ApiRepository.to.editICCardData( + final LoginEntity entity = await ApiRepository.to.editICCardData( cardId: state.keyId.value.toString(), lockId: state.fingerprintItemData.value.lockId.toString(), weekDay: state.weekDay.value, startDate: state.starDate.value * 1000, endDate: state.endDate.value * 1000, - isCoerced: state.isStressFingerprint.value ? "2" : "1", + isCoerced: state.isStressFingerprint.value ? '2' : '1', cardName: state.changeNameController.text, - changeType: "1", + changeType: '1', startTime: int.parse(state.starTime.value), endTime: int.parse(state.endTime.value), cardType: state.keyType.value, cardRight: 0, ); if (entity.errorCode!.codeIsSuccessful) { - showToast("修改成功", something: () { + showToast('修改成功'.tr, something: () { eventBus.fire(OtherTypeRefreshListEvent()); }); } @@ -160,14 +159,14 @@ class IrisDetailLogic extends BaseGetXController { // 删除IC卡 void deletICCardData() async { - var entity = await ApiRepository.to.deletIcCardData( + final LoginEntity entity = await ApiRepository.to.deletIcCardData( cardId: state.fingerprintItemData.value.cardId.toString(), lockId: state.fingerprintItemData.value.lockId.toString(), - type: "0", - deleteType: "1"); + type: '0', + deleteType: '1'); if (entity.errorCode!.codeIsSuccessful) { - showToast("删除成功", something: () { - Get.back(result: "addScuess"); + showToast('删除成功'.tr, something: () { + Get.back(result: 'addScuess'); }); } } @@ -175,20 +174,19 @@ class IrisDetailLogic extends BaseGetXController { String getKeyTypeShowDateTime() { String useDateStr = ''; if (state.keyType.value == 1) { - useDateStr = "永久"; + useDateStr = '永久'.tr; } else if (state.keyType.value == 2) { useDateStr = - "${DateTool().dateToYMDHNString(state.starDate.value)}\n${DateTool().dateToYMDHNString(state.endDate.value)}"; + '${DateTool().dateToYMDHNString(state.starDate.value)}\n${DateTool().dateToYMDHNString(state.endDate.value)}'; } else if (state.keyType.value == 4) { useDateStr = - "${DateTool().dateToYMDString(state.starDate.value)}\n${DateTool().dateToYMDString(state.endDate.value)}"; + '${DateTool().dateToYMDString(state.starDate.value)}\n${DateTool().dateToYMDString(state.endDate.value)}'; } return useDateStr; } @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -196,13 +194,11 @@ class IrisDetailLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); diff --git a/lib/main/lockDetail/iris/irisDetail/irisDetail_page.dart b/lib/main/lockDetail/iris/irisDetail/irisDetail_page.dart index 96c518cd..43fc32cc 100755 --- a/lib/main/lockDetail/iris/irisDetail/irisDetail_page.dart +++ b/lib/main/lockDetail/iris/irisDetail/irisDetail_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -8,7 +9,6 @@ import 'package:star_lock/main/lockDetail/iris/irisDetail/irisDetail_state.dart' import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; -import '../../../../blue/blue_manage.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; @@ -17,7 +17,6 @@ import '../../../../tools/showTFView.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class CardDetailPage extends StatefulWidget { const CardDetailPage({Key? key}) : super(key: key); @@ -35,15 +34,14 @@ class _CardDetailPageState extends State with RouteAware { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '虹膜详情', + barTitle: '虹膜详情'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: ListView( children: [ Obx(() => CommonItem( - leftTitel: - '虹膜', + leftTitel: '虹膜号'.tr, rightTitle: state.typeNumber.value, isHaveDirection: false, isHaveLine: true)), @@ -106,7 +104,7 @@ class _CardDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + leftTitel: '有效日'.tr, rightTitle: logic.weekDayStr.join(','), isHaveDirection: true, isHaveLine: true, @@ -131,7 +129,7 @@ class _CardDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4 ? true : false, child: Obx(() => CommonItem( - leftTitel: '有效时间', + leftTitel: '有效时间'.tr, rightTitle: '${DateTool().dateToHNString(state.starTime.value)}-${DateTool().dateToHNString(state.endTime.value)}', isHaveDirection: true, @@ -165,7 +163,7 @@ class _CardDetailPageState extends State with RouteAware { )), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.stressCard!.tr, + leftTitel: '胁迫卡'.tr, rightTitle: '', isTipsImg: false, isHaveRightWidget: true, @@ -316,7 +314,7 @@ class _CardDetailPageState extends State with RouteAware { controller: state.changeNameController, sureClick: () { if (state.changeNameController.text.isEmpty) { - logic.showToast('请输入姓名'); + logic.showToast('请输入姓名'.tr); return; } Get.back(); @@ -335,8 +333,8 @@ class _CardDetailPageState extends State with RouteAware { context: context, builder: (BuildContext context) { return ShowIosTipView( - title: '提示', - tipTitle: '确定要删除吗?', + title: '提示'.tr, + tipTitle: '确定要删除吗?'.tr, sureClick: () async { Get.back(); String? idStr = await Storage.getUid(); diff --git a/lib/main/lockDetail/iris/irisDetail/irisDetail_state.dart b/lib/main/lockDetail/iris/irisDetail/irisDetail_state.dart index 27b7d125..bcce6fc4 100755 --- a/lib/main/lockDetail/iris/irisDetail/irisDetail_state.dart +++ b/lib/main/lockDetail/iris/irisDetail/irisDetail_state.dart @@ -4,30 +4,10 @@ import 'package:get/get.dart'; import '../../fingerprint/fingerprintList/fingerprintListData_entity.dart'; class IrisDetailState { - final fingerprintItemData = FingerprintItemData().obs; - - final TextEditingController changeNameController = TextEditingController(); - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) - - final typeNumber = "".obs; // 指纹号 - final typeName = "".obs; // 指纹名字 - var starDate = "".obs; // 开始时间 - var endDate = "".obs; // 结束时间 - var starTime = "".obs; // 生效时间 - var endTime = "".obs; // 失效时间 - final keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 - var weekDay = [].obs; // 有效日 - var adder = "".obs; // 添加者 - var addTime = 0.obs; // 添加时间 - var keyId = 0.obs; // 卡id - - final isStressFingerprint = false.obs; IrisDetailState() { Map map = Get.arguments; - if ((map["fingerprintItemData"] != null)) { - fingerprintItemData.value = map["fingerprintItemData"]; + if (map['fingerprintItemData'] != null) { + fingerprintItemData.value = map['fingerprintItemData']; keyId.value = fingerprintItemData.value.cardId!; typeNumber.value = fingerprintItemData.value.cardNumber!; typeName.value = fingerprintItemData.value.cardName!; @@ -39,9 +19,32 @@ class IrisDetailState { keyType.value = fingerprintItemData.value.cardType!; adder.value = fingerprintItemData.value.senderUsername!; addTime.value = fingerprintItemData.value.createDate!; - isStressFingerprint.value = - fingerprintItemData.value.isCoerced! == 2 ? true : false; + if (fingerprintItemData.value.isCoerced! == 2) { + isStressFingerprint.value = true; + } else { + isStressFingerprint.value = false; + } weekDay.value = fingerprintItemData.value.weekDay!; } } + final Rx fingerprintItemData = FingerprintItemData().obs; + + final TextEditingController changeNameController = TextEditingController(); + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) + + final RxString typeNumber = ''.obs; // 指纹号 + final RxString typeName = ''.obs; // 指纹名字 + RxString starDate = ''.obs; // 开始时间 + RxString endDate = ''.obs; // 结束时间 + RxString starTime = ''.obs; // 生效时间 + RxString endTime = ''.obs; // 失效时间 + final RxInt keyType = 0.obs; // 永久:1;限时2,单次3,循环:4 + RxList weekDay = [].obs; // 有效日 + RxString adder = ''.obs; // 添加者 + RxInt addTime = 0.obs; // 添加时间 + RxInt keyId = 0.obs; // 卡id + + final RxBool isStressFingerprint = false.obs; } diff --git a/lib/main/lockDetail/iris/irisList/irisList_logic.dart b/lib/main/lockDetail/iris/irisList/irisList_logic.dart index f0b2f68c..789c20c4 100755 --- a/lib/main/lockDetail/iris/irisList/irisList_logic.dart +++ b/lib/main/lockDetail/iris/irisList/irisList_logic.dart @@ -2,16 +2,14 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:star_lock/blue/io_protocol/io_addFace.dart'; -import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; -import 'package:star_lock/blue/io_type.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; +import 'package:star_lock/main/lockDetail/fingerprint/fingerprintList/fingerprintListData_entity.dart'; import 'package:star_lock/main/lockDetail/iris/irisList/irisList_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../blue/blue_manage.dart'; -import '../../../../blue/io_protocol/io_checkingUserInfoCount.dart'; import '../../../../blue/io_reply.dart'; import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; -import '../../../../blue/sender_manage.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/storage.dart'; @@ -23,26 +21,17 @@ class IrisListLogic extends BaseGetXController { late StreamSubscription _replySubscription; void _initReplySubscription() { _replySubscription = - EventBusManager().eventBus!.on().listen((reply) { + EventBusManager().eventBus!.on().listen((Reply reply) { // 添加人脸开始(此处用作删除人脸) if ((reply is SenderAddFaceReply) && (state.isDeletFaceData == true)) { _replyAddFaceBegin(reply); } - - if (reply is SenderQueryingFaceStatusReply) { - // 获取人脸状态 - _replyQueryingFaceStatus(reply); - } - - if (reply is SenderCheckingUserInfoCountReply) { - _replyCheckingUserInfoCount(reply); - } }); } // 添加人脸开始---这里用作删除人脸 Future _replyAddFaceBegin(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch (status) { case 0x00: @@ -58,14 +47,17 @@ class IrisListLogic extends BaseGetXController { break; case 0x06: //无权限 - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var signKey = await Storage.getStringList(saveBlueSignKey); - List signKeyDataList = changeStringListToIntList(signKey!); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); // IoSenderManage.senderAddFaceCommand( // keyID:state.deletKeyID, @@ -91,29 +83,9 @@ class IrisListLogic extends BaseGetXController { } } - // 获取人脸状态 - Future _replyQueryingFaceStatus(Reply reply) async { - int status = reply.data[2]; - - switch (status) { - case 0x00: - //成功 - // _getLockStatus(); - break; - case 0x06: - //无权限 - - break; - default: - //失败 - - break; - } - } - // 获取卡片状态 Future _replyReferEventRecordNumber(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch (status) { case 0x00: //成功 @@ -129,77 +101,23 @@ class IrisListLogic extends BaseGetXController { } } - // 查询用户、指纹、密码、卡片数量(用于判断是否同步) - Future _replyCheckingUserInfoCount(Reply reply) async { - int status = reply.data[2]; - - // 用户数量 - int userNum = reply.data[5]; - - // 指纹数量 - int fingerNum = reply.data[6]; - - // 密码数量 - int pwdNum = reply.data[7]; - - // 卡片数量 - int cardNum = reply.data[8]; - - // 记录数量 - int logsNum = reply.data[9]; - - // 版本 - int verNo = reply.data[10]; - - // 最大管理员指纹数量 - int maxAdminFingerNum = reply.data[11]; - - // 最大用户指纹数量 - int maxUserFingerNum = reply.data[12]; - - // 最大管理员密码数量 - int maxAdminPassNum = reply.data[13]; - - // 最大用户密码数量 - int maxUserPassNum = reply.data[14]; - - // 最大管理员卡片数量 - int maxAdminCardNum = reply.data[15]; - - // 最大用户卡片数量 - int maxUserCardNum = reply.data[16]; - - // 序列号 - var serialNo = reply.data.sublist(17, 21); - - switch (status) { - case 0x00: - //成功 - // _getLockStatus(); - break; - case 0x06: - //需要鉴权 - - break; - default: - //失败 - break; - } - } - // 获取人脸状态 Future senderQueryingFaceStatus() async { BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState state) async { if (state == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = + changeStringListToIntList(publicKey!); // IoSenderManage.senderQueryingFaceStatusCommand( // keyID: BlueManage().connectDeviceName, @@ -221,14 +139,18 @@ class IrisListLogic extends BaseGetXController { BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState state) async { if (state == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = + changeStringListToIntList(publicKey!); // IoSenderManage.senderCheckingUserInfoCountCommand( // keyID: BlueManage().connectDeviceName, @@ -253,14 +175,17 @@ class IrisListLogic extends BaseGetXController { BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { - var signKey = await Storage.getStringList(saveBlueSignKey); - List signKeyDataList = changeStringListToIntList(signKey!); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); // IoSenderManage.senderAddFaceCommand( // keyID:state.deletKeyID, @@ -291,8 +216,9 @@ class IrisListLogic extends BaseGetXController { } // 获取虹膜列表 - void getIrisListData() async { - var entity = await ApiRepository.to.getFaceListData( + Future getIrisListData() async { + final FingerprintListDataEntity entity = + await ApiRepository.to.getFaceListData( lockId: state.lockId.value.toString(), pageNo: '1', pageSize: '20', @@ -304,37 +230,37 @@ class IrisListLogic extends BaseGetXController { } // 删除的人脸 - void deletFacesData() async { - var faceId = ""; - var type = "1"; + Future deletFacesData() async { + String faceId = ''; + String type = '1'; if (state.isDeletAll == false) { faceId = state.deletKeyID; - type = "0"; + type = '0'; } - var entity = await ApiRepository.to.deleteFaceData( + final LoginEntity entity = await ApiRepository.to.deleteFaceData( faceId: int.parse(faceId), lockId: state.lockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast("删除成功"); + showToast('删除成功'); state.isDeletFaceData = false; getIrisListData(); } } // 重置所有的人脸 - void clearAllFacesData() async { - var faceId = ""; - var type = "1"; + Future clearAllFacesData() async { + String faceId = ''; + String type = '1'; if (state.isDeletAll == false) { faceId = state.deletKeyID; - type = "0"; + type = '0'; } - var entity = await ApiRepository.to.clearFaceData( + final LoginEntity entity = await ApiRepository.to.clearFaceData( lockId: state.lockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast("重置成功"); + showToast('重置成功'); state.isDeletFaceData = false; getIrisListData(); } @@ -343,18 +269,19 @@ class IrisListLogic extends BaseGetXController { // 监听修改完详情之后刷新列表 late StreamSubscription _teamEvent; void _initRefreshAction() { - _teamEvent = eventBus.on().listen((event) { + _teamEvent = eventBus + .on() + .listen((OtherTypeRefreshListEvent event) { getIrisListData(); }); } @override Future onReady() async { - // TODO: implement onReady super.onReady(); // 获取是否是演示模式 演示模式不获取接口 - var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { // _initReplySubscription(); @@ -366,10 +293,9 @@ class IrisListLogic extends BaseGetXController { @override Future onInit() async { - // TODO: implement onInit super.onInit(); - var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { // senderQueryingFingerprintStatus(); // senderCheckingCardStatus(); @@ -380,10 +306,9 @@ class IrisListLogic extends BaseGetXController { @override Future onClose() async { - // TODO: implement onClose super.onClose(); - var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { // _replySubscription.cancel(); // _teamEvent.cancel(); diff --git a/lib/main/lockDetail/iris/irisList/irisList_page.dart b/lib/main/lockDetail/iris/irisList/irisList_page.dart index 229c5b88..8b63e481 100755 --- a/lib/main/lockDetail/iris/irisList/irisList_page.dart +++ b/lib/main/lockDetail/iris/irisList/irisList_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -16,7 +17,6 @@ import '../../../../tools/showIosTipView.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class IrisListPage extends StatefulWidget { const IrisListPage({Key? key}) : super(key: key); @@ -51,10 +51,10 @@ class _IrisListPageState extends State { if (!isNetWork) { return; } - showDeletAlertDialog(context); + // showDeletAlertDialog(context); } else { // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }, ), @@ -122,7 +122,7 @@ class _IrisListPageState extends State { (getFaceItemData.faceType! != 1) ? (getFaceItemData.endDate! < DateTime.now().millisecondsSinceEpoch - ? '已失效' + ? '已失效'.tr : '') : '', getFaceItemData.validTimeStr!, @@ -165,9 +165,9 @@ class _IrisListPageState extends State { width: 60, color: const Color(0xFFF20101), alignment: Alignment.center, - child: const Text( - '删除', - style: TextStyle( + child: Text( + '删除'.tr, + style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Colors.white, @@ -183,8 +183,8 @@ class _IrisListPageState extends State { context: context, builder: (BuildContext context) { return ShowIosTipView( - title: '提示', - tipTitle: '确定要删除吗?', + title: '提示'.tr, + tipTitle: '确定要删除吗?'.tr, sureClick: () async { Get.back(); state.isDeletFaceData = true; @@ -254,35 +254,35 @@ class _IrisListPageState extends State { ); } - void showDeletAlertDialog(BuildContext context) { - showCupertinoDialog( - context: context, - builder: (BuildContext context) { - return CupertinoAlertDialog( - title: const Text('提示'), - content: const Text('重置后,该锁的人脸都将被删除哦,确认要重置吗?'), - actions: [ - CupertinoDialogAction( - child: Text('取消'.tr), - onPressed: () { - Navigator.pop(context); - }, - ), - CupertinoDialogAction( - child: Text('确定'.tr), - onPressed: () { - Navigator.pop(context); - state.isDeletFaceData = true; - state.isDeletAll = true; - state.deletKeyID = '1'; - state.deletUserID = 'DeleteAll!@#'; - state.deletFaceNo = 255; - // logic.senderAddFace(); - }, - ), - ], - ); - }, - ); - } + // void showDeletAlertDialog(BuildContext context) { + // showCupertinoDialog( + // context: context, + // builder: (BuildContext context) { + // return CupertinoAlertDialog( + // title: const Text('提示'), + // content: const Text('重置后,该锁的人脸都将被删除哦,确认要重置吗?'), + // actions: [ + // CupertinoDialogAction( + // child: Text('取消'.tr), + // onPressed: () { + // Navigator.pop(context); + // }, + // ), + // CupertinoDialogAction( + // child: Text('确定'.tr), + // onPressed: () { + // Navigator.pop(context); + // state.isDeletFaceData = true; + // state.isDeletAll = true; + // state.deletKeyID = '1'; + // state.deletUserID = 'DeleteAll!@#'; + // state.deletFaceNo = 255; + // // logic.senderAddFace(); + // }, + // ), + // ], + // ); + // }, + // ); + // } } diff --git a/lib/main/lockDetail/iris/irisList/irisList_state.dart b/lib/main/lockDetail/iris/irisList/irisList_state.dart index ac926272..4fbcf9a7 100755 --- a/lib/main/lockDetail/iris/irisList/irisList_state.dart +++ b/lib/main/lockDetail/iris/irisList/irisList_state.dart @@ -4,21 +4,21 @@ import 'package:star_lock/main/lockDetail/fingerprint/fingerprintList/fingerprin class IrisListState { final TextEditingController searchController = TextEditingController(); - final lockId = 0.obs; + final RxInt lockId = 0.obs; // 因为删除跟添加人脸用的同一个协议 所以这里用做判断 - var isDeletFaceData = false; - var isDeletAll = false; - var deletKeyID = ""; - var deletUserID = "DeleteAll!@#"; - var deletFaceNo = 0; + bool isDeletFaceData = false; + bool isDeletAll = false; + String deletKeyID = ''; + String deletUserID = 'DeleteAll!@#'; + int deletFaceNo = 0; - final faceItemListData = [].obs; + final RxList faceItemListData = [].obs; - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 IrisListState() { Map map = Get.arguments; - lockId.value = map["lockId"]; + lockId.value = map['lockId']; } } diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index c14580e5..e6cf086b 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -7,12 +7,14 @@ import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart'; import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; +import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/throttler.dart'; - import 'package:star_lock/widget/permission/permission_dialog.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../app_settings/app_settings.dart'; import '../../../blue/blue_manage.dart'; @@ -25,6 +27,7 @@ import '../../../blue/sender_manage.dart'; import '../../../network/api_repository.dart'; import '../../../tools/baseGetXController.dart'; import '../../../tools/commonDataManage.dart'; +import '../../../tools/dateTool.dart'; import '../../../tools/eventBusEventManage.dart'; import '../../../tools/storage.dart'; import '../lockOperatingRecord/keyOperationRecord_entity.dart'; @@ -61,6 +64,22 @@ class LockDetailLogic extends BaseGetXController { Future _replyOpenLock(Reply reply) async { final int status = reply.data[6]; + BuglyTool.uploadException( + message: '开锁结果,解析数据', + detail: '开锁结果,解析数据 _replyOpenLock:${reply.data}', + upload: true); + + if (status != 6) { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('open_lock', { + 'lock_name': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '${reply.data}', + }); + } + switch (status) { case 0x00: //成功 @@ -90,7 +109,7 @@ class LockDetailLogic extends BaseGetXController { await uploadElectricQuantityRequest(); // 开锁成功上报 - // lockReportLockSuccessfullyUploadData(); + lockReportLockSuccessfullyUploadData(); resetOpenDoorState(); state.animationController!.stop(); @@ -252,7 +271,9 @@ class LockDetailLogic extends BaseGetXController { void closeLuckStatus() { state.openLockBtnState.value = 0; // state.openDoorBtnisUneable.value = true; - state.animationController!.stop(canceled: true); + if (state.animationController != null) { + state.animationController!.stop(canceled: true); + } cancelBlueConnetctToastTimer(); } @@ -330,12 +351,6 @@ class LockDetailLogic extends BaseGetXController { // 点击开门事件 Future openDoorAction() async { - showBlueConnetctToastTimer( - outTimer: 20, - action: () { - resetOpenDoorState(); - blueManageDisconnect(); - }); final List? privateKey = await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -346,10 +361,48 @@ class LockDetailLogic extends BaseGetXController { final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); + final String command = OpenLockCommand( + lockID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + openMode: state.openDoorModel, + openTime: getUTCNetTime(), + onlineToken: state.lockNetToken, + token: getTokenList, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + ).toString(); + AppLog.log('command:${command}'); + + showBlueConnetctToastTimer( + outTimer: 20, + action: () async { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('open_lock', { + 'lock_name': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '超时', + }); + + resetOpenDoorState(); + blueManageDisconnect(); + BuglyTool.uploadException( + message: '开门超时处理-开锁失败', + detail: '开门超时,断开连接,开锁失败--OpenLockCommand:$command', + upload: true); + }); + BlueManage() .blueSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { + BuglyTool.uploadException( + message: '蓝牙连接成功', + detail: '蓝牙连接成功,发送开锁指令--OpenLockCommand:$command', + upload: false); + // FlutterBuglyPlugin.reportException(exceptionName: '蓝牙连接成功', reason: '蓝牙连接成功,发送开锁指令'); IoSenderManage.senderOpenLock( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), @@ -364,10 +417,22 @@ class LockDetailLogic extends BaseGetXController { } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { cancelBlueConnetctToastTimer(); + BuglyTool.uploadException( + message: '蓝牙连接失败-开锁失败', + detail: '蓝牙连接失败,断开连接, 开锁失败--OpenLockCommand:$command', + upload: true); + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('open_lock', { + 'lock_name': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '断开连接', + }); + if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } - resetOpenDoorState(); } }); @@ -450,6 +515,8 @@ class LockDetailLogic extends BaseGetXController { // AppLog.log('从服务器获取联网token:${state.lockNetToken}'); openDoorAction(); } else { + BuglyTool.uploadException( + message: '点击了需要联网开锁', detail: '点击了需要联网开锁 获取连网token失败', upload: true); showToast('网络访问失败,请检查网络是否正常'.tr, something: () { resetOpenDoorState(); cancelBlueConnetctToastTimer(); @@ -489,7 +556,7 @@ class LockDetailLogic extends BaseGetXController { // 操作记录上传 Future lockRecordUploadData(List list) async { - if(list.isEmpty){ + if (list.isEmpty) { return; } final KeyOperationRecordEntity entity = await ApiRepository.to @@ -537,6 +604,15 @@ class LockDetailLogic extends BaseGetXController { } } + // 远程开锁 + Future remoteOpenLock() async { + final LoginEntity entity = await ApiRepository.to + .remoteOpenLock(lockId: state.keyInfos.value.lockId.toString()); + if (entity.errorCode!.codeIsSuccessful) { + showToast('已开锁'.tr); + } + } + /// 锁设置里面开启关闭考勤刷新锁详情 void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus diff --git a/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart index a3f43790..ca53f640 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart @@ -1,10 +1,10 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../app_settings/app_colors.dart'; import '../../../flavors.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import '../../lockMian/entity/lockListInfo_entity.dart'; import 'lockDetail_page.dart'; @@ -26,10 +26,10 @@ class _LockDetailMainPageState extends State { final bool isOnlyOneData; LockListInfoItemEntity keyInfos = LockListInfoItemEntity(); dynamic obj = ModalRoute.of(context)?.settings.arguments; - if (obj != null && (obj["keyInfo"] != null)) { - keyInfos = obj["keyInfo"]; + if (obj != null && (obj['keyInfo'] != null)) { + keyInfos = obj['keyInfo']; } - isOnlyOneData = obj["isOnlyOneData"]; + isOnlyOneData = obj['isOnlyOneData']; return F.sw( skyCall: () => Scaffold( @@ -47,7 +47,7 @@ class _LockDetailMainPageState extends State { backgroundColor: Colors.white, appBar: TitleAppBar( barTitle: F.sw( - xhjCall: () => '星星锁', skyCall: () => keyInfos.lockAlias), + xhjCall: () => '星星锁'.tr, skyCall: () => keyInfos.lockAlias), haveBack: true, backgroundColor: Colors.white, titleColor: AppColors.blackColor, diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index a6538c76..6009bfeb 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -10,6 +10,7 @@ import 'package:star_lock/flavors.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart'; import 'package:star_lock/tools/aliyunRealNameAuth/aliyunRealNameAuthHandle.dart'; +import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/widget/flavors_img.dart'; @@ -21,7 +22,6 @@ import '../../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../../tools/appRouteObserver.dart'; import '../../../tools/dateTool.dart'; import '../../../tools/eventBusEventManage.dart'; -import '../../../translations/trans_lib.dart'; import '../../lockMian/entity/lockListInfo_entity.dart'; import 'lockDetail_logic.dart'; @@ -89,10 +89,17 @@ class _LockDetailPageState extends State //鑫泓佳布局 Widget xhjWidget() { - final bool isShowTip = - (state.keyInfos.value.keyType == XSConstantMacro.keyTypeTime || state.keyInfos.value.keyType == XSConstantMacro.keyTypeLoop) - && (DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) <= 15 && DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) >= 0) - && (state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusNormalUse || state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusWaitReceive); + final bool isShowTip = (state.keyInfos.value.keyType == + XSConstantMacro.keyTypeTime || + state.keyInfos.value.keyType == XSConstantMacro.keyTypeLoop) && + (DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) <= + 15 && + DateTool() + .compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) >= + 0) && + (state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusNormalUse || + state.keyInfos.value.keyStatus == + XSConstantMacro.keyStatusWaitReceive); return Scaffold( backgroundColor: Colors.white, body: Obx(() { @@ -102,9 +109,23 @@ class _LockDetailPageState extends State SingleChildScrollView( child: Column( children: [ - SizedBox( - height: isShowTip ? 70.h : 10.h, + Visibility( + visible: isShowTip, + child: Container( + // height: 30.h, + width: 1.sw, + color: const Color(0xFFFBEFD4), + padding: EdgeInsets.only(top: 8.h, bottom: 8.h), + child: Text( + "${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}", + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xffCBA74B), fontSize: 24.sp)), + ), ), + SizedBox(height: 10.h), Padding( padding: EdgeInsets.symmetric(horizontal: 24.w), child: Text( @@ -126,7 +147,7 @@ class _LockDetailPageState extends State child: bottomWidget()), btnText( img: 'images/main/icon_main_set.png', - text: TranslationLoader.lanKeys!.set!.tr, + text: '设置'.tr, onTap: () { if (state.openDoorBtnisUneable.value == false) { return; @@ -145,25 +166,9 @@ class _LockDetailPageState extends State ], ), ), - Visibility( - visible: isShowTip, - child: Container( - // height: 30.h, - color: const Color(0xFFFBEFD4), - padding: EdgeInsets.only(top: 8.h, bottom: 8.h), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}", - style: TextStyle( - color: const Color(0xffCBA74B), fontSize: 24.sp)) - ], - ), - ), - ), Visibility( visible: state.iSClosedUnlockSuccessfulPopup.value, + // visible: true, child: Container( width: 1.sw, height: 1.sh - ScreenUtil().statusBarHeight * 2, @@ -269,6 +274,9 @@ class _LockDetailPageState extends State return Container( width: 0.9.sw, height: 0.6.sw, + constraints: BoxConstraints( + minHeight: 0.6.sw, + ), decoration: BoxDecoration( image: const DecorationImage( image: AssetImage('images/xhj_main_bg.jpg'), @@ -287,11 +295,11 @@ class _LockDetailPageState extends State child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - const Spacer(), + SizedBox(height: 10.h), GestureDetector( onTap: () { ShowTipView().showSureAlertDialog( - "${"锁电量更新时间:".tr}${DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString())}"); + "${"锁电量更新时间".tr}:${state.keyInfos.value.electricQuantityDate! != 0 ? DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString()) : "-"}"); }, child: Column( mainAxisSize: MainAxisSize.min, @@ -316,9 +324,6 @@ class _LockDetailPageState extends State SizedBox(width: 20.w), ], ), - SizedBox( - height: 15.h, - ), Visibility( visible: state .keyInfos.value.lockFeature!.isSupportBackupBattery == @@ -353,100 +358,126 @@ class _LockDetailPageState extends State ], ), ), - GestureDetector( - onTap: () { - if (state.openDoorBtnisUneable.value == true) { - logic.functionBlocker.block(isNeedRealNameAuthThenOpenLock); - } - }, - onLongPressStart: (LongPressStartDetails details) { - if (state.openDoorBtnisUneable.value == true) { - void callback() { - setState(startUnLock); - } + Container( + height: 200.r, + child: Stack( + children: [ + Center( + child: GestureDetector( + onTap: () { + if (state.openDoorBtnisUneable.value == true) { + logic.functionBlocker + .block(isNeedRealNameAuthThenOpenLock); + } + }, + onLongPressStart: (LongPressStartDetails details) { + if (state.openDoorBtnisUneable.value == true) { + void callback() { + setState(startUnLock); + } - logic.functionBlocker.block(callback); - } - }, - child: Container( - width: 200.r, - height: 200.r, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(100.w), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.3), - offset: const Offset(0, 0), - blurRadius: 15.r, - spreadRadius: 0, + logic.functionBlocker.block(callback); + } + }, + child: Container( + width: 200.r, + height: 200.r, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(100.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + offset: const Offset(0, 0), + blurRadius: 15.r, + spreadRadius: 0, + ), + ]), + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + if (state.openDoorBtnisUneable.value == false) + Icon( + Icons.bluetooth_searching, + size: 78.r, + color: AppColors.mainColor.withOpacity(0.6), + ) + else + Image.asset( + state.isOpenPassageMode.value == 1 + ? 'images/icon_lock_err.png' + : 'images/icon_lock_fill.png', + width: 68.r, + height: 68.r, + color: AppColors.mainColor, + ), + if (state.openLockBtnState.value == 1) + xhjBuildRotationTransition( + width: 168.r, + height: 168.r, + ) + else + Positioned( + child: Image.asset( + 'images/icon_circle_dotted.png', + width: 168.r, + height: 168.r, + color: state.openDoorBtnisUneable.value == false + ? AppColors.mainColor.withOpacity(0.6) + : state.isOpenPassageMode.value == 1 + ? Colors.red + : AppColors.mainColor, + )), + ], + ), ), - ]), - margin: EdgeInsets.only(top: 0.h), - child: Stack( - alignment: AlignmentDirectional.center, - children: [ - if (state.openDoorBtnisUneable.value == false) - Icon( - Icons.bluetooth_searching, - size: 78.r, - color: AppColors.mainColor.withOpacity(0.6), - ) - else - Image.asset( - state.isOpenPassageMode.value == 1 - ? 'images/icon_lock_err.png' - : 'images/icon_lock_fill.png', - width: 68.r, - height: 68.r, - color: AppColors.mainColor, - ), - if (state.openLockBtnState.value == 1) - xhjBuildRotationTransition( - width: 168.r, - height: 168.r, - ) - else - Positioned( - child: Image.asset( - 'images/icon_circle_dotted.png', - width: 168.r, - height: 168.r, - color: state.openDoorBtnisUneable.value == false - ? AppColors.mainColor.withOpacity(0.6) - : state.isOpenPassageMode.value == 1 - ? Colors.red - : AppColors.mainColor, - )), - ], + ), + ), + Positioned( + right: 90.w, + bottom: 1, + child: Obx(() => Visibility( + visible: + state.keyInfos.value.lockSetting!.remoteUnlock == 1, + child: GestureDetector( + onTap: () { + ShowCupertinoAlertView().isToRemoteUnLockAlert( + remoteUnlockAction: () { + if (state.keyInfos.value.hasGateway != 1) { + logic.showToast('附近没有可用网关'.tr); + } + logic.remoteOpenLock(); + }); + }, + child: Align( + alignment: const Alignment(0.6, 1), + child: FlavorsImg( + child: Image.asset( + 'images/main/icon_main_remoteUnlocking_xhj.png', + width: 50.w, + height: 52.w, + ), + )), + ))), + ) + ], + ), + ), + // SizedBox(height: 15.h), + Expanded( + child: Center( + child: Text( + '点击开锁,长按闭锁'.tr, + textAlign: TextAlign.center, + style: TextStyle( + color: AppColors.darkGrayTextColor, + fontSize: 20.sp, + ), ), ), ), - const Spacer(), - Padding( - padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - '点击开锁,长按闭锁'.tr, - style: TextStyle( - color: AppColors.darkGrayTextColor, - fontSize: 20.sp, - ), - ), - SizedBox( - height: 16.h, - ), - adminInfoView(center: false, max: false), - ], - ), - ], - ), - ) + adminInfoView(center: true, max: false), + SizedBox(height: 10.h) ], ), ); @@ -474,17 +505,17 @@ class _LockDetailPageState extends State , child: Container( // height: 30.h, + width: 1.sw, color: const Color(0xFFFBEFD4), - padding: EdgeInsets.only(top: 8.h, bottom: 8.h), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}", - style: TextStyle( - color: const Color(0xffCBA74B), fontSize: 24.sp)) - ], - ), + padding: + EdgeInsets.only(top: 8.h, bottom: 8.h, right: 10.w, left: 10.h), + child: Text( + "${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}", + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: + TextStyle(color: const Color(0xffCBA74B), fontSize: 24.sp)), ), ), Stack(children: [ @@ -539,7 +570,7 @@ class _LockDetailPageState extends State bottom: 16.h, right: 15.w, ), - child: adminInfoView(center: false, add: true), + child: adminInfoView(center: false), ), ), Stack( @@ -704,8 +735,9 @@ class _LockDetailPageState extends State ShowCupertinoAlertView().isToRemoteUnLockAlert( remoteUnlockAction: () { if (state.keyInfos.value.hasGateway != 1) { - logic.showToast('附近没有可用网关'); + logic.showToast('附近没有可用网关'.tr); } + logic.remoteOpenLock(); }); }, child: Align( @@ -725,17 +757,19 @@ class _LockDetailPageState extends State SizedBox( height: 30.h, ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( + Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: Center( + child: Text( logic.getKeyStatusTextAndShow(), + maxLines: 2, + textAlign: TextAlign.center, style: TextStyle( fontSize: 22.sp, color: AppColors.btnDisableColor, fontWeight: FontWeight.w500), ), - ], + ), ), SizedBox( height: 30.h, @@ -754,93 +788,79 @@ class _LockDetailPageState extends State ); } - Widget adminInfoView( - {bool center = true, bool max = true, bool add = false}) { + Widget adminInfoView({bool center = true, bool max = true}) { return Row( mainAxisAlignment: center ? MainAxisAlignment.center : MainAxisAlignment.start, - mainAxisSize: max ? MainAxisSize.max : MainAxisSize.min, children: [ - Image.asset( - 'images/icon_electronicKey_admin.png', - width: 24.w, - height: 20.w, - color: AppColors.blackColor, //应根据状态显示(当前角色为超级管理员 应显示蓝色图标) - ), - SizedBox(width: 6.w), - Text( - state.keyInfos.value.isLockOwner == 1 - ? TranslationLoader.lanKeys!.superAdmin!.tr - : (state.keyInfos.value.keyRight == 1 - ? TranslationLoader.lanKeys!.authorizedAdmin!.tr - : TranslationLoader.lanKeys!.normalUser!.tr), - style: TextStyle(fontSize: 20.sp, color: AppColors.darkGrayTextColor), - ), - if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w), - FlavorsImg( - child: Image.asset( - state.keyInfos.value.hasGateway == 1 - ? 'images/main/icon_main_remoteUnlocking.png' - : 'images/main/icon_main_remoteUnlocking_grey.png', - width: 24.w, - height: 20.w, - ), - ), - SizedBox(width: 6.w), - Text( - TranslationLoader.lanKeys!.gatewayDevice!.tr, - style: TextStyle( - fontSize: 20.sp, - color: state.keyInfos.value.hasGateway == 1 - ? AppColors.mainColor - : AppColors.btnDisableColor), - ), - if (add) SizedBox(width: 20.w) else SizedBox(width: 20.w), - FlavorsImg( - child: Image.asset('images/main/icon_lockDetail_needNetwork.png', + Row( + mainAxisSize: max ? MainAxisSize.max : MainAxisSize.min, + children: [ + Image.asset( + 'images/icon_electronicKey_admin.png', width: 24.w, height: 20.w, - color: state.isOpenLockNeedOnline.value == 1 - ? AppColors.mainColor - : AppColors.btnDisableColor), + color: AppColors.blackColor, //应根据状态显示(当前角色为超级管理员 应显示蓝色图标) + ), + SizedBox(width: 6.w), + Text( + state.keyInfos.value.isLockOwner == 1 + ? '超级管理员英文'.tr + : (state.keyInfos.value.keyRight == 1 + ? '授权管理员英文'.tr + : '普通用户英文'.tr), + style: TextStyle( + fontSize: 20.sp, color: AppColors.darkGrayTextColor), + ), + SizedBox(width: 40.w), + ], ), - SizedBox(width: 6.w), - Text( - '手机需联网'.tr, - style: TextStyle( - fontSize: 20.sp, - color: state.isOpenLockNeedOnline.value == 1 - ? AppColors.mainColor - : AppColors.btnDisableColor), - ), - if (add) ...[ - const Spacer(), - GestureDetector( - onTap: () { - Get.toNamed(Routers.selectLockTypePage); - }, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - FlavorsImg( - child: Image.asset( - 'images/mine/icon_mine_main_addLock.png', - width: 24.w, - height: 20.w, - ), - ), - Text( - TranslationLoader.lanKeys!.addDevice!.tr, - style: TextStyle( - fontSize: 20.sp, color: AppColors.darkGrayTextColor), - ) - ], + Row( + mainAxisSize: max ? MainAxisSize.max : MainAxisSize.min, + children: [ + FlavorsImg( + child: Image.asset( + state.keyInfos.value.hasGateway == 1 + ? 'images/main/icon_main_remoteUnlocking.png' + : 'images/main/icon_main_remoteUnlocking_grey.png', + width: 24.w, + height: 20.w, ), ), - ), - ] + SizedBox(width: 6.w), + Text( + '网关设备英文'.tr, + style: TextStyle( + fontSize: 20.sp, + color: state.keyInfos.value.hasGateway == 1 + ? AppColors.mainColor + : AppColors.btnDisableColor), + ), + SizedBox(width: 20.w), + ], + ), + Row( + mainAxisSize: max ? MainAxisSize.max : MainAxisSize.min, + children: [ + FlavorsImg( + child: Image.asset('images/main/icon_lockDetail_needNetwork.png', + width: 24.w, + height: 20.w, + color: state.isOpenLockNeedOnline.value == 1 + ? AppColors.mainColor + : AppColors.btnDisableColor), + ), + SizedBox(width: 6.w), + Text( + '手机需联网英文'.tr, + style: TextStyle( + fontSize: 20.sp, + color: state.isOpenLockNeedOnline.value == 1 + ? AppColors.mainColor + : AppColors.btnDisableColor), + ), + ], + ) ], ); } @@ -959,16 +979,36 @@ class _LockDetailPageState extends State Widget bottomWidget() { return SizedBox( - width: ScreenUtil().screenWidth - 20.w, - child: GridView.count( - crossAxisCount: 4, - // childAspectRatio: 3, - crossAxisSpacing: 0.h, - mainAxisSpacing: 0.h, - shrinkWrap: true, + width: ScreenUtil().screenWidth, + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + mainAxisSpacing: 0.h, + crossAxisSpacing: 0.h, + mainAxisExtent: 90.0, // 设置每个 item 的固定高度 + ), + itemCount: (state.keyInfos.value.isLockOwner == 1 || + state.keyInfos.value.keyRight == 1) + ? getAllWidget().length + : getNormalWidget().length, + itemBuilder: (context, index) { + Widget widget = getBottomWidget()[index]; + return widget; + }, physics: const NeverScrollableScrollPhysics(), - children: getBottomWidget()), - ); + shrinkWrap: true, + ) + + // GridView.count( + // crossAxisCount: 4, + // // childAspectRatio: 3, + // crossAxisSpacing: 0.h, + // mainAxisSpacing: 0.h, + // shrinkWrap: true, + // physics: const NeverScrollableScrollPhysics(), + // children: getBottomWidget()), + + ); } // 根据权限显示不同的底部按钮 @@ -986,13 +1026,13 @@ class _LockDetailPageState extends State List getNormalWidget() { final List showWidgetArr = []; // 考勤 - if (state.isAttendance.value == 1) { - showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', - '考勤'.tr, state.bottomBtnisEable.value, () { - Get.toNamed(Routers.checkingInListPage, - arguments: state.keyInfos.value); - })); - } + // if (state.isAttendance.value == 1) { + // showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', + // '考勤'.tr, state.bottomBtnisEable.value, () { + // Get.toNamed(Routers.checkingInListPage, + // arguments: state.keyInfos.value); + // })); + // } // 操作记录 showWidgetArr.add(bottomItem('images/main/icon_main_operatingRecord.png', '操作记录'.tr, state.bottomBtnisEable.value, () { @@ -1004,8 +1044,8 @@ class _LockDetailPageState extends State // 设置 if (F.isSKY) { - showWidgetArr.add(bottomItem('images/main/icon_main_set.png', - TranslationLoader.lanKeys!.set!.tr, true, () { + showWidgetArr + .add(bottomItem('images/main/icon_main_set.png', '设置'.tr, true, () { Get.toNamed(Routers.lockSetPage, arguments: { 'lockId': state.keyInfos.value.lockId, 'isOnlyOneData': state.isOnlyOneData @@ -1020,13 +1060,13 @@ class _LockDetailPageState extends State List getAllWidget() { final List showWidgetArr = []; // 考勤 - if (state.isAttendance.value == 1) { - showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', - '考勤'.tr, state.bottomBtnisEable.value, () { - Get.toNamed(Routers.checkingInListPage, - arguments: state.keyInfos.value); - })); - } + // if (state.isAttendance.value == 1) { + // showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', + // '考勤'.tr, state.bottomBtnisEable.value, () { + // Get.toNamed(Routers.checkingInListPage, + // arguments: state.keyInfos.value); + // })); + // } // 电子钥匙 showWidgetArr.add(bottomItem('images/main/icon_main_electronicKey.png', @@ -1077,9 +1117,8 @@ class _LockDetailPageState extends State if (state.keyInfos.value.lockFeature!.d3Face == 1) { showWidgetArr.add( bottomItem( - 'images/main/icon_face.png', - TranslationLoader.lanKeys!.humanFace!.tr, - state.bottomBtnisEable.value, () { + 'images/main/icon_face.png', '人脸'.tr, state.bottomBtnisEable.value, + () { Get.toNamed(Routers.faceListPage, arguments: { 'lockId': state.keyInfos.value.lockId, }); @@ -1114,9 +1153,7 @@ class _LockDetailPageState extends State //可视对讲门锁新增->监控 if (state.keyInfos.value.lockFeature!.videoIntercom == 1) { showWidgetArr.add( - bottomItem( - 'images/main/icon_catEyes.png', - TranslationLoader.lanKeys!.monitoring!.tr, + bottomItem('images/main/icon_catEyes.png', '监控'.tr, state.bottomBtnisEable.value, () { Get.toNamed(Routers.realTimePicturePage, arguments: { 'lockName': state.keyInfos.value.lockName, @@ -1128,10 +1165,8 @@ class _LockDetailPageState extends State // 授权管理员 if (state.keyInfos.value.isLockOwner == 1) { - showWidgetArr.add(bottomItem( - 'images/main/icon_main_authorizedAdmin.png', - TranslationLoader.lanKeys!.authorizedAdmin!.tr, - state.bottomBtnisEable.value, () { + showWidgetArr.add(bottomItem('images/main/icon_main_authorizedAdmin.png', + '授权管理员'.tr, state.bottomBtnisEable.value, () { Get.toNamed(Routers.authorizedAdminListPage, arguments: { 'keyInfo': state.keyInfos.value @@ -1155,10 +1190,8 @@ class _LockDetailPageState extends State if (state.keyInfos.value.lockFeature!.isSupportCatEye == 1) { //视频日志 - endWiddget.add(bottomItem( - 'images/main/icon_lockDetail_videoLog.png', - TranslationLoader.lanKeys!.videoLog!.tr, - state.bottomBtnisEable.value, () { + endWiddget.add(bottomItem('images/main/icon_lockDetail_videoLog.png', + '视频日志'.tr, state.bottomBtnisEable.value, () { Get.toNamed(Routers.videoLogPage, arguments: { 'lockId': state.keyInfos.value.lockId, }); @@ -1167,10 +1200,8 @@ class _LockDetailPageState extends State if (!F.isProductionEnv) { endWiddget.add( // 消息提醒 - bottomItem( - 'images/main/icon_lockDetail_messageReminding.png', - TranslationLoader.lanKeys!.messageReminding!.tr, - state.bottomBtnisEable.value, () { + bottomItem('images/main/icon_lockDetail_messageReminding.png', + '消息提醒'.tr, state.bottomBtnisEable.value, () { Get.toNamed(Routers.msgNotificationPage, arguments: { 'lockId': state.keyInfos.value.lockId, 'isSupportCatEye': @@ -1183,8 +1214,7 @@ class _LockDetailPageState extends State if (F.isSKY) { endWiddget.add( // 设置 - bottomItem('images/main/icon_main_set.png', - TranslationLoader.lanKeys!.set!.tr, true, () { + bottomItem('images/main/icon_main_set.png', '设置'.tr, true, () { // logic.clickItemBtnAction(10); Get.toNamed(Routers.lockSetPage, arguments: { 'lockId': state.keyInfos.value.lockId, @@ -1207,7 +1237,7 @@ class _LockDetailPageState extends State children: [ SizedBox( width: 42.w, - height: 42.w, + height: 42.h, child: FlavorsImg( black: true, child: Image.asset(iconUrl, @@ -1219,7 +1249,7 @@ class _LockDetailPageState extends State fit: BoxFit.fitWidth), ), ), - SizedBox(height: 5.w), + SizedBox(height: 5.h), Expanded( child: Text(name, style: TextStyle( @@ -1233,10 +1263,10 @@ class _LockDetailPageState extends State ), xhjCall: () => Container( color: Colors.white, - margin: EdgeInsets.symmetric(vertical: 5.h), + padding: EdgeInsets.only(left: 3.w, right: 3.w, bottom: 5.h), child: Column( crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ SizedBox( width: 42.w, @@ -1252,11 +1282,16 @@ class _LockDetailPageState extends State fit: BoxFit.fitWidth), ), ), - SizedBox(height: 5.h), + SizedBox(height: 15.h), Text( name, + // '哈水电费垃圾啊货到付款垃圾啊是老大开发机哈吉手打', + textAlign: TextAlign.center, + maxLines: 4, + overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 20.sp, + height: 1.0, color: bottomBtnisEable ? AppColors.blackColor : AppColors.lockDetailBottomBtnUneable), @@ -1326,19 +1361,27 @@ class _LockDetailPageState extends State child: Stack( children: [ Image.asset( - state.iSOpenLock.value == true - ? 'images/main/unlocked_bg.png' - : 'images/main/locked_bg.png', + 'images/main/icon_lockDetail_openLock_succeed.png', width: 358.w, height: 348.h, ), Positioned( - top: 180.h, + top: 120.h, width: 358.w, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ + Text(state.iSOpenLock.value == true ? '已开锁'.tr : '已闭锁'.tr, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: AppColors.mainColor, + fontSize: 32.sp, + fontWeight: FontWeight.w600)), + SizedBox( + height: 10.h, + ), Text( lockAlias, style: TextStyle( @@ -1423,15 +1466,29 @@ class _LockDetailPageState extends State state.iSOpenLock.value = true; state.openLockBtnState.value = 1; state.animationController!.forward(); - AppLog.log('点击开锁'); + // AppLog.log('点击开锁'); if (isOpenLockNeedOnline) { // 不需要联网 state.openDoorModel = 0; + // AppLog.log('点击开锁 state.openDoorModel = 0 不需要联网'); + // FlutterBuglyPlugin.reportException(exceptionName: '点击了不需要联网开锁'); + BuglyTool.uploadException( + message: '点击了不需要联网开锁', + detail: '点击了不需要联网开锁 openDoorModel:${state.openDoorModel}', + upload: false, + begin: true); AppLog.log('点击开锁 state.openDoorModel = 0 不需要联网'); logic.openDoorAction(); } else { // 需要联网 state.openDoorModel = 2; + // AppLog.log('点击开锁 state.openDoorModel = 2 需要联网'); + // FlutterBuglyPlugin.reportException(exceptionName: '点击了需要联网开锁'); + BuglyTool.uploadException( + message: '点击了需要联网开锁', + detail: '点击了需要联网开锁 openDoorModel:${state.openDoorModel}', + upload: false, + begin: true); AppLog.log('点击开锁 state.openDoorModel = 2 需要联网'); logic.getLockNetToken(); } @@ -1448,12 +1505,12 @@ class _LockDetailPageState extends State AppLog.log('长按闭锁'); if (state.isOpenLockNeedOnline.value == 0) { // 不需要联网 - AppLog.log('长按闭锁 state.openDoorModel = 32 不需要联网'); + // AppLog.log('长按闭锁 state.openDoorModel = 32 不需要联网'); state.openDoorModel = 32; logic.openDoorAction(); } else { // 需要联网 - AppLog.log('长按闭锁 state.openDoorModel = 34 需要联网'); + // AppLog.log('长按闭锁 state.openDoorModel = 34 需要联网'); state.openDoorModel = 34; logic.getLockNetToken(); } diff --git a/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart b/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart index 41b51807..892636ca 100755 --- a/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart +++ b/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; import '../../../app_settings/app_settings.dart'; import '../../../blue/blue_manage.dart'; @@ -21,129 +22,129 @@ class LockOperatingRecordLogic extends BaseGetXController { LockOperatingRecordState state = LockOperatingRecordState(); // 获取解析后的数据 - late StreamSubscription _replySubscription; + // late StreamSubscription _replySubscription; - void _initReplySubscription() { - _replySubscription = - EventBusManager().eventBus!.on().listen((Reply reply) { - if (reply is SenderReferEventRecordTimeReply) { - _replyReferEventRecordTime(reply); - } - }); - } + // void _initReplySubscription() { + // _replySubscription = + // EventBusManager().eventBus!.on().listen((Reply reply) { + // if (reply is SenderReferEventRecordTimeReply) { + // _replyReferEventRecordTime(reply); + // } + // }); + // } // 根据时间查解析数据 - Future _replyReferEventRecordTime(Reply reply) async { - cancelBlueConnetctToastTimer(); - final int status = reply.data[2]; - switch (status) { - case 0x00: - //成功 - final int dataLength = (reply.data[5] << 8) + reply.data[6]; - AppLog.log('dataLength:$dataLength'); - // var dataLength = reply.data[5]; - if (dataLength > 0) { - reply.data.removeRange(0, 7); - // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 - if (reply.data.length < 17) { - return; - } - final List> getList = splitList(reply.data, 17); - // AppLog.log("getList:$getList"); - final List uploadList = []; - for (int i = 0; i < getList.length; i++) { - final List indexList = getList[i]; - // AppLog.log("indexList:$indexList"); - final Map indexMap = {}; - - indexMap['type'] = indexList[0].toString(); - - final int userNo = (indexList[1] * 256) + indexList[2]; - indexMap['user'] = userNo.toString(); - AppLog.log('userNouserNouserNouserNo:$userNo'); - - final List passwordData = indexList.sublist(7, 17); - final String password = utf8String(passwordData); - indexMap['password'] = password.toString(); - AppLog.log('passwordpasswordpassword:$password'); - - indexMap['success'] = '1'; - - final int time = (0xff & indexList[3]) << 24 | - (0xff & indexList[4]) << 16 | - (0xff & indexList[5]) << 8 | - (0xFF & indexList[6]); - final operateDate = time * 1000; - final serverTime = state.currentDate; - if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( - DateTime.fromMillisecondsSinceEpoch(serverTime*1000))) { - continue; - } - indexMap['date'] = '$operateDate'; - uploadList.add(indexMap); - } - if (dataLength == state.logCountPage) { - state.ifHaveNext = true; - } else { - state.ifHaveNext = false; - } - lockRecordUploadData(uploadList); - } - break; - case 0x06: - //无权限 需要鉴权 - - break; - default: - //失败 - break; - } - } + // Future _replyReferEventRecordTime(Reply reply) async { + // cancelBlueConnetctToastTimer(); + // final int status = reply.data[2]; + // switch (status) { + // case 0x00: + // //成功 + // final int dataLength = (reply.data[5] << 8) + reply.data[6]; + // AppLog.log('dataLength:$dataLength'); + // // var dataLength = reply.data[5]; + // if (dataLength > 0) { + // reply.data.removeRange(0, 7); + // // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 + // if (reply.data.length < 17) { + // return; + // } + // final List> getList = splitList(reply.data, 17); + // // AppLog.log("getList:$getList"); + // final List uploadList = []; + // for (int i = 0; i < getList.length; i++) { + // final List indexList = getList[i]; + // // AppLog.log("indexList:$indexList"); + // final Map indexMap = {}; + // + // indexMap['type'] = indexList[0].toString(); + // + // final int userNo = (indexList[1] * 256) + indexList[2]; + // indexMap['user'] = userNo.toString(); + // AppLog.log('userNouserNouserNouserNo:$userNo'); + // + // final List passwordData = indexList.sublist(7, 17); + // final String password = utf8String(passwordData); + // indexMap['password'] = password.toString(); + // AppLog.log('passwordpasswordpassword:$password'); + // + // indexMap['success'] = '1'; + // + // final int time = (0xff & indexList[3]) << 24 | + // (0xff & indexList[4]) << 16 | + // (0xff & indexList[5]) << 8 | + // (0xFF & indexList[6]); + // final operateDate = time * 1000; + // final serverTime = state.currentDate; + // if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( + // DateTime.fromMillisecondsSinceEpoch(serverTime*1000))) { + // continue; + // } + // indexMap['date'] = '$operateDate'; + // uploadList.add(indexMap); + // } + // if (dataLength == state.logCountPage) { + // state.ifHaveNext = true; + // } else { + // state.ifHaveNext = false; + // } + // lockRecordUploadData(uploadList); + // } + // break; + // case 0x06: + // //无权限 需要鉴权 + // + // break; + // default: + // //失败 + // break; + // } + // } // 查询事件记录(时间查询) - Future senderReferEventRecordTime() async { - showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState connectionStateState) async { - if (connectionStateState == BluetoothConnectionState.connected) { - final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = - changeStringListToIntList(privateKey!); - - final List? token = await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); - - final List? publicKey = - await Storage.getStringList(saveBluePublicKey); - final List getPublicKeyList = - changeStringListToIntList(publicKey!); - - IoSenderManage.senderReferEventRecordTimeCommand( - keyID: BlueManage().connectDeviceName, - userID: await Storage.getUid(), - logsCount: state.logCountPage, - // time:DateTime.now().millisecondsSinceEpoch~/1000, - time: state.operateDate, - currentDate: state.currentDate, - token: getTokenList, - needAuthor: 1, - publicKey: getPublicKeyList, - privateKey: getPrivateKeyList, - ); - } else if (connectionStateState == - BluetoothConnectionState.disconnected) { - dismissEasyLoading(); - cancelBlueConnetctToastTimer(); - if (state.ifCurrentScreen.value == true) { - showBlueConnetctToast(); - } - } - }); - } + // Future senderReferEventRecordTime() async { + // showEasyLoading(); + // showBlueConnetctToastTimer(action: () { + // dismissEasyLoading(); + // }); + // BlueManage().blueSendData(BlueManage().connectDeviceName, + // (BluetoothConnectionState connectionStateState) async { + // if (connectionStateState == BluetoothConnectionState.connected) { + // final List? privateKey = + // await Storage.getStringList(saveBluePrivateKey); + // final List getPrivateKeyList = + // changeStringListToIntList(privateKey!); + // + // final List? token = await Storage.getStringList(saveBlueToken); + // final List getTokenList = changeStringListToIntList(token!); + // + // final List? publicKey = + // await Storage.getStringList(saveBluePublicKey); + // final List getPublicKeyList = + // changeStringListToIntList(publicKey!); + // + // IoSenderManage.senderReferEventRecordTimeCommand( + // keyID: BlueManage().connectDeviceName, + // userID: await Storage.getUid(), + // logsCount: state.logCountPage, + // // time:DateTime.now().millisecondsSinceEpoch~/1000, + // time: state.operateDate, + // currentDate: state.currentDate, + // token: getTokenList, + // needAuthor: 1, + // publicKey: getPublicKeyList, + // privateKey: getPrivateKeyList, + // ); + // } else if (connectionStateState == + // BluetoothConnectionState.disconnected) { + // dismissEasyLoading(); + // cancelBlueConnetctToastTimer(); + // if (state.ifCurrentScreen.value == true) { + // showBlueConnetctToast(); + // } + // } + // }); + // } //请求操作记录列表 Future mockNetworkDataRequest() async { @@ -180,48 +181,48 @@ class LockOperatingRecordLogic extends BaseGetXController { } // 查询锁记录最后时间 - Future getLockRecordLastUploadDataTime() async { - final LockOperatingRecordGetLastRecordTimeEntity entity = - await ApiRepository.to.getLockRecordLastUploadDataTime( - lockId: CommonDataManage().currentKeyInfo.lockId.toString()); - if (entity.errorCode!.codeIsSuccessful) { - state.operateDate = entity.data!.operateDate! ~/ 1000; - state.currentDate = entity.data!.currentDate! ~/ 1000; - senderReferEventRecordTime(); - } - } + // Future getLockRecordLastUploadDataTime() async { + // final LockOperatingRecordGetLastRecordTimeEntity entity = + // await ApiRepository.to.getLockRecordLastUploadDataTime( + // lockId: CommonDataManage().currentKeyInfo.lockId.toString()); + // if (entity.errorCode!.codeIsSuccessful) { + // state.operateDate = entity.data!.operateDate! ~/ 1000; + // state.currentDate = entity.data!.currentDate! ~/ 1000; + // senderReferEventRecordTime(); + // } + // } // 操作记录上传 - Future lockRecordUploadData(List list) async { - if(list.isEmpty){ - return; - } - final KeyOperationRecordEntity entity = await ApiRepository.to - .lockRecordUploadData( - lockId: CommonDataManage().currentKeyInfo.lockId.toString(), - records: list); - if (entity.errorCode!.codeIsSuccessful) { - if (state.ifHaveNext == true) { - getLockRecordLastUploadDataTime(); - } else { - pageNo = 1; - mockNetworkDataRequest(); - } - } - } + // Future lockRecordUploadData(List list) async { + // if(list.isEmpty){ + // return; + // } + // final KeyOperationRecordEntity entity = await ApiRepository.to + // .lockRecordUploadData( + // lockId: CommonDataManage().currentKeyInfo.lockId.toString(), + // records: list); + // if (entity.errorCode!.codeIsSuccessful) { + // if (state.ifHaveNext == true) { + // getLockRecordLastUploadDataTime(); + // } else { + // pageNo = 1; + // mockNetworkDataRequest(); + // } + // } + // } //清空操作记录 - Future clearOperationRecordRequest() async { - final KeyOperationRecordEntity entity = await ApiRepository.to - .clearOperationRecord( - CommonDataManage().currentKeyInfo.lockId.toString()); - if (entity.errorCode!.codeIsSuccessful) { - showToast('清除数据成功', something: () { - pageNo = 1; - mockNetworkDataRequest(); - }); - } - } + // Future clearOperationRecordRequest() async { + // final KeyOperationRecordEntity entity = await ApiRepository.to + // .clearOperationRecord( + // CommonDataManage().currentKeyInfo.lockId.toString()); + // if (entity.errorCode!.codeIsSuccessful) { + // showToast('清除数据成功', something: () { + // pageNo = 1; + // mockNetworkDataRequest(); + // }); + // } + // } @override Future onReady() async { @@ -244,10 +245,10 @@ class LockOperatingRecordLogic extends BaseGetXController { // 获取是否是演示模式 演示模式不获取接口 final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { - getLockRecordLastUploadDataTime(); + // getLockRecordLastUploadDataTime(); // senderReferEventRecordTime(); // senderReferEventRecordNumber(); - _initReplySubscription(); + // _initReplySubscription(); } } @@ -258,7 +259,7 @@ class LockOperatingRecordLogic extends BaseGetXController { //获取是否是演示模式 演示模式不获取接口 final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { - _replySubscription.cancel(); + // _replySubscription.cancel(); // _getDoorLockLogListRefreshUIEvent?.cancel(); } } diff --git a/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart b/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart index 17752fd5..1de474fa 100755 --- a/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart +++ b/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart @@ -2,17 +2,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockOperatingRecord/lockOperatingRecord_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/EasyRefreshTool.dart'; import '../../../tools/appRouteObserver.dart'; -import '../../../tools/commonDataManage.dart'; import '../../../tools/custom_bottom_sheet.dart'; -import '../../../tools/keySearchWidget.dart'; import '../../../tools/noData.dart'; import '../../../tools/storage.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'keyOperationRecord_entity.dart'; import 'lockOperatingRecord_logic.dart'; @@ -24,14 +22,16 @@ class LockOperatingRecordPage extends StatefulWidget { _LockOperatingRecordPageState(); } -class _LockOperatingRecordPageState extends State with RouteAware{ - final logic = Get.put(LockOperatingRecordLogic()); - final state = Get.find().state; +class _LockOperatingRecordPageState extends State + with RouteAware { + final LockOperatingRecordLogic logic = Get.put(LockOperatingRecordLogic()); + final LockOperatingRecordState state = + Get.find().state; Future getHttpData() async { - var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { - logic.mockNetworkDataRequest().then((KeyOperationRecordEntity value){ + logic.mockNetworkDataRequest().then((KeyOperationRecordEntity value) { if (mounted) { setState(() {}); } @@ -51,7 +51,9 @@ class _LockOperatingRecordPageState extends State with return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: state.recordName.value.isNotEmpty? state.recordName.value : '操作记录'.tr, + barTitle: state.recordName.value.isNotEmpty + ? state.recordName.value + : '操作记录'.tr, haveBack: true, backgroundColor: AppColors.mainColor, // actionsList: [ @@ -77,15 +79,15 @@ class _LockOperatingRecordPageState extends State with // ], ), body: EasyRefreshTool( - onRefresh: (){ + onRefresh: () { logic.pageNo = 1; getHttpData(); }, - onLoad: (){ + onLoad: () { getHttpData(); }, child: Column( - children: [ + children: [ // (CommonDataManage().currentKeyInfo.isLockOwner == 1 || // CommonDataManage().currentKeyInfo.keyRight == 1) // ? Column( @@ -120,13 +122,13 @@ class _LockOperatingRecordPageState extends State with return Obx(() => state.lockOperatingRecordListData.value.isNotEmpty ? ListView.separated( itemCount: state.lockOperatingRecordListData.length, - itemBuilder: (c, index) { - KeyRecordDataItem dataItem = + itemBuilder: (BuildContext c, int index) { + final KeyRecordDataItem dataItem = state.lockOperatingRecordListData[index]; - int? operateDate = dataItem.operateDate; - DateTime dateStr = + final int? operateDate = dataItem.operateDate; + final DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(operateDate!); - String operateDateStr = + final String operateDateStr = '${dateStr.toLocal().toString().substring(0, 16)} '; // return _operatingRecordItem(getTypeIcon(dataItem.recordType!), // dataItem.recordTypeName!, operateDateStr, () {}); @@ -140,7 +142,10 @@ class _LockOperatingRecordPageState extends State with ); }, ) - : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight)); + : NoData( + noDataHeight: 1.sh - + ScreenUtil().statusBarHeight - + ScreenUtil().bottomBarHeight)); } String getTypeIcon(int type) { @@ -168,7 +173,8 @@ class _LockOperatingRecordPageState extends State with return title; } - Widget _operatingOneRecordItem(String userAvatarStr, String userNameStr, String unlockDescStr, Function() action) { + Widget _operatingOneRecordItem(String userAvatarStr, String userNameStr, + String unlockDescStr, Function() action) { return GestureDetector( onTap: action, child: Container( @@ -181,26 +187,25 @@ class _LockOperatingRecordPageState extends State with ), child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Icon(Icons.access_time, size: 35.w), - SizedBox(width: 10.w,), + SizedBox( + width: 10.w, + ), Text( unlockDescStr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 24.sp, - color: AppColors.darkGrayTextColor), + fontSize: 24.sp, color: AppColors.darkGrayTextColor), ), SizedBox(width: 10.h), Expanded( - child:Container( + child: Container( margin: EdgeInsets.only(bottom: 3.w), child: Row( - children: [ + children: [ Flexible( - child: Text( - userNameStr, - // "发的发生大发手动阀手动阀三大发啥打法是打发三大发啥打法是打发", + child: Text(userNameStr, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( @@ -273,34 +278,33 @@ class _LockOperatingRecordPageState extends State with // ); // } - Future _openModalBottomSheet() async { - showModalBottomSheet( - context: context, - shape: RoundedRectangleBorder( - borderRadius: BorderRadiusDirectional.circular(10)), - builder: (BuildContext context) { - return AlertBottomWidget( - topTitle: '', - // items: const ['读取记录', '清空记录', '导出记录'], - items: const ['清空记录'], - chooseCallback: (value) { - int getSelectIndex = value; - // if (getSelectIndex == 0) { - // logic.mockNetworkDataRequest(); - // } else if (getSelectIndex == 1) { - // logic.clearOperationRecordRequest(); - // } - if (getSelectIndex == 0) { - logic.clearOperationRecordRequest(); - } - }, - ); - }); - } + // Future _openModalBottomSheet() async { + // showModalBottomSheet( + // context: context, + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadiusDirectional.circular(10)), + // builder: (BuildContext context) { + // return AlertBottomWidget( + // topTitle: '', + // // items: const ['读取记录', '清空记录', '导出记录'], + // items: ['清空记录'.tr], + // chooseCallback: (int value) { + // final int getSelectIndex = value; + // // if (getSelectIndex == 0) { + // // logic.mockNetworkDataRequest(); + // // } else if (getSelectIndex == 1) { + // // logic.clearOperationRecordRequest(); + // // } + // if (getSelectIndex == 0) { + // logic.clearOperationRecordRequest(); + // } + // }, + // ); + // }); + // } @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -309,7 +313,6 @@ class _LockOperatingRecordPageState extends State with @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); @@ -327,7 +330,9 @@ class _LockOperatingRecordPageState extends State with void didPop() { super.didPop(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; } @@ -343,8 +348,9 @@ class _LockOperatingRecordPageState extends State with void didPushNext() { super.didPushNext(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; } - } diff --git a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart index c083d92d..49976f8c 100755 --- a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart +++ b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart @@ -207,11 +207,6 @@ class AutomaticBlockingLogic extends BaseGetXController { .then((String value) => state.timeController.text = value); } - @override - void onInit() { - super.onInit(); - } - @override void onClose() { super.onClose(); diff --git a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart index 51e85f47..6c235b5b 100755 --- a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart +++ b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart @@ -14,7 +14,6 @@ import '../../../../tools/commonItem.dart'; import '../../../../tools/showBottomSheetTool.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'automaticBlocking_logic.dart'; class AutomaticBlockingPage extends StatefulWidget { @@ -34,7 +33,7 @@ class _AutomaticBlockingPageState extends State return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.automaticBlocking!.tr, + barTitle: '自动闭锁'.tr, haveBack: true, actionsList: [ Obx(() => TextButton( @@ -52,7 +51,7 @@ class _AutomaticBlockingPageState extends State child: Text( state.canNext.value == false ? '' - : TranslationLoader.lanKeys!.save!.tr, + : '保存'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), )), @@ -62,7 +61,7 @@ class _AutomaticBlockingPageState extends State children: [ Obx( () => CommonItem( - leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, + leftTitel: '自动闭锁'.tr, isHaveLine: false, isHaveRightWidget: true, rightWidget: @@ -77,7 +76,7 @@ class _AutomaticBlockingPageState extends State ), Builder(builder: (BuildContext context) { return Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.delayTime!.tr, + leftTitel: '延迟时间'.tr, rightTitle: state.isCustomLockTime.value == true ? '自定义'.tr : (state.autoLockTime.value.isNotEmpty && @@ -103,7 +102,7 @@ class _AutomaticBlockingPageState extends State context, //默认的索引 normalIndex: 0, - title: TranslationLoader.lanKeys!.time!.tr, + title: '时间'.tr, cancelTitle:'取消'.tr, sureTitle: '确定'.tr, //要显示的列表 @@ -134,7 +133,7 @@ class _AutomaticBlockingPageState extends State Row( children: [ Text( - TranslationLoader.lanKeys!.time!.tr, + '时间'.tr, style: TextStyle(fontSize: 24.sp), ), ], @@ -178,9 +177,8 @@ class _AutomaticBlockingPageState extends State child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Expanded( - child: Text( - TranslationLoader.lanKeys!.automaticBlockingTip!.tr, + Expanded(child: Text( + '经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。'.tr, style: TextStyle(fontSize: 20.sp), )), ], diff --git a/lib/main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart b/lib/main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart index 2ada492d..ffa2e162 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart @@ -10,7 +10,6 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/appRouteObserver.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'adminOpenLockPassword_logic.dart'; class AdminOpenLockPasswordPage extends StatefulWidget { @@ -29,7 +28,7 @@ class _AdminOpenLockPasswordPageState extends State w return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.adminOpenLockPassword!.tr, + barTitle: '管理员开锁密码'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( diff --git a/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_logic.dart b/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_logic.dart index 0e783b3f..38643a53 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_logic.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_logic.dart @@ -49,8 +49,8 @@ class BasicInformationLogic extends BaseGetXController { void onReady() { super.onReady(); - AppLog.log( - '厂商 vendor:${state.lockBasicInfo.value.vendor} 型号 model:${state.lockBasicInfo.value.model}'); + // AppLog.log( + // '厂商 vendor:${state.lockBasicInfo.value.vendor} 型号 model:${state.lockBasicInfo.value.model}'); } @override diff --git a/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_page.dart b/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_page.dart index 98d590d6..d73c4ba2 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_page.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_page.dart @@ -10,7 +10,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'basicInformation_logic.dart'; class BasicInformationPage extends StatefulWidget { @@ -38,13 +37,13 @@ class _BasicInformationPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.basicInformation!.tr, + barTitle: '基本信息'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( children: [ Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockNumber!.tr, + leftTitel: '锁编号'.tr, rightTitle: state.lockBasicInfo.value.lockName ?? '', allHeight: 70.h, isHaveLine: true)), @@ -68,7 +67,7 @@ class _BasicInformationPageState extends State { height: 10.h, ), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.electricQuantity!.tr, + leftTitel: '电量'.tr, rightTitle: '${state.lockBasicInfo.value.electricQuantity??0}%', isHaveLine: true, isHaveDirection: true, @@ -104,7 +103,7 @@ class _BasicInformationPageState extends State { SizedBox(height: 10.h), Obx(() => Visibility( visible: state.lockBasicInfo.value.isLockOwner == 1 || state.lockBasicInfo.value.keyRight == 1, - child: lockDataListItem(TranslationLoader.lanKeys!.lockName!.tr, state.lockBasicInfo.value.lockAlias ?? '', () async { + child: lockDataListItem('名称'.tr, state.lockBasicInfo.value.lockAlias ?? '', () async { var data = await Get.toNamed(Routers.editLockNamePage, arguments: { 'lockSetInfoData': state.lockSetInfoData.value }); @@ -114,7 +113,7 @@ class _BasicInformationPageState extends State { }); } }))), - Obx(() => lockDataListItem(TranslationLoader.lanKeys!.lockGrouping!.tr, state.lockBasicInfo.value.groupName ?? '', () async { + Obx(() => lockDataListItem('锁分组'.tr, state.lockBasicInfo.value.groupName ?? '', () async { Get.toNamed(Routers.lockSelectGroupingPage, arguments: { 'lockSetInfoData': state.lockSetInfoData.value })!.then((val) { @@ -127,8 +126,7 @@ class _BasicInformationPageState extends State { Obx(() => Visibility( visible: state.lockBasicInfo.value.isLockOwner == 1, child: CommonItem( - leftTitel: - TranslationLoader.lanKeys!.adminOpenLockPassword!.tr, + leftTitel:'管理员开锁密码'.tr, rightTitle: state.lockBasicInfo.value.adminPwd, isHaveLine: true, diff --git a/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_page.dart b/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_page.dart index aae6087f..f52c873c 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_page.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_page.dart @@ -8,7 +8,6 @@ import 'package:star_lock/main/lockDetail/lockSet/basicInformation/editLockName/ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/tf_loginInput.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'editLockName_logic.dart'; class EditLockNamePage extends StatefulWidget { @@ -27,13 +26,13 @@ class _EditLockNamePageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.changeName!.tr, + barTitle: '修改名称'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.save!.tr, + '保存'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: logic.modifyKeyNameRequest, diff --git a/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_logic.dart b/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_logic.dart index e433b7eb..8b2a09bf 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_logic.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_logic.dart @@ -52,11 +52,6 @@ class LockSelectGroupingLogic extends BaseGetXController { mockNetworkDataRequest(); } - @override - void onInit() { - super.onInit(); - } - @override void onClose() { super.onClose(); diff --git a/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_page.dart b/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_page.dart index 89abaf6f..528aeb49 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_page.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/lockSelectGrouping/lockSelectGrouping_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -12,7 +11,6 @@ import '../../../../../tools/noData.dart'; import '../../../../../tools/showTipView.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'lockSelectGrouping_logic.dart'; class LockSelectGroupingPage extends StatefulWidget { @@ -24,22 +22,22 @@ class LockSelectGroupingPage extends StatefulWidget { class _LockSelectGroupingPageState extends State { final LockSelectGroupingLogic logic = Get.put(LockSelectGroupingLogic()); - final LockSelectGroupingState state = Get.find().state; + final LockSelectGroupingState state = + Get.find().state; @override Widget build(BuildContext context) { - return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectGroup!.tr, + barTitle: '选择分组'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( children: [ Expanded(child: _buildMainUI()), SubmitBtn( - btnName: TranslationLoader.lanKeys!.createNewGroup!.tr, + btnName: '创建新分组'.tr, borderRadius: 20.w, margin: EdgeInsets.only( left: 30.w, right: 30.w, top: 30.w, bottom: 30.w), @@ -47,14 +45,14 @@ class _LockSelectGroupingPageState extends State { onClick: () { // showCupertinoAlertDialog(context); ShowTipView().showTFViewAlertDialog( - state.changeNameController, - TranslationLoader.lanKeys!.createNewGroup!.tr, - '请输入分组名称'.tr, (){ + state.changeNameController, '创建新分组'.tr, '请输入分组名称'.tr, () { logic.addLockGroupRequest(); Get.back(); - }, isShowSuffixIcon:true, inputFormatters: [ - LengthLimitingTextInputFormatter(50), - ]); + }, + isShowSuffixIcon: true, + inputFormatters: [ + LengthLimitingTextInputFormatter(50), + ]); }), SizedBox( height: 40.h, @@ -65,23 +63,29 @@ class _LockSelectGroupingPageState extends State { } Widget _buildMainUI() { - return Obx(() => state.groupList.value.isNotEmpty ? ListView.builder( - itemCount: state.groupList.value.length, - itemBuilder: (BuildContext c, int index) { - final GroupListItem itemData = state.groupList.value[index]; - return lockDataListItem(itemData.keyGroupName ?? '', state.lockBasicInfo.value.groupId == itemData.keyGroupId, - () { - logic.setLockGroupRequest(itemData).then((value) => setState(() {})); + return Obx(() => state.groupList.value.isNotEmpty + ? ListView.builder( + itemCount: state.groupList.value.length, + itemBuilder: (BuildContext c, int index) { + final GroupListItem itemData = state.groupList.value[index]; + return lockDataListItem(itemData.keyGroupName ?? '', + state.lockBasicInfo.value.groupId == itemData.keyGroupId, () { + logic + .setLockGroupRequest(itemData) + .then((value) => setState(() {})); }); - }) : NoData()); + }) + : NoData()); } - Widget lockDataListItem(String title, bool isShowSeletIcon, Function()? action){ + Widget lockDataListItem( + String title, bool isShowSeletIcon, Function()? action) { return GestureDetector( onTap: action, child: Container( // height: 70.h, - padding: EdgeInsets.only(left: 20.w, right: 20.w, top: 15.h, bottom: 15.h), + padding: + EdgeInsets.only(left: 20.w, right: 20.w, top: 15.h, bottom: 15.h), decoration: BoxDecoration( color: Colors.white, border: Border( @@ -89,20 +93,23 @@ class _LockSelectGroupingPageState extends State { color: AppColors.greyLineColor, // 设置边框颜色 width: 2.0.h, // 设置边框宽度 ), - ) - ), + )), child: Row( children: [ - Expanded( - child: Text(title, style: TextStyle(fontSize: 22.sp)) - ), + Expanded(child: Text(title, style: TextStyle(fontSize: 22.sp))), SizedBox(width: 15.w), - if (isShowSeletIcon) Image( - image: const AssetImage('images/icon_item_checked.png'), - width: 30.w, - height: 30.w, - fit: BoxFit.contain, - ) else SizedBox(width: 30.w, height: 30.w,), + if (isShowSeletIcon) + Image( + image: const AssetImage('images/icon_item_checked.png'), + width: 30.w, + height: 30.w, + fit: BoxFit.contain, + ) + else + SizedBox( + width: 30.w, + height: 30.w, + ), ], ), ), diff --git a/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart b/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart index 23d80a44..d0abe318 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart @@ -165,11 +165,6 @@ class UploadElectricQuantityLogic extends BaseGetXController { // getServerDatetime(); } - @override - void onInit() { - super.onInit(); - } - @override void onClose() { super.onClose(); diff --git a/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart b/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart index 1aea288a..a377545a 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart @@ -10,7 +10,6 @@ import '../../../../../tools/appRouteObserver.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../lockMian/lockMain/lockMain_logic.dart'; import '../../lockSet/lockSetInfo_entity.dart'; import 'uploadElectricQuantity_logic.dart'; @@ -32,7 +31,7 @@ class _UploadElectricQuantityPageState extends State return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.electricQuantity!.tr, + barTitle: '电量'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( @@ -43,8 +42,7 @@ class _UploadElectricQuantityPageState extends State mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded( - child: Text( - TranslationLoader.lanKeys!.updateElectricQuantityTip!.tr, + child: Text('电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新'.tr, style: TextStyle(fontSize: 20.sp), )), ], @@ -57,7 +55,7 @@ class _UploadElectricQuantityPageState extends State children: [ Expanded( child: Text( - "${"电池1".tr}${TranslationLoader.lanKeys!.electricQuantity!.tr}:${state.battRemCap.value}%", + "${"电池1电量".tr}:${state.lockBasicInfo.value.electricQuantity ?? ""}%", style: TextStyle(fontSize: 20.sp), )), ], @@ -69,7 +67,7 @@ class _UploadElectricQuantityPageState extends State children: [ Expanded( child: Text( - "${"电池2".tr}${TranslationLoader.lanKeys!.electricQuantity!.tr}:${state.battRemCapStandby.value}%", + "${"电池2电量".tr}:${state.lockBasicInfo.value.electricQuantityStandby ?? ""}%", style: TextStyle(fontSize: 20.sp), )), ], @@ -90,7 +88,7 @@ class _UploadElectricQuantityPageState extends State height: 30.h, ), SubmitBtn( - btnName: TranslationLoader.lanKeys!.update!.tr, + btnName: '更新'.tr, borderRadius: 20.w, fontSize: 32.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), diff --git a/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_logic.dart b/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_logic.dart index 1d7ec440..74e2c236 100755 --- a/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_logic.dart +++ b/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_logic.dart @@ -5,6 +5,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsNoParameters.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_reply.dart'; @@ -21,7 +22,7 @@ class BurglarAlarmLogic extends BaseGetXController{ // 配置锁的常开模式设置 -> 防撬报警 Future _setLockSetGeneralSetting() async{ - var entity = await ApiRepository.to.setBurglarAlarmData( + final LoginEntity entity = await ApiRepository.to.setBurglarAlarmData( lockId: state.lockSetInfoData.value.lockId!, antiPrySwitch:state.burglarAlarmEnable.value == 1 ? 0 : 1, // 1-开启、2-关闭; ); @@ -30,7 +31,7 @@ class BurglarAlarmLogic extends BaseGetXController{ state.burglarAlarmEnable.value = state.burglarAlarmEnable.value == 1 ? 0 : 1; state.lockSetInfoData.value.lockSettingInfo!.antiPrySwitch = state.burglarAlarmEnable.value; - showToast("操作成功".tr, something: (){ + showToast('操作成功'.tr, something: (){ eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); }); } @@ -39,7 +40,7 @@ class BurglarAlarmLogic extends BaseGetXController{ // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { if(reply is SetSupportFunctionsNoParametersReply) { _replySetSupportFunctionsWithParameters(reply); } @@ -69,7 +70,7 @@ class BurglarAlarmLogic extends BaseGetXController{ // 设置自动落锁数据解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch(status){ case 0x00: //成功 @@ -102,14 +103,14 @@ class BurglarAlarmLogic extends BaseGetXController{ }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); IoSenderManage.setSupportFunctionsNoParametersCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), @@ -133,7 +134,6 @@ class BurglarAlarmLogic extends BaseGetXController{ @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -141,7 +141,6 @@ class BurglarAlarmLogic extends BaseGetXController{ @override void onInit() { - // TODO: implement onInit super.onInit(); // _readSupportFunctionsNoParameters(); @@ -149,7 +148,6 @@ class BurglarAlarmLogic extends BaseGetXController{ @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); diff --git a/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_page.dart b/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_page.dart index 06edf527..451405ee 100755 --- a/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_page.dart +++ b/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_page.dart @@ -1,14 +1,14 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_state.dart'; import '../../../../app_settings/app_colors.dart'; -import '../../../../blue/blue_manage.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; import 'burglarAlarm_logic.dart'; @@ -20,27 +20,27 @@ class BurglarAlarmPage extends StatefulWidget { } class _BurglarAlarmPageState extends State with RouteAware{ - final logic = Get.put(BurglarAlarmLogic()); - final state = Get.find().state; + final BurglarAlarmLogic logic = Get.put(BurglarAlarmLogic()); + final BurglarAlarmState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.burglarAlarm!.tr, + barTitle: '防撬报警'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( padding: EdgeInsets.all(30.w), child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - TranslationLoader.lanKeys!.burglarAlarmTip!.tr, + '开启后,锁被撬动时,会发出报警声'.tr, style: TextStyle(fontSize: 20.sp), )), ], @@ -50,10 +50,10 @@ class _BurglarAlarmPageState extends State with RouteAware{ ), Obx(() => Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - '${TranslationLoader.lanKeys!.currentMode!.tr} : ${state.burglarAlarmEnable.value == 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr}', + "${"当前模式".tr} : ${state.burglarAlarmEnable.value == 1 ? '已开启'.tr : '已关闭'.tr}", style: TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w600), )), @@ -63,7 +63,7 @@ class _BurglarAlarmPageState extends State with RouteAware{ height: 40.h, ), Obx(() => SubmitBtn( - btnName: state.burglarAlarmEnable.value == 1 ? TranslationLoader.lanKeys!.close!.tr : TranslationLoader.lanKeys!.open!.tr, + btnName: state.burglarAlarmEnable.value == 1 ? '关闭'.tr : '开启'.tr, borderRadius: 20.w, fontSize: 32.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), @@ -83,7 +83,6 @@ class _BurglarAlarmPageState extends State with RouteAware{ @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -92,7 +91,6 @@ class _BurglarAlarmPageState extends State with RouteAware{ @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); @@ -112,7 +110,9 @@ class _BurglarAlarmPageState extends State with RouteAware{ super.didPop(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; state.sureBtnState.value = 0; } @@ -131,7 +131,9 @@ class _BurglarAlarmPageState extends State with RouteAware{ super.didPushNext(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; state.sureBtnState.value = 0; } diff --git a/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_state.dart b/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_state.dart index ce6f2d58..def35f6c 100755 --- a/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_state.dart +++ b/lib/main/lockDetail/lockSet/burglarAlarm/burglarAlarm_state.dart @@ -3,19 +3,18 @@ import 'package:get/get.dart'; import '../lockSet/lockSetInfo_entity.dart'; -class BurglarAlarmState{ - var lockSetInfoData = LockSetInfoData().obs; - - var burglarAlarmEnable = 0.obs; - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) - +class BurglarAlarmState{// 0普通状态(可用) 1连接中(不可用) BurglarAlarmState() { var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; burglarAlarmEnable.value = lockSetInfoData.value.lockSettingInfo!.antiPrySwitch!; } + Rx lockSetInfoData = LockSetInfoData().obs; + + RxInt burglarAlarmEnable = 0.obs; + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; } \ No newline at end of file diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart index 7d2754ba..400edf80 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart @@ -1,3 +1,4 @@ +import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -8,7 +9,7 @@ class CatEyeCustomModeLogic extends BaseGetXController { // 获取锁设置信息 Future getLockSettingInfoData() async { - LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( + final LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( lockId: state.lockSetInfoData.value.lockId.toString(), ); if (entity.errorCode!.codeIsSuccessful) { @@ -19,9 +20,9 @@ class CatEyeCustomModeLogic extends BaseGetXController { if (state.catEyeConfigData.value.catEyeModeConfig != null) { if (state.catEyeConfigData.value.catEyeModeConfig!.recordMode == 1) { - state.selectVideoSlot.value = '自定义时段'; + state.selectVideoSlot.value = '自定义时段'.tr; } else { - state.selectVideoSlot.value = '全天'; + state.selectVideoSlot.value = '全天'.tr; } state.recordTime.value = @@ -31,8 +32,8 @@ class CatEyeCustomModeLogic extends BaseGetXController { ''; state.realTimeMode.value = state.catEyeConfigData.value.catEyeModeConfig!.realTimeMode == 0 - ? '发生事件时查看' - : '实时查看'; + ? '发生事件时查看'.tr + : '实时查看'.tr; } } } @@ -67,7 +68,7 @@ class CatEyeCustomModeLogic extends BaseGetXController { ], ); if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'); + showToast('设置成功'.tr); } } } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart index 088ca9bc..5850d951 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart @@ -1,13 +1,14 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart'; +import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_state.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart'; import 'package:star_lock/tools/titleAppBar.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class CatEyeCustomModePage extends StatefulWidget { const CatEyeCustomModePage({Key? key}) : super(key: key); @@ -17,8 +18,8 @@ class CatEyeCustomModePage extends StatefulWidget { } class _CatEyeCustomModePageState extends State { - final logic = Get.put(CatEyeCustomModeLogic()); - final state = Get.find().state; + final CatEyeCustomModeLogic logic = Get.put(CatEyeCustomModeLogic()); + final CatEyeCustomModeState state = Get.find().state; @override initState() { @@ -31,7 +32,7 @@ class _CatEyeCustomModePageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.customMode!.tr, + barTitle: '自定义模式'.tr, haveBack: true, backAction: () { Navigator.pop(context, true); @@ -42,7 +43,7 @@ class _CatEyeCustomModePageState extends State { Container( margin: EdgeInsets.only(left: 20.w), child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.videoSlot!.tr, + leftTitel: '录像时段'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -64,14 +65,14 @@ class _CatEyeCustomModePageState extends State { }, ), ), - _buildSubTitleItem('有人出现时录像', '有人在门口出现10秒后开始录像。\n有人按门铃时立即录像', + _buildSubTitleItem('有人出现时录像'.tr, '有人在门口出现10秒后开始录像。'.tr + '\n' + '有人按门铃时立即录像'.tr, state.recordTime.value, () { _openBottomItemSheet(state.showsUpVideoList.value, 0); }), SizedBox( height: 30.h, ), - _buildSubTitleItem('人体侦测距离', '有人出现在门前1.5米范围时启动录像', + _buildSubTitleItem('人体侦测距离'.tr, '有人出现在门前1.5米范围时启动录像'.tr, state.detectionDistance.value, () { _openBottomItemSheet(state.detectionRangeList.value, 1); }), @@ -81,7 +82,7 @@ class _CatEyeCustomModePageState extends State { Container( margin: EdgeInsets.only(left: 20.w), child: CommonItem( - leftTitel: '实时画面', + leftTitel: '实时画面'.tr, rightTitle: state.realTimeMode.value, isHaveLine: false, isHaveDirection: true, diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_state.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_state.dart index a4bafbe0..d7c56403 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_state.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_state.dart @@ -3,24 +3,34 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; -import 'package:star_lock/translations/trans_lib.dart'; -class CatEyeCustomModeState { - var isCheck = false.obs; - var faceOn = false.obs; //面容开锁 - var autoBright = false.obs; //自动亮屏 +class CatEyeCustomModeState { //实时画面 0发生事件事查看 1实时查看 + + CatEyeCustomModeState() { + Map map = Get.arguments; + if (map['lockSetInfoData'] != null) { + lockSetInfoData.value = map['lockSetInfoData']; + } + + if (map['catEyeConfigData'] != null) { + catEyeConfigData.value = map['catEyeConfigData']; + } + } + RxBool isCheck = false.obs; + RxBool faceOn = false.obs; //面容开锁 + RxBool autoBright = false.obs; //自动亮屏 // var showsUpVideo = '10${TranslationLoader.lanKeys!.second!.tr}'.obs; //有人出现时录像 // var detectionRange = '约1.5米'.obs; //人体侦测距离 - var showsUpVideoList = [ - '不录像', - '立即录像', - '5${TranslationLoader.lanKeys!.second!.tr}', - '10${TranslationLoader.lanKeys!.second!.tr}', - '15${TranslationLoader.lanKeys!.second!.tr}', - '30${TranslationLoader.lanKeys!.second!.tr}', - '60${TranslationLoader.lanKeys!.second!.tr}' + RxList showsUpVideoList = [ + '不录像'.tr, + '立即录像'.tr, + '5${"秒".tr}', + '10${"秒".tr}', + '15${"秒".tr}', + '30${"秒".tr}', + '60${"秒".tr}' ].obs; - var detectionRangeList = ['约0.8米', '约1.5米', '约3.0米'].obs; + RxList detectionRangeList = ['约0.8米'.tr, '约1.5米'.tr, '约3.0米'.tr].obs; //高亮样式 final TextStyle titleStyle = TextStyle( color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); @@ -28,31 +38,20 @@ class CatEyeCustomModeState { final TextStyle subTipsStyle = TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ + late InlineSpan tipsPreviewSpan = TextSpan(children: [ TextSpan( - text: '${TranslationLoader.lanKeys!.addAndUseFaceWhenUnlocking!.tr}:\n', + text: '${"添加和使用面容开锁时".tr}:\n', style: titleStyle), TextSpan( - text: TranslationLoader.lanKeys!.addAndUseFaceWhenUnlockingTip!.tr, + text: '添加和使用面容开锁时提示'.tr, style: subTipsStyle), ]); - var lockSetInfoData = LockSetInfoData().obs; - var catEyeConfigData = CatEyeConfig().obs; + Rx lockSetInfoData = LockSetInfoData().obs; + Rx catEyeConfigData = CatEyeConfig().obs; - var selectVideoSlot = ''.obs; //录像时段 0全天 1自定义时间 - var recordTime = ''.obs; //有人出现时录像 - var detectionDistance = ''.obs; //人体侦测距离 - var realTimeMode = ''.obs; //实时画面 0发生事件事查看 1实时查看 - - CatEyeCustomModeState() { - Map map = Get.arguments; - if (map["lockSetInfoData"] != null) { - lockSetInfoData.value = map["lockSetInfoData"]; - } - - if (map['catEyeConfigData'] != null) { - catEyeConfigData.value = map['catEyeConfigData']; - } - } + RxString selectVideoSlot = ''.obs; //录像时段 0全天 1自定义时间 + RxString recordTime = ''.obs; //有人出现时录像 + RxString detectionDistance = ''.obs; //人体侦测距离 + RxString realTimeMode = ''.obs; } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart index bfcbae3d..53a61e8d 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart @@ -3,6 +3,7 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; import 'catEyeSet_state.dart'; @@ -10,8 +11,8 @@ class CatEyeSetLogic extends BaseGetXController { final CatEyeSetState state = CatEyeSetState(); //设置自动亮屏 - void updateAutoLightScreenConfig() async { - var entity = await ApiRepository.to.updateAutoLightScreenConfig( + Future updateAutoLightScreenConfig() async { + final VersionUndateEntity entity = await ApiRepository.to.updateAutoLightScreenConfig( lockId: state.lockSetInfoData.value.lockId!, autoLightScreen: state.isAutoBright.value == true ? 1 : 0, ); @@ -21,8 +22,8 @@ class CatEyeSetLogic extends BaseGetXController { } //设置自动亮屏 - void updateLightScreenTimeConfig() async { - var entity = await ApiRepository.to.updateLightScreenTimeConfig( + Future updateLightScreenTimeConfig() async { + final VersionUndateEntity entity = await ApiRepository.to.updateLightScreenTimeConfig( lockId: state.lockSetInfoData.value.lockId!, autoLightScreenTime: int.parse(state.selectBrightDuration.value.replaceAll('秒'.tr, '')), @@ -33,8 +34,8 @@ class CatEyeSetLogic extends BaseGetXController { } //设置逗留警告 - void updateStayWarnConfig() async { - var entity = await ApiRepository.to.updateStayWarnConfig( + Future updateStayWarnConfig() async { + final VersionUndateEntity entity = await ApiRepository.to.updateStayWarnConfig( lockId: state.lockSetInfoData.value.lockId!, stayWarn: state.isStayWarning.value == true ? 1 : 0, ); @@ -44,8 +45,8 @@ class CatEyeSetLogic extends BaseGetXController { } //设置异常警告 - void updateAbnormalWarnConfig() async { - var entity = await ApiRepository.to.updateAbnormalWarnConfig( + Future updateAbnormalWarnConfig() async { + final VersionUndateEntity entity = await ApiRepository.to.updateAbnormalWarnConfig( lockId: state.lockSetInfoData.value.lockId!, abnormalWarn: state.isExceptionWarning.value == true ? 1 : 0, ); @@ -56,25 +57,34 @@ class CatEyeSetLogic extends BaseGetXController { // 获取锁设置信息 Future getLockSettingInfoData() async { - LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( + final LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( lockId: state.lockSetInfoData.value.lockId.toString(), ); if (entity.errorCode!.codeIsSuccessful) { state.lockSetInfoData.value = entity.data!; - state.selectBrightDuration.value = - '${state.lockSetInfoData.value.lockSettingInfo!.autoLightScreenTime}秒'; //选中的亮屏持续时间 - state.isAutoBright.value = - state.lockSetInfoData.value.lockSettingInfo!.autoLightScreen == 0 - ? false - : true; //自动亮屏 - state.isStayWarning.value = - state.lockSetInfoData.value.lockSettingInfo!.stayWarn == 0 - ? false - : true; //逗留警告 - state.isExceptionWarning.value = - state.lockSetInfoData.value.lockSettingInfo!.abnormalWarn == 0 - ? false - : true; //异常警告 + state.selectBrightDuration.value = '${state.lockSetInfoData.value.lockSettingInfo!.autoLightScreenTime}${'秒'.tr}'; //选中的亮屏持续时间 + + if (state.lockSetInfoData.value.lockSettingInfo!.autoLightScreen == 0) { + state.isAutoBright.value = false; + } else { + state.isAutoBright.value = true; + } + + //自动亮屏 + if (state.lockSetInfoData.value.lockSettingInfo!.stayWarn == 0) { + state.isStayWarning.value = false; + } else { + state.isStayWarning.value = true; + } + + //逗留警告 + if (state.lockSetInfoData.value.lockSettingInfo!.abnormalWarn == 0) { + state.isExceptionWarning.value = false; + } else { + state.isExceptionWarning.value = true; + } + + //异常警告 state.selectCatEyeWorkMode.value = ''; //猫眼工作模式 // selectCatEyeWorkMode.value = catEyeConfigData.value.catEyeMode!; diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart index 0ae9bf24..100e871f 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart @@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart'; +import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart'; @@ -18,8 +19,8 @@ class CatEyeSetPage extends StatefulWidget { } class _CatEyeSetPageState extends State { - final logic = Get.put(CatEyeSetLogic()); - final state = Get.find().state; + final CatEyeSetLogic logic = Get.put(CatEyeSetLogic()); + final CatEyeSetState state = Get.find().state; @override void initState() { @@ -37,7 +38,7 @@ class _CatEyeSetPageState extends State { haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ + children: [ Obx(() => CommonItem( leftTitel: '猫眼工作模式'.tr, rightTitle: state.selectCatEyeWorkMode.value, @@ -46,20 +47,20 @@ class _CatEyeSetPageState extends State { isHaveDirection: true, action: () { Navigator.pushNamed(context, Routers.catEyeWorkModePage, - arguments: { + arguments: { 'lockSetInfoData': state.lockSetInfoData.value, 'catEyeConfigData': state.lockSetInfoData.value .lockSettingInfo!.catEyeConfig!.isNotEmpty ? state.lockSetInfoData.value.lockSettingInfo! .catEyeConfig![0] : null - }).then((value) { + }).then((Object? value) { logic.getLockSettingInfoData(); }); })), Obx(() => CommonItem( leftTitel: '自动亮屏'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveDirection: false, isHaveRightWidget: true, @@ -74,14 +75,14 @@ class _CatEyeSetPageState extends State { })), Obx(() => CommonItem( leftTitel: '逗留警告'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: _otherToDoSwitch(2), )), Obx(() => CommonItem( leftTitel: '异常警告'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: _otherToDoSwitch(3))), @@ -108,7 +109,7 @@ class _CatEyeSetPageState extends State { trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, value: isCheck, - onChanged: (value) { + onChanged: (bool value) { switch (clickIndex) { case 1: //自动亮屏 { @@ -144,7 +145,7 @@ class _CatEyeSetPageState extends State { return AlertBottomWidget( topTitle: '', items: state.brightDurationTimeList, - chooseCallback: (value) { + chooseCallback: (int value) { state.selectBrightDuration.value = state.brightDurationTimeList[value]; logic.updateLightScreenTimeConfig(); diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart index b1c5dd1c..ac48a22f 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart @@ -1,24 +1,17 @@ + import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; class CatEyeSetState { - var brightDurationTimeList = ['10秒', '15秒', '20秒'].obs; - var selectBrightDuration = '10 秒'.obs; //选中的亮屏持续时间 - var isAutoBright = false.obs; //自动亮屏 - var isStayWarning = false.obs; //逗留警告 - var isExceptionWarning = false.obs; //异常警告 - var lockSetInfoData = LockSetInfoData().obs; - var selectCatEyeWorkMode = ''.obs; //猫眼工作模式 - final String settingSuccess = '设置成功'.tr; CatEyeSetState() { Map map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; if (lockSetInfoData.value != null && lockSetInfoData.value.lockSettingInfo != null) { selectBrightDuration.value = - '${lockSetInfoData.value.lockSettingInfo?.autoLightScreenTime} 秒'; + '${lockSetInfoData.value.lockSettingInfo?.autoLightScreenTime} ${'秒'.tr}'; if (lockSetInfoData.value.lockSettingInfo?.autoLightScreen == 1) { isAutoBright.value = true; } else { @@ -38,4 +31,12 @@ class CatEyeSetState { } } } + RxList brightDurationTimeList = ['10${'秒'.tr}', '15${'秒'.tr}', '20${'秒'.tr}'].obs; + RxString selectBrightDuration = '10 ${'秒'.tr}'.obs; //选中的亮屏持续时间 + RxBool isAutoBright = false.obs; //自动亮屏 + RxBool isStayWarning = false.obs; //逗留警告 + RxBool isExceptionWarning = false.obs; //异常警告 + Rx lockSetInfoData = LockSetInfoData().obs; + RxString selectCatEyeWorkMode = ''.obs; //猫眼工作模式 + final String settingSuccess = '设置成功'.tr; } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart index 10be744e..a13f49d5 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart @@ -1,21 +1,23 @@ +import 'package:get/get.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; class CatEyeWorkModeLogic extends BaseGetXController { final CatEyeWorkModeState state = CatEyeWorkModeState(); //设置猫眼工作模式 - void updateCatEyeModeConfig() async { - var entity = await ApiRepository.to.updateCatEyeModeConfig( + Future updateCatEyeModeConfig() async { + final VersionUndateEntity entity = await ApiRepository.to.updateCatEyeModeConfig( lockId: state.lockSetInfoData.value.lockId!, catEyeConfig: [ - { + { 'catEyeMode': - state.boolList.indexWhere((element) => element == true) + 1, - 'catEyeModeConfig': { + state.boolList.indexWhere((bool element) => element == true) + 1, + 'catEyeModeConfig': { 'recordMode': state.lockSetInfoData.value.lockSettingInfo! .catEyeConfig!.isNotEmpty ? state.catEyeConfigData.value.catEyeModeConfig?.recordMode @@ -46,14 +48,14 @@ class CatEyeWorkModeLogic extends BaseGetXController { ], ); if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'); + showToast('设置成功'.tr); getLockSettingInfoData(); } } // 获取锁设置信息 - void getLockSettingInfoData() async { - LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( + Future getLockSettingInfoData() async { + final LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( lockId: state.lockSetInfoData.value.lockId.toString(), ); if (entity.errorCode!.codeIsSuccessful) { @@ -65,16 +67,16 @@ class CatEyeWorkModeLogic extends BaseGetXController { if (state.catEyeConfigData.value.catEyeMode == XSConstantMacro.catEyeWorkModePowerSaving) { - state.boolList.value = [true, false, false, false]; + state.boolList.value = [true, false, false, false]; } else if (state.catEyeConfigData.value.catEyeMode == XSConstantMacro.catEyeWorkModeStayCapture) { - state.boolList.value = [false, true, false, false]; + state.boolList.value = [false, true, false, false]; } else if (state.catEyeConfigData.value.catEyeMode == XSConstantMacro.catEyeWorkModeRealTimeMonitoring) { - state.boolList.value = [false, false, true, false]; + state.boolList.value = [false, false, true, false]; } else if (state.catEyeConfigData.value.catEyeMode == XSConstantMacro.catEyeWorkModeCustom) { - state.boolList.value = [false, false, false, true]; + state.boolList.value = [false, false, false, true]; } } } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart index c205c0fc..800b03dd 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart @@ -1,8 +1,11 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart'; +import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart'; +import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; @@ -15,8 +18,8 @@ class CatEyeWorkModePage extends StatefulWidget { } class _CatEyeWorkModePageState extends State { - final logic = Get.put(CatEyeWorkModeLogic()); - final state = Get.find().state; + final CatEyeWorkModeLogic logic = Get.put(CatEyeWorkModeLogic()); + final CatEyeWorkModeState state = Get.find().state; @override initState() { @@ -29,36 +32,38 @@ class _CatEyeWorkModePageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: '猫眼工作模式', + barTitle: '猫眼工作模式'.tr, haveBack: true, backAction: () { Navigator.pop(context, true); }, backgroundColor: AppColors.mainColor), body: Obx(() => Column( - children: [ - SizedBox( - height: 30.h, - ), - _buildTipsView('省电模式:\n', - '适合门口较为安全的环境。\n仅发生特定事件才录像,并可查看实时画面。\n一般情况下,满电可使用7-8个月', 0), - SizedBox( - height: 30.h, - ), - _buildTipsView('逗留抓拍模式:\n', - '有人逗留或发生特定事件才录像,可随时查看\n实时画面。\n一般情况下,满电可使用5~6个月。', 1), + children: [ SizedBox( height: 30.h, ), _buildTipsView( - '实时监控模式:\n', - '适合门口人员复杂、较不安全的环境。\n有人出现就录像,可随时查看实时画面。\n一般情况下,满电可使用2~4个月。', + '省电模式'.tr + ':\n', + '适合门口较为安全的环境。'.tr + '\n' + '仅发生特定事件才录像,并可查看实时画面。'.tr + '\n' + '一般情况下,满电可使用7-8个月'.tr, + 0), + SizedBox( + height: 30.h, + ), + _buildTipsView('逗留抓拍模式'.tr + ':\n', + '有人逗留或发生特定事件才录像,可随时查看'.tr + '\n' + '实时画面。'.tr + '\n' + '一般情况下,满电可使用5~6个月。'.tr, 1), + SizedBox( + height: 30.h, + ), + _buildTipsView( + '实时监控模式'.tr + ':\n', + '适合门口人员复杂、较不安全的环境。'.tr + '\n' + '有人出现就录像,可随时查看实时画面。'.tr + '\n' + '一般情况下,满电可使用2~4个月。'.tr, 2), SizedBox( height: 30.h, ), _buildTipsView( - '自定义模式:\n', '根据您家门口实际情况设置录像和实时画面功能。\n可使用时长由具体设置决定。', 3) + '自定义模式'.tr + ':\n', '根据您家门口实际情况设置录像和实时画面功能。'.tr + '\n' + '可使用时长由具体设置决定。'.tr, 3) ], ))); } @@ -78,14 +83,12 @@ class _CatEyeWorkModePageState extends State { padding: EdgeInsets.only( left: 20.w, top: 30.h, bottom: 30.h, right: 20.w), child: Row( - children: [ - state.boolList.value[clickIndex] - ? Image.asset( + children: [ + if (state.boolList.value[clickIndex]) Image.asset( 'images/mine/icon_mine_blueSelect.png', width: 20.w, height: 14.w, - ) - : SizedBox( + ) else SizedBox( width: 20.w, height: 14.w, ), @@ -109,7 +112,7 @@ class _CatEyeWorkModePageState extends State { ), child: Center( child: Text( - clickIndex == 3 ? '设置' : '查看', + clickIndex == 3 ? '设置'.tr : '查看'.tr, style: TextStyle( color: AppColors.placeholderTextColor, fontSize: 20.sp), @@ -121,9 +124,9 @@ class _CatEyeWorkModePageState extends State { if (clickIndex == 3) { Navigator.pushNamed( context, Routers.catEyeCustomModePage, - arguments: { + arguments: { 'lockSetInfoData': state.lockSetInfoData.value, - }).then((value) => logic.getLockSettingInfoData()); + }).then((Object? value) => logic.getLockSettingInfoData()); } else { //其他模式弹框 showBottomSheet(context, clickIndex); @@ -158,7 +161,7 @@ class _CatEyeWorkModePageState extends State { : AppColors.placeholderTextColor, fontSize: 20.sp); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ + late InlineSpan tipsPreviewSpan = TextSpan(children: [ TextSpan(text: titleStr, style: titleStyle), TextSpan(text: subTitle, style: subTipsStyle), ]); @@ -171,14 +174,14 @@ class _CatEyeWorkModePageState extends State { builder: (BuildContext context) { //构建弹框中的内容 if (clickIndex == 0) { - return _buildBottomSheetWidget(context, '省电模式', '有人按门铃或发生\n异常事件时', - '不录像', '/', '有人按门铃或发生\n异常事件时'); + return _buildBottomSheetWidget(context, '省电模式'.tr, '有人按门铃或发生'.tr + '\n' + '异常事件时'.tr, + '不录像'.tr, '/', '有人按门铃或发生'.tr + '\n' + '异常事件时'.tr); } else if (clickIndex == 1) { - return _buildBottomSheetWidget(context, '逗留抓拍模式', - '有人出现、按门铃\n或发生异常事件时', '逗留达到10秒', '约1.5米', '随时'); + return _buildBottomSheetWidget(context, '逗留抓拍模式'.tr, + '有人出现、按门铃'.tr + '\n' + '或发生异常事件时'.tr, '逗留达到10秒'.tr, '约1.5米'.tr, '随时'.tr); } else if (clickIndex == 2) { return _buildBottomSheetWidget( - context, '实时监控模式', '有人出现、按门铃\n或发生异常事件时', '立即录像', '约1.5米', '随时'); + context, '实时监控模式'.tr, '有人出现、按门铃'.tr + '\n' + '或发生异常事件时'.tr, '立即录像'.tr, '约1.5米'.tr, '随时'.tr); } else { return Container(); } @@ -191,9 +194,9 @@ class _CatEyeWorkModePageState extends State { return Container( margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.h), child: Column( - children: [ + children: [ Row( - children: [ + children: [ //居中显示 Expanded( child: Center( @@ -211,10 +214,10 @@ class _CatEyeWorkModePageState extends State { SizedBox( height: 40.h, ), - _buildRowWidget('录像时机', tips1), - _buildRowWidget('有人出现时录像', tips2), - _buildRowWidget('人体侦测距离', tips3), - _buildRowWidget('查看实时画面', tips4), + _buildRowWidget('录像时机'.tr, tips1), + _buildRowWidget('有人出现时录像'.tr, tips2), + _buildRowWidget('人体侦测距离'.tr, tips3), + _buildRowWidget('查看实时画面'.tr, tips4), _buildIKnowBtn(), ], ), @@ -227,7 +230,7 @@ class _CatEyeWorkModePageState extends State { child: Row( //Row两端对齐的方法 mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Text( titleStr, style: TextStyle( @@ -268,7 +271,7 @@ class _CatEyeWorkModePageState extends State { ), child: Center( child: Text( - '我知道了', + '我知道了'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 24.sp, diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart index 765f9050..7e7973bd 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart @@ -2,14 +2,10 @@ import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; class CatEyeWorkModeState { - var lockSetInfoData = LockSetInfoData().obs; - // var selectCatEyeWorkMode = 0.obs; //猫眼工作模式 - var boolList = [false, false, false, false].obs; - var catEyeConfigData = CatEyeConfig().obs; CatEyeWorkModeState() { Map map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; // if (map['catEyeConfigData'] != null) { // catEyeConfigData.value = map['catEyeConfigData']; // selectCatEyeWorkMode.value = catEyeConfigData.value.catEyeMode!; @@ -31,4 +27,8 @@ class CatEyeWorkModeState { // catEyeConfigData.value = CatEyeConfig(); // } } + Rx lockSetInfoData = LockSetInfoData().obs; + // var selectCatEyeWorkMode = 0.obs; //猫眼工作模式 + RxList boolList = [false, false, false, false].obs; + Rx catEyeConfigData = CatEyeConfig().obs; } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart index b52a8b2c..32e2f7e4 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart @@ -1,16 +1,18 @@ + import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/dateTool.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; class VideoSlotLogic extends BaseGetXController { final VideoSlotState state = VideoSlotState(); // 获取锁设置信息 Future getLockSettingInfoData() async { - LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( + final LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( lockId: state.lockSetInfoData.value.lockId.toString(), ); if (entity.errorCode!.codeIsSuccessful) { @@ -39,7 +41,7 @@ class VideoSlotLogic extends BaseGetXController { } //设置猫眼工作模式 - void updateCatEyeModeConfig() async { + Future updateCatEyeModeConfig() async { state.isCustom.value == false ? state.recordMode.value = 0 : state.recordMode.value = 1; @@ -48,13 +50,13 @@ class VideoSlotLogic extends BaseGetXController { state.recordStartTime.value = DateTool().dateToTimestamp(state.startDate.value, 0); // 将当前时间加一天 - DateTime tomorrow = + final DateTime tomorrow = DateTime(DateTool().dateToTimestamp(state.startDate.value, 0)) .add(const Duration(days: 1)); // 获取明天时间的时间戳 state.recordEndTime.value = tomorrow.millisecondsSinceEpoch; } - var entity = await ApiRepository.to.updateCatEyeModeConfig( + final VersionUndateEntity entity = await ApiRepository.to.updateCatEyeModeConfig( lockId: state.lockSetInfoData.value.lockId!, catEyeConfig: [ { @@ -74,7 +76,7 @@ class VideoSlotLogic extends BaseGetXController { ], ); if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'); + showToast('设置成功'.tr); Get.back(); } } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart index d060cd80..49aeb165 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart'; +import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_state.dart'; import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; @@ -19,8 +19,8 @@ class VideoSlotPage extends StatefulWidget { } class _VideoSlotPageState extends State { - final logic = Get.put(VideoSlotLogic()); - final state = Get.find().state; + final VideoSlotLogic logic = Get.put(VideoSlotLogic()); + final VideoSlotState state = Get.find().state; @override initState() { @@ -33,34 +33,32 @@ class _VideoSlotPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '录像时段', + barTitle: '录像时段'.tr, haveBack: true, backAction: () { Navigator.pop(context, true); }, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.save!.tr, + '保存'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), - onPressed: () { - logic.updateCatEyeModeConfig(); - }, + onPressed: logic.updateCatEyeModeConfig, ), ], ), body: Obx(() => Column( - children: [ + children: [ SizedBox( height: 30.h, ), - _buildTipsView('全天', 0), + _buildTipsView('全天'.tr, 0), SizedBox( height: 30.h, ), - _buildCustomTimeView('自定义时间', 1), + _buildCustomTimeView('自定义时间'.tr, 1), ], ))); } @@ -81,14 +79,12 @@ class _VideoSlotPageState extends State { padding: EdgeInsets.only( left: 20.w, top: 30.h, bottom: 30.h, right: 20.w), child: Row( - children: [ - state.isCustom.value == false - ? Image.asset( + children: [ + if (state.isCustom.value == false) Image.asset( 'images/mine/icon_mine_blueSelect.png', width: 20.w, height: 14.w, - ) - : SizedBox( + ) else SizedBox( width: 20.w, height: 14.w, ), @@ -128,22 +124,20 @@ class _VideoSlotPageState extends State { padding: EdgeInsets.only( left: 20.w, top: 30.h, bottom: 30.h, right: 20.w), child: Column( - children: [ + children: [ Row( - children: [ - state.isCustom.value == true - ? Image.asset( + children: [ + if (state.isCustom.value == true) Image.asset( 'images/mine/icon_mine_blueSelect.png', width: 20.w, height: 14.w, - ) - : SizedBox( + ) else SizedBox( width: 20.w, height: 14.w, ), SizedBox(width: 10.w), Expanded( - child: _buildRichText('自定义时间', state.isCustom.value), + child: _buildRichText('自定义时间'.tr, state.isCustom.value), ), SizedBox( width: 10.w, @@ -151,9 +145,7 @@ class _VideoSlotPageState extends State { ], ), //如果选中了全天模式,就不显示下面的时间选择 - state.isCustom.value == false - ? Container() - : Container( + if (state.isCustom.value == false) Container() else Container( height: 1, margin: EdgeInsets.only( left: 20.w, @@ -164,17 +156,11 @@ class _VideoSlotPageState extends State { ? AppColors.blueTextTipsColor : Colors.black, ), - state.isCustom.value == false - ? Container() - : startAndEndTimeRow(false), - state.isCustom.value == false - ? Container() - : SizedBox( + if (state.isCustom.value == false) Container() else startAndEndTimeRow(false), + if (state.isCustom.value == false) Container() else SizedBox( height: 30.h, ), - state.isCustom.value == false - ? Container() - : startAndEndTimeRow(true), + if (state.isCustom.value == false) Container() else startAndEndTimeRow(true), ], )), )), @@ -192,12 +178,12 @@ class _VideoSlotPageState extends State { Widget startAndEndTimeRow(bool isEndTime) { return GestureDetector( child: Row( - children: [ + children: [ SizedBox( width: 20.w, ), Text( - isEndTime == false ? '开始时间' : '结束时间', + isEndTime == false ? '开始时间'.tr : '结束时间'.tr, style: TextStyle( color: state.isCustom.value == true ? AppColors.blueTextTipsColor @@ -210,8 +196,8 @@ class _VideoSlotPageState extends State { )), Obx(() => Text( isEndTime == false - ? '当日${state.startDate.value}' - : '次日${state.endDate.value}', + ? '${'当日'.tr}${state.startDate.value}' + : '${'次日'.tr}${state.endDate.value}', style: TextStyle( color: state.isCustom.value == true ? AppColors.blueTextTipsColor @@ -232,7 +218,7 @@ class _VideoSlotPageState extends State { PDuration selectDate = PDuration.parse(DateTime.tryParse( isEndTime == false ? state.startDate.value : state.endDate.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.HM, onConfirm: (p) { + selectDate: selectDate, mode: DateMode.HM, onConfirm: (PDuration p) { if (isEndTime == false) { state.startDate.value = DateTool().getYMDHNDateString(p, 3); } else { @@ -250,7 +236,7 @@ class _VideoSlotPageState extends State { fontSize: 24.sp, fontWeight: FontWeight.w500); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ + late InlineSpan tipsPreviewSpan = TextSpan(children: [ TextSpan(text: titleStr, style: titleStyle), ]); return RichText(text: tipsPreviewSpan); diff --git a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_state.dart b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_state.dart index 79f52c28..7ad52496 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_state.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_state.dart @@ -2,22 +2,7 @@ import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/tools/dateTool.dart'; -class VideoSlotState { - var lockSetInfoData = LockSetInfoData().obs; - var catEyeConfigData = CatEyeConfig().obs; - - var isCustom = false.obs; //是否自定义 - DateTime dateTime = DateTime.now(); - var startDate = DateTool().getNowDateWithType(6).obs; //默认为当前时间 - var endDate = DateTool().getNowDateWithType(6).obs; //默认为当前时间 - - var recordMode = 0.obs; //录像时段 0全天 1自定义时间 - - var recordStartTime = 0.obs; // 自定义开始时间 - var recordEndTime = 0.obs; // 自定义结束时间 - var recordTime = ''.obs; //有人出现时录像 - var detectionDistance = 0.obs; //人体侦测距离 - var realTimeMode = 0.obs; //实时画面 0发生事件事查看 1实时查看 +class VideoSlotState { //实时画面 0发生事件事查看 1实时查看 VideoSlotState() { Map map = Get.arguments; @@ -28,4 +13,19 @@ class VideoSlotState { catEyeConfigData.value = map['catEyeConfigData']; } } + Rx lockSetInfoData = LockSetInfoData().obs; + Rx catEyeConfigData = CatEyeConfig().obs; + + RxBool isCustom = false.obs; //是否自定义 + DateTime dateTime = DateTime.now(); + RxString startDate = DateTool().getNowDateWithType(6).obs; //默认为当前时间 + RxString endDate = DateTool().getNowDateWithType(6).obs; //默认为当前时间 + + RxInt recordMode = 0.obs; //录像时段 0全天 1自定义时间 + + RxInt recordStartTime = 0.obs; // 自定义开始时间 + RxInt recordEndTime = 0.obs; // 自定义结束时间 + RxString recordTime = ''.obs; //有人出现时录像 + RxInt detectionDistance = 0.obs; //人体侦测距离 + RxInt realTimeMode = 0.obs; } diff --git a/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_logic.dart b/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_logic.dart index 651d844d..aa12ec1f 100755 --- a/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_logic.dart +++ b/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_logic.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../network/api_repository.dart'; @@ -10,35 +11,35 @@ class CheckInCreatCompanyLogic extends BaseGetXController{ CheckInCreatCompanyState state = CheckInCreatCompanyState(); // 设置考勤创建公司 - void setCheckInCreateCompany() async{ + Future setCheckInCreateCompany() async{ if(state.companyNameController.text.length > 50){ - showToast("公司名称不能超过30个字符".tr); + showToast('公司名称不能超过30个字符'.tr); return; } if(state.companyNameController.text.length < 6){ - showToast("公司名称不能小于6个字符".tr); + showToast('公司名称不能小于6个字符'.tr); return; } - var entity = await ApiRepository.to.setCheckInCreateCompanyData( + final LoginEntity entity = await ApiRepository.to.setCheckInCreateCompanyData( lockId: state.lockSetInfoData.value.lockId.toString(), - attendanceType: state.isCustom.value ? "0" :"1", + attendanceType: state.isCustom.value ? '0' :'1', companyName: state.companyNameController.text, workDay: state.weekDays.value, workEndTime: state.endTimeTimestamp.value, workStartTime: state.beginTimeTimestamp.value, ); if(entity.errorCode!.codeIsSuccessful){ - showToast("创建成功".tr, something: (){ + showToast('创建成功'.tr, something: (){ setLockSetGeneralSetting(); }); } } // 设置考勤 - void setLockSetGeneralSetting() async{ - var entity = await ApiRepository.to.setCheckInData( + Future setLockSetGeneralSetting() async{ + final LoginEntity entity = await ApiRepository.to.setCheckInData( lockId: state.lockSetInfoData.value.lockId!, attendance:1, ); @@ -47,9 +48,9 @@ class CheckInCreatCompanyLogic extends BaseGetXController{ state.lockSetInfoData.value.lockSettingInfo!.attendance = 1; eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, "1")); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, '1')); Get.back(); - showToast("设置成功".tr); + showToast('设置成功'.tr); } } diff --git a/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_page.dart b/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_page.dart index ac210b02..71157ec7 100755 --- a/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_page.dart +++ b/lib/main/lockDetail/lockSet/checkInCreatCompany/checkInCreatCompany_page.dart @@ -10,7 +10,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../checkingIn/checkingInSet/checkingInSet_entity.dart'; import 'checkInCreatCompany_logic.dart'; @@ -30,7 +29,7 @@ class _CheckInCreatCompanyPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '创建公司', + barTitle: '创建公司'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index 340ccc1b..3049a26c 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -6,6 +6,8 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:network_info_plus/network_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; +import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../../blue/blue_manage.dart'; @@ -23,19 +25,19 @@ class ConfiguringWifiLogic extends BaseGetXController{ final ConfiguringWifiState state = ConfiguringWifiState(); Future getWifiLockServiceIpAndPort() async { - var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); + final ConfiguringWifiEntity entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); if(entity.errorCode! == 0){ state.configuringWifiEntity.value = entity; } } - void updateNetworkInfo() async{ - var entity = await ApiRepository.to.updateNetworkInfo( + Future updateNetworkInfo() async{ + final LoginEntity entity = await ApiRepository.to.updateNetworkInfo( lockId: state.lockSetInfoData.value.lockId!, network:state.wifiNameController.text, ); if(entity.errorCode!.codeIsSuccessful){ - showToast("配网成功", something:(){ + showToast('配网成功'.tr, something:(){ eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); Get.close(2); }); @@ -45,7 +47,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ // 监听设备返回的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) async { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) async { // WIFI配网结果 if(reply is SenderConfiguringWifiReply) { _replySenderConfiguringWifi(reply); @@ -55,7 +57,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ // WIFI配网结果 Future _replySenderConfiguringWifi(Reply reply) async { - int status = reply.data[5]; + final int status = reply.data[5]; switch(status){ case 0x00: @@ -67,32 +69,32 @@ class ConfiguringWifiLogic extends BaseGetXController{ break; case 0x06: //无权限 - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List publicKeyDataList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = changeStringListToIntList(publicKey!); - var tokenData = reply.data.sublist(7, 10); - var saveStrList = changeIntListToStringList(tokenData); + final List tokenData = reply.data.sublist(7, 10); + final List saveStrList = changeIntListToStringList(tokenData); Storage.setStringList(saveBlueToken, saveStrList); - var serversList = []; + final List serversList = []; for(int i = 0; i itemList = item.serviceIp!.split('.'); + for (String element in itemList) { serversList.add(int.parse(element)); } - double typeDouble = int.parse(item.port!) / 256; - int type1 = typeDouble.toInt(); - int type2 = int.parse(item.port!) % 256; + final double typeDouble = int.parse(item.port!) / 256; + final int type1 = typeDouble.toInt(); + final int type2 = int.parse(item.port!) % 256; serversList.add(type1); serversList.add(type2); } - var uidList = [Storage.getUid().toString()]; + final List uidList = [Storage.getUid().toString()]; IoSenderManage.senderConfiguringWifiCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), userID: await Storage.getUid(), @@ -111,7 +113,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ break; case 0xff: //成功 - showToast("配网失败"); + showToast('配网失败'.tr); break; default: //失败 @@ -122,7 +124,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ // 点击配置wifi Future senderConfiguringWifiAction() async { if(state.wifiNameController.text.isEmpty){ - showToast("请输入wifi名称"); + showToast('请输入wifi名称'.tr); return; } @@ -138,40 +140,40 @@ class ConfiguringWifiLogic extends BaseGetXController{ }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected){ - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List publicKeyDataList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = changeStringListToIntList(publicKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var serversList = []; + final List serversList = []; for(int i = 0; i itemList = item.serviceIp!.split('.'); + for (String element in itemList) { serversList.add(int.parse(element)); } }else{ - List addresses = await InternetAddress.lookup(item.serviceIp!); - var itemList = addresses.first.address.split("."); - for (var element in itemList) { + final List addresses = await InternetAddress.lookup(item.serviceIp!); + final List itemList = addresses.first.address.split('.'); + for (String element in itemList) { serversList.add(int.parse(element)); } } - double typeDouble = int.parse(item.port!) / 256; - int type1 = typeDouble.toInt(); - int type2 = int.parse(item.port!) % 256; + final double typeDouble = int.parse(item.port!) / 256; + final int type1 = typeDouble.toInt(); + final int type2 = int.parse(item.port!) % 256; serversList.add(type1); serversList.add(type2); } - var uidStr = await Storage.getUid(); - var uidList = [uidStr.toString()]; + final String? uidStr = await Storage.getUid(); + final List uidList = [uidStr.toString()]; IoSenderManage.senderConfiguringWifiCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), userID: await Storage.getUid(), @@ -197,9 +199,9 @@ class ConfiguringWifiLogic extends BaseGetXController{ }); } - final _networkInfo = NetworkInfo(); + final NetworkInfo _networkInfo = NetworkInfo(); Future getWifiName() async { - var ssid = ''; + String ssid = ''; ssid = (await _networkInfo.getWifiName())!; ssid = ssid ?? ''; ssid = ssid.replaceAll(r'"', ''); @@ -208,8 +210,8 @@ class ConfiguringWifiLogic extends BaseGetXController{ ///定位权限 Future checkLocationPermission() async { - PermissionStatus value = await locationPermission(); - bool allow = value != PermissionStatus.permanentlyDenied && value != PermissionStatus.denied; + final PermissionStatus value = await locationPermission(); + final bool allow = value != PermissionStatus.permanentlyDenied && value != PermissionStatus.denied; return allow; } @@ -217,11 +219,10 @@ class ConfiguringWifiLogic extends BaseGetXController{ @override void onReady() { - // TODO: implement onReady super.onReady(); if(state.wifiName.value.isEmpty){ - getWifiName().then((value) { + getWifiName().then((String value) { state.wifiNameController.text = value; }); } @@ -232,13 +233,11 @@ class ConfiguringWifiLogic extends BaseGetXController{ @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose _replySubscription.cancel(); super.onClose(); } diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart index 1006645d..6bfec6a6 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../blue/blue_manage.dart'; @@ -11,7 +12,6 @@ import '../../../../../tools/appRouteObserver.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'configuringWifi_logic.dart'; class ConfiguringWifiPage extends StatefulWidget { @@ -22,22 +22,22 @@ class ConfiguringWifiPage extends StatefulWidget { } class _ConfiguringWifiPageState extends State with RouteAware { - final logic = Get.put(ConfiguringWifiLogic()); - final state = Get.find().state; + final ConfiguringWifiLogic logic = Get.put(ConfiguringWifiLogic()); + final ConfiguringWifiState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.configuringWiFi!.tr, + barTitle: '配置WiFi'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ - configuringWifiTFWidget(TranslationLoader.lanKeys!.wifiName!.tr, TranslationLoader.lanKeys!.pleaseEnterWifiName!.tr, state.wifiNameController), + children: [ + configuringWifiTFWidget('WiFi名称'.tr, '请输入WiFi名字'.tr, state.wifiNameController), Container(width: 1.sw, height: 1.h,color: AppColors.mainBackgroundColor), - configuringWifiTFWidget(TranslationLoader.lanKeys!.wifiPassward!.tr, TranslationLoader.lanKeys!.pleaseEnterWifiPwd!.tr, state.wifiPWDController), + configuringWifiTFWidget('WiFi密码'.tr, '请输入WiFi密码'.tr, state.wifiPWDController), SizedBox(height: 50.h,), SubmitBtn(btnName: '确定'.tr, onClick: () { logic.senderConfiguringWifiAction(); @@ -49,11 +49,11 @@ class _ConfiguringWifiPageState extends State with RouteAwa Widget configuringWifiTFWidget( String titleStr, String rightTitle,TextEditingController controller) { return Column( - children: [ + children: [ Container(height: 10.h), CommonItem( leftTitel: titleStr, - rightTitle: "", + rightTitle: '', isHaveRightWidget: true, rightWidget: getTFWidget(rightTitle, controller)), Container(height: 10.h), @@ -67,7 +67,7 @@ class _ConfiguringWifiPageState extends State with RouteAwa height: 65.h, width: 300.w, child: Row( - children: [ + children: [ Expanded( child: TextField( //输入框一行 @@ -112,7 +112,6 @@ class _ConfiguringWifiPageState extends State with RouteAwa @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -121,7 +120,6 @@ class _ConfiguringWifiPageState extends State with RouteAwa @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart index ec9b3161..04a748a4 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart @@ -6,24 +6,24 @@ import '../../lockSet/lockSetInfo_entity.dart'; import 'configuringWifiEntity.dart'; class ConfiguringWifiState{ - var configuringWifiEntity = ConfiguringWifiEntity().obs; - var lockSetInfoData = LockSetInfoData().obs; - var lockBasicInfo = LockBasicInfo().obs; - - var wifiName = "".obs; - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) - - TextEditingController wifiNameController = TextEditingController(); - TextEditingController wifiPWDController = TextEditingController(); ConfiguringWifiState() { var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; lockBasicInfo.value = lockSetInfoData.value.lockBasicInfo!; - if ((map["wifiName"] != null)) { - wifiName.value = map["wifiName"]; + if (map['wifiName'] != null) { + wifiName.value = map['wifiName']; wifiNameController.text = wifiName.value; } } + Rx configuringWifiEntity = ConfiguringWifiEntity().obs; + Rx lockSetInfoData = LockSetInfoData().obs; + Rx lockBasicInfo = LockBasicInfo().obs; + + RxString wifiName = ''.obs; + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) + + TextEditingController wifiNameController = TextEditingController(); + TextEditingController wifiPWDController = TextEditingController(); } \ No newline at end of file diff --git a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_logic.dart index 77456721..d9c00155 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_logic.dart @@ -20,7 +20,7 @@ class WifiListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { if(reply is SenderGetWifiReply) { _replySendGetWifiParameters(reply); } @@ -33,15 +33,13 @@ class WifiListLogic extends BaseGetXController { // 发送获取wifi列表数据解析 Future _replySendGetWifiParameters(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch(status){ case 0x00: //成功 showEasyLoading(); cancelBlueConnetctToastTimer(); - Future.delayed(5.seconds, (){ - dismissEasyLoading(); - }); + Future.delayed(5.seconds, dismissEasyLoading); break; case 0x06: // 需要鉴权 @@ -71,7 +69,7 @@ class WifiListLogic extends BaseGetXController { // 设置自动落锁数据解析 Future _replyGetWifiListParameters(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch(status){ case 0x00: //成功 @@ -82,14 +80,14 @@ class WifiListLogic extends BaseGetXController { if (reply.data[6] > 0) { reply.data.removeRange(0, 7); // 把得到的数据按33位分割成数组 然后塞进一个新的数组里面 - var getList = splitList(reply.data, 33); - var uploadList = >[]; + final List> getList = splitList(reply.data, 33); + final List> uploadList = >[]; for (int i = 0; i < getList.length; i++) { - var indexList = getList[i]; - var indexMap = {}; - var wifiName = indexList.sublist(0, 32); - indexMap["wifiName"] = utf8String(wifiName); - indexMap["rssi"] = (indexList.last - 255).toString(); + final List indexList = getList[i]; + final Map indexMap = {}; + final List wifiName = indexList.sublist(0, 32); + indexMap['wifiName'] = utf8String(wifiName); + indexMap['rssi'] = (indexList.last - 255).toString(); uploadList.add(indexMap); state.wifiNameDataList.value = uploadList; } @@ -115,14 +113,14 @@ class WifiListLogic extends BaseGetXController { }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected){ - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List publicKeyDataList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = changeStringListToIntList(publicKey!); IoSenderManage.getWifiListCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), @@ -145,7 +143,6 @@ class WifiListLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -153,7 +150,6 @@ class WifiListLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); senderGetWifiListWifiAction(); @@ -161,7 +157,6 @@ class WifiListLogic extends BaseGetXController { @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); } diff --git a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart index 9fe68fe1..f750d0d5 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_state.dart'; +import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; @@ -18,49 +20,47 @@ class WifiListPage extends StatefulWidget { } class _WifiListPageState extends State { - final logic = Get.put(WifiListLogic()); - final state = Get.find().state; + final WifiListLogic logic = Get.put(WifiListLogic()); + final WifiListState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "WIFI列表".tr, + barTitle: 'WIFI列表'.tr, haveBack: true, - actionsList: [ + actionsList: [ TextButton( child: Text( - "刷新".tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), + '刷新'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), - onPressed: () { - logic.senderGetWifiListWifiAction(); - }, + onPressed: logic.senderGetWifiListWifiAction, ), ], backgroundColor: AppColors.mainColor), body: Column( - children: [ + children: [ Expanded( child: Obx(() => state.wifiNameDataList.value.isNotEmpty ? ListView.builder( itemCount: state.wifiNameDataList.value.length, - itemBuilder: (c, index) { + itemBuilder: (BuildContext c, int index) { Map wifiNameStr = state.wifiNameDataList.value[index]; - return _messageListItem(wifiNameStr["wifiName"], wifiNameStr["rssi"], () { + return _messageListItem(wifiNameStr['wifiName'], wifiNameStr['rssi'], () { Get.toNamed(Routers.configuringWifiPage, arguments: { 'lockSetInfoData': state.lockSetInfoData.value, - 'wifiName': wifiNameStr["wifiName"], + 'wifiName': wifiNameStr['wifiName'], }); }); }) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 64.h)), ), SubmitBtn( - btnName: "手动配网".tr, + btnName: '手动配网'.tr, fontSize: 28.sp, borderRadius: 20.w, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), onClick: () { - Get.toNamed(Routers.configuringWifiPage, arguments: { + Get.toNamed(Routers.configuringWifiPage, arguments: { 'lockSetInfoData': state.lockSetInfoData.value }); }), @@ -88,16 +88,16 @@ class _WifiListPageState extends State { height: 80.h, margin: EdgeInsets.only(left: 20.w, right: 40.w), child: Column( - children: [ + children: [ SizedBox( height: 79.h, width: 1.sw - 20.w*2, child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Flexible( child: Text( - "$wifiName(${rssi}db)", + '$wifiName(${rssi}db)', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( diff --git a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_state.dart b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_state.dart index 698501f2..ca058136 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_state.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_state.dart @@ -3,16 +3,16 @@ import 'package:get/get.dart'; import '../../lockSet/lockSetInfo_entity.dart'; -class WifiListState{ - final wifiNameDataList = >[].obs; - var lockSetInfoData = LockSetInfoData().obs; - var lockBasicInfo = LockBasicInfo().obs; - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) +class WifiListState{// 0普通状态(可用) 1连接中(不可用) WifiListState() { - var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + final map = Get.arguments; + lockSetInfoData.value = map['lockSetInfoData']; lockBasicInfo.value = lockSetInfoData.value.lockBasicInfo!; } + final RxList> wifiNameDataList = >[].obs; + Rx lockSetInfoData = LockSetInfoData().obs; + Rx lockBasicInfo = LockBasicInfo().obs; + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; } \ No newline at end of file diff --git a/lib/main/lockDetail/lockSet/diagnose/diagnose_logic.dart b/lib/main/lockDetail/lockSet/diagnose/diagnose_logic.dart index 0384652c..d85e3a42 100755 --- a/lib/main/lockDetail/lockSet/diagnose/diagnose_logic.dart +++ b/lib/main/lockDetail/lockSet/diagnose/diagnose_logic.dart @@ -1,4 +1,5 @@ +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../network/api_repository.dart'; @@ -9,36 +10,33 @@ class DiagnoseLogic extends BaseGetXController{ // 诊断 Future setLockDiagnose() async{ - var entity = await ApiRepository.to.setLockDiagnoseData( + final LoginEntity entity = await ApiRepository.to.setLockDiagnoseData( lockId: state.lockSetInfoData.value.lockId.toString(), - electricQuantity:"23", - firmwareRevision:"1.0", // 1-开启、2-关闭; - hardwareRevision:"1.3", // 4 重置键开关 - lockDate:"1689410557000", - modelNum:"123456", - pwdInfo:"123456", - timestamp:"1689410559456000", + electricQuantity:'23', + firmwareRevision:'1.0', // 1-开启、2-关闭; + hardwareRevision:'1.3', // 4 重置键开关 + lockDate:'1689410557000', + modelNum:'123456', + pwdInfo:'123456', + timestamp:'1689410559456000', ); if(entity.errorCode!.codeIsSuccessful){ - showToast("操作成功"); + showToast('操作成功'); } } @override void onReady() { - // TODO: implement onReady super.onReady(); } @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose } } \ No newline at end of file diff --git a/lib/main/lockDetail/lockSet/diagnose/diagnose_page.dart b/lib/main/lockDetail/lockSet/diagnose/diagnose_page.dart index 6aad1dec..ea309568 100755 --- a/lib/main/lockDetail/lockSet/diagnose/diagnose_page.dart +++ b/lib/main/lockDetail/lockSet/diagnose/diagnose_page.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/diagnose/diagnose_state.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'diagnose_logic.dart'; class DiagnosePage extends StatefulWidget { @@ -16,27 +16,27 @@ class DiagnosePage extends StatefulWidget { } class _DiagnosePageState extends State { - final logic = Get.put(DiagnoseLogic()); - final state = Get.find().state; + final DiagnoseLogic logic = Get.put(DiagnoseLogic()); + final DiagnoseState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.diagnose!.tr, + barTitle: '诊断'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( padding: EdgeInsets.all(30.w), child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - TranslationLoader.lanKeys!.diagnoseTip!.tr, + '诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), )), @@ -46,7 +46,7 @@ class _DiagnosePageState extends State { height: 40.h, ), SubmitBtn( - btnName: TranslationLoader.lanKeys!.uploading!.tr, + btnName: '上传'.tr, borderRadius: 20.w, fontSize: 32.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), diff --git a/lib/main/lockDetail/lockSet/doorMagnetic/addDoorMagnetic/addDoorMagnetic_page.dart b/lib/main/lockDetail/lockSet/doorMagnetic/addDoorMagnetic/addDoorMagnetic_page.dart index f6069b4e..ef8cc01d 100755 --- a/lib/main/lockDetail/lockSet/doorMagnetic/addDoorMagnetic/addDoorMagnetic_page.dart +++ b/lib/main/lockDetail/lockSet/doorMagnetic/addDoorMagnetic/addDoorMagnetic_page.dart @@ -6,7 +6,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class AddDoorMagneticPage extends StatefulWidget { const AddDoorMagneticPage({Key? key}) : super(key: key); @@ -38,8 +37,7 @@ class _AddDoorMagneticPageState extends State { children: [ Expanded( child: Text( - TranslationLoader - .lanKeys!.pressAndHoldTheResetButtonTwoSeconds!.tr, + '长按重置键2秒'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), @@ -62,7 +60,7 @@ class _AddDoorMagneticPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - TranslationLoader.lanKeys!.whenScreenFlashesClickNext!.tr, + '当屏幕闪烁时,点击下一步'.tr, style: TextStyle(fontSize: 22.sp), ), ], @@ -73,7 +71,7 @@ class _AddDoorMagneticPageState extends State { Container( margin: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () { Navigator.pushNamed(context, Routers.nearbyDoorMagneticPage); }), diff --git a/lib/main/lockDetail/lockSet/doorMagnetic/doorMagneticList/doorMagnetic_page.dart b/lib/main/lockDetail/lockSet/doorMagnetic/doorMagneticList/doorMagnetic_page.dart index 7f215ddd..e9130bc1 100755 --- a/lib/main/lockDetail/lockSet/doorMagnetic/doorMagneticList/doorMagnetic_page.dart +++ b/lib/main/lockDetail/lockSet/doorMagnetic/doorMagneticList/doorMagnetic_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -7,7 +8,6 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../baseWidget.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class DoorMagneticPage extends StatefulWidget { const DoorMagneticPage({Key? key}) : super(key: key); @@ -22,7 +22,7 @@ class _DoorMagneticPageState extends State with BaseWidget { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.doorMagnetic!.tr, + barTitle: '门磁'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -35,7 +35,7 @@ class _DoorMagneticPageState extends State with BaseWidget { children: [ Expanded( child: Text( - TranslationLoader.lanKeys!.doorMagneticListTopTip!.tr, + '通过门磁可查询门的开、关状态。每把锁咳添加一个门磁'.tr, style: TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w500), )), @@ -120,7 +120,7 @@ class _DoorMagneticPageState extends State with BaseWidget { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - "2023.6.21 11.15", + '2023.6.21 11.15', style: TextStyle( fontSize: 28.sp, fontWeight: FontWeight.w500), ), diff --git a/lib/main/lockDetail/lockSet/doorMagnetic/nearbyDoorMagnetic/nearbyDoorMagnetic_page.dart b/lib/main/lockDetail/lockSet/doorMagnetic/nearbyDoorMagnetic/nearbyDoorMagnetic_page.dart index f964823e..01c016da 100755 --- a/lib/main/lockDetail/lockSet/doorMagnetic/nearbyDoorMagnetic/nearbyDoorMagnetic_page.dart +++ b/lib/main/lockDetail/lockSet/doorMagnetic/nearbyDoorMagnetic/nearbyDoorMagnetic_page.dart @@ -5,7 +5,6 @@ import 'package:star_lock/tools/noData.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class NearbyDoorMagneticPage extends StatefulWidget { const NearbyDoorMagneticPage({Key? key}) : super(key: key); @@ -21,7 +20,7 @@ class _NearbyDoorMagneticPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.nearbyEquipment!.tr, + barTitle: '附近的设备'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: dataList.isEmpty @@ -29,7 +28,7 @@ class _NearbyDoorMagneticPageState extends State { : ListView.builder( itemCount: dataList.length, itemBuilder: (c, index) { - return nearbyLockItem('images/icon_lock.png', "MCBN01-ea9240", + return nearbyLockItem('images/icon_lock.png', '', () { // Navigator.pushNamed(context, Routers.saveLockPage); }); diff --git a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart index 0d1b1b44..10b64978 100755 --- a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart +++ b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; diff --git a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart index 8ebd87bc..7a8ebaef 100755 --- a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart +++ b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -12,7 +11,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/pickers/pickers.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class FaceUnlockPage extends StatefulWidget { const FaceUnlockPage({Key? key}) : super(key: key); @@ -30,15 +28,15 @@ class _FaceUnlockPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.faceUnlocksSet!.tr, + barTitle: '面容开锁设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), - body: Obx(() => Column( + body: Obx(() => ListView( children: [ Container( margin: EdgeInsets.only(left: 20.w), child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.faceUnlocks!.tr, + leftTitel: '面容开锁'.tr, rightTitle: '', allHeight: 70.h, isHaveLine: true, @@ -47,7 +45,7 @@ class _FaceUnlockPageState extends State { width: 60.w, height: 50.h, child: _switch(1))), ), _buildSubTitleItem( - TranslationLoader.lanKeys!.sensingDistance!.tr, + '感应距离'.tr, // TranslationLoader.lanKeys!.sensingDistanceTip!.tr, logic.getSensingDistanceString(), state.senseDistance.value, @@ -56,14 +54,18 @@ class _FaceUnlockPageState extends State { }), SizedBox(height: 30.h), _buildSubTitleItem( - TranslationLoader.lanKeys!.preventWrongOpening!.tr, + '防误开'.tr, state.antiMisoperation.value == 0 - ? TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr - :'防误开已打开,开锁后'.tr + state.antiMisoperation.value.toString() + '秒内不可使用面容开锁'.tr, + ? '防误开已关闭,关门后仍可使用面容开锁'.tr + : '防误开已打开,开锁后'.tr + + state.antiMisoperation.value.toString() + + '秒内不可使用面容开锁'.tr, // state.antiMisoperation.value == 0 ? '关闭' : '${state.antiMisoperation.value}' + '秒'.tr, state.faceOn.value, () { - Pickers.showSinglePicker(Get.context!, data: state.antiMisoperationStrList.value, onConfirm: (var data, int position) { + Pickers.showSinglePicker(Get.context!, + data: state.antiMisoperationStrList.value, + onConfirm: (var data, int position) { AppLog.log('data = $data, position = $position'); state.antiMisoperation.value = position; state.setType.value = 2; @@ -80,7 +82,8 @@ class _FaceUnlockPageState extends State { ))); } - Widget _buildSubTitleItem(String leftStr, String subTitle, String rightStr, bool isAble, Function()? action) { + Widget _buildSubTitleItem(String leftStr, String subTitle, String rightStr, + bool isAble, Function()? action) { return GestureDetector( onTap: isAble ? action : null, child: Container( @@ -100,7 +103,11 @@ class _FaceUnlockPageState extends State { alignment: Alignment.centerLeft, child: Text( leftStr, - style: TextStyle(fontSize: 24.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor), + style: TextStyle( + fontSize: 24.sp, + color: isAble + ? Colors.black + : AppColors.placeholderTextColor), ), ), SizedBox( @@ -110,8 +117,6 @@ class _FaceUnlockPageState extends State { alignment: Alignment.centerLeft, child: Text( subTitle, - maxLines: 2, - overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 20.sp, color: AppColors.btnDisableColor), ), @@ -124,7 +129,9 @@ class _FaceUnlockPageState extends State { Text( rightStr, style: TextStyle( - fontSize: 22.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor), + fontSize: 22.sp, + color: + isAble ? Colors.black : AppColors.placeholderTextColor), ), SizedBox( width: 10.w, @@ -160,7 +167,8 @@ class _FaceUnlockPageState extends State { activeColor: CupertinoColors.activeBlue, trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, - value: state.faceOn.value, // getIndex == 1 ? state.faceOn.value : state.autoBright.value, + value: state.faceOn.value, + // getIndex == 1 ? state.faceOn.value : state.autoBright.value, onChanged: (bool value) { if (getIndex == 1) { //设置面容开锁开关 @@ -182,8 +190,7 @@ class _FaceUnlockPageState extends State { topTitle: '', items: bottomItemList, chooseCallback: (int value) { - state.senseDistance.value = - state.senseDistanceList.value[value]; + state.senseDistance.value = state.senseDistanceList.value[value]; state.setType.value = 1; logic.sendFaceUnlock(); }, diff --git a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart index 3dc43c85..4af10227 100755 --- a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart +++ b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart @@ -1,14 +1,10 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; -import '../../../../translations/trans_lib.dart'; - class FaceUnlockState { - FaceUnlockState() { Map map = Get.arguments; if (map['lockSetInfoData'] != null) { @@ -16,25 +12,26 @@ class FaceUnlockState { faceOn.value = lockSetInfoData.value.lockSettingInfo!.faceSwitch != 0; // autoBright.value = lockSetInfoData.value.lockSettingInfo!.faceAutoLightScreen != 0; - switch(lockSetInfoData.value.lockSettingInfo!.faceInductionDistance!){ + switch (lockSetInfoData.value.lockSettingInfo!.faceInductionDistance!) { case 1: - senseDistance.value = '近距离'; + senseDistance.value = '近距离'.tr; break; case 2: - senseDistance.value = '中距离'; + senseDistance.value = '中距离'.tr; break; case 3: - senseDistance.value = '远距离'; + senseDistance.value = '远距离'.tr; break; case 0: - senseDistance.value = '关闭'; + senseDistance.value = '关闭'.tr; break; } - antiMisoperation.value = lockSetInfoData.value.lockSettingInfo!.faceEnErrUnlock!; + antiMisoperation.value = + lockSetInfoData.value.lockSettingInfo!.faceEnErrUnlock!; } - for(int i = 0; i < 31; i++) { + for (int i = 0; i < 31; i++) { antiMisoperationStrList.add(i.toString() + '秒'.tr); } } @@ -43,14 +40,10 @@ class FaceUnlockState { // RxBool isCheck = false.obs; RxBool faceOn = false.obs; //面容开锁 // RxBool autoBright = false.obs; //自动亮屏 - RxString senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; //感应距离 + RxString senseDistance = '远距离'.tr.obs; //感应距离 RxInt antiMisoperation = 0.obs; //防误开 - RxList senseDistanceList = [ - '远距离'.tr, - '中距离'.tr, - '近距离'.tr, - '关闭'.tr - ].obs; + RxList senseDistanceList = + ['远距离'.tr, '中距离'.tr, '近距离'.tr, '关闭'.tr].obs; // RxList antiMisoperationList = [0, 5, 10, 15, 30, 60].obs; RxList antiMisoperationStrList = [].obs; @@ -64,12 +57,8 @@ class FaceUnlockState { TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); late InlineSpan tipsPreviewSpan = TextSpan(children: [ - TextSpan( - text: '${TranslationLoader.lanKeys!.addAndUseFaceWhenUnlocking!.tr}:\n', - style: titleStyle), - TextSpan( - text: TranslationLoader.lanKeys!.addAndUseFaceWhenUnlockingTip!.tr, - style: subTipsStyle), + TextSpan(text: '${"添加和使用面容开锁时".tr}:\n', style: titleStyle), + TextSpan(text: '添加和使用面容开锁时提示'.tr, style: subTipsStyle), ]); RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 diff --git a/lib/main/lockDetail/lockSet/importOtherLockData/ImportOtherLockData_page.dart b/lib/main/lockDetail/lockSet/importOtherLockData/ImportOtherLockData_page.dart index 124ffd23..0f7ebedc 100755 --- a/lib/main/lockDetail/lockSet/importOtherLockData/ImportOtherLockData_page.dart +++ b/lib/main/lockDetail/lockSet/importOtherLockData/ImportOtherLockData_page.dart @@ -5,7 +5,6 @@ import 'package:get/get.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class ImportOtherLockDataPage extends StatefulWidget { const ImportOtherLockDataPage({Key? key}) : super(key: key); @@ -21,7 +20,7 @@ class _ImportOtherLockDataPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.importOtherLockData!.tr, + barTitle: '导入其他锁数据'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -42,7 +41,7 @@ class _ImportOtherLockDataPageState extends State { Padding( padding: EdgeInsets.only(top: 30.w, left: 20.w, right: 20.w), child: Text( - TranslationLoader.lanKeys!.importOtherLockDataTip!.tr, + '请选择要从哪把锁导入'.tr, style: TextStyle(fontSize: 22.sp), )), _searchWidget(), @@ -105,8 +104,8 @@ class _ImportOtherLockDataPageState extends State { return ListView.separated( itemCount: 2, itemBuilder: (c, index) { - return _electronicKeyItem('images/icon_round_unSelect.png', "张三", - "2023.6.21 11.15", "2023.6.21 11.15", index,() { + return _electronicKeyItem('images/icon_round_unSelect.png', '', + '2023.6.21 11.15', '2023.6.21 11.15', index,() { // Navigator.pushNamed(context, Routers.electronicKeyDetailPage); }); }, @@ -144,7 +143,7 @@ class _ImportOtherLockDataPageState extends State { width: 10.w, ), Text( - '锁${index+1}', + '${'锁'.tr}${index+1}', style: TextStyle( color: AppColors.blackColor, fontSize: 22.sp, diff --git a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart index 4de0b674..ebb57c15 100755 --- a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart +++ b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart @@ -3,13 +3,14 @@ import 'package:star_lock/main/lockDetail/lockSet/liveVideo/liveVideo_state.dart import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; class LiveVideoLogic extends BaseGetXController { final LiveVideoState state = LiveVideoState(); // 获取锁设置信息 Future getLockSettingInfoData() async { - LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( + final LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( lockId: state.lockSetInfoData.value.lockId.toString(), ); if (entity.errorCode!.codeIsSuccessful) { @@ -34,13 +35,13 @@ class LiveVideoLogic extends BaseGetXController { } //设置猫眼工作模式 - void updateCatEyeModeConfig() async { - var entity = await ApiRepository.to.updateCatEyeModeConfig( + Future updateCatEyeModeConfig() async { + final VersionUndateEntity entity = await ApiRepository.to.updateCatEyeModeConfig( lockId: state.lockSetInfoData.value.lockId ?? 0, catEyeConfig: [ - { + { 'catEyeMode': 4, - 'catEyeModeConfig': { + 'catEyeModeConfig': { 'recordMode': state.catEyeConfigData.value.catEyeModeConfig!.recordMode, 'recordStartTime': diff --git a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart index 3dc5fa77..74e91a8e 100755 --- a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart +++ b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart @@ -1,8 +1,9 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart'; -import 'package:star_lock/translations/trans_lib.dart'; +import 'package:star_lock/main/lockDetail/lockSet/liveVideo/liveVideo_state.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; @@ -15,8 +16,8 @@ class LiveVideoPage extends StatefulWidget { } class _LiveVideoPageState extends State { - final logic = Get.put(LiveVideoLogic()); - final state = Get.find().state; + final LiveVideoLogic logic = Get.put(LiveVideoLogic()); + final LiveVideoState state = Get.find().state; @override initState() { @@ -35,10 +36,10 @@ class _LiveVideoPageState extends State { Navigator.pop(context, true); }, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.save!.tr, + '保存'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { @@ -52,7 +53,7 @@ class _LiveVideoPageState extends State { ], ), body: Obx(() => Column( - children: [ + children: [ SizedBox( height: 80.h, ), @@ -94,7 +95,7 @@ class _LiveVideoPageState extends State { padding: EdgeInsets.only( left: 20.w, top: 30.h, bottom: 30.h, right: 20.w), child: Row( - children: [ + children: [ clickIndex == 0 ? (state.isLiveView.value == false ? Image.asset( @@ -151,7 +152,7 @@ class _LiveVideoPageState extends State { : AppColors.placeholderTextColor, fontSize: 20.sp); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ + late InlineSpan tipsPreviewSpan = TextSpan(children: [ TextSpan(text: titleStr, style: titleStyle), TextSpan(text: subTitle, style: subTipsStyle), ]); diff --git a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_state.dart b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_state.dart index fedd25d5..f35330d2 100755 --- a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_state.dart +++ b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_state.dart @@ -2,11 +2,6 @@ import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; class LiveVideoState { - var isLiveView = false.obs; //是否实时查看 - var realTimeMode = 0.obs; //实时画面 0发生事件事查看 1实时查看 - var lockSetInfoData = LockSetInfoData().obs; - var catEyeConfigData = CatEyeConfig().obs; - LiveVideoState() { Map map = Get.arguments; if (map['lockSetInfoData'] != null) { @@ -16,4 +11,8 @@ class LiveVideoState { catEyeConfigData.value = map['catEyeConfigData']; } } + RxBool isLiveView = false.obs; //是否实时查看 + RxInt realTimeMode = 0.obs; //实时画面 0发生事件事查看 1实时查看 + Rx lockSetInfoData = LockSetInfoData().obs; + Rx catEyeConfigData = CatEyeConfig().obs; } diff --git a/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart b/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart index c820e949..190df466 100755 --- a/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart +++ b/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:convert'; import 'dart:io'; diff --git a/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_page.dart b/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_page.dart index f9895168..30070575 100755 --- a/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_page.dart +++ b/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_page.dart @@ -1,12 +1,11 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:star_lock/tools/commonDataManage.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'lockEscalation_logic.dart'; class LockEscalationPage extends StatefulWidget { @@ -25,7 +24,7 @@ class _LockEscalationPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockEscalation!.tr, + barTitle: '锁升级'.tr, haveBack: true, backgroundColor: AppColors.mainColor, backAction: logic.getBack, @@ -110,7 +109,7 @@ class _LockEscalationPageState extends State { Obx(() { if (logic.state.isShowUpDataBtn.value) { return Text( - TranslationLoader.lanKeys!.haveNewVersion!.tr + + '有新版本'.tr + logic.state.showNewVersion.value, style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), @@ -130,7 +129,7 @@ class _LockEscalationPageState extends State { ), Obx(() { return Text( - '${TranslationLoader.lanKeys!.currentVersion!.tr}:${logic.state.showVersion.value}', + '${'当前版本'.tr}:${logic.state.showVersion.value}', style: TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor), ); @@ -143,7 +142,7 @@ class _LockEscalationPageState extends State { logic.state.isShowUpDataBtn.value; return show ? SubmitBtn( - btnName: TranslationLoader.lanKeys!.upgrade!.tr, + btnName: '升级'.tr, onClick: () { logic.downloadTheFile(); }) @@ -214,7 +213,7 @@ class _LockEscalationPageState extends State { mainAxisSize: MainAxisSize.min, children: [ Text( - '固件传输中', + '固件传输中'.tr, style: TextStyle( color: AppColors.mainColor, fontSize: 18.sp, diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart b/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart index 31297bc2..4e01541b 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart @@ -1,8 +1,4 @@ class LockSetInfoEntity { - int? errorCode; - String? description; - String? errorMsg; - LockSetInfoData? data; LockSetInfoEntity( {this.errorCode, this.description, this.errorMsg, this.data}); @@ -13,6 +9,10 @@ class LockSetInfoEntity { errorMsg = json['errorMsg']; data = json['data'] != null ? LockSetInfoData.fromJson(json['data']) : null; } + int? errorCode; + String? description; + String? errorMsg; + LockSetInfoData? data; Map toJson() { final Map data = {}; @@ -27,11 +27,6 @@ class LockSetInfoEntity { } class LockSetInfoData { - int? lockId; - LockStatus? lockStatus; - LockFeature? lockFeature; - LockBasicInfo? lockBasicInfo; - LockSettingInfo? lockSettingInfo; LockSetInfoData( {this.lockId, @@ -55,6 +50,11 @@ class LockSetInfoData { ? LockSettingInfo.fromJson(json['lockSettingInfo']) : null; } + int? lockId; + LockStatus? lockStatus; + LockFeature? lockFeature; + LockBasicInfo? lockBasicInfo; + LockSettingInfo? lockSettingInfo; Map toJson() { final Map data = {}; @@ -76,13 +76,13 @@ class LockSetInfoData { } class LockStatus { - int? roomStatus; LockStatus({this.roomStatus}); LockStatus.fromJson(Map json) { roomStatus = json['roomStatus']; } + int? roomStatus; Map toJson() { final Map data = {}; @@ -91,61 +91,7 @@ class LockStatus { } } -class LockFeature { - int? password; - int? icCard; - int? fingerprint; - int? fingerVein; - int? palmVein; - int? d3Face; - int? qrCode; - int? bluetoothRemoteControl; - int? wirelessKey; - int? gatewayUnlock; - int? lockCommand; - int? firmwareUpgrade; - int? passwordIssue; - int? cardIssue; - int? fingerprintIssue; - int? fingerVeinIssue; - int? palmVeinIssue; - int? d3FaceIssue; - int? lockFreeze; - int? readAdminPassword; - int? passwordManagement; - int? passwordWithDelete; - int? remoteUnlock; - int? autoLock; - int? antiPrySwitch; - int? resetSwitch; - int? lockSwitch; - int? lockSound; - int? languageSetting; - int? realTimeClock; - int? wifi; - int? videoIntercom; - int? cyclePassword; - int? cycleFingerprintCard; - int? doubleAuthentication; - int? openDirection; - int? proximitySensing; - int? doorStatus; - int? wiredDoorMagnet; - int? wirelessDoorMagnet; - int? doorNotClosedAlarm; - int? unlockReminder; - int? wirelessKeyboard; - int? lightingTime; - int? passageMode; - int? isSupportCatEye; - int? hotelLockCardSystem; - int? appUnlockOnline; - int? bluetoothBroadcast; - int? attendance; - int? motorTorsion; - int? stayWarn; - int? abnormalWarn; - int? isSupportBackupBattery; //人脸开关 0:关闭 1:开启 +class LockFeature { //人脸开关 0:关闭 1:开启 LockFeature({ this.password, @@ -260,6 +206,60 @@ class LockFeature { abnormalWarn = json['abnormalWarn']; isSupportBackupBattery = json['isSupportBackupBattery']; } + int? password; + int? icCard; + int? fingerprint; + int? fingerVein; + int? palmVein; + int? d3Face; + int? qrCode; + int? bluetoothRemoteControl; + int? wirelessKey; + int? gatewayUnlock; + int? lockCommand; + int? firmwareUpgrade; + int? passwordIssue; + int? cardIssue; + int? fingerprintIssue; + int? fingerVeinIssue; + int? palmVeinIssue; + int? d3FaceIssue; + int? lockFreeze; + int? readAdminPassword; + int? passwordManagement; + int? passwordWithDelete; + int? remoteUnlock; + int? autoLock; + int? antiPrySwitch; + int? resetSwitch; + int? lockSwitch; + int? lockSound; + int? languageSetting; + int? realTimeClock; + int? wifi; + int? videoIntercom; + int? cyclePassword; + int? cycleFingerprintCard; + int? doubleAuthentication; + int? openDirection; + int? proximitySensing; + int? doorStatus; + int? wiredDoorMagnet; + int? wirelessDoorMagnet; + int? doorNotClosedAlarm; + int? unlockReminder; + int? wirelessKeyboard; + int? lightingTime; + int? passageMode; + int? isSupportCatEye; + int? hotelLockCardSystem; + int? appUnlockOnline; + int? bluetoothBroadcast; + int? attendance; + int? motorTorsion; + int? stayWarn; + int? abnormalWarn; + int? isSupportBackupBattery; Map toJson() { final Map data = {}; @@ -322,31 +322,6 @@ class LockFeature { } class LockBasicInfo { - int? lockId; - int? electricQuantityDate; - int? keyId; - String? model; - int? electricQuantity; - int? electricQuantityStandby; - int? indate; - int? isLockOwner; - String? lockAlias; - String? lockName; - int? groupId; - String? groupName; - List? groupData; - String? adminPwd; - int? keyType; - int? startDate; - int? endDate; - String? mac; - int? keyRight; - int? senderUserId; - int? lockUserNo; - List? weekDays; - String? address; - String? network; - String? vendor; LockBasicInfo( {this.lockId, @@ -407,6 +382,31 @@ class LockBasicInfo { network = json['network']; vendor = json['vendor']; } + int? lockId; + int? electricQuantityDate; + int? keyId; + String? model; + int? electricQuantity; + int? electricQuantityStandby; + int? indate; + int? isLockOwner; + String? lockAlias; + String? lockName; + int? groupId; + String? groupName; + List? groupData; + String? adminPwd; + int? keyType; + int? startDate; + int? endDate; + String? mac; + int? keyRight; + int? senderUserId; + int? lockUserNo; + List? weekDays; + String? address; + String? network; + String? vendor; Map toJson() { final Map data = {}; @@ -442,8 +442,6 @@ class LockBasicInfo { } class GroupData { - int? id; - String? name; GroupData({this.id, this.name}); @@ -451,6 +449,8 @@ class GroupData { id = json['id']; name = json['name']; } + int? id; + String? name; Map toJson() { final Map data = {}; @@ -460,55 +460,7 @@ class GroupData { } } -class LockSettingInfo { - int? remoteUnlock; - int? autoLock; - int? autoLockSecond; - int? antiPrySwitch; - int? resetSwitch; - int? lockSwitch; - int? lockSound; - int? lockSoundVolume; - int? languageSettingLang; - int? openDirectionValue; - int? doorNotClosedAlarm; - int? unlockReminder; - int? lightingTime; - int? lightingSecond; - int? passageMode; - List? passageModeConfig; - int? attendance; - int? appUnlockOnline; - int? bluetoothBroadcast; - String? adminPwd; - int? unlockReminderPush; - String? languageSettingLangText; - int? motorTorsion; - int? stayWarn; - int? abnormalWarn; - List? catEyeConfig; - int? faceSwitch; //人脸开关 0:关闭 1:开启 - int? faceAutoLightScreen; //人脸自动亮屏开关 0:关闭 1:开启 - int? faceInductionDistance; //人脸感应距离 - // int? faceAntiMistakeOpen; //人脸防误开门 0:关闭 1:开启 - int? autoLightScreen; //猫眼-自动亮屏开关 0:关闭 1:开启 - int? autoLightScreenTime; //猫眼-自动亮屏时间 - int? faceEnErrUnlock; // 防误开 - - // List? catEyeConfigList; - // int? faceSwitch; //人脸开关 0:关闭 1:开启 - // int? faceAutoLightScreen; //人脸自动亮屏开关 0:关闭 1:开启 - // int? faceInductionDistance; //人脸感应距离 - // int? faceAntiMistakeOpen; //人脸防误开门 0:关闭 1:开启 - // int? autoLightScreen; //猫眼-自动亮屏开关 0:关闭 1:开启 - // int? autoLightScreenTime; //猫眼-自动亮屏时间 - // int? dayNotOpenDoorSwitch; //N天未开门开关 (启用/禁用) - // int? dayNotOpenDoorValue; //N天未开门值 - // int? doorNotCloseSwitch; //门未关闭开关 (启用/禁用) - // int? lowElecNoticeSwitch; //低电量开关 (启用/禁用) - // int? doorbellNoticeSwitch; //有人按门铃开关 (启用/禁用) - // int? someoneAtDoorSwitch; //有人出现在门口开关 (启用/禁用)// - +class LockSettingInfo { // 防误开 LockSettingInfo({ this.remoteUnlock, this.autoLock, @@ -539,16 +491,9 @@ class LockSettingInfo { this.faceSwitch, this.faceAutoLightScreen, this.faceInductionDistance, - // this.faceAntiMistakeOpen, this.autoLightScreen, this.autoLightScreenTime, this.faceEnErrUnlock, - // this.dayNotOpenDoorSwitch, - // this.dayNotOpenDoorValue, - // this.doorNotCloseSwitch, - // this.lowElecNoticeSwitch, - // this.doorbellNoticeSwitch, - // this.someoneAtDoorSwitch, }); LockSettingInfo.fromJson(Map json) { @@ -591,18 +536,43 @@ class LockSettingInfo { faceSwitch = json['faceSwitch']; faceAutoLightScreen = json['faceAutoLightScreen']; faceInductionDistance = json['faceInductionDistance']; - // faceAntiMistakeOpen = json['faceAntiMistakeOpen']; autoLightScreen = json['autoLightScreen']; autoLightScreenTime = json['autoLightScreenTime']; faceEnErrUnlock = json['faceEnErrUnlock']; - - // dayNotOpenDoorSwitch = json['dayNotOpenDoorSwitch']; - // dayNotOpenDoorValue = json['dayNotOpenDoorValue']; - // doorNotCloseSwitch = json['doorNotCloseSwitch']; - // lowElecNoticeSwitch = json['lowElecNoticeSwitch']; - // doorbellNoticeSwitch = json['doorbellNoticeSwitch']; - // someoneAtDoorSwitch = json['someoneAtDoorSwitch']; } + int? remoteUnlock; + int? autoLock; + int? autoLockSecond; + int? antiPrySwitch; + int? resetSwitch; + int? lockSwitch; + int? lockSound; + int? lockSoundVolume; + int? languageSettingLang; + int? openDirectionValue; + int? doorNotClosedAlarm; + int? unlockReminder; + int? lightingTime; + int? lightingSecond; + int? passageMode; + List? passageModeConfig; + int? attendance; + int? appUnlockOnline; + int? bluetoothBroadcast; + String? adminPwd; + int? unlockReminderPush; + String? languageSettingLangText; + int? motorTorsion; + int? stayWarn; + int? abnormalWarn; + List? catEyeConfig; + int? faceSwitch; //人脸开关 0:关闭 1:开启 + int? faceAutoLightScreen; //人脸自动亮屏开关 0:关闭 1:开启 + int? faceInductionDistance; //人脸感应距离 + // int? faceAntiMistakeOpen; //人脸防误开门 0:关闭 1:开启 + int? autoLightScreen; //猫眼-自动亮屏开关 0:关闭 1:开启 + int? autoLightScreenTime; //猫眼-自动亮屏时间 + int? faceEnErrUnlock; Map toJson() { final Map data = {}; @@ -640,27 +610,15 @@ class LockSettingInfo { data['faceSwitch'] = faceSwitch; data['faceAutoLightScreen'] = faceAutoLightScreen; data['faceInductionDistance'] = faceInductionDistance; - // data['faceAntiMistakeOpen'] = faceAntiMistakeOpen; data['autoLightScreen'] = autoLightScreen; data['autoLightScreenTime'] = autoLightScreenTime; data['faceEnErrUnlock'] = faceEnErrUnlock; - // data['dayNotOpenDoorSwitch'] = dayNotOpenDoorSwitch; - // data['dayNotOpenDoorValue'] = dayNotOpenDoorValue; - // data['doorNotCloseSwitch'] = doorNotCloseSwitch; - // data['lowElecNoticeSwitch'] = lowElecNoticeSwitch; - // data['doorbellNoticeSwitch'] = doorbellNoticeSwitch; - // data['someoneAtDoorSwitch'] = someoneAtDoorSwitch; - return data; } } class PassageModeConfig { - int? startDate; - int? endDate; - List? weekDays; - int? isAllDay; PassageModeConfig( {this.startDate, this.endDate, this.weekDays, this.isAllDay}); @@ -671,6 +629,10 @@ class PassageModeConfig { weekDays = json['weekDays'].cast(); isAllDay = json['isAllDay']; } + int? startDate; + int? endDate; + List? weekDays; + int? isAllDay; Map toJson() { final Map data = {}; @@ -683,8 +645,6 @@ class PassageModeConfig { } class CatEyeConfig { - int? catEyeMode; //1省电模式 2逗留抓拍模式 3实时监控模式 4自定义模式(自定义模式下存在其他设置参数) - CatEyeModeConfig? catEyeModeConfig; CatEyeConfig({this.catEyeMode, this.catEyeModeConfig}); @@ -694,6 +654,8 @@ class CatEyeConfig { ? CatEyeModeConfig.fromJson(json['catEyeModeConfig']) : null; } + int? catEyeMode; //1省电模式 2逗留抓拍模式 3实时监控模式 4自定义模式(自定义模式下存在其他设置参数) + CatEyeModeConfig? catEyeModeConfig; Map toJson() { final Map data = {}; @@ -705,13 +667,7 @@ class CatEyeConfig { } } -class CatEyeModeConfig { - int? recordMode; //录像时段 0全天 1自定义时间 - String? recordTime; //有人出现时录像 - int? realTimeMode; //实时画面 0发生事件事查看 1实时查看 - int? recordEndTime; //录像时段自定义时间-结束时间 - int? recordStartTime; //录像时段自定义时间-开始时间 - String? detectionDistance; //人体侦测距离 +class CatEyeModeConfig { //人体侦测距离 CatEyeModeConfig( {this.recordMode, @@ -733,6 +689,12 @@ class CatEyeModeConfig { recordStartTime = json['recordStartTime']; detectionDistance = json['detectionDistance']; } + int? recordMode; //录像时段 0全天 1自定义时间 + String? recordTime; //有人出现时录像 + int? realTimeMode; //实时画面 0发生事件事查看 1实时查看 + int? recordEndTime; //录像时段自定义时间-结束时间 + int? recordStartTime; //录像时段自定义时间-开始时间 + String? detectionDistance; Map toJson() { final Map data = {}; diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart b/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart index 2a38d64c..1f33e666 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart @@ -5,7 +5,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; -import 'package:star_lock/tools/showTipView.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_factoryDataReset.dart'; @@ -19,6 +19,7 @@ import '../../../../blue/sender_manage.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; import '../../../../tools/commonDataManage.dart'; +import '../../../../tools/dateTool.dart'; import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/storage.dart'; import 'checkingInInfoData_entity.dart'; @@ -124,11 +125,15 @@ class LockSetLogic extends BaseGetXController { break; case 0x06: //无权限 - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - final List? publicKey = await Storage.getStringList(saveBluePublicKey); - final List publicKeyDataList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = + changeStringListToIntList(publicKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); @@ -287,7 +292,17 @@ class LockSetLogic extends BaseGetXController { showEasyLoading(); showBlueConnetctToastTimer( isShowBlueConnetctToast: false, - action: () { + action: () async { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('delet_lock', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'delet_type': 'lock', + 'delet_lock_result': '删除锁超时', + }); + dismissEasyLoading(); showDeletAlertTipDialog(); }); @@ -316,6 +331,16 @@ class LockSetLogic extends BaseGetXController { privateKey: getPrivateKeyList, token: getTokenList); } else if (connectionState == BluetoothConnectionState.disconnected) { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('delet_lock', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'delet_type': 'lock', + 'delet_lock_result': '删除锁断开', + }); + dismissEasyLoading(); cancelBlueConnetctToastTimer(); if (state.ifCurrentScreen.value == true) { @@ -353,7 +378,7 @@ class LockSetLogic extends BaseGetXController { // 设置支持功能(带参数) Future sendBurglarAlarm(int type) async { - if(state.sureBtnState.value == 1){ + if (state.sureBtnState.value == 1) { return; } state.sureBtnState.value = 1; @@ -524,7 +549,7 @@ class LockSetLogic extends BaseGetXController { void showDeletAlertTipDialog({String? showContent = ''}) { final String content = showContent!.isEmpty - ? "${"删除设备失败,请确保在设备附近,设备未被连接,设备已打开".tr}${BlueManage().connectDeviceName!.contains("T9A") == true ? "。如果是全自动锁,请使屏幕变亮".tr : ""}" + ? "${"删除设备失败,请确保在设备附近,设备未被连接,设备已打开".tr}。${BlueManage().connectDeviceName!.contains("T9A") == true ? "如果是全自动锁,请使屏幕变亮".tr : ""}" : showContent; state.showTipView.showSureAlertDialog(content); } @@ -532,11 +557,13 @@ class LockSetLogic extends BaseGetXController { /// 以下为删除逻辑 void deleyLockLogicOfRoles() { if (state.lockBasicInfo.value.isLockOwner == 1) { - // 超级管理员必须通过连接蓝牙删除 - state.showTipView.showIosTipWithContentDialog('删除锁后,所有信息都会一起删除,确定删除锁吗?'.tr, () { + // 超级管理员必须通过连接蓝牙删除q + state.showTipView + .showIosTipWithContentDialog('删除锁后,所有信息都会一起删除,确定删除锁吗?'.tr, () { // 删除锁 state.showTipView.resetGetController(); - state.showTipView.showTFViewAlertDialog(state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword); + state.showTipView.showTFViewAlertDialog( + state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword); }); } else if (state.lockBasicInfo.value.keyRight == 1) { // 授权管理员弹框提示 @@ -568,7 +595,17 @@ class LockSetLogic extends BaseGetXController { final LockListInfoEntity entity = await ApiRepository.to.deletOwnerLockData( lockId: state.lockSetInfoData.value.lockId!, ); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('delet_lock', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'delet_type': 'lock', + 'delet_lock_result': '成功', + }); + BlueManage().connectDeviceMacAddress = ''; final bool isOnlyOneData = state.isOnlyOneData.value == true; await Future.delayed(const Duration(milliseconds: 200)) @@ -578,6 +615,15 @@ class LockSetLogic extends BaseGetXController { SchedulerBinding.instance.addPostFrameCallback((_) { eventBus.fire(RefreshLockListInfoDataEvent()); }); + } else { + UmengCommonSdk.onEvent('delet_lock', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'delet_type': 'lock', + 'delet_lock_result': '${entity.errorCode}--${entity.errorMsg}', + }); } } @@ -588,7 +634,17 @@ class LockSetLogic extends BaseGetXController { keyId: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), includeUnderlings: state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('delet_lock', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'delet_type': 'key', + 'delet_lock_result': '成功', + }); + BlueManage().connectDeviceMacAddress = ''; final bool isOnlyOneData = state.isOnlyOneData.value == true; await Future.delayed(const Duration(milliseconds: 200)) @@ -598,6 +654,15 @@ class LockSetLogic extends BaseGetXController { SchedulerBinding.instance.addPostFrameCallback((_) { eventBus.fire(RefreshLockListInfoDataEvent()); }); + } else { + UmengCommonSdk.onEvent('delet_lock', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'delet_type': 'key', + 'delet_lock_result': '${entity.errorCode}--${entity.errorMsg}', + }); } } diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart b/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart index 0152248e..a51b8715 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart @@ -16,7 +16,6 @@ import '../../../../tools/commonItem.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'lockSetInfo_entity.dart'; import 'lockSet_logic.dart'; @@ -27,13 +26,14 @@ class LockSetPage extends StatefulWidget { State createState() => _LockSetPageState(); } -class _LockSetPageState extends State with WidgetsBindingObserver, RouteAware { +class _LockSetPageState extends State + with WidgetsBindingObserver, RouteAware { final LockSetLogic logic = Get.put(LockSetLogic()); final LockSetState state = Get.find().state; Future getHttpData() async { logic.getLockSettingInfoData().then((LockSetInfoEntity value) { - if(mounted){ + if (mounted) { setState(() {}); } }); @@ -58,7 +58,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.set!.tr, + barTitle: '设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: EasyRefreshTool( @@ -94,7 +94,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, final List showWidgetArr = [ // 基本信息 CommonItem( - leftTitel: TranslationLoader.lanKeys!.basicInformation!.tr, + leftTitel: '基本信息'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -109,10 +109,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Obx(() => Visibility( visible: state.lockFeature.value.autoLock == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, + leftTitel: '自动闭锁'.tr, rightTitle: (state.lockSettingInfo.value.autoLock ?? 0) > 0 ? '${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond ?? 0}s' - : TranslationLoader.lanKeys!.closed!.tr, + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, // isHaveRightWidget: true, @@ -130,10 +130,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Obx(() => Visibility( visible: state.lockFeature.value.passageMode == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr, + leftTitel: '常开模式'.tr, rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1 - ? TranslationLoader.lanKeys!.opened!.tr - : TranslationLoader.lanKeys!.closed!.tr, + ? '已开启'.tr + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -146,7 +146,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockTime!.tr, + leftTitel: '锁时间'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -184,7 +184,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, final List showWidgetArr = [ // 基本信息 CommonItem( - leftTitel: TranslationLoader.lanKeys!.basicInformation!.tr, + leftTitel: '基本信息'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -247,10 +247,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Obx(() => Visibility( visible: state.lockFeature.value.autoLock == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, + leftTitel: '自动闭锁'.tr, rightTitle: state.lockSettingInfo.value.autoLock! > 0 ? '${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond}s' - : TranslationLoader.lanKeys!.closed!.tr, + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, // isHaveRightWidget: true, @@ -269,28 +269,28 @@ class _LockSetPageState extends State with WidgetsBindingObserver, if ((state.lockSettingInfo.value.lockSound ?? 0) == 1) { switch (state.lockSettingInfo.value.lockSoundVolume ?? 0) { case 1: - titleStr = TranslationLoader.lanKeys!.low!.tr; + titleStr = '低'.tr; break; case 2: - titleStr = TranslationLoader.lanKeys!.lower!.tr; + titleStr = '较低'.tr; break; case 3: - titleStr = TranslationLoader.lanKeys!.medium!.tr; + titleStr = '中'.tr; break; case 4: - titleStr = TranslationLoader.lanKeys!.higher!.tr; + titleStr = '较高'.tr; break; case 5: - titleStr = TranslationLoader.lanKeys!.high!.tr; + titleStr = '高'.tr; break; } } else { - titleStr = TranslationLoader.lanKeys!.closed!.tr; + titleStr = '已关闭'.tr; } return Visibility( visible: state.lockFeature.value.lockSound == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockSound!.tr, + leftTitel: '锁声音'.tr, rightTitle: titleStr, isHaveLine: true, isHaveDirection: true, @@ -305,10 +305,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Obx(() => Visibility( visible: state.lockFeature.value.antiPrySwitch == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr, + leftTitel: '防撬报警'.tr, rightTitle: (state.lockSettingInfo.value.antiPrySwitch ?? 0) == 1 - ? TranslationLoader.lanKeys!.opened!.tr - : TranslationLoader.lanKeys!.closed!.tr, + ? '已开启'.tr + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -323,10 +323,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, visible: state.lockFeature.value.passageMode == 1, // visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr, + leftTitel: '常开模式'.tr, rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1 - ? TranslationLoader.lanKeys!.opened!.tr - : TranslationLoader.lanKeys!.closed!.tr, + ? '已开启'.tr + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -339,10 +339,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Obx(() => Visibility( visible: state.lockFeature.value.remoteUnlock == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr, + leftTitel: '远程开锁'.tr, rightTitle: (state.lockSettingInfo.value.remoteUnlock ?? 0) == 1 - ? TranslationLoader.lanKeys!.opened!.tr - : TranslationLoader.lanKeys!.closed!.tr, + ? '已开启'.tr + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -356,10 +356,10 @@ class _LockSetPageState extends State with WidgetsBindingObserver, visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.resetSwitch == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.resetButton!.tr, + leftTitel: '重置键'.tr, rightTitle: (state.lockSettingInfo.value.resetSwitch ?? 0) == 1 - ? TranslationLoader.lanKeys!.opened!.tr - : TranslationLoader.lanKeys!.closed!.tr, + ? '已开启'.tr + : '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -375,7 +375,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: state.lockFeature.value.d3Face == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.faceUnlocks!.tr, + leftTitel: '面容开锁'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -390,7 +390,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.messageReminding!.tr, + leftTitel: '消息提醒'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -404,7 +404,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Obx(() => Visibility( visible: state.lockFeature.value.isSupportCatEye == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.catEyeSet!.tr, + leftTitel: '猫眼设置'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -444,7 +444,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: state.lockFeature.value.openDirection == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.openingDirectionSet!.tr, + leftTitel: '开门方向设置'.tr, rightTitle: '', isHaveDirection: true, isHaveLine: true, @@ -458,7 +458,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: state.lockFeature.value.motorTorsion == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.motorPowerSetting!.tr, + leftTitel: '电机功率设置'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -501,24 +501,24 @@ class _LockSetPageState extends State with WidgetsBindingObserver, // })); // }), // 考勤 - Obx( - () => Visibility( - visible: state.lockBasicInfo.value.isLockOwner == 1 && - state.lockFeature.value.attendance == 1, - child: CommonItem( - leftTitel: '考勤'.tr, - rightTitle: '', - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: _openCheckInSwitch())), - ), + // Obx( + // () => Visibility( + // visible: state.lockBasicInfo.value.isLockOwner == 1 && + // state.lockFeature.value.attendance == 1, + // child: CommonItem( + // leftTitel: '考勤'.tr, + // rightTitle: '', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: _openCheckInSwitch())), + // ), // 开锁提醒 Obx( () => Visibility( visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.unlockReminder == 1, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr, + leftTitel: '开锁提醒'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -529,12 +529,9 @@ class _LockSetPageState extends State with WidgetsBindingObserver, () => Visibility( visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.appUnlockOnline == 1, - child: CommonItem( - leftTitel: TranslationLoader - .lanKeys!.whetherInternetRequiredWhenUnlocking!.tr, - rightTitle: '', + child: otherItem( + leftTitle: '开锁时是否需联网'.tr, isHaveLine: false, - isHaveRightWidget: true, rightWidget: _openLockNeedOnlineSwitch()), ), ), @@ -544,8 +541,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, () => Visibility( visible: state.lockFeature.value.wifi == 1, child: CommonItem( - leftTitel: - TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr, + leftTitel: 'WiFi配网'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -564,7 +560,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockTime!.tr, + leftTitel: '锁时间'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -595,7 +591,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.uploadData!.tr, + leftTitel: '上传数据'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -621,7 +617,7 @@ class _LockSetPageState extends State with WidgetsBindingObserver, Visibility( visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockEscalation!.tr, + leftTitel: '锁升级'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -655,33 +651,60 @@ class _LockSetPageState extends State with WidgetsBindingObserver, style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor)); } - // 开启考勤 - CupertinoSwitch _openCheckInSwitch() { - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: state.isAttendance.value == 1, - onChanged: (bool value) { - logic.openCheckingInData( - (CheckingInInfoDataEntity checkingInInfoDataEntity) { - if (checkingInInfoDataEntity.data!.companyId == 0) { - // logic.showCupertinoAlertDialog(context); - ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () { - // 删除锁 - Get.toNamed(Routers.checkInCreatCompanyPage, - arguments: { - 'lockSetInfoData': state.lockSetInfoData.value - }); - }); - } else { - logic.setLockSetGeneralSetting(); - } - }); - }, + Widget otherItem({String? leftTitle, bool? isHaveLine, Widget? rightWidget}) { + return Container( + width: 1.sw, + padding: + EdgeInsets.only(left: 20.w, top: 7.5.h, bottom: 7.5.h, right: 10.w), + decoration: BoxDecoration( + color: Colors.white, + border: isHaveLine! + ? Border( + bottom: BorderSide( + color: AppColors.greyLineColor, // 设置边框颜色 + width: 2.0.h, // 设置边框宽度 + ), + ) + : null, + ), + child: Row( + children: [ + Expanded(child: Text(leftTitle!, style: TextStyle(fontSize: 22.sp))), + SizedBox(width: 10.w), + rightWidget ?? Container(), + SizedBox(width: 5.w), + ], + ), ); } + // 开启考勤 + // CupertinoSwitch _openCheckInSwitch() { + // return CupertinoSwitch( + // activeColor: CupertinoColors.activeBlue, + // trackColor: CupertinoColors.systemGrey5, + // thumbColor: CupertinoColors.white, + // value: state.isAttendance.value == 1, + // onChanged: (bool value) { + // logic.openCheckingInData( + // (CheckingInInfoDataEntity checkingInInfoDataEntity) { + // if (checkingInInfoDataEntity.data!.companyId == 0) { + // // logic.showCupertinoAlertDialog(context); + // ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () { + // // 删除锁 + // Get.toNamed(Routers.checkInCreatCompanyPage, + // arguments: { + // 'lockSetInfoData': state.lockSetInfoData.value + // }); + // }); + // } else { + // logic.setLockSetGeneralSetting(); + // } + // }); + // }, + // ); + // } + // 开锁提醒 CupertinoSwitch _lockRemindSwitch() { return CupertinoSwitch( @@ -702,11 +725,13 @@ class _LockSetPageState extends State with WidgetsBindingObserver, trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, value: state.isOpenLockNeedOnline.value == 1, - onChanged: state.sureBtnState.value == 1 ? null : (bool value) { - setState(() { - logic.sendBurglarAlarm(55); - }); - }, + onChanged: state.sureBtnState.value == 1 + ? null + : (bool value) { + setState(() { + logic.sendBurglarAlarm(55); + }); + }, ); } diff --git a/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_logic.dart b/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_logic.dart index 7333c47c..ea0c997a 100755 --- a/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_logic.dart +++ b/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_logic.dart @@ -1,7 +1,9 @@ + import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../blue/blue_manage.dart'; @@ -19,8 +21,8 @@ class LockSoundSetLogic extends BaseGetXController { LockSoundSetState state = LockSoundSetState(); // 配置锁的常开模式设置 -> 锁声音设置 - void _setLockSetGeneralSetting() async{ - var entity = await ApiRepository.to.setLockSound( + Future _setLockSetGeneralSetting() async{ + final LoginEntity entity = await ApiRepository.to.setLockSound( lockId: state.lockSetInfoData.value.lockId!, lockSound:state.isOpenLockSound.value == true ? 1 : 0, lockSoundVolume:state.lockSoundLevel.value @@ -31,7 +33,7 @@ class LockSoundSetLogic extends BaseGetXController { state.lockSetInfoData.value.lockSettingInfo!.lockSound = state.isOpenLockSound.value == true ? 1 :0; state.lockSetInfoData.value.lockSettingInfo!.lockSoundVolume = state.lockSoundLevel.value; ifCanNext(); - showToast("操作成功".tr, something: (){ + showToast('操作成功'.tr, something: (){ eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); Get.back(); }); @@ -41,7 +43,7 @@ class LockSoundSetLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { // 设置支持功能解析(带参数) if(reply is SetSupportFunctionsWithParametersReply) { _replySetSupportFunctionsWithParameters(reply); @@ -74,7 +76,7 @@ class LockSoundSetLogic extends BaseGetXController { // 设置支持功能解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch(status){ case 0x00: //成功 @@ -105,14 +107,14 @@ class LockSoundSetLogic extends BaseGetXController { }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); int type; if(state.isOpenLockSound.value == false){ @@ -127,7 +129,7 @@ class LockSoundSetLogic extends BaseGetXController { userID: await Storage.getUid(), featureBit: 33, featureParaLength: 1, - featureData: [type], + featureData: [type], token: getTokenList, needAuthor: 1, publicKey: getPublicKeyList, @@ -153,22 +155,13 @@ class LockSoundSetLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); } - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - - } - @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); } diff --git a/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_page.dart b/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_page.dart index e564fbdf..0fabd865 100755 --- a/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_page.dart +++ b/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_page.dart @@ -1,16 +1,16 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_state.dart'; import '../../../../app_settings/app_colors.dart'; -import '../../../../blue/blue_manage.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'lockSoundSet_logic.dart'; class LockSoundSetPage extends StatefulWidget { @@ -21,22 +21,22 @@ class LockSoundSetPage extends StatefulWidget { } class _LockSoundSetPageState extends State with RouteAware { - final logic = Get.put(LockSoundSetLogic()); - final state = Get.find().state; + final LockSoundSetLogic logic = Get.put(LockSoundSetLogic()); + final LockSoundSetState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockSound!.tr, + barTitle: '锁声音'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Obx(() => ListView( - children: [ + children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockSound!.tr, - rightTitle: "", + leftTitel: '锁声音'.tr, + rightTitle: '', isHaveLine: false, isHaveRightWidget: true, rightWidget: @@ -50,10 +50,10 @@ class _LockSoundSetPageState extends State with RouteAware { // color: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - TranslationLoader.lanKeys!.lockSoundTip!.tr, + '功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。'.tr, style: TextStyle(fontSize: 20.sp), )), ], @@ -67,15 +67,14 @@ class _LockSoundSetPageState extends State with RouteAware { child: Container( color: Colors.white, child: Column( - children: [ + children: [ CommonItem( - leftTitel: TranslationLoader - .lanKeys!.pleaseSelectLockVolume!.tr, - rightTitle: "", + leftTitel: '请选择锁音量'.tr, + rightTitle: '', isHaveLine: true), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.low!.tr, - rightTitle: "", + leftTitel: '低'.tr, + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -86,7 +85,7 @@ class _LockSoundSetPageState extends State with RouteAware { logic.ifCanNext(); }, child: Row( - children: [ + children: [ Image.asset( state.lockSoundLevel.value == 1 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, @@ -96,8 +95,8 @@ class _LockSoundSetPageState extends State with RouteAware { ), ))), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.lower!.tr, - rightTitle: "", + leftTitel: '较低'.tr, + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -108,7 +107,7 @@ class _LockSoundSetPageState extends State with RouteAware { logic.ifCanNext(); }, child: Row( - children: [ + children: [ Image.asset( state.lockSoundLevel.value == 2 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, @@ -118,8 +117,8 @@ class _LockSoundSetPageState extends State with RouteAware { ), ))), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.medium!.tr, - rightTitle: "", + leftTitel: '中'.tr, + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -130,7 +129,7 @@ class _LockSoundSetPageState extends State with RouteAware { logic.ifCanNext(); }, child: Row( - children: [ + children: [ Image.asset( state.lockSoundLevel.value == 3 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, @@ -140,8 +139,8 @@ class _LockSoundSetPageState extends State with RouteAware { ), ))), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.higher!.tr, - rightTitle: "", + leftTitel: '较高'.tr, + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -152,7 +151,7 @@ class _LockSoundSetPageState extends State with RouteAware { logic.ifCanNext(); }, child: Row( - children: [ + children: [ Image.asset( state.lockSoundLevel.value == 4 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, @@ -162,8 +161,8 @@ class _LockSoundSetPageState extends State with RouteAware { ), ))), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.high!.tr, - rightTitle: "", + leftTitel: '高'.tr, + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -174,7 +173,7 @@ class _LockSoundSetPageState extends State with RouteAware { logic.ifCanNext(); }, child: Row( - children: [ + children: [ Image.asset( state.lockSoundLevel.value == 5 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, @@ -189,11 +188,9 @@ class _LockSoundSetPageState extends State with RouteAware { Container( margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 30.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.save!.tr, + btnName: '保存'.tr, isDisabled: state.canNext.value, - onClick: state.canNext.value ? (){ - logic.sendLockSound(); - }: null), + onClick: state.canNext.value ? logic.sendLockSound: null), ), ], ))); @@ -205,7 +202,7 @@ class _LockSoundSetPageState extends State with RouteAware { trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, value: state.isOpenLockSound.value, - onChanged: (value) { + onChanged: (bool value) { setState(() { state.isOpenLockSound.value = value; }); @@ -216,7 +213,6 @@ class _LockSoundSetPageState extends State with RouteAware { @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -225,7 +221,6 @@ class _LockSoundSetPageState extends State with RouteAware { @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); diff --git a/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_state.dart b/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_state.dart index 1ee76616..4e4876b4 100755 --- a/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_state.dart +++ b/lib/main/lockDetail/lockSet/lockSoundSet/lockSoundSet_state.dart @@ -2,20 +2,24 @@ import 'package:get/get.dart'; import '../lockSet/lockSetInfo_entity.dart'; -class LockSoundSetState { - var lockSetInfoData = LockSetInfoData().obs; - - var isOpenLockSound = false.obs;// 是否开启声音 - var lockSoundLevel = 0.obs;// 音量等级 - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) - var canNext = false.obs;// 是否可以点击下一步 +class LockSoundSetState {// 是否可以点击下一步 LockSoundSetState() { var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; - isOpenLockSound.value = lockSetInfoData.value.lockSettingInfo!.lockSound == 1 ? true : false; + if (lockSetInfoData.value.lockSettingInfo!.lockSound == 1) { + isOpenLockSound.value = true; + } else { + isOpenLockSound.value = false; + } lockSoundLevel.value = lockSetInfoData.value.lockSettingInfo!.lockSoundVolume!; } + Rx lockSetInfoData = LockSetInfoData().obs; + + RxBool isOpenLockSound = false.obs;// 是否开启声音 + RxInt lockSoundLevel = 0.obs;// 音量等级 + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) + RxBool canNext = false.obs; } diff --git a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart index 1e16f15d..e3ab45be 100755 --- a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart +++ b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart @@ -216,7 +216,7 @@ class LockTimeLogic extends BaseGetXController{ int getLocalTime(){ final DateTime now = DateTime.now(); final Duration timeZoneOffset = now.timeZoneOffset; - AppLog.log('timeZoneOffset.inSeconds:$timeZoneOffset.inSeconds'); + // AppLog.log('timeZoneOffset.inSeconds:$timeZoneOffset.inSeconds'); return state.serverTime + timeZoneOffset.inSeconds; } diff --git a/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart b/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart index 5122a776..0fac4ce6 100755 --- a/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart +++ b/lib/main/lockDetail/lockSet/lockTime/lockTime_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -8,7 +9,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'lockTime_logic.dart'; class LockTimePage extends StatefulWidget { @@ -27,7 +27,7 @@ class _LockTimePageState extends State with RouteAware{ return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockTime!.tr, + barTitle: '锁时间'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( @@ -49,7 +49,7 @@ class _LockTimePageState extends State with RouteAware{ height: 60.h, ), SubmitBtn( - btnName: TranslationLoader.lanKeys!.calibrationTime!.tr, + btnName: '校准时间'.tr, borderRadius: 20.w, fontSize: 32.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), diff --git a/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_logic.dart b/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_logic.dart index 7e1fb1f0..a0987503 100755 --- a/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_logic.dart +++ b/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_logic.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../network/api_repository.dart'; @@ -11,7 +12,7 @@ class MarkedHouseStateLogic extends BaseGetXController{ // 标记房态 Future setRoomStatusData() async{ - var entity = await ApiRepository.to.setRoomStatusData( + final LoginEntity entity = await ApiRepository.to.setRoomStatusData( lockId: state.lockSetInfoData.value.lockId!, roomStatus:state.roomStatus.value, ); @@ -20,7 +21,7 @@ class MarkedHouseStateLogic extends BaseGetXController{ state.lockSetInfoData.value.lockStatus!.roomStatus = state.roomStatus.value; eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - showToast("操作成功".tr); + showToast('操作成功'.tr); }else if(entity.errorCode! == 1){ // 跳转到高级功能界面 需要开通高级功能 diff --git a/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_page.dart b/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_page.dart index 14a5bb06..c86fe034 100755 --- a/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_page.dart +++ b/lib/main/lockDetail/lockSet/markedHouseState/markedHouseState_page.dart @@ -1,12 +1,13 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/markedHouseState/markedHouseState_state.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'markedHouseState_logic.dart'; class MarkedHouseStatePage extends StatefulWidget { @@ -17,22 +18,22 @@ class MarkedHouseStatePage extends StatefulWidget { } class _MarkedHouseStatePageState extends State { - final logic = Get.put(MarkedHouseStateLogic()); - final state = Get.find().state; + final MarkedHouseStateLogic logic = Get.put(MarkedHouseStateLogic()); + final MarkedHouseStateState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.markedHouseState!.tr, + barTitle: '标记房态'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ + children: [ Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.leisure!.tr, - rightTitle: "", + leftTitel: '空闲'.tr, + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -42,7 +43,7 @@ class _MarkedHouseStatePageState extends State { }); }, child: Row( - children: [ + children: [ Image.asset( state.roomStatus.value == 0 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, @@ -52,8 +53,8 @@ class _MarkedHouseStatePageState extends State { ), ))), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.checkedIn!.tr, - rightTitle: "", + leftTitel: '已入住'.tr, + rightTitle: '', isHaveLine: false, isHaveRightWidget: true, rightWidget: GestureDetector( @@ -63,7 +64,7 @@ class _MarkedHouseStatePageState extends State { }); }, child: Row( - children: [ + children: [ Image.asset( state.roomStatus.value == 1 ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, diff --git a/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart b/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart index 943480f9..0085779e 100755 --- a/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart +++ b/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart @@ -1,8 +1,8 @@ - import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_setSupportFunctionsNoParameters.dart'; @@ -19,25 +19,27 @@ import 'motorPower_state.dart'; class MotorPowerLogic extends BaseGetXController { final MotorPowerState state = MotorPowerState(); - // 配置锁的常开模式设置 -> 防撬报警 - Future _setLockSetGeneralSetting() async{ - var entity = await ApiRepository.to.setOpenDoorDirectionData( + // 配置锁的常开模式设置 -> 电机功率设置 + Future _setLockSetGeneralSetting() async { + final LoginEntity entity = await ApiRepository.to.setMotorTorqueData( lockId: state.lockSetInfoData.value.lockId!, - openDirectionValue:state.motorTorsion.value, // 1-开启、2-关闭; + motorTorsion: state.motorTorsion.value, // // 1:小,2:中,3:大 ); - if(entity.errorCode!.codeIsSuccessful){ - - state.lockSetInfoData.value.lockSettingInfo!.openDirectionValue = state.motorTorsion.value; - eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - showToast("操作成功".tr); + if (entity.errorCode!.codeIsSuccessful) { + state.lockSetInfoData.value.lockSettingInfo!.openDirectionValue = + state.motorTorsion.value; + eventBus + .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + showToast('操作成功'.tr); } } // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { - if(reply is SetSupportFunctionsNoParametersReply) { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) { + if (reply is SetSupportFunctionsNoParametersReply) { _replySetSupportFunctionsWithParameters(reply); } @@ -67,8 +69,8 @@ class MotorPowerLogic extends BaseGetXController { // 设置自动落锁数据解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { - int status = reply.data[2]; - switch(status){ + final int status = reply.data[2]; + switch (status) { case 0x00: //成功 _setLockSetGeneralSetting(); @@ -84,16 +86,21 @@ class MotorPowerLogic extends BaseGetXController { // 读取支持功能-带参数 Future _readSupportFunctionsNoParameters() async { - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = + changeStringListToIntList(publicKey!); IoSenderManage.readSupportFunctionsNoParametersCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), @@ -102,31 +109,35 @@ class MotorPowerLogic extends BaseGetXController { token: getTokenList, needAuthor: 1, publicKey: getPublicKeyList, - privateKey: getPrivateKeyList - ); + privateKey: getPrivateKeyList); } }); } // 设置支持功能(带参数) Future sendOpenDoorDirection() async { - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = + changeStringListToIntList(publicKey!); IoSenderManage.setSupportFunctionsWithParametersCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), userID: await Storage.getUid(), featureBit: 58, featureParaLength: 1, - featureData: [state.motorTorsion.value], + featureData: [state.motorTorsion.value], token: getTokenList, needAuthor: 1, publicKey: getPublicKeyList, @@ -137,7 +148,6 @@ class MotorPowerLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -145,7 +155,6 @@ class MotorPowerLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); _readSupportFunctionsNoParameters(); @@ -153,9 +162,7 @@ class MotorPowerLogic extends BaseGetXController { @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); } - } diff --git a/lib/main/lockDetail/lockSet/motorPower/motorPower_page.dart b/lib/main/lockDetail/lockSet/motorPower/motorPower_page.dart index 657741c0..ac023d66 100755 --- a/lib/main/lockDetail/lockSet/motorPower/motorPower_page.dart +++ b/lib/main/lockDetail/lockSet/motorPower/motorPower_page.dart @@ -4,7 +4,8 @@ import 'package:get/get.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; +import 'motorPower_logic.dart'; +import 'motorPower_state.dart'; class MotorPowerPage extends StatefulWidget { const MotorPowerPage({Key? key}) : super(key: key); @@ -14,14 +15,15 @@ class MotorPowerPage extends StatefulWidget { } class _MotorPowerPageState extends State { - bool isCheck = false; + final MotorPowerLogic logic = Get.put(MotorPowerLogic()); + final MotorPowerState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.motorPowerSetting!.tr, + barTitle: '电机功率设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -33,7 +35,7 @@ class _MotorPowerPageState extends State { margin: EdgeInsets.only(left: 40.w), alignment: Alignment.centerLeft, child: Text( - TranslationLoader.lanKeys!.motorPowerSettingTip!.tr, + '请根据门锁实际情况,请谨慎选择电机功率:'.tr, style: TextStyle( fontSize: 24.sp, color: Colors.black, @@ -43,23 +45,39 @@ class _MotorPowerPageState extends State { SizedBox( height: 40.h, ), - _buildTipsView('${TranslationLoader.lanKeys!.miniwatt!.tr}\n', TranslationLoader.lanKeys!.miniwattTip!.tr, isCheck), + _buildTipsView( + '${'小功率:'.tr}\n', '耗电少'.tr, state.motorTorsion.value == 1, () { + state.motorTorsion.value = 1; + logic.sendOpenDoorDirection(); + }), SizedBox( height: 20.h, ), - _buildTipsView('${TranslationLoader.lanKeys!.highPower!.tr}\n', - TranslationLoader.lanKeys!.highPowerTip!.tr, !isCheck) + _buildTipsView( + '${'中功率'.tr}\n', '常规使用'.tr, state.motorTorsion.value == 2, () { + state.motorTorsion.value = 2; + logic.sendOpenDoorDirection(); + }), + SizedBox( + height: 20.h, + ), + _buildTipsView( + '${'大功率'.tr}\n', '大功率提示'.tr, state.motorTorsion.value == 3, () { + state.motorTorsion.value = 3; + logic.sendOpenDoorDirection(); + }), ], )); } - Widget _buildTipsView(String titleStr, String subTitle, bool isClick) { + Widget _buildTipsView( + String titleStr, String subTitle, bool isClick, Function() action) { return GestureDetector( child: Container( width: ScreenUtil().screenWidth - 40.w, margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), - padding: EdgeInsets.only( - left: 20.w, top: 30.h, bottom: 30.h, right: 15.w), + padding: + EdgeInsets.only(left: 20.w, top: 30.h, bottom: 30.h, right: 15.w), decoration: BoxDecoration( color: isClick ? AppColors.blueViewBgColor @@ -68,29 +86,25 @@ class _MotorPowerPageState extends State { ), child: Row( children: [ - isClick - ? Image.asset( - 'images/mine/icon_mine_blueSelect.png', - width: 20.w, - height: 14.w, - ) - : SizedBox( - width: 20.w, - height: 14.w, - ), + if (isClick) + Image.asset( + 'images/mine/icon_mine_blueSelect.png', + width: 20.w, + height: 14.w, + ) + else + SizedBox( + width: 20.w, + height: 14.w, + ), SizedBox(width: 20.w), SizedBox( - width: ScreenUtil().screenWidth - 40.w - 20.w*4, - child: _buildRichText(titleStr, subTitle, isClick) - ), + width: ScreenUtil().screenWidth - 40.w - 20.w * 4, + child: _buildRichText(titleStr, subTitle, isClick)), ], ), ), - onTap: () { - setState(() { - isCheck = !isCheck; - }); - }, + onTap: action, ); } diff --git a/lib/main/lockDetail/lockSet/motorPower/motorPower_state.dart b/lib/main/lockDetail/lockSet/motorPower/motorPower_state.dart index c23e4d94..e1425945 100755 --- a/lib/main/lockDetail/lockSet/motorPower/motorPower_state.dart +++ b/lib/main/lockDetail/lockSet/motorPower/motorPower_state.dart @@ -1,19 +1,15 @@ - - import 'package:get/get.dart'; import '../lockSet/lockSetInfo_entity.dart'; class MotorPowerState { - - var lockSetInfoData = LockSetInfoData().obs; - var motorTorsion = 1.obs; - MotorPowerState() { - var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + final map = Get.arguments; + lockSetInfoData.value = map['lockSetInfoData']; motorTorsion.value = lockSetInfoData.value.lockSettingInfo!.motorTorsion!; } + Rx lockSetInfoData = LockSetInfoData().obs; + RxInt motorTorsion = 1.obs; // 1:小,2:中,3:大 } diff --git a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart index 37aaba23..c748da0c 100755 --- a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart +++ b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../blue/blue_manage.dart'; @@ -20,33 +21,33 @@ class NormallyOpenModeLogic extends BaseGetXController{ NormallyOpenModeState state = NormallyOpenModeState(); // 配置锁的常开模式设置 - void configPassageMode() async{ + Future configPassageMode() async{ if(state.weekDays.value.isEmpty){ - showToast("请选择常开日期".tr); + showToast('请选择常开日期'.tr); return; } if(state.endTimeMinute.value < state.beginTimeMinute.value){ - showToast("结束时间不能小于开始时间哦".tr); + showToast('结束时间不能小于开始时间哦'.tr); return; } - var passageModeConfig = []; - var map = { - "isAllDay":state.isAllDay.value, - "weekDays":state.weekDays.value, - "startDate":state.beginTimeMinute.value, - "endDate":state.endTimeMinute.value, + final List passageModeConfig = []; + final Map map = { + 'isAllDay':state.isAllDay.value, + 'weekDays':state.weekDays.value, + 'startDate':state.beginTimeMinute.value, + 'endDate':state.endTimeMinute.value, }; passageModeConfig.add(map); - var entity = await ApiRepository.to.setNormallyModeData( + final LoginEntity entity = await ApiRepository.to.setNormallyModeData( lockId: state.lockSetInfoData.value.lockId!, passageMode:state.isOpenNormallyOpenMode.value == true ? 1:0, passageModeConfig: passageModeConfig, ); if(entity.errorCode!.codeIsSuccessful){ - showToast("操作成功".tr, something: (){ + showToast('操作成功'.tr, something: (){ eventBus.fire(RefreshLockListInfoDataEvent()); state.lockSetInfoData.value.lockSettingInfo!.passageMode = state.isOpenNormallyOpenMode.value == true ? 1:0; @@ -59,7 +60,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { if(reply is SetSupportFunctionsWithParametersReply) { _replySetSupportFunctionsWithParameters(reply); } @@ -91,7 +92,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ // 设置自动落锁数据解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch(status){ case 0x00: //成功 @@ -122,39 +123,39 @@ class NormallyOpenModeLogic extends BaseGetXController{ }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); - var weekStr = "00000000"; + String weekStr = '00000000'; for (var day in state.weekDays.value) { - int index = day % 7; // 将周日的索引转换为 0 + final int index = day % 7; // 将周日的索引转换为 0 weekStr = '${weekStr.substring(0, index)}1${weekStr.substring(index + 1)}'; } // 倒序 weekStr weekStr = weekStr.split('').reversed.join(''); - int number = int.parse(weekStr, radix: 2); + final int number = int.parse(weekStr, radix: 2); - List list = []; + final List list = []; list.add(state.isOpenNormallyOpenMode.value == true ? 1:0); - int bieginTime = state.beginTimeMinute.value; - double bieginDouble = bieginTime / 256; - int biegin1 = bieginDouble.toInt(); - int biegin2 = bieginTime % 256; + final int bieginTime = state.beginTimeMinute.value; + final double bieginDouble = bieginTime / 256; + final int biegin1 = bieginDouble.toInt(); + final int biegin2 = bieginTime % 256; list.add(biegin1); list.add(biegin2); // list.add(state.beginTimeMinute.value); - int endTime = state.endTimeMinute.value; - double endDouble = endTime / 256; - int end1 = endDouble.toInt(); - int end2 = endTime % 256; + final int endTime = state.endTimeMinute.value; + final double endDouble = endTime / 256; + final int end1 = endDouble.toInt(); + final int end2 = endTime % 256; list.add(end1); list.add(end2); @@ -185,7 +186,6 @@ class NormallyOpenModeLogic extends BaseGetXController{ @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -193,7 +193,6 @@ class NormallyOpenModeLogic extends BaseGetXController{ @override void onInit() { - // TODO: implement onInit super.onInit(); // _readSupportFunctionsWithParameters(); @@ -201,7 +200,6 @@ class NormallyOpenModeLogic extends BaseGetXController{ @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); diff --git a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_page.dart b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_page.dart index 2e923da7..ed696552 100755 --- a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_page.dart +++ b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_page.dart @@ -1,19 +1,19 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_state.dart'; import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import '../../../../app_settings/app_colors.dart'; -import '../../../../blue/blue_manage.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'normallyOpenMode_logic.dart'; class NormallyOpenModePage extends StatefulWidget { @@ -23,23 +23,22 @@ class NormallyOpenModePage extends StatefulWidget { State createState() => _NormallyOpenModePageState(); } -class _NormallyOpenModePageState extends State - with RouteAware { - final logic = Get.put(NormallyOpenModeLogic()); - final state = Get.find().state; +class _NormallyOpenModePageState extends State with RouteAware { + final NormallyOpenModeLogic logic = Get.put(NormallyOpenModeLogic()); + final NormallyOpenModeState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.normallyOpenMode!.tr, + barTitle: '常开模式'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Obx(() => ListView( - children: [ + children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr, + leftTitel: '常开模式'.tr, rightTitle: '', isHaveLine: false, isHaveRightWidget: true, @@ -56,10 +55,9 @@ class _NormallyOpenModePageState extends State color: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( - child: Text( - TranslationLoader.lanKeys!.normallyOpenModeTip!.tr, + child: Text('你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。'.tr, style: TextStyle(fontSize: 20.sp), )), ], @@ -73,7 +71,7 @@ class _NormallyOpenModePageState extends State child: Container( color: Colors.white, child: Column( - children: [ + children: [ // CommonItem( // leftTitel: TranslationLoader.lanKeys!.automaticUnLock!.tr, // rightTitle: "", @@ -118,7 +116,7 @@ class _NormallyOpenModePageState extends State child: state.isJustForShow.value == true ? Container() : SubmitBtn( - btnName: TranslationLoader.lanKeys!.save!.tr, + btnName: '保存'.tr, onClick: () { logic.sendAutoLock(); }), @@ -134,15 +132,14 @@ class _NormallyOpenModePageState extends State color: Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Container( height: 60.h, // color: Colors.red, padding: EdgeInsets.only(left: 30.w, top: 15.h), child: Text( - "${TranslationLoader.lanKeys!.normallyOpen!.tr}${TranslationLoader.lanKeys!.date!.tr}", - style: - TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600))), + '常开日期'.tr, + style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600))), Container( height: 100.h, padding: EdgeInsets.only(left: 10.w, right: 10.w, bottom: 10.h), @@ -151,7 +148,7 @@ class _NormallyOpenModePageState extends State crossAxisCount: 7, childAspectRatio: 1.0), itemCount: 7, physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { + itemBuilder: (BuildContext context, int index) { index += 1; return btnItem(index); })), @@ -228,14 +225,13 @@ class _NormallyOpenModePageState extends State Widget bottomWidget() { return Column( - children: [ + children: [ Container( color: AppColors.mainBackgroundColor, height: 10.h, ), Obx(() => CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.normallyOpen!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '常开时间'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -254,9 +250,9 @@ class _NormallyOpenModePageState extends State setState(() {}); }, child: Row( - children: [ + children: [ Text( - TranslationLoader.lanKeys!.allDay!.tr, + '全天'.tr, style: TextStyle(fontSize: 22.sp), ), SizedBox( @@ -277,10 +273,10 @@ class _NormallyOpenModePageState extends State child: Container( color: Colors.white, child: Column( - children: [ + children: [ Obx(() => CommonItem( leftTitel: - "${TranslationLoader.lanKeys!.begin!.tr}${TranslationLoader.lanKeys!.time!.tr}", + '开始时间'.tr, rightTitle: state.beginTime.value, isHaveDirection: true, isHaveLine: true, @@ -292,7 +288,7 @@ class _NormallyOpenModePageState extends State DateTime.tryParse(state.beginTime.value)); Pickers.showDatePicker(context, selectDate: selectDate, - mode: DateMode.HM, onConfirm: (p) { + mode: DateMode.HM, onConfirm: (PDuration p) { setState(() { state.beginTimeMinute.value = p.hour! * 60 + p.minute!; @@ -301,8 +297,7 @@ class _NormallyOpenModePageState extends State }); })), Obx(() => CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.end!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '结束时间'.tr, rightTitle: state.endTime.value, isHaveDirection: true, action: () { @@ -313,7 +308,7 @@ class _NormallyOpenModePageState extends State DateTime.tryParse(state.endTime.value)); Pickers.showDatePicker(context, selectDate: selectDate, - mode: DateMode.HM, onConfirm: (p) { + mode: DateMode.HM, onConfirm: (PDuration p) { setState(() { state.endTimeMinute.value = p.hour! * 60 + p.minute!; @@ -337,7 +332,7 @@ class _NormallyOpenModePageState extends State value: state.isOpenNormallyOpenMode.value, onChanged: state.isJustForShow.value == true ? null - : (value) { + : (bool value) { setState(() { state.isOpenNormallyOpenMode.value = value; }); @@ -347,7 +342,6 @@ class _NormallyOpenModePageState extends State @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); // 路由订阅 @@ -356,7 +350,6 @@ class _NormallyOpenModePageState extends State @override void dispose() { - // TODO: implement dispose // 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); diff --git a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_state.dart b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_state.dart index 885fe31e..7b4c26ca 100755 --- a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_state.dart +++ b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_state.dart @@ -2,30 +2,18 @@ import 'package:get/get.dart'; import '../lockSet/lockSetInfo_entity.dart'; -class NormallyOpenModeState{ - var lockSetInfoData = LockSetInfoData().obs; - var lockBasicInfo = LockBasicInfo().obs; - var isJustForShow = false.obs;// 是否只是作为展示作用,因为普通用户只是展示,不可修改 - - // var getPassageModeConfigData = GetPassageModeConfigEntity().obs; - var isOpenNormallyOpenMode = false.obs;// 是否开启常开模式 常开模式:1-开启、0-关闭 - // var isOpenAutomaticUnLock = false.obs;// 是否开启自动开锁模式 自动开锁:1-开启、2-关闭,开启后锁将在常开模式开始时自动打开 - var isAllDay = 0.obs;// 是否开启全天模式 是否全天常开:1-是、2-否, 如果全天常开,startDate和endDate参数将被忽略. - var weekDays = [].obs;// 常开时期 - var beginTime = "".obs;// 开始时间 - var endTime = "".obs;// 结束时间 - var beginTimeMinute = 0.obs;// 开始时间分钟 - var endTimeMinute = 0.obs;// 结束时间分钟 - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) +class NormallyOpenModeState{// 0普通状态(可用) 1连接中(不可用) NormallyOpenModeState() { var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; lockBasicInfo = lockSetInfoData.value.lockBasicInfo!.obs; - isOpenNormallyOpenMode.value = lockSetInfoData.value.lockSettingInfo!.passageMode! == 1 ? true : false; + if (lockSetInfoData.value.lockSettingInfo!.passageMode! == 1) { + isOpenNormallyOpenMode.value = true; + } else { + isOpenNormallyOpenMode.value = false; + } if(lockBasicInfo.value.isLockOwner == 1 || lockBasicInfo.value.keyRight == 1){ isJustForShow.value = false; @@ -38,9 +26,25 @@ class NormallyOpenModeState{ weekDays.value = lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].weekDays!; beginTimeMinute.value = lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].startDate!; - beginTime.value = "${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].startDate!~/60}:${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].startDate! % 60}"; + beginTime.value = '${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].startDate!~/60}:${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].startDate! % 60}'; endTimeMinute.value = lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].endDate!; - endTime.value = "${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].endDate!~/60}:${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].endDate! % 60}"; + endTime.value = '${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].endDate!~/60}:${lockSetInfoData.value.lockSettingInfo!.passageModeConfig![0].endDate! % 60}'; } } + Rx lockSetInfoData = LockSetInfoData().obs; + Rx lockBasicInfo = LockBasicInfo().obs; + RxBool isJustForShow = false.obs;// 是否只是作为展示作用,因为普通用户只是展示,不可修改 + + // var getPassageModeConfigData = GetPassageModeConfigEntity().obs; + RxBool isOpenNormallyOpenMode = false.obs;// 是否开启常开模式 常开模式:1-开启、0-关闭 + // var isOpenAutomaticUnLock = false.obs;// 是否开启自动开锁模式 自动开锁:1-开启、2-关闭,开启后锁将在常开模式开始时自动打开 + RxInt isAllDay = 0.obs;// 是否开启全天模式 是否全天常开:1-是、2-否, 如果全天常开,startDate和endDate参数将被忽略. + RxList weekDays = [].obs;// 常开时期 + RxString beginTime = ''.obs;// 开始时间 + RxString endTime = ''.obs;// 结束时间 + RxInt beginTimeMinute = 0.obs;// 开始时间分钟 + RxInt endTimeMinute = 0.obs;// 结束时间分钟 + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; } \ No newline at end of file diff --git a/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_logic.dart b/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_logic.dart index b9dce4b6..49ac3a8d 100755 --- a/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_logic.dart +++ b/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_logic.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_setSupportFunctionsNoParameters.dart'; @@ -21,7 +22,7 @@ class OpenDoorDirectionLogic extends BaseGetXController { // 配置锁的常开模式设置 -> 防撬报警 Future _setLockSetGeneralSetting() async{ - var entity = await ApiRepository.to.setOpenDoorDirectionData( + final LoginEntity entity = await ApiRepository.to.setOpenDoorDirectionData( lockId: state.lockSetInfoData.value.lockId!, openDirectionValue:state.openDirectionValue.value, // 1-开启、2-关闭; ); @@ -31,7 +32,7 @@ class OpenDoorDirectionLogic extends BaseGetXController { // state.openDirectionValue.value = state.openDirectionValue.value == 1 ? 0 : 1; state.lockSetInfoData.value.lockSettingInfo!.openDirectionValue = state.openDirectionValue.value; eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - showToast("操作成功".tr); + showToast('操作成功'.tr); } } @@ -89,14 +90,14 @@ class OpenDoorDirectionLogic extends BaseGetXController { BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { dismissEasyLoading(); if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); IoSenderManage.setSupportFunctionsNoParametersCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), @@ -116,7 +117,6 @@ class OpenDoorDirectionLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -124,7 +124,6 @@ class OpenDoorDirectionLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); // _readSupportFunctionsNoParameters(); @@ -132,7 +131,6 @@ class OpenDoorDirectionLogic extends BaseGetXController { @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); } diff --git a/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart b/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart index f762d58c..5d8094ed 100755 --- a/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart +++ b/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_state.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'openDoorDirection_logic.dart'; class OpenDoorDirectionPage extends StatefulWidget { @@ -15,8 +15,8 @@ class OpenDoorDirectionPage extends StatefulWidget { } class _OpenDoorDirectionPageState extends State { - final logic = Get.put(OpenDoorDirectionLogic()); - final state = Get.find().state; + final OpenDoorDirectionLogic logic = Get.put(OpenDoorDirectionLogic()); + final OpenDoorDirectionState state = Get.find().state; // bool isCheck = false; // int selectIndex = 0; @@ -27,11 +27,11 @@ class _OpenDoorDirectionPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.openingDirectionSet!.tr, + barTitle: '开门方向设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ + children: [ SizedBox( height: 60.h, ), @@ -39,7 +39,7 @@ class _OpenDoorDirectionPageState extends State { margin: EdgeInsets.only(left: 40.w, right: 40.w), alignment: Alignment.centerLeft, child: Text( - TranslationLoader.lanKeys!.openingDirectionSetTip!.tr, + '开门方向设置提示'.tr, style: TextStyle( fontSize: 24.sp, color: Colors.black, @@ -56,8 +56,8 @@ class _OpenDoorDirectionPageState extends State { height: 60.h, ), _buildTipsView( - TranslationLoader.lanKeys!.judgmentMethod!.tr, - TranslationLoader.lanKeys!.judgmentMethodContent!.tr, + "${'判断方法'.tr}:", + '判断方法内容'.tr, false) ], )); @@ -67,23 +67,23 @@ class _OpenDoorDirectionPageState extends State { Row _buildRadioGroupRowWidget() { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ + children: [ // SizedBox(width: 60.w,), Row( - children: [ + children: [ Obx(() => _colorfulCheckBox(1)), Text( - TranslationLoader.lanKeys!.openLeft!.tr, + '左开'.tr, style: TextStyle(fontSize: 24.sp), ), ], ), // SizedBox(width: 100.w), Row( - children: [ + children: [ Obx(() => _colorfulCheckBox(2)), Text( - TranslationLoader.lanKeys!.openRight!.tr, + '右开'.tr, style: TextStyle(fontSize: 24.sp), ), ], @@ -126,7 +126,7 @@ class _OpenDoorDirectionPageState extends State { : AppColors.placeholderTextColor, fontSize: 22.sp); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ + late InlineSpan tipsPreviewSpan = TextSpan(children: [ TextSpan(text: titleStr, style: titleStyle), TextSpan(text: subTitle, style: subTipsStyle), ]); diff --git a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart index fd65a94e..d5cc7d9d 100755 --- a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart +++ b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/talk/udp/udp_manage.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -20,11 +21,11 @@ class RemoteUnlockingLogic extends BaseGetXController { RemoteUnlockingState state = RemoteUnlockingState(); void remoteUnlockingOpenOrClose() async { - var entity = await ApiRepository.to.remoteUnlockingOpenOrClose( + final LoginEntity entity = await ApiRepository.to.remoteUnlockingOpenOrClose( lockId: state.lockSetInfoData.value.lockId!, remoteUnlock: state.remoteEnable.value == 1 ? 0 : 1); if (entity.errorCode!.codeIsSuccessful) { - showToast("操作成功".tr, something: () { + showToast('操作成功'.tr, something: () { eventBus.fire(RefreshLockListInfoDataEvent()); state.remoteEnable.value = state.remoteEnable.value == 1 ? 0 : 1; state.lockSetInfoData.value.lockSettingInfo!.remoteUnlock = @@ -143,7 +144,6 @@ class RemoteUnlockingLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -151,7 +151,6 @@ class RemoteUnlockingLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); // _readSupportFunctionsNoParameters(); @@ -159,8 +158,8 @@ class RemoteUnlockingLogic extends BaseGetXController { @override void onClose() { - // TODO: implement onClose super.onClose(); + _replySubscription.cancel(); } } diff --git a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart index f23a5d45..2147a824 100755 --- a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart +++ b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart @@ -4,13 +4,13 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart'; +import 'package:star_lock/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_state.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class RemoteUnlockingPage extends StatefulWidget { const RemoteUnlockingPage({Key? key}) : super(key: key); @@ -19,29 +19,28 @@ class RemoteUnlockingPage extends StatefulWidget { State createState() => _RemoteUnlockingPageState(); } -class _RemoteUnlockingPageState extends State - with RouteAware { - final logic = Get.put(RemoteUnlockingLogic()); - final state = Get.find().state; +class _RemoteUnlockingPageState extends State with RouteAware { + final RemoteUnlockingLogic logic = Get.put(RemoteUnlockingLogic()); + final RemoteUnlockingState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.remoteUnlocking!.tr, + barTitle: '远程开锁'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( padding: EdgeInsets.all(30.w), child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - TranslationLoader.lanKeys!.remoteUnlockingPageTip!.tr, + '功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。'.tr, style: TextStyle( fontSize: 20.sp, color: AppColors.darkGrayTextColor), )), @@ -53,10 +52,10 @@ class _RemoteUnlockingPageState extends State Obx(() { return Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - "${TranslationLoader.lanKeys!.currentMode!.tr} : ${state.remoteEnable.value == 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr}", + "${"当前模式".tr} : ${state.remoteEnable.value == 1 ? '已开启'.tr : '已关闭'.tr}", style: TextStyle( fontWeight: FontWeight.w600, fontSize: 22.sp), )), @@ -68,11 +67,11 @@ class _RemoteUnlockingPageState extends State ), Obx(() => SubmitBtn( btnName: state.remoteEnable.value == 1 - ? TranslationLoader.lanKeys!.close!.tr - : TranslationLoader.lanKeys!.open!.tr, + ? '关闭'.tr + : '开启'.tr, onClick: () { //全自动锁只判断是否开启远程开锁 - bool isContains = BlueManage().connectDeviceName.contains("T9A"); + bool isContains = BlueManage().connectDeviceName.contains('T9A'); if (isContains) { logic.remoteUnlockingOpenOrClose(); } else { @@ -86,7 +85,6 @@ class _RemoteUnlockingPageState extends State @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); // 路由订阅 @@ -95,7 +93,6 @@ class _RemoteUnlockingPageState extends State @override void dispose() { - // TODO: implement dispose // 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); diff --git a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_state.dart b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_state.dart index ee1de354..36fcf9ea 100755 --- a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_state.dart +++ b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_state.dart @@ -4,16 +4,15 @@ import 'package:get/get.dart'; import '../lockSet/lockSetInfo_entity.dart'; class RemoteUnlockingState{ - var lockSetInfoData = LockSetInfoData().obs; - var remoteEnable = 1.obs; - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) - RemoteUnlockingState() { var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; remoteEnable.value = lockSetInfoData.value.lockSettingInfo!.remoteUnlock!; } + Rx lockSetInfoData = LockSetInfoData().obs; + RxInt remoteEnable = 1.obs; + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; } \ No newline at end of file diff --git a/lib/main/lockDetail/lockSet/resetButton/resetButton_logic.dart b/lib/main/lockDetail/lockSet/resetButton/resetButton_logic.dart index 233f464a..526a829e 100755 --- a/lib/main/lockDetail/lockSet/resetButton/resetButton_logic.dart +++ b/lib/main/lockDetail/lockSet/resetButton/resetButton_logic.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/lockSet/resetButton/resetButton_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -21,7 +22,7 @@ class ResetButtonLogic extends BaseGetXController{ // 配置锁的常开模式设置 -> 重置开关 Future _setLockSetGeneralSetting() async{ - var entity = await ApiRepository.to.setResetButtonData( + final LoginEntity entity = await ApiRepository.to.setResetButtonData( lockId: state.lockSetInfoData.value.lockId!, resetSwitch:state.resetButtonEnable.value == 1 ? 0 : 1, ); @@ -29,7 +30,7 @@ class ResetButtonLogic extends BaseGetXController{ // eventBus.fire(RefreshLockListInfoDataEvent()); state.resetButtonEnable.value = state.resetButtonEnable.value == 1 ? 2 : 1; state.lockSetInfoData.value.lockSettingInfo!.resetSwitch = state.resetButtonEnable.value; - showToast("操作成功".tr, something: (){ + showToast('操作成功'.tr, something: (){ eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); }); } @@ -38,7 +39,7 @@ class ResetButtonLogic extends BaseGetXController{ // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { if(reply is SetSupportFunctionsNoParametersReply) { _replySetSupportFunctionsWithParameters(reply); } @@ -69,7 +70,7 @@ class ResetButtonLogic extends BaseGetXController{ // 设置自动落锁数据解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { - int status = reply.data[2]; + final int status = reply.data[2]; switch(status){ case 0x00: //成功 @@ -100,14 +101,14 @@ class ResetButtonLogic extends BaseGetXController{ }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); IoSenderManage.setSupportFunctionsNoParametersCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), @@ -131,7 +132,6 @@ class ResetButtonLogic extends BaseGetXController{ @override void onReady() { - // TODO: implement onReady super.onReady(); _initReplySubscription(); @@ -139,7 +139,6 @@ class ResetButtonLogic extends BaseGetXController{ @override void onInit() { - // TODO: implement onInit super.onInit(); // _readSupportFunctionsNoParameters(); @@ -147,7 +146,6 @@ class ResetButtonLogic extends BaseGetXController{ @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); } diff --git a/lib/main/lockDetail/lockSet/resetButton/resetButton_page.dart b/lib/main/lockDetail/lockSet/resetButton/resetButton_page.dart index 936adeec..b810e956 100755 --- a/lib/main/lockDetail/lockSet/resetButton/resetButton_page.dart +++ b/lib/main/lockDetail/lockSet/resetButton/resetButton_page.dart @@ -1,15 +1,16 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import '../../../../flavors.dart'; +import 'package:star_lock/main/lockDetail/lockSet/resetButton/resetButton_state.dart'; import '../../../../app_settings/app_colors.dart'; +import '../../../../flavors.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'resetButton_logic.dart'; class ResetButtonPage extends StatefulWidget { @@ -20,32 +21,32 @@ class ResetButtonPage extends StatefulWidget { } class _ResetButtonPageState extends State with RouteAware { - final logic = Get.put(ResetButtonLogic()); - final state = Get.find().state; + final ResetButtonLogic logic = Get.put(ResetButtonLogic()); + final ResetButtonState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.resetButton!.tr, + barTitle: '重置键'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( padding: EdgeInsets.all(30.w), child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ if (F.isSKY) Text( - TranslationLoader.lanKeys!.resetButtonTip1!.tr, + '开启后,锁被撬动时,会发出报警声'.tr, style: TextStyle(fontSize: 20.sp), ) else @@ -57,7 +58,7 @@ class _ResetButtonPageState extends State with RouteAware { height: 10.h, ), Text( - TranslationLoader.lanKeys!.resetButtonTip2!.tr, + '关闭后,重置键无效,锁要通过app删除后才能重新添加'.tr, style: TextStyle(fontSize: 20.sp), ) ], @@ -69,10 +70,10 @@ class _ResetButtonPageState extends State with RouteAware { ), Obx(() => Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - "${TranslationLoader.lanKeys!.currentMode!.tr} : ${state.resetButtonEnable.value == 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr}", + "${"当前模式".tr} : ${state.resetButtonEnable.value == 1 ? '已开启'.tr : '已关闭'.tr}", style: TextStyle( fontWeight: FontWeight.w600, fontSize: 20.sp), )), @@ -83,8 +84,8 @@ class _ResetButtonPageState extends State with RouteAware { ), Obx(() => SubmitBtn( btnName: state.resetButtonEnable.value == 1 - ? TranslationLoader.lanKeys!.close!.tr - : TranslationLoader.lanKeys!.open!.tr, + ? '关闭'.tr + : '开启'.tr, borderRadius: 20.w, fontSize: 32.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), @@ -92,10 +93,9 @@ class _ResetButtonPageState extends State with RouteAware { onClick: () { // showDeletAlertTipDialog(context); ShowTipView().showIosTipWithContentDialog( - '确定要${state.resetButtonEnable.value == 1 ? TranslationLoader.lanKeys!.close!.tr : TranslationLoader.lanKeys!.open!.tr}重置键?', - () { - logic.sendBurglarAlarm(); - }); + state.resetButtonEnable.value == 1 ? '确定要关闭重置键?'.tr : '确定要开启重置键?'.tr, + // '确定要${state.resetButtonEnable.value == 1 ? '关闭'.tr : '开启'.tr}重置键?', + logic.sendBurglarAlarm); })), ], ), @@ -104,7 +104,6 @@ class _ResetButtonPageState extends State with RouteAware { @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -113,7 +112,6 @@ class _ResetButtonPageState extends State with RouteAware { @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); @@ -131,7 +129,9 @@ class _ResetButtonPageState extends State with RouteAware { void didPop() { super.didPop(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; state.sureBtnState.value = 0; } @@ -148,7 +148,9 @@ class _ResetButtonPageState extends State with RouteAware { void didPushNext() { super.didPushNext(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; state.sureBtnState.value = 0; } diff --git a/lib/main/lockDetail/lockSet/resetButton/resetButton_state.dart b/lib/main/lockDetail/lockSet/resetButton/resetButton_state.dart index 9fae5267..503f27c2 100755 --- a/lib/main/lockDetail/lockSet/resetButton/resetButton_state.dart +++ b/lib/main/lockDetail/lockSet/resetButton/resetButton_state.dart @@ -3,19 +3,19 @@ import 'package:get/get.dart'; import '../lockSet/lockSetInfo_entity.dart'; -class ResetButtonState{ - var lockSetInfoData = LockSetInfoData().obs; - - var resetButtonEnable = 1.obs; - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) +class ResetButtonState{// 0普通状态(可用) 1连接中(不可用) ResetButtonState() { var map = Get.arguments; - lockSetInfoData.value = map["lockSetInfoData"]; + lockSetInfoData.value = map['lockSetInfoData']; resetButtonEnable.value = lockSetInfoData.value.lockSettingInfo!.resetSwitch!; } + Rx lockSetInfoData = LockSetInfoData().obs; + + RxInt resetButtonEnable = 1.obs; + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; } diff --git a/lib/main/lockDetail/lockSet/unlockQRCode/unlockQRCode_page.dart b/lib/main/lockDetail/lockSet/unlockQRCode/unlockQRCode_page.dart index c39faa38..254c857e 100755 --- a/lib/main/lockDetail/lockSet/unlockQRCode/unlockQRCode_page.dart +++ b/lib/main/lockDetail/lockSet/unlockQRCode/unlockQRCode_page.dart @@ -1,12 +1,12 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:qr_flutter/qr_flutter.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; -import 'package:qr_flutter/qr_flutter.dart'; class UnlockQRCodePage extends StatefulWidget { const UnlockQRCodePage({Key? key}) : super(key: key); @@ -21,7 +21,7 @@ class _UnlockQRCodePageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.unlockQRCode!.tr, + barTitle: '微信二维码'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -34,7 +34,7 @@ class _UnlockQRCodePageState extends State { borderRadius: BorderRadius.all(Radius.circular(10.h)), ), child: Text( - "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边", + '拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边'.tr, style: TextStyle(fontSize: 20.sp), )), Container( diff --git a/lib/main/lockDetail/lockSet/uploadData/uploadData_logic.dart b/lib/main/lockDetail/lockSet/uploadData/uploadData_logic.dart index 41473423..3fea8596 100644 --- a/lib/main/lockDetail/lockSet/uploadData/uploadData_logic.dart +++ b/lib/main/lockDetail/lockSet/uploadData/uploadData_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; import 'package:star_lock/blue/io_protocol/io_updataLockRemoteControlList.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -724,7 +725,7 @@ class UploadDataLogic extends BaseGetXController{ // 1设置 state.indexCount.value = 0; state.sureBtnState.value = 0; - showToast('上传成功'); + showToast('上传成功'.tr); }else{ // 2开门方式 switch(recordType){ diff --git a/lib/main/lockDetail/lockSet/uploadData/uploadData_page.dart b/lib/main/lockDetail/lockSet/uploadData/uploadData_page.dart index 7426a9ef..5d3686d1 100755 --- a/lib/main/lockDetail/lockSet/uploadData/uploadData_page.dart +++ b/lib/main/lockDetail/lockSet/uploadData/uploadData_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -8,7 +9,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'uploadData_logic.dart'; class UploadDataPage extends StatefulWidget { @@ -26,7 +26,11 @@ class _UploadDataPageState extends State with RouteAware{ Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: TitleAppBar(barTitle: TranslationLoader.lanKeys!.uploadData!.tr, haveBack:true, backgroundColor: AppColors.mainColor), + appBar: TitleAppBar( + barTitle: '上传数据'.tr, + haveBack:true, + backgroundColor: AppColors.mainColor + ), body:Container( padding: EdgeInsets.all(30.w), child: Column( @@ -34,11 +38,11 @@ class _UploadDataPageState extends State with RouteAware{ Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Expanded(child: Text(TranslationLoader.lanKeys!.uploadDataTip!.tr, style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor),)), + Expanded(child: Text('本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待'.tr, style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor),)), ], ), SizedBox(height: 30.h,), - Obx(() => SubmitBtn(btnName: state.indexCount.value == 0 ? TranslationLoader.lanKeys!.begin!.tr : '${TranslationLoader.lanKeys!.begin!.tr}(${state.indexCount.value}/7)', + Obx(() => SubmitBtn(btnName: state.indexCount.value == 0 ? '开始'.tr : '${'开始'.tr}(${state.indexCount.value}/7)', borderRadius: 20.w, fontSize: 24.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), diff --git a/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboard/addWirelessKeyboard_page.dart b/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboard/addWirelessKeyboard_page.dart index 32e05b3a..15e092c0 100755 --- a/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboard/addWirelessKeyboard_page.dart +++ b/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboard/addWirelessKeyboard_page.dart @@ -6,7 +6,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class AddWirelessKeyboardPage extends StatefulWidget { const AddWirelessKeyboardPage({Key? key}) : super(key: key); @@ -36,7 +35,7 @@ class _AddWirelessKeyboardPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - TranslationLoader.lanKeys!.lightTouchScreen!.tr, + '摸亮触摸屏'.tr, style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), ), ], @@ -56,7 +55,7 @@ class _AddWirelessKeyboardPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - TranslationLoader.lanKeys!.whenScreenFlashesClickNext!.tr, + '当屏幕闪烁时,点击下一步'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), ), @@ -68,7 +67,7 @@ class _AddWirelessKeyboardPageState extends State { Container( margin: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () { Navigator.pushNamed( context, Routers.selectWirelessKeyboardPage); @@ -90,8 +89,4 @@ class _AddWirelessKeyboardPageState extends State { ), ); } - - void onShow() {} - - void onHide() {} } diff --git a/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboardScreenNotLightOn/addWirelessKeyboardScreenNotLightOn_page.dart b/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboardScreenNotLightOn/addWirelessKeyboardScreenNotLightOn_page.dart index de13ec84..33eeec95 100755 --- a/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboardScreenNotLightOn/addWirelessKeyboardScreenNotLightOn_page.dart +++ b/lib/main/lockDetail/lockSet/wirelessKeyboard/addWirelessKeyboardScreenNotLightOn/addWirelessKeyboardScreenNotLightOn_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -6,7 +7,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class AddWirelessKeyboardScreenNotLightOnPage extends StatefulWidget { const AddWirelessKeyboardScreenNotLightOnPage({Key? key}) : super(key: key); @@ -37,7 +37,7 @@ class _AddWirelessKeyboardScreenNotLightOnPageState mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - TranslationLoader.lanKeys!.enterNumberOrPressSet!.tr, + '输入*529#或按设置键'.tr, style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), ), ], @@ -49,7 +49,7 @@ class _AddWirelessKeyboardScreenNotLightOnPageState mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - "(${TranslationLoader.lanKeys!.theLocationOfTheSetKeyWillBeDifferent!.tr})", + '(${'设置键的位置会有差异'.tr})', style: TextStyle(fontSize: 20.sp), ), ], @@ -69,7 +69,7 @@ class _AddWirelessKeyboardScreenNotLightOnPageState mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - TranslationLoader.lanKeys!.whenScreenFlashesClickNext!.tr, + '当屏幕闪烁时,点击下一步'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), ), @@ -81,7 +81,7 @@ class _AddWirelessKeyboardScreenNotLightOnPageState Container( margin: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () { Navigator.pushNamed( context, Routers.selectWirelessKeyboardPage); @@ -91,8 +91,4 @@ class _AddWirelessKeyboardScreenNotLightOnPageState ), ); } - - void onShow() {} - - void onHide() {} } diff --git a/lib/main/lockDetail/lockSet/wirelessKeyboard/selectWirelessKeyboard/selectWirelessKeyboard_page.dart b/lib/main/lockDetail/lockSet/wirelessKeyboard/selectWirelessKeyboard/selectWirelessKeyboard_page.dart index 1919e78d..b81f18cc 100755 --- a/lib/main/lockDetail/lockSet/wirelessKeyboard/selectWirelessKeyboard/selectWirelessKeyboard_page.dart +++ b/lib/main/lockDetail/lockSet/wirelessKeyboard/selectWirelessKeyboard/selectWirelessKeyboard_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -5,7 +6,6 @@ import 'package:star_lock/tools/noData.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class SelectWirelessKeyboardPage extends StatefulWidget { const SelectWirelessKeyboardPage({Key? key}) : super(key: key); @@ -22,8 +22,7 @@ class _SelectWirelessKeyboardPageState extends State return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: - "${TranslationLoader.lanKeys!.select!.tr}${TranslationLoader.lanKeys!.wirelessKeyboard!.tr}", + barTitle: '选择无线键盘'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: dataList.isEmpty @@ -31,8 +30,7 @@ class _SelectWirelessKeyboardPageState extends State : ListView.builder( itemCount: 20, itemBuilder: (c, index) { - return nearbyLockItem('images/icon_lock.png', "MCBN01-ea9240", - () { + return nearbyLockItem('images/icon_lock.png', '', () { // Navigator.pushNamed(context, Routers.saveLockPage); }); }), diff --git a/lib/main/lockDetail/lockSet/wirelessKeyboard/wirelessKeyboardList/wirelessKeyboard_page.dart b/lib/main/lockDetail/lockSet/wirelessKeyboard/wirelessKeyboardList/wirelessKeyboard_page.dart index 031883ad..f206a3bc 100755 --- a/lib/main/lockDetail/lockSet/wirelessKeyboard/wirelessKeyboardList/wirelessKeyboard_page.dart +++ b/lib/main/lockDetail/lockSet/wirelessKeyboard/wirelessKeyboardList/wirelessKeyboard_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -9,7 +10,6 @@ import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class WirelessKeyboardPage extends StatefulWidget { const WirelessKeyboardPage({Key? key}) : super(key: key); @@ -26,7 +26,7 @@ class _WirelessKeyboardPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.wirelessKeyboard!.tr, + barTitle:'无线键盘'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -68,8 +68,8 @@ class _WirelessKeyboardPageState extends State { : ListView.builder( itemCount: 10, itemBuilder: (c, index) { - return _electronicKeyItem('images/icon_password.png', "张三", - "2023.6.21 11.15", "2023.6.21 11.15", () { + return _electronicKeyItem('images/icon_password.png', '张三', + '2023.6.21 11.15', '2023.6.21 11.15', () { // Navigator.pushNamed(context, Routers.electronicKeyDetailPage); }); }); @@ -123,7 +123,7 @@ class _WirelessKeyboardPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - "2023.6.21 11.15", + '2023.6.21 11.15', style: TextStyle( fontSize: 18.sp, color: AppColors.placeholderTextColor), @@ -147,7 +147,7 @@ class _WirelessKeyboardPageState extends State { context: Get.context!, builder: (context) { return CupertinoAlertDialog( - title: const Text('该锁的无线键盘都将被删除'), + title: Text('该锁的无线键盘都将被删除'.tr), actions: [ CupertinoDialogAction( child: Text('取消'.tr), diff --git a/lib/main/lockDetail/messageWarn/addFamily/addFamily_logic.dart b/lib/main/lockDetail/messageWarn/addFamily/addFamily_logic.dart index 988ef2a0..7b0a961a 100755 --- a/lib/main/lockDetail/messageWarn/addFamily/addFamily_logic.dart +++ b/lib/main/lockDetail/messageWarn/addFamily/addFamily_logic.dart @@ -157,15 +157,15 @@ class AddFamilyLogic extends BaseGetXController { final int keyType = state.familyData.value.settingValue!.openDoorType!; switch (keyType) { case 1: - return '电子钥匙'; + return '电子钥匙'.tr; case 2: - return '密码'; + return '密码'.tr; case 3: - return '指纹'; + return '指纹'.tr; case 4: - return '卡'; + return '卡'.tr; case 5: - return '人脸'; + return '人脸'.tr; default: return ''; } diff --git a/lib/main/lockDetail/messageWarn/addFamily/addFamily_page.dart b/lib/main/lockDetail/messageWarn/addFamily/addFamily_page.dart index b458cc18..aa28cff9 100755 --- a/lib/main/lockDetail/messageWarn/addFamily/addFamily_page.dart +++ b/lib/main/lockDetail/messageWarn/addFamily/addFamily_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -11,7 +12,6 @@ import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/showTFView.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; diff --git a/lib/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart b/lib/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart index 39f29f61..e9d163d0 100755 --- a/lib/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart +++ b/lib/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart @@ -1,8 +1,4 @@ class LockUserEntity { - int? errorCode; - String? description; - String? errorMsg; - List? data; LockUserEntity({this.errorCode, this.description, this.errorMsg, this.data}); @@ -17,6 +13,10 @@ class LockUserEntity { }); } } + int? errorCode; + String? description; + String? errorMsg; + List? data; Map toJson() { final Map data = {}; @@ -31,9 +31,6 @@ class LockUserEntity { } class LockUserData { - int? openLockType; - String? openLockTypeName; - List? lockUserList; LockUserData({this.openLockType, this.openLockTypeName, this.lockUserList}); @@ -47,6 +44,9 @@ class LockUserData { }); } } + int? openLockType; + String? openLockTypeName; + List? lockUserList; Map toJson() { final Map data = {}; @@ -59,64 +59,7 @@ class LockUserData { } } -class LockUserListKeys { - int? id; - String? clientId; - int? lockOwnerId; - int? apiUserId; - int? lockId; - // int? senderUserId; - // int? receiverUsernameType; - String? keyName; - int? keyType; - int? startDate; - int? endDate; - List? weekDays; - String? remarks; - int? remoteEnable; - int? isCameraEnable; - int? faceAuthentication; - int? lastFaceValidateTime; - int? keyRight; - int? remoteUnlockSwitch; - int? userType; - int? keyStatus; - int? groupId; - int? lockUserNo; - int? businessId; - String? createdAt; - String? updatedAt; - int? isOnlyManageSelf; - UserInfo? userInfo; - UserInfo? userSender; - int? keyboardPwdType; - int? fingerprintType; - int? cardType; - int? faceType; - int? keyboardPwdStatus; - String? keyboardPwdName; - String? fingerprintName; - String? cardName; - String? faceName; - String? keyboardPwd; - String? keyboardPwdHash; - int? addType; - int? pwdRight; - int? isCustom; - int? isCoerced; - int? hoursStart; - int? hoursEnd; - int? pwdUserNo; - String? senderUsername; - int? keyboardPwdId; - int? sendDate; - int? currentKeyType; //当前钥匙类型 1:电子钥匙 2:密码钥匙 3:指纹钥匙 4:卡钥匙 5:人脸钥匙 - String? currentKeyTypeStr; //当前钥匙类型名称 - String? currentTypeImg; //当前钥匙类型图片 - String? currentKeyName; //当前钥匙名称 - bool? isCurrentSelect; //当前是否选中 - int? currentDateType; //钥匙日期类型 1:永久 2:限期 3:单次 4:循环 - int? currentOpenDoorID; //当前开门ID +class LockUserListKeys { //当前开门ID LockUserListKeys( {this.id, @@ -242,6 +185,63 @@ class LockUserListKeys { isCurrentSelect = json['isCurrentSelect']; currentDateType = json['currentDateType']; } + int? id; + String? clientId; + int? lockOwnerId; + int? apiUserId; + int? lockId; + // int? senderUserId; + // int? receiverUsernameType; + String? keyName; + int? keyType; + int? startDate; + int? endDate; + List? weekDays; + String? remarks; + int? remoteEnable; + int? isCameraEnable; + int? faceAuthentication; + int? lastFaceValidateTime; + int? keyRight; + int? remoteUnlockSwitch; + int? userType; + int? keyStatus; + int? groupId; + int? lockUserNo; + int? businessId; + String? createdAt; + String? updatedAt; + int? isOnlyManageSelf; + UserInfo? userInfo; + UserInfo? userSender; + int? keyboardPwdType; + int? fingerprintType; + int? cardType; + int? faceType; + int? keyboardPwdStatus; + String? keyboardPwdName; + String? fingerprintName; + String? cardName; + String? faceName; + String? keyboardPwd; + String? keyboardPwdHash; + int? addType; + int? pwdRight; + int? isCustom; + int? isCoerced; + int? hoursStart; + int? hoursEnd; + int? pwdUserNo; + String? senderUsername; + int? keyboardPwdId; + int? sendDate; + int? currentKeyType; //当前钥匙类型 1:电子钥匙 2:密码钥匙 3:指纹钥匙 4:卡钥匙 5:人脸钥匙 + String? currentKeyTypeStr; //当前钥匙类型名称 + String? currentTypeImg; //当前钥匙类型图片 + String? currentKeyName; //当前钥匙名称 + bool? isCurrentSelect; //当前是否选中 + int? currentDateType; //钥匙日期类型 1:永久 2:限期 3:单次 4:循环 + int? currentOpenDoorID; Map toJson() { final Map data = {}; @@ -314,15 +314,6 @@ class LockUserListKeys { } class UserInfo { - int? id; - String? clientId; - String? username; - String? accountName; - String? businessQueryStr; - String? password; - int? date; - String? createdAt; - String? updatedAt; UserInfo( {this.id, @@ -346,6 +337,15 @@ class UserInfo { createdAt = json['created_at']; updatedAt = json['updated_at']; } + int? id; + String? clientId; + String? username; + String? accountName; + String? businessQueryStr; + String? password; + int? date; + String? createdAt; + String? updatedAt; Map toJson() { final Map data = {}; diff --git a/lib/main/lockDetail/messageWarn/lockUser/lockUser_logic.dart b/lib/main/lockDetail/messageWarn/lockUser/lockUser_logic.dart index 54060f5d..5fd49b83 100755 --- a/lib/main/lockDetail/messageWarn/lockUser/lockUser_logic.dart +++ b/lib/main/lockDetail/messageWarn/lockUser/lockUser_logic.dart @@ -1,8 +1,8 @@ + import 'package:get/get.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_state.dart'; -import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/dateTool.dart'; @@ -160,62 +160,62 @@ class LockUserLogic extends BaseGetXController { case 3: //限期 3 在开始和结束时间内有效,必需在开始时间24小时内使用一次,否则将失效 useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)} - ${endDateStr.toLocal().toString().substring(0, 16)} ${"限时".tr} ${itemData.isCustom! == 1 ? "自定义".tr : ""}'; + '${startDateStr.toLocal().toString().substring(0, 16)} - ${endDateStr.toLocal().toString().substring(0, 16)} ${'限时'.tr} ${itemData.isCustom! == 1 ? "自定义".tr : ""}'; break; case 4: //删除 4 在锁上使用后会删除之前在锁上使用过的密码 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"清空码".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'清空码'.tr}'; break; case 5: //周未循环 5 在周未开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周末".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周末'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 6: //每日循环 6 每天开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"每日".tr}$starHour:00-$endHour:00 ${"循环"}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'每日'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 7: //工作日循环 7 工作日开始和结束时间指定的时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"工作日".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'工作日'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 8: //周一循环 8 每周一开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周一".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周一'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 9: //周二循环 9 每周二开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周二".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周二'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 10: //周三循环 10 每周三开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周三".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周三'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 11: //周四循环 11 每周四开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周四".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周四'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 12: //周五循环 12 每周五开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周五".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周五'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 13: //周六循环 13 每周六开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周六".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周六'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 14: //周天循环 14 每周日开始和结束时间指定时间段内有效 useDateStr = - '${endDateStr.toLocal().toString().substring(0, 16)} ${"周日".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + '${endDateStr.toLocal().toString().substring(0, 16)} ${'周日'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; default: diff --git a/lib/main/lockDetail/messageWarn/lockUser/lockUser_page.dart b/lib/main/lockDetail/messageWarn/lockUser/lockUser_page.dart index b86eaa89..285b6459 100755 --- a/lib/main/lockDetail/messageWarn/lockUser/lockUser_page.dart +++ b/lib/main/lockDetail/messageWarn/lockUser/lockUser_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart index a8060112..aa4c2c47 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificationMode_data.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -10,7 +11,7 @@ class CoerceFingerprintLogic extends BaseGetXController { //添加胁迫开门通知 void addLockNoticeSetting() async { - var entity = await ApiRepository.to.addLockNoticeSetting( + final MsgNotificationEntity entity = await ApiRepository.to.addLockNoticeSetting( lockId: state.getLockId.value, noticeType: 20, settingValue: { @@ -30,8 +31,8 @@ class CoerceFingerprintLogic extends BaseGetXController { } //删除开门通知 - void deleteLockNoticeSetting() async { - var entity = await ApiRepository.to.deleteLockNoticeSettingAccount( + Future deleteLockNoticeSetting() async { + final entity = await ApiRepository.to.deleteLockNoticeSettingAccount( lockNoticeSettingAccountId: state.familyData.value.id!, ); if (entity.errorCode!.codeIsSuccessful) { @@ -42,14 +43,14 @@ class CoerceFingerprintLogic extends BaseGetXController { //获取到家人信息的请求数组 List getEmailAndSMSAccountList(bool isEmail) { - List list = []; + final List list = []; List accountList = []; isEmail ? accountList = state.emailReceiverList.value : accountList = state.phoneReceiverList.value; for (int i = 0; i < accountList.length; i++) { - MsgNoticeModeData item = accountList[i]; - Map map = {}; + final MsgNoticeModeData item = accountList[i]; + final Map map = {}; map['countryCode'] = isEmail ? 0 : item.countryCode; map['account'] = isEmail ? item.receiveEmail : item.receivePhone; list.add(map); @@ -61,9 +62,9 @@ class CoerceFingerprintLogic extends BaseGetXController { String emailListStr = ''; if (val['emailReceiverList'] != null) { state.emailReceiverList.value = val['emailReceiverList']; - List emailReceiverList = state.emailReceiverList.value; + final List emailReceiverList = state.emailReceiverList.value; for (int i = 0; i < emailReceiverList.length; i++) { - MsgNoticeModeData item = emailReceiverList[i]; + final MsgNoticeModeData item = emailReceiverList[i]; emailListStr += item.receiveEmail; // 检查是否为最后一个元素 if (i < emailReceiverList.length - 1) { @@ -79,9 +80,9 @@ class CoerceFingerprintLogic extends BaseGetXController { if (val['phoneReceiverList'] != null) { state.phoneReceiverList.value = val['phoneReceiverList']; - List phoneReceiverList = state.phoneReceiverList.value; + final List phoneReceiverList = state.phoneReceiverList.value; for (int i = 0; i < phoneReceiverList.length; i++) { - MsgNoticeModeData item = phoneReceiverList[i]; + final MsgNoticeModeData item = phoneReceiverList[i]; phoneListStr += item.receivePhone; // 检查是否为最后一个元素 if (i < phoneReceiverList.length - 1) { @@ -105,8 +106,8 @@ class CoerceFingerprintLogic extends BaseGetXController { //根据列表返回值得到邮箱、手机列表 Map> getAccountsMap() { - List mailAccounts = []; - List smsAccounts = []; + final List mailAccounts = []; + final List smsAccounts = []; if (state.familyData.value.settingValue != null) { for (NoticeWay item @@ -114,7 +115,7 @@ class CoerceFingerprintLogic extends BaseGetXController { if (item.type == 'mail' && item.accounts != null) { for (Accounts account in item.accounts!) { if (account.account != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receiveEmail = account.account!; mailAccounts.add(msgNoticeModeData); } @@ -122,7 +123,7 @@ class CoerceFingerprintLogic extends BaseGetXController { } else if (item.type == 'sms' && item.accounts != null) { for (Accounts account in item.accounts!) { if (account.account != null && account.countryCode != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receivePhone = account.account!; msgNoticeModeData.countryCode = account.countryCode!; smsAccounts.add(msgNoticeModeData); diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart index 7f2918c0..a720af2c 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart @@ -1,10 +1,13 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_logic.dart'; -import 'package:star_lock/tools/showCupertinoAlertView.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; import 'package:star_lock/tools/commonItem.dart'; +import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/submitBtn.dart'; @@ -19,8 +22,8 @@ class CoerceFingerprintPage extends StatefulWidget { } class _CoerceFingerprintPageState extends State { - final logic = Get.put(CoerceFingerprintLogic()); - final state = Get.find().state; + final CoerceFingerprintLogic logic = Get.put(CoerceFingerprintLogic()); + final CoerceFingerprintState state = Get.find().state; @override Widget build(BuildContext context) { @@ -33,7 +36,7 @@ class _CoerceFingerprintPageState extends State { body: Container( padding: EdgeInsets.all(30.w), child: Column( - children: [ + children: [ Obx(() => CommonItem( leftTitel: '胁迫指纹'.tr, rightTitle: state.isDetail.value == true @@ -44,7 +47,7 @@ class _CoerceFingerprintPageState extends State { action: () { //锁用户 Get.toNamed(Routers.coerceFingerprintListPage, - arguments: {'lockId': state.getLockId.value}) + arguments: {'lockId': state.getLockId.value}) ?.then((val) { if (val != null) { state.fingerprintData.value = val; @@ -59,11 +62,11 @@ class _CoerceFingerprintPageState extends State { color: Colors.white, margin: EdgeInsets.only(bottom: 10.h), child: Column( - children: [ + children: [ GestureDetector( onTap: () { Get.toNamed(Routers.notificationModePage, - arguments: {'familyData': state.familyData.value}) + arguments: {'familyData': state.familyData.value}) ?.then((val) { if (val != null) { state.emailListStr.value = logic.getEmailListStr(val); @@ -75,10 +78,10 @@ class _CoerceFingerprintPageState extends State { color: Colors.white, margin: EdgeInsets.only(bottom: 10.h), child: Column( - children: [ + children: [ CommonItem( leftTitel: '提醒方式'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: false, isHaveRightWidget: false, isHaveDirection: true, @@ -110,7 +113,7 @@ class _CoerceFingerprintPageState extends State { : logic.checkBtnDisable(), isDelete: state.isDetail.value, onClick: () async { - var isVip = await Storage.getBool(saveIsVip); + bool? isVip = await Storage.getBool(saveIsVip); if (isVip == true) { if (state.isDetail.value) { logic.deleteLockNoticeSetting(); @@ -141,7 +144,7 @@ class _CoerceFingerprintPageState extends State { borderRadius: BorderRadius.circular(6.0.w), ), child: Row( - children: [ + children: [ Text( notifyTitle, style: TextStyle(color: Colors.black, fontSize: 20.sp), diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart index 97ca0573..eb468a02 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_state.dart @@ -3,17 +3,6 @@ import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpen import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; class CoerceFingerprintState { - var pageNum = 1.obs; //请求页码 - final pageSize = 20.obs; //请求每页数据条数 - final itemDataList = [].obs; - var getLockId = 0.obs; - var fingerprintData = CoerceFingerprintItemData().obs; - var emailReceiverList = [].obs; - var phoneReceiverList = [].obs; - var emailListStr = ''.obs; - var phontListStr = ''.obs; - var isDetail = false.obs; - var familyData = DataList().obs; CoerceFingerprintState() { Map map = Get.arguments; @@ -29,4 +18,15 @@ class CoerceFingerprintState { familyData.value = map['itemData']; } } + RxInt pageNum = 1.obs; //请求页码 + final RxInt pageSize = 20.obs; //请求每页数据条数 + final RxList itemDataList = [].obs; + RxInt getLockId = 0.obs; + Rx fingerprintData = CoerceFingerprintItemData().obs; + RxList emailReceiverList = [].obs; + RxList phoneReceiverList = [].obs; + RxString emailListStr = ''.obs; + RxString phontListStr = ''.obs; + RxBool isDetail = false.obs; + Rx familyData = DataList().obs; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_state.dart index 97c6c736..d8bfa05a 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_state.dart @@ -1,13 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class CoerceFingerprintListState { - TextEditingController searchController = TextEditingController(); //邮箱/手机号输入框 - var isSelectIndex = 0.obs; - var getLockId = 0.obs; - var fingerprintList = [].obs; //指纹列表 - var pageNum = 1.obs; //请求页码 - var pageSize = 20.obs; //请求每页数据条数 +class CoerceFingerprintListState { //请求每页数据条数 CoerceFingerprintListState() { Map map = Get.arguments; @@ -15,4 +9,10 @@ class CoerceFingerprintListState { getLockId.value = map['lockId']; } } + TextEditingController searchController = TextEditingController(); //邮箱/手机号输入框 + RxInt isSelectIndex = 0.obs; + RxInt getLockId = 0.obs; + RxList fingerprintList = [].obs; //指纹列表 + RxInt pageNum = 1.obs; //请求页码 + RxInt pageSize = 20.obs; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart index 9302a21a..e646ffb2 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_logic.dart @@ -1,3 +1,4 @@ +import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -24,15 +25,15 @@ class CoerceOpenDoorLogic extends BaseGetXController { int keyType = itemData.settingValue!.openDoorType!; switch (keyType) { case 1: - return '电子钥匙'; + return '电子钥匙'.tr; case 2: - return '密码'; + return '密码'.tr; case 3: - return '指纹'; + return '指纹'.tr; case 4: - return '卡'; + return '卡'.tr; case 5: - return '人脸'; + return '人脸'.tr; default: return ''; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart index a7f88a61..33d0eeeb 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; import 'package:star_lock/tools/noData.dart'; @@ -18,8 +19,8 @@ class CoerceOpenDoorPage extends StatefulWidget { } class _CoerceOpenDoorPageState extends State { - final logic = Get.put(CoerceOpenDoorLogic()); - final state = Get.find().state; + final CoerceOpenDoorLogic logic = Get.put(CoerceOpenDoorLogic()); + final CoerceOpenDoorState state = Get.find().state; @override void initState() { @@ -38,7 +39,7 @@ class _CoerceOpenDoorPageState extends State { backgroundColor: AppColors.mainColor, ), body: Column( - children: [ + children: [ _topTipsWidget(), SizedBox( height: 20.h, @@ -50,7 +51,7 @@ class _CoerceOpenDoorPageState extends State { AddBottomWhiteBtn( btnName: '胁迫指纹'.tr, onClick: () { - Get.toNamed(Routers.coerceFingerprintPage, arguments: { + Get.toNamed(Routers.coerceFingerprintPage, arguments: { 'lockId': state.getLockId.value, 'isDetail': false, })?.then((value) { @@ -81,7 +82,7 @@ class _CoerceOpenDoorPageState extends State { return ListView.separated( shrinkWrap: true, itemCount: state.itemDataList.length, - itemBuilder: (c, index) { + itemBuilder: (BuildContext c, int index) { return _electronicKeyItem(state.itemDataList.value[index]); }, separatorBuilder: (BuildContext context, int index) { @@ -96,7 +97,7 @@ class _CoerceOpenDoorPageState extends State { Widget _electronicKeyItem(DataList itemData) { return GestureDetector( onTap: () { - Get.toNamed(Routers.coerceFingerprintPage, arguments: { + Get.toNamed(Routers.coerceFingerprintPage, arguments: { 'itemData': itemData, 'lockId': state.getLockId.value, 'isDetail': true @@ -110,7 +111,7 @@ class _CoerceOpenDoorPageState extends State { color: Colors.white, height: 90.h, child: Row( - children: [ + children: [ SizedBox( width: 30.w, ), @@ -125,9 +126,9 @@ class _CoerceOpenDoorPageState extends State { Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ Row( - children: [ + children: [ Text( itemData.settingValue!.remark ?? '', style: TextStyle( @@ -143,7 +144,7 @@ class _CoerceOpenDoorPageState extends State { SizedBox(height: 10.h), Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Text( logic.getKeyTypeStr(itemData), style: TextStyle( diff --git a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart index 0f505db1..998f4f47 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceOpenDoor/coerceOpenDoor_state.dart @@ -1,10 +1,6 @@ import 'package:get/get.dart'; class CoerceOpenDoorState { - var pageNum = 1.obs; //请求页码 - final pageSize = 20.obs; //请求每页数据条数 - final itemDataList = [].obs; - var getLockId = 0.obs; CoerceOpenDoorState() { Map map = Get.arguments; @@ -12,4 +8,8 @@ class CoerceOpenDoorState { getLockId.value = map['lockId']; } } + RxInt pageNum = 1.obs; //请求页码 + final RxInt pageSize = 20.obs; //请求每页数据条数 + final RxList itemDataList = [].obs; + RxInt getLockId = 0.obs; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart b/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart index aa76671c..6b872136 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_logic.dart @@ -1,3 +1,4 @@ + import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificationMode_data.dart'; @@ -9,13 +10,13 @@ import 'lowBatteryReminder_state.dart'; class LowBatteryReminderLogic extends BaseGetXController { LowBatteryReminderState state = LowBatteryReminderState(); - void lockNoticeSettingAccountList() async { - var entity = await ApiRepository.to.updatelowElecNoticeStateSetting( + Future lockNoticeSettingAccountList() async { + final OpenDoorNotifyEntity entity = await ApiRepository.to.updatelowElecNoticeStateSetting( lockId: state.getLockId.value, lowElecNoticeState: state.isLowBatteryNotify.value == true ? 1 : 0, lowElecNoticeWayList: [ - {'type': 'mail', 'accounts': getEmailAndSMSAccountList(true)}, - {'type': 'sms', 'accounts': getEmailAndSMSAccountList(false)} + {'type': 'mail', 'accounts': getEmailAndSMSAccountList(true)}, + {'type': 'sms', 'accounts': getEmailAndSMSAccountList(false)} ]); if (entity.errorCode!.codeIsSuccessful) { showToast('设置成功'.tr); @@ -25,14 +26,14 @@ class LowBatteryReminderLogic extends BaseGetXController { //获取到家人信息的请求数组 List getEmailAndSMSAccountList(bool isEmail) { - List list = []; + final List list = []; List accountList = []; isEmail ? accountList = state.emailReceiverList.value : accountList = state.phoneReceiverList.value; for (int i = 0; i < accountList.length; i++) { - MsgNoticeModeData item = accountList[i]; - Map map = {}; + final MsgNoticeModeData item = accountList[i]; + final Map map = {}; map['countryCode'] = isEmail ? 0 : item.countryCode; map['account'] = isEmail ? item.receiveEmail : item.receivePhone; list.add(map); @@ -44,9 +45,9 @@ class LowBatteryReminderLogic extends BaseGetXController { String emailListStr = ''; if (val['emailReceiverList'] != null) { state.emailReceiverList.value = val['emailReceiverList']; - List emailReceiverList = state.emailReceiverList.value; + final List emailReceiverList = state.emailReceiverList.value; for (int i = 0; i < emailReceiverList.length; i++) { - MsgNoticeModeData item = emailReceiverList[i]; + final MsgNoticeModeData item = emailReceiverList[i]; emailListStr += item.receiveEmail; // 检查是否为最后一个元素 if (i < emailReceiverList.length - 1) { @@ -62,9 +63,9 @@ class LowBatteryReminderLogic extends BaseGetXController { if (val['phoneReceiverList'] != null) { state.phoneReceiverList.value = val['phoneReceiverList']; - List phoneReceiverList = state.phoneReceiverList.value; + final List phoneReceiverList = state.phoneReceiverList.value; for (int i = 0; i < phoneReceiverList.length; i++) { - MsgNoticeModeData item = phoneReceiverList[i]; + final MsgNoticeModeData item = phoneReceiverList[i]; phoneListStr += item.receivePhone; // 检查是否为最后一个元素 if (i < phoneReceiverList.length - 1) { @@ -77,23 +78,23 @@ class LowBatteryReminderLogic extends BaseGetXController { //根据列表返回值得到邮箱、手机列表 Map> getAccountsMap() { - List mailAccounts = []; - List smsAccounts = []; + final List mailAccounts = []; + final List smsAccounts = []; if (state.msgNoticeInfo.value.lowElecNoticeWayList != null) { - for (NoticeWay item in state.msgNoticeInfo.value.lowElecNoticeWayList!) { + for (final NoticeWay item in state.msgNoticeInfo.value.lowElecNoticeWayList!) { if (item.type == 'mail' && item.accounts != null) { - for (Accounts account in item.accounts!) { + for (final Accounts account in item.accounts!) { if (account.account != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receiveEmail = account.account!; mailAccounts.add(msgNoticeModeData); } } } else if (item.type == 'sms' && item.accounts != null) { - for (Accounts account in item.accounts!) { + for (final Accounts account in item.accounts!) { if (account.account != null && account.countryCode != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receivePhone = account.account!; msgNoticeModeData.countryCode = account.countryCode!; smsAccounts.add(msgNoticeModeData); @@ -103,7 +104,7 @@ class LowBatteryReminderLogic extends BaseGetXController { } } - return { + return >{ 'emailReceiverList': mailAccounts, 'phoneReceiverList': smsAccounts, }; diff --git a/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart index fad9a86d..49af205f 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_page.dart @@ -1,10 +1,13 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/tools/showCupertinoAlertView.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; import 'package:star_lock/tools/commonItem.dart'; +import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/submitBtn.dart'; @@ -20,8 +23,8 @@ class LowBatteryReminderPage extends StatefulWidget { } class _LowBatteryReminderPageState extends State { - final logic = Get.put(LowBatteryReminderLogic()); - final state = Get.find().state; + final LowBatteryReminderLogic logic = Get.put(LowBatteryReminderLogic()); + final LowBatteryReminderState state = Get.find().state; @override Widget build(BuildContext context) { @@ -35,14 +38,13 @@ class _LowBatteryReminderPageState extends State { child: Padding( padding: EdgeInsets.all(30.w), child: Column( - children: [ + children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( - "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。" - .tr, + '打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。'.tr, style: TextStyle( fontSize: 20.sp, color: AppColors.darkGrayTextColor, @@ -65,13 +67,13 @@ class _LowBatteryReminderPageState extends State { Visibility( visible: state.isLowBatteryNotify.value, child: Column( - children: [ + children: [ SizedBox( height: 20.h, ), GestureDetector( onTap: () { - Get.toNamed(Routers.notificationModePage, arguments: { + Get.toNamed(Routers.notificationModePage, arguments: { 'msgNoticeInfo': state.msgNoticeInfo.value, })?.then((val) { if (val != null) { @@ -86,10 +88,10 @@ class _LowBatteryReminderPageState extends State { color: Colors.white, margin: EdgeInsets.only(bottom: 10.h), child: Column( - children: [ + children: [ CommonItem( leftTitel: '提醒方式'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: false, isHaveRightWidget: false, isHaveDirection: true, @@ -116,7 +118,7 @@ class _LowBatteryReminderPageState extends State { SubmitBtn( btnName: '保存'.tr, onClick: () async { - var isVip = await Storage.getBool(saveIsVip); + bool? isVip = await Storage.getBool(saveIsVip); if (isVip == false) { ShowCupertinoAlertView().advancedFeatureAlert(); } else { @@ -144,7 +146,7 @@ class _LowBatteryReminderPageState extends State { borderRadius: BorderRadius.circular(6.0.w), ), child: Row( - children: [ + children: [ Text( notifyTitle, style: TextStyle(color: Colors.black, fontSize: 20.sp), @@ -173,7 +175,7 @@ class _LowBatteryReminderPageState extends State { trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, value: state.isLowBatteryNotify.value, - onChanged: (value) { + onChanged: (bool value) { setState(() { state.isLowBatteryNotify.value = value; }); diff --git a/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart index 6554ff81..ed6d3af5 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/lowBatteryReminder/lowBatteryReminder_state.dart @@ -1,18 +1,9 @@ + import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; class LowBatteryReminderState { - var isLowBatteryNotify = false.obs; // 是否低电量提醒 - - var getLockId = 0.obs; - var lockUserKeys = LockUserListKeys().obs; - var emailReceiverList = [].obs; - var phoneReceiverList = [].obs; - var emailListStr = ''.obs; - var phontListStr = ''.obs; - - var msgNoticeInfo = MsgNoticeData().obs; LowBatteryReminderState() { Map map = Get.arguments; @@ -22,8 +13,21 @@ class LowBatteryReminderState { if (map['lockSetInfoData'] != null) { msgNoticeInfo.value = map['lockSetInfoData']; - isLowBatteryNotify.value = - msgNoticeInfo.value.lowElecNoticeState == 1 ? true : false; + if (msgNoticeInfo.value.lowElecNoticeState == 1) { + isLowBatteryNotify.value = true; + } else { + isLowBatteryNotify.value = false; + } } } + RxBool isLowBatteryNotify = false.obs; // 是否低电量提醒 + + RxInt getLockId = 0.obs; + Rx lockUserKeys = LockUserListKeys().obs; + RxList emailReceiverList = [].obs; + RxList phoneReceiverList = [].obs; + RxString emailListStr = ''.obs; + RxString phontListStr = ''.obs; + + Rx msgNoticeInfo = MsgNoticeData().obs; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_logic.dart b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_logic.dart index 96ad0e36..b849808e 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_logic.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_logic.dart @@ -7,32 +7,53 @@ class MsgNotificationLogic extends BaseGetXController { final MsgNotificationState state = MsgNotificationState(); // 获取锁消息设置 - void getLockNoticeSetting() async { - MsgNotificationEntity entity = await ApiRepository.to.getLockNoticeSetting( + Future getLockNoticeSetting() async { + final MsgNotificationEntity entity = await ApiRepository.to.getLockNoticeSetting( lockId: state.getLockId.value, ); if (entity.errorCode!.codeIsSuccessful) { state.msgNoticeInfo.value = entity.data!; state.nDaysNotOpenDoor.value = entity.data!.dayNotOpenDoorState! == 0 ? state.notifyDisable - : state.notifyEnable; //N天未开门 - state.isDoorNotShut.value = - entity.data!.doorNotCloseState! == 0 ? false : true; //门未关好 - state.isTamperAlarm.value = - entity.data!.tamperAlarmState! == 0 ? false : true; //防拆报警 + : state.notifyEnable; + + //N天未开门 + if (entity.data!.doorNotCloseState! == 0) { + state.isDoorNotShut.value = false; + } else { + state.isDoorNotShut.value = true; + } + + //门未关好 + if (entity.data!.tamperAlarmState! == 0) { + state.isTamperAlarm.value = false; + } else { + state.isTamperAlarm.value = true; + } + + //防拆报警 state.isLowBattery.value = entity.data!.lowElecNoticeState! == 0 ? state.notifyDisable : state.notifyEnable; //低电量提醒 - state.isSomeoneRing.value = - entity.data!.doorbellNoticeState! == 0 ? false : true; //有人按门铃 - state.isSomeoneAppeared.value = - entity.data!.someoneAtDoorNoticeState! == 0 ? false : true; //有人出现在门口 + + if (entity.data!.doorbellNoticeState! == 0) { + state.isSomeoneRing.value = false; + } else { + state.isSomeoneRing.value = true; + } + + //有人按门铃 + if (entity.data!.someoneAtDoorNoticeState! == 0) { + state.isSomeoneAppeared.value = false; + } else { + state.isSomeoneAppeared.value = true; + } //有人出现在门口 } } //设置门未关好 - void updateDoorNotCloseSetting() async { - MsgNotificationEntity entity = + Future updateDoorNotCloseSetting() async { + final MsgNotificationEntity entity = await ApiRepository.to.updateDoorNotCloseSetting( lockId: state.getLockId.value, doorNotCloseState: state.isDoorNotShut.value ? 1 : 0, @@ -43,8 +64,8 @@ class MsgNotificationLogic extends BaseGetXController { } //有人按门铃 - void updateDoorbellNoticeStateSetting() async { - MsgNotificationEntity entity = + Future updateDoorbellNoticeStateSetting() async { + final MsgNotificationEntity entity = await ApiRepository.to.updateDoorbellNoticeStateSetting( lockId: state.getLockId.value, doorbellNoticeState: state.isSomeoneRing.value ? 1 : 0, @@ -55,8 +76,8 @@ class MsgNotificationLogic extends BaseGetXController { } //有人出现在门口 - void updateSomeoneAtDoorNoticeStateSetting() async { - MsgNotificationEntity entity = + Future updateSomeoneAtDoorNoticeStateSetting() async { + final MsgNotificationEntity entity = await ApiRepository.to.updateSomeoneAtDoorNoticeStateSetting( lockId: state.getLockId.value, someoneAtDoorNoticeState: state.isSomeoneAppeared.value ? 1 : 0, @@ -67,8 +88,8 @@ class MsgNotificationLogic extends BaseGetXController { } //设置防拆报警通知 - void updateTamperAlarmStateSetting() async { - MsgNotificationEntity entity = + Future updateTamperAlarmStateSetting() async { + final MsgNotificationEntity entity = await ApiRepository.to.updateTamperAlarmStateSetting( lockId: state.getLockId.value, tamperAlarmState: state.isTamperAlarm.value ? 1 : 0, diff --git a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart index d6251fa4..2fa56dd0 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart @@ -1,9 +1,11 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_logic.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_state.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; @@ -17,23 +19,21 @@ class MsgNotificationPage extends StatefulWidget { } class _MsgNotificationPageState extends State { - final logic = Get.put(MsgNotificationLogic()); - final state = Get.find().state; + final MsgNotificationLogic logic = Get.put(MsgNotificationLogic()); + final MsgNotificationState state = Get.find().state; //高亮样式 - final TextStyle titleStyle = TextStyle( - color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); + final TextStyle titleStyle = TextStyle(color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); //默认样式 - final TextStyle subTipsStyle = - TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); + final TextStyle subTipsStyle = TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ - TextSpan(text: '${'添加和使用面容开锁时:'.tr}\n', style: titleStyle), - TextSpan( - text: - '\n1、请尽量保持单人在门前操作;\n2、请站立在门锁正前方约0.5~0.8米,面向门锁;\n3、请保持脸部无遮挡,露出五官;\n4、面容识别异常时,可触摸数字键盘任意按键,手动重启人脸识别。', - style: subTipsStyle), - ]); + // late InlineSpan tipsPreviewSpan = TextSpan(children: [ + // TextSpan(text: '${'添加和使用面容开锁时:'.tr}\n', style: titleStyle), + // TextSpan( + // text: + // '\n1、请尽量保持单人在门前操作;\n2、请站立在门锁正前方约0.5~0.8米,面向门锁;\n3、请保持脸部无遮挡,露出五官;\n4、面容识别异常时,可触摸数字键盘任意按键,手动重启人脸识别。', + // style: subTipsStyle), + // ]); @override initState() { @@ -56,14 +56,14 @@ class _MsgNotificationPageState extends State { Widget _buildMainItem() { return Column( - children: [ + children: [ CommonItem( leftTitel: '开门通知'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.openDoorNotifyPage, arguments: { + Get.toNamed(Routers.openDoorNotifyPage, arguments: { 'lockSetInfoData': state.msgNoticeInfo.value, 'lockId': state.getLockId.value }); @@ -75,7 +75,7 @@ class _MsgNotificationPageState extends State { isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.nDaysUnopenedPage, arguments: { + Get.toNamed(Routers.nDaysUnopenedPage, arguments: { 'lockSetInfoData': state.msgNoticeInfo.value, 'lockId': state.getLockId.value })?.then((value) { @@ -87,7 +87,7 @@ class _MsgNotificationPageState extends State { )), Obx(() => CommonItem( leftTitel: '门未关好'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: @@ -108,7 +108,7 @@ class _MsgNotificationPageState extends State { isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.lowBatteryReminderPage, arguments: { + Get.toNamed(Routers.lowBatteryReminderPage, arguments: { 'lockSetInfoData': state.msgNoticeInfo.value, 'lockId': state.getLockId.value })?.then((value) { @@ -120,11 +120,11 @@ class _MsgNotificationPageState extends State { )), CommonItem( leftTitel: '胁迫开门'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.coerceOpenDoorPage, arguments: { + Get.toNamed(Routers.coerceOpenDoorPage, arguments: { 'lockSetInfoData': state.msgNoticeInfo.value, 'lockId': state.getLockId.value }); @@ -147,7 +147,7 @@ class _MsgNotificationPageState extends State { visible: state.isSupportCatEye.value, child: CommonItem( leftTitel: '有人出现在门口'.tr, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: @@ -156,7 +156,7 @@ class _MsgNotificationPageState extends State { height: 60.h, ), Text( - '此模块功能需要锁联网后设置方可生效', + '此模块功能需要锁联网后设置方可生效'.tr, style: TextStyle(fontSize: 20.sp), ) ], @@ -195,7 +195,7 @@ class _MsgNotificationPageState extends State { trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, value: isCheck, - onChanged: (value) { + onChanged: (bool value) { switch (getIndex) { //离家开门 case 1: diff --git a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_state.dart index 1ba082ec..61b09b52 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_state.dart @@ -1,21 +1,8 @@ + import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; class MsgNotificationState { - var msgNoticeInfo = MsgNoticeData().obs; - var getLockId = 0.obs; - var isCheck = false.obs; - var nDaysNotOpenDoor = '已启用'.obs; //N天未开门 - var isTamperAlarm = false.obs; //防拆报警 - var isLowBattery = '已启用'.obs; //低电量提醒 - var isLeaveHomeOpenDoor = false.obs; //离家开门 - var isDoorNotShut = false.obs; //门未关好 - var isSomeoneRing = false.obs; //有人按门铃 - var isSomeoneAppeared = false.obs; //有人出现在门口 - final String notifyEnable = '已启用'.tr; - final String notifyDisable = '未启用'.tr; - final String settingSuccess = '设置成功'.tr; - var isSupportCatEye = false.obs; MsgNotificationState() { Map map = Get.arguments; @@ -29,4 +16,18 @@ class MsgNotificationState { nDaysNotOpenDoor.value = notifyEnable; isLowBattery.value = notifyEnable; } + Rx msgNoticeInfo = MsgNoticeData().obs; + RxInt getLockId = 0.obs; + RxBool isCheck = false.obs; + RxString nDaysNotOpenDoor = '已启用'.obs; //N天未开门 + RxBool isTamperAlarm = false.obs; //防拆报警 + RxString isLowBattery = '已启用'.obs; //低电量提醒 + RxBool isLeaveHomeOpenDoor = false.obs; //离家开门 + RxBool isDoorNotShut = false.obs; //门未关好 + RxBool isSomeoneRing = false.obs; //有人按门铃 + RxBool isSomeoneAppeared = false.obs; //有人出现在门口 + final String notifyEnable = '已启用'.tr; + final String notifyDisable = '未启用'.tr; + final String settingSuccess = '设置成功'.tr; + RxBool isSupportCatEye = false.obs; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_page.dart index 1aed9f7c..3949a419 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_page.dart @@ -1,9 +1,9 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_state.dart'; import 'package:star_lock/tools/commonItem.dart'; @@ -88,8 +88,8 @@ class _NDaysUnopenedPageState extends State { child: Column( children: [ CommonItem( - leftTitel: '门未开时间'.tr, - rightTitle: '${state.unOpenDoorTime.value}天', + leftTitel: '未开门时间'.tr, + rightTitle: '${state.unOpenDoorTime.value}' + '天'.tr, isHaveLine: true, isHaveRightWidget: false, isHaveDirection: true, diff --git a/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_state.dart index be246bdf..86fd425c 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_state.dart @@ -3,35 +3,6 @@ import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_entity.d import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; class NDaysUnopenedState { - final List unopenDoorTimeList = [ - '1天', - '2天', - '3天', - '4天', - '5天', - '6天', - '7天', - '8天', - '9天', - '10天', - '11天', - '12天', - '13天', - '14天', - '15天', - ]; - - var isUnOpenNotice = false.obs; // 是否N天未开门提醒 - var unOpenDoorTime = 3.obs; // 未开门时间 - - var getLockId = 0.obs; - var lockUserKeys = LockUserListKeys().obs; - var emailReceiverList = [].obs; - var phoneReceiverList = [].obs; - var emailListStr = ''.obs; - var phontListStr = ''.obs; - - var msgNoticeInfo = MsgNoticeData().obs; NDaysUnopenedState() { Map map = Get.arguments; @@ -41,11 +12,43 @@ class NDaysUnopenedState { if (map['lockSetInfoData'] != null) { msgNoticeInfo.value = map['lockSetInfoData']; - isUnOpenNotice.value = - msgNoticeInfo.value.dayNotOpenDoorState == 1 ? true : false; + if (msgNoticeInfo.value.dayNotOpenDoorState == 1) { + isUnOpenNotice.value = true; + } else { + isUnOpenNotice.value = false; + } if (msgNoticeInfo.value.dayNotOpenDoorValue != 0) { unOpenDoorTime.value = msgNoticeInfo.value.dayNotOpenDoorValue!; } } } + final List unopenDoorTimeList = [ + '1' + '天'.tr, + '2' + '天'.tr, + '3' + '天'.tr, + '4' + '天'.tr, + '5' + '天'.tr, + '6' + '天'.tr, + '7' + '天'.tr, + '8' + '天'.tr, + '9' + '天'.tr, + '10' + '天'.tr, + '11' + '天'.tr, + '12' + '天'.tr, + '13' + '天'.tr, + '14' + '天'.tr, + '15' + '天'.tr, + ]; + + RxBool isUnOpenNotice = false.obs; // 是否N天未开门提醒 + RxInt unOpenDoorTime = 3.obs; // 未开门时间 + + RxInt getLockId = 0.obs; + Rx lockUserKeys = LockUserListKeys().obs; + RxList emailReceiverList = [].obs; + RxList phoneReceiverList = [].obs; + RxString emailListStr = ''.obs; + RxString phontListStr = ''.obs; + + Rx msgNoticeInfo = MsgNoticeData().obs; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_logic.dart b/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_logic.dart index 4e194d0b..fd7173ac 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_logic.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_logic.dart @@ -1,3 +1,4 @@ +import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -6,8 +7,8 @@ import 'openDoorNotify_state.dart'; class OpenDoorNotifyLogic extends BaseGetXController { final OpenDoorNotifyState state = OpenDoorNotifyState(); - void lockNoticeSettingAccountList() async { - OpenDoorNotifyEntity entity = + Future lockNoticeSettingAccountList() async { + final OpenDoorNotifyEntity entity = await ApiRepository.to.lockNoticeSettingAccountList( lockId: state.getLockId.value, noticeType: 10, @@ -19,18 +20,18 @@ class OpenDoorNotifyLogic extends BaseGetXController { //当前钥匙类型 1:电子钥匙 2:密码钥匙 3:指纹钥匙 4:卡钥匙 5:人脸钥匙 String getKeyTypeStr(DataList itemData) { - int keyType = itemData.settingValue!.openDoorType!; + final int keyType = itemData.settingValue!.openDoorType!; switch (keyType) { case 1: - return '电子钥匙'; + return '电子钥匙'.tr; case 2: - return '密码'; + return '密码'.tr; case 3: - return '指纹'; + return '指纹'.tr; case 4: - return '卡'; + return '卡'.tr; case 5: - return '人脸'; + return '人脸'.tr; default: return ''; } diff --git a/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_page.dart index 33c653c1..41d7c957 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_page.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_entity.dart'; +import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_state.dart'; import 'package:star_lock/tools/noData.dart'; import '../../../../../app_settings/app_colors.dart'; @@ -18,8 +19,8 @@ class OpenDoorNotifyPage extends StatefulWidget { } class _OpenDoorNotifyPageState extends State { - final logic = Get.put(OpenDoorNotifyLogic()); - final state = Get.find().state; + final OpenDoorNotifyLogic logic = Get.put(OpenDoorNotifyLogic()); + final OpenDoorNotifyState state = Get.find().state; @override void initState() { @@ -37,7 +38,7 @@ class _OpenDoorNotifyPageState extends State { backgroundColor: AppColors.mainColor, ), body: Column( - children: [ + children: [ _topTipsWidget(), SizedBox(height: 20.h), Expanded( @@ -50,7 +51,7 @@ class _OpenDoorNotifyPageState extends State { AddBottomWhiteBtn( btnName: '添加家人'.tr, onClick: () { - Get.toNamed(Routers.addFamilyPage, arguments: { + Get.toNamed(Routers.addFamilyPage, arguments: { 'lockId': state.getLockId.value, 'isDetail': false, })?.then((value) { @@ -84,7 +85,7 @@ class _OpenDoorNotifyPageState extends State { return ListView.separated( shrinkWrap: true, itemCount: state.openDoorNotifyList.length, - itemBuilder: (c, index) { + itemBuilder: (BuildContext c, int index) { return _electronicKeyItem(state.openDoorNotifyList.value[index]); }, separatorBuilder: (BuildContext context, int index) { @@ -99,7 +100,7 @@ class _OpenDoorNotifyPageState extends State { Widget _electronicKeyItem(DataList itemData) { return GestureDetector( onTap: () { - Get.toNamed(Routers.addFamilyPage, arguments: { + Get.toNamed(Routers.addFamilyPage, arguments: { 'itemData': itemData, 'lockId': state.getLockId.value, 'isDetail': true, @@ -111,7 +112,7 @@ class _OpenDoorNotifyPageState extends State { color: Colors.white, height: 90.h, child: Row( - children: [ + children: [ SizedBox(width: 30.w), Image.asset( 'images/controls_user.png', @@ -123,9 +124,9 @@ class _OpenDoorNotifyPageState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Row( - children: [ + children: [ Expanded( child: Text( itemData.settingValue!.remark ?? '', @@ -141,7 +142,7 @@ class _OpenDoorNotifyPageState extends State { SizedBox(height: 10.h), Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Text( logic.getKeyTypeStr(itemData), style: TextStyle( diff --git a/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_state.dart b/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_state.dart index 42e880c1..d873f95d 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_state.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_state.dart @@ -1,8 +1,6 @@ import 'package:get/get.dart'; -class OpenDoorNotifyState { - var getLockId = 0.obs; - var openDoorNotifyList = [].obs; //开门通知列表 +class OpenDoorNotifyState { //开门通知列表 OpenDoorNotifyState() { Map map = Get.arguments; @@ -10,4 +8,6 @@ class OpenDoorNotifyState { getLockId.value = map['lockId']; } } + RxInt getLockId = 0.obs; + RxList openDoorNotifyList = [].obs; } diff --git a/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_page.dart b/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_page.dart index aa696fa5..489483f4 100755 --- a/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_page.dart +++ b/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_page.dart @@ -9,7 +9,6 @@ import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificat import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificationMode_state.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; @@ -39,7 +38,7 @@ class _NotificationModePageState extends State { haveBack: true, backgroundColor: AppColors.mainColor), body: SingleChildScrollView( - child: Obx(() => _buildMainView()), + child: Obx(_buildMainView), )); } diff --git a/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_state.dart b/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_state.dart index 57c33ebd..3299c2f6 100755 --- a/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_state.dart +++ b/lib/main/lockDetail/messageWarn/notificationMode/notificationMode_state.dart @@ -4,32 +4,25 @@ import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNo import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificationMode_data.dart'; class NotificationModeState { - var emailReceiverList = [].obs; - var phoneReceiverList = [].obs; - - var countryName = '中国'.obs; - var countryCode = 86.obs; - var familyData = DataList().obs; - var msgNoticeInfo = MsgNoticeData().obs; NotificationModeState() { - Map map = Get.arguments; + final Map map = Get.arguments; if (map['familyData'] != null) { familyData.value = map['familyData']; if (familyData.value.settingValue != null) { - for (NoticeWay item in familyData.value.settingValue!.noticeWayList!) { + for (final NoticeWay item in familyData.value.settingValue!.noticeWayList!) { if (item.type == 'mail' && item.accounts != null) { - for (Accounts account in item.accounts!) { + for (final Accounts account in item.accounts!) { if (account.account != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receiveEmail = account.account!; emailReceiverList.value.add(msgNoticeModeData); } } } else if (item.type == 'sms' && item.accounts != null) { - for (Accounts account in item.accounts!) { + for (final Accounts account in item.accounts!) { if (account.account != null && account.countryCode != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receivePhone = account.account!; msgNoticeModeData.countryCode = account.countryCode!; phoneReceiverList.value.add(msgNoticeModeData); @@ -43,20 +36,20 @@ class NotificationModeState { if (map['msgNoticeInfo'] != null) { msgNoticeInfo.value = map['msgNoticeInfo']; if (msgNoticeInfo.value.dayNotOpenDoorNoticeWayList != null) { - for (NoticeWay item + for (final NoticeWay item in msgNoticeInfo.value.dayNotOpenDoorNoticeWayList!) { if (item.type == 'mail' && item.accounts != null) { - for (Accounts account in item.accounts!) { + for (final Accounts account in item.accounts!) { if (account.account != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receiveEmail = account.account!; emailReceiverList.value.add(msgNoticeModeData); } } } else if (item.type == 'sms' && item.accounts != null) { - for (Accounts account in item.accounts!) { + for (final Accounts account in item.accounts!) { if (account.account != null && account.countryCode != null) { - MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); + final MsgNoticeModeData msgNoticeModeData = MsgNoticeModeData(); msgNoticeModeData.receivePhone = account.account!; msgNoticeModeData.countryCode = account.countryCode!; phoneReceiverList.value.add(msgNoticeModeData); @@ -67,4 +60,11 @@ class NotificationModeState { } } } + RxList emailReceiverList = [].obs; + RxList phoneReceiverList = [].obs; + + RxString countryName = '中国'.tr.obs; + RxInt countryCode = 86.obs; + Rx familyData = DataList().obs; + Rx msgNoticeInfo = MsgNoticeData().obs; } diff --git a/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart b/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart index 83612b36..2b47048d 100755 --- a/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart +++ b/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart @@ -69,7 +69,7 @@ class LockMonitoringLogic extends BaseGetXController { // 检查条件,如果达到6秒且未得到应答,则认为失败 if (state.answerSeconds >= 6) { state.answerTimer.cancel(); - showToast("接听失败"); + showToast('接听失败'.tr); // initiateUdpHangUpAction(2); UDPTalkClass().callNoAnswer(1); } @@ -77,7 +77,7 @@ class LockMonitoringLogic extends BaseGetXController { } /// 接听 - udpAnswerAction() async { + Future udpAnswerAction() async { AppLog.log('点了接听么'); UDPSenderManage.sendMainProtocol( command: 150, @@ -159,13 +159,13 @@ class LockMonitoringLogic extends BaseGetXController { try { if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) { await state.voiceProcessor?.start(state.frameLength, state.sampleRate); - bool? isRecording = await state.voiceProcessor?.isRecording(); + final bool? isRecording = await state.voiceProcessor?.isRecording(); state.isProcessing.value = isRecording!; } else { - state.errorMessage.value = "Recording permission not granted"; + state.errorMessage.value = 'Recording permission not granted'; } } on PlatformException catch (ex) { - state.errorMessage.value = "Failed to start recorder: $ex"; + state.errorMessage.value = 'Failed to start recorder: $ex'; } finally { state.isButtonDisabled.value = false; } @@ -176,18 +176,19 @@ class LockMonitoringLogic extends BaseGetXController { // CallTalk().stopPlaySound(); // } state.allFrames.add(frame); // 将帧添加到状态变量中 - List concatenatedFrames = concatenateFrames(state.allFrames); // 连接所有帧 - AppLog.log("pcm数据:$concatenatedFrames"); + final List concatenatedFrames = + concatenateFrames(state.allFrames); // 连接所有帧 + AppLog.log('pcm数据:$concatenatedFrames'); - List pcmBytes = listLinearToULaw(frame); + final List pcmBytes = listLinearToULaw(frame); // await Future.delayed(const Duration(milliseconds: 100)); sendRecordData({ - "bytes": pcmBytes, + 'bytes': pcmBytes, // "udpSendDataFrameNumber": 0, - "lockID": UDPManage().lockId, - "lockIP": UDPManage().host, - "userMobile": await state.userUid, - "userMobileIP": await state.userMobileIP, + 'lockID': UDPManage().lockId, + 'lockIP': UDPManage().host, + 'userMobile': await state.userUid, + 'userMobileIP': await state.userMobileIP, }); } @@ -197,8 +198,9 @@ class LockMonitoringLogic extends BaseGetXController { // 将所有帧连接起来 List concatenateFrames(List> frames) { - List concatenated = []; - for (List frame in frames) { + final List concatenated = []; + for (int i = 0; i < frames.length; i++) { + final List frame = frames[i]; concatenated.addAll(frame); } return concatenated; @@ -216,21 +218,21 @@ class LockMonitoringLogic extends BaseGetXController { state.voiceProcessor?.removeFrameListener(_onFrame); state.udpSendDataFrameNumber = 0; } on PlatformException catch (ex) { - state.errorMessage.value = "Failed to stop recorder: $ex"; + state.errorMessage.value = 'Failed to stop recorder: $ex'; } finally { - bool? isRecording = await state.voiceProcessor?.isRecording(); + final bool? isRecording = await state.voiceProcessor?.isRecording(); state.isProcessing.value = isRecording!; state.isButtonDisabled.value = false; } } sendRecordData(Map args) async { - List bytes = args["bytes"]; + final List bytes = args['bytes']; // int udpSendDataFrameNumber = args["udpSendDataFrameNumber"]; - String? lockID = args["lockID"]; - String? lockIP = args["lockIP"]; - String? userMobile = args["userMobile"]; - String? userMobileIP = args["userMobileIP"]; + final String? lockID = args['lockID']; + final String? lockIP = args['lockIP']; + final String? userMobile = args['userMobile']; + final String? userMobileIP = args['userMobileIP']; // int length = 320; // 每个子List的长度 // List list = state.listAudioData.value.sublist(0, 320); @@ -245,7 +247,7 @@ class LockMonitoringLogic extends BaseGetXController { state.udpSendDataFrameNumber++; if (state.udpSendDataFrameNumber >= 65536) state.udpSendDataFrameNumber = 1; // 57 - List topBytes = []; + final List topBytes = []; // var cID = "XXXCID"; // List cIDData = utf8.encode(cID!); @@ -303,11 +305,11 @@ class LockMonitoringLogic extends BaseGetXController { 176, 4, // 保留 ]); - topBytes[6] = (state.udpSendDataFrameNumber & 0x000000FF); - topBytes[7] = ((state.udpSendDataFrameNumber & 0x0000FF00) >> 8); + topBytes[6] = state.udpSendDataFrameNumber & 0x000000FF; + topBytes[7] = (state.udpSendDataFrameNumber & 0x0000FF00) >> 8; topBytes.addAll(bytes); - AppLog.log("G711编码后为:$topBytes"); + AppLog.log('G711编码后为:$topBytes'); UDPSenderManage.sendMainProtocol( command: 150, @@ -323,9 +325,9 @@ class LockMonitoringLogic extends BaseGetXController { } List listLinearToULaw(List pcmList) { - List uLawList = []; + final List uLawList = []; for (int pcmVal in pcmList) { - int uLawVal = linearToULaw(pcmVal); + final int uLawVal = linearToULaw(pcmVal); uLawList.add(uLawVal); } return uLawList; @@ -349,14 +351,14 @@ class LockMonitoringLogic extends BaseGetXController { if (seg >= 8) { return 0x7F ^ mask; } else { - uval = (seg << 4); - uval |= ((pcmVal >> (seg + 3)) & 0xF); + uval = seg << 4; + uval |= (pcmVal >> (seg + 3)) & 0xF; return uval ^ mask; } } int search(int val) { - List table = [ + final List table = [ 0xFF, 0x1FF, 0x3FF, @@ -366,7 +368,7 @@ class LockMonitoringLogic extends BaseGetXController { 0x3FFF, 0x7FFF ]; - int size = 8; + const int size = 8; for (int i = 0; i < size; i++) { if (val <= table[i]) { return i; @@ -376,9 +378,9 @@ class LockMonitoringLogic extends BaseGetXController { } Future getPermissionStatus() async { - Permission permission = Permission.microphone; + const Permission permission = Permission.microphone; //granted 通过,denied 被拒绝,permanentlyDenied 拒绝且不在提示 - PermissionStatus status = await permission.status; + final PermissionStatus status = await permission.status; if (status.isGranted) { return true; } else if (status.isDenied) { @@ -392,8 +394,8 @@ class LockMonitoringLogic extends BaseGetXController { } ///申请权限 - void requestPermission(Permission permission) async { - PermissionStatus status = await permission.request(); + Future requestPermission(Permission permission) async { + final PermissionStatus status = await permission.request(); if (status.isPermanentlyDenied) { openAppSettings(); } @@ -401,7 +403,6 @@ class LockMonitoringLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _getUDPStatusRefreshUIAction(); @@ -411,13 +412,11 @@ class LockMonitoringLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose CallTalk().finishAVData(); stopProcessing(); _getUDPStatusRefreshUIEvent!.cancel(); diff --git a/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart b/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart index 2cd66610..4ddd8ba6 100755 --- a/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart +++ b/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:io'; import 'dart:ui' as ui; @@ -10,6 +11,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart'; import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/udp/udp_manage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; @@ -28,8 +30,8 @@ class LockMonitoringPage extends StatefulWidget { } class _LockMonitoringPageState extends State { - final logic = Get.put(LockMonitoringLogic()); - final state = Get.find().state; + final LockMonitoringLogic logic = Get.put(LockMonitoringLogic()); + final LockMonitoringState state = Get.find().state; @override void initState() { @@ -53,7 +55,7 @@ class _LockMonitoringPageState extends State { height: 1.sh, color: Colors.transparent, child: Stack( - children: [ + children: [ Image.memory( state.listPhotoData.value, gaplessPlayback: true, @@ -61,7 +63,7 @@ class _LockMonitoringPageState extends State { height: 1.sh, fit: BoxFit.cover, //contain-原比例 none-原始图片 filterQuality: FilterQuality.high, - errorBuilder: (context, error, stackTrace) { + errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) { return Container(color: Colors.transparent); }, ), @@ -69,16 +71,16 @@ class _LockMonitoringPageState extends State { top: ScreenUtil().statusBarHeight + 30.h, width: 1.sw, child: Obx(() { - var sec = (state.oneMinuteTime.value % 60) + final String sec = (state.oneMinuteTime.value % 60) .toString() .padLeft(2, '0'); - var min = (state.oneMinuteTime.value ~/ 60) + final String min = (state.oneMinuteTime.value ~/ 60) .toString() .padLeft(2, '0'); return Row( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text("$min:$sec", + children: [ + Text('$min:$sec', style: TextStyle( fontSize: 26.sp, color: Colors.white)), ]); @@ -94,7 +96,7 @@ class _LockMonitoringPageState extends State { color: const Color(0xC83C3F41), borderRadius: BorderRadius.circular(20.h)), child: Column( - children: [ + children: [ SizedBox(height: 20.h), bottomTopBtnWidget(), SizedBox(height: 20.h), @@ -110,7 +112,7 @@ class _LockMonitoringPageState extends State { } Widget bottomTopBtnWidget() { - return Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + return Row(mainAxisAlignment: MainAxisAlignment.center, children: [ // 打开关闭声音 GestureDetector( onTap: () { @@ -125,18 +127,15 @@ class _LockMonitoringPageState extends State { height: 40.w, image: state.isOpenVoice.value ? const AssetImage( - "images/main/icon_lockDetail_monitoringCloseVoice.png") + 'images/main/icon_lockDetail_monitoringCloseVoice.png') : const AssetImage( - "images/main/icon_lockDetail_monitoringOpenVoice.png"))), + 'images/main/icon_lockDetail_monitoringOpenVoice.png'))), ), ), SizedBox(width: 60.w), // 截图 GestureDetector( - onTap: () { - captureAndSavePng(); - // Get.toNamed(Routers.monitoringRealTimeScreenPage); - }, + onTap: captureAndSavePng, child: Container( width: 50.w, height: 50.w, @@ -145,7 +144,7 @@ class _LockMonitoringPageState extends State { width: 40.w, height: 40.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringScreenshot.png")), + 'images/main/icon_lockDetail_monitoringScreenshot.png')), ), ), SizedBox(width: 60.w), @@ -162,20 +161,20 @@ class _LockMonitoringPageState extends State { width: 40.w, height: 40.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringScreenRecording.png")), + 'images/main/icon_lockDetail_monitoringScreenRecording.png')), ), ), ]); } Widget bottomBottomBtnWidget() { - return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ + return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ // 接听 Obx(() => bottomBtnItemWidget( state.isClickAnswer.value == true ? 'images/main/icon_lockDetail_monitoringUnTalkback.png' : getAnswerBtnImg(), - state.isClickAnswer.value == true ? '长按说话' : getAnswerBtnName(), + state.isClickAnswer.value == true ? '长按说话'.tr : getAnswerBtnName(), Colors.white, () async { if (state.isClickAnswer.value == false) { logic.initiateUdpAnswerAction(); @@ -183,7 +182,7 @@ class _LockMonitoringPageState extends State { } }, longPress: () { // 开始长按 - AppLog.log("onLongPress"); + AppLog.log('onLongPress'); state.listAudioData.value = []; if (state.udpStatus.value == 8) { state.udpStatus.value = 9; @@ -192,14 +191,14 @@ class _LockMonitoringPageState extends State { logic.startProcessing(); }, longPressUp: () async { // 长按结束 - AppLog.log("onLongPressUp"); + AppLog.log('onLongPressUp'); if (state.udpStatus.value == 9) { state.udpStatus.value = 8; } logic.stopProcessing(); })), bottomBtnItemWidget( - "images/main/icon_lockDetail_hangUp.png", "挂断", Colors.red, () async { + 'images/main/icon_lockDetail_hangUp.png', '挂断'.tr, Colors.red, () async { logic.stopProcessing(); CallTalk().finishAVData(); // 挂断 @@ -214,12 +213,12 @@ class _LockMonitoringPageState extends State { // logic.initiateUdpHangUpAction(4); // } }), - bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", - "开锁", AppColors.mainColor, () { + bottomBtnItemWidget('images/main/icon_lockDetail_monitoringUnlock.png', + '开锁'.tr, AppColors.mainColor, () { if (UDPManage().remoteUnlock == 1) { showDeletPasswordAlertDialog(context); } else { - logic.showToast("请在锁设置中开启远程开锁"); + logic.showToast('请在锁设置中开启远程开锁'.tr); } }) ]); @@ -228,29 +227,29 @@ class _LockMonitoringPageState extends State { String getAnswerBtnImg() { switch (state.udpStatus.value) { case 8: - return "images/main/icon_lockDetail_monitoringUnTalkback.png"; + return 'images/main/icon_lockDetail_monitoringUnTalkback.png'; case 9: - return "images/main/icon_lockDetail_monitoringTalkback.png"; + return 'images/main/icon_lockDetail_monitoringTalkback.png'; default: - return "images/main/icon_lockDetail_monitoringAnswerCalls.png"; + return 'images/main/icon_lockDetail_monitoringAnswerCalls.png'; } } String getAnswerBtnName() { switch (state.udpStatus.value) { case 8: - return "长按说话"; + return '长按说话'.tr; case 9: - return "松开发送"; + return '松开发送'.tr; default: - return "接听"; + return '接听'.tr; } } Widget bottomBtnItemWidget( String iconUrl, String name, Color backgroundColor, Function() onClick, {Function()? longPress, Function()? longPressUp}) { - var wh = 80.w; + final double wh = 80.w; return GestureDetector( onTap: onClick, onLongPress: longPress, @@ -259,7 +258,7 @@ class _LockMonitoringPageState extends State { height: 140.h, child: Column( crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ Container( width: wh, height: wh, @@ -285,31 +284,30 @@ class _LockMonitoringPageState extends State { context: context, builder: (BuildContext context) { return ShowTFView( - title: "请输入六位数字开锁密码", - tipTitle: "", + title: '请输入6位数字开锁密码'.tr, + tipTitle: '', controller: state.passwordTF, - inputFormatters: [ + inputFormatters: [ LengthLimitingTextInputFormatter(6), //限制长度 - FilteringTextInputFormatter.allow(RegExp("[0-9]")), + FilteringTextInputFormatter.allow(RegExp('[0-9]')), ], sureClick: () async { //发送删除锁请求 if (state.passwordTF.text.isEmpty) { - logic.showToast("请输入开锁密码"); + logic.showToast('请输入开锁密码'.tr); return; } // List numbers = state.passwordTF.text.split('').map((char) => int.parse(char)).toList(); // 开锁 // lockID - List numbers = []; - List lockIDData = utf8.encode(state.passwordTF.text); + final List numbers = []; + final List lockIDData = utf8.encode(state.passwordTF.text); numbers.addAll(lockIDData); // topBytes = getFixedLengthList(lockIDData, 20 - lockIDData.length); for (int i = 0; i < 6 - lockIDData.length; i++) { numbers.add(0); } - // AppLog.log("numbersnumbersnumbers:$numbers"); logic.udpOpenDoorAction(numbers); }, cancelClick: () { @@ -322,7 +320,7 @@ class _LockMonitoringPageState extends State { //获取麦克风权限 Future requestMicrophonePermission() async { - await logic.getPermissionStatus().then((value) async { + await logic.getPermissionStatus().then((bool value) async { if (!value) { return; } @@ -339,30 +337,30 @@ class _LockMonitoringPageState extends State { AppLog.log('截图失败: 未找到当前上下文'); return; } - RenderRepaintBoundary boundary = state.globalKey.currentContext! - .findRenderObject() as RenderRepaintBoundary; - ui.Image image = await boundary.toImage(); - ByteData? byteData = + final RenderRepaintBoundary boundary = state.globalKey.currentContext! + .findRenderObject()! as RenderRepaintBoundary; + final ui.Image image = await boundary.toImage(); + final ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png); if (byteData == null) { AppLog.log('截图失败: 图像数据为空'); return; } - Uint8List pngBytes = byteData.buffer.asUint8List(); + final Uint8List pngBytes = byteData.buffer.asUint8List(); // 获取应用程序的文档目录 - final directory = await getApplicationDocumentsDirectory(); - final imagePath = '${directory.path}/screenshot.png'; + final Directory directory = await getApplicationDocumentsDirectory(); + final String imagePath = '${directory.path}/screenshot.png'; // 将截图保存为文件 - File imgFile = File(imagePath); + final File imgFile = File(imagePath); await imgFile.writeAsBytes(pngBytes); // 将截图保存到相册 await ImageGallerySaver.saveFile(imagePath); AppLog.log('截图保存路径: $imagePath'); - logic.showToast('截图已保存到相册'); + logic.showToast('截图已保存到相册'.tr); } catch (e) { AppLog.log('截图失败: $e'); } @@ -372,10 +370,10 @@ class _LockMonitoringPageState extends State { void _getTVDataRefreshUIAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus state.getTVDataRefreshUIEvent = - eventBus.on().listen((event) async { + eventBus.on().listen((GetTVDataRefreshUI event) async { if (event.tvList.isNotEmpty && event.tvList.length > 100) { // 比较新旧数据是否相同 - Uint8List imageData = Uint8List.fromList(event.tvList); + final Uint8List imageData = Uint8List.fromList(event.tvList); if (!listEquals(state.listPhotoData.value, imageData)) { // 更新状态 diff --git a/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart b/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart index 7b4fdfeb..c0f07e83 100755 --- a/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart +++ b/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart @@ -9,50 +9,50 @@ import 'package:network_info_plus/network_info_plus.dart'; import '../../../../tools/storage.dart'; class LockMonitoringState { - var isOpenVoice = false.obs; + RxBool isOpenVoice = false.obs; int udpSendDataFrameNumber = 0; // 帧序号 // var isSenderAudioData = false.obs;// 是否要发送音频数据 StreamSubscription? getTVDataRefreshUIEvent; //收到视频流数据 - var shouldUpdateUI = false.obs; //是否需要更新UI + RxBool shouldUpdateUI = false.obs; //是否需要更新UI - var userMobileIP = NetworkInfo().getWifiIP(); - var userUid = Storage.getUid(); + Future userMobileIP = NetworkInfo().getWifiIP(); + Future userUid = Storage.getUid(); - var udpStatus = + RxInt udpStatus = 0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话 - var passwordTF = TextEditingController(); + TextEditingController passwordTF = TextEditingController(); - var listPhotoData = Uint8List(0).obs; //得到的视频流字节数据 - var listAudioData = [].obs; //得到的音频流字节数据 + Rx listPhotoData = Uint8List(0).obs; //得到的视频流字节数据 + RxList listAudioData = [].obs; //得到的音频流字节数据 //录音相关 late VoiceProcessor? voiceProcessor; - var isProcessing = false.obs; //是否正在处理音频数据 - var isButtonDisabled = false.obs; //是否禁用按钮 + RxBool isProcessing = false.obs; //是否正在处理音频数据 + RxBool isButtonDisabled = false.obs; //是否禁用按钮 final int frameLength = 320; //音视频帧长度为320 final int sampleRate = 8000; //音频采样率为8000 // final int volumeHistoryCapacity = 5; //音量历史记录的容量 // final double dbOffset = 50.0; //用于音量计算的偏移量 // var volumeHistory = [].obs; //用于存储音量历史记录的列表 // var smoothedVolumeValue = 0.0.obs; //存储平滑后的音量值 - var errorMessage = ''.obs; - List> allFrames = []; + RxString errorMessage = ''.obs; + List> allFrames = >[]; GlobalKey globalKey = GlobalKey(); late Timer oneMinuteTimeTimer = Timer(const Duration(seconds: 1), () {}); // 定时器超过60秒关闭当前界面 - var oneMinuteTime = 0.obs; // 定时器秒数 + RxInt oneMinuteTime = 0.obs; // 定时器秒数 // 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次 late Timer answerTimer = Timer(const Duration(seconds: 1), () {}); //接听命令定时器 - var answerSeconds = 0.obs; - var isClickAnswer = false.obs; //是否点击了接听按钮 + RxInt answerSeconds = 0.obs; + RxBool isClickAnswer = false.obs; //是否点击了接听按钮 late Timer hangUpTimer = Timer(const Duration(seconds: 1), () {}); //挂断命令定时器 - var hangUpSeconds = 0.obs; - var isClickHangUp = false.obs; //是否点击了挂断按钮 + RxInt hangUpSeconds = 0.obs; + RxBool isClickHangUp = false.obs; //是否点击了挂断按钮 late Timer openDoorTimer = Timer(const Duration(seconds: 1), () {}); //开门命令定时器 - var openDoorSeconds = 0.obs; + RxInt openDoorSeconds = 0.obs; } diff --git a/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart b/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart index 5a27981c..ae4f0635 100755 --- a/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart +++ b/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_state.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; @@ -15,24 +16,24 @@ class MonitoringRealTimeScreenPage extends StatefulWidget { } class _MonitoringRealTimeScreenPageState extends State { - final logic = Get.put(MonitoringRealTimeScreenLogic()); - final state = Get.find().state; + final MonitoringRealTimeScreenLogic logic = Get.put(MonitoringRealTimeScreenLogic()); + final MonitoringRealTimeScreenState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: "实时播放", + barTitle: '实时播放'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: Stack( alignment: Alignment.bottomCenter, - children: [ + children: [ Column( - children: [ - Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sw/5*4, fit: BoxFit.cover), + children: [ + Image.asset('images/icon_test20231113.png', width: 1.sw, height: 1.sw/5*4, fit: BoxFit.cover), middleWidget(), ], ), @@ -50,7 +51,7 @@ class _MonitoringRealTimeScreenPageState extends State[ // 打开关闭声音 GestureDetector( onTap: () { @@ -64,8 +65,8 @@ class _MonitoringRealTimeScreenPageState extends State[ + bottomBtnItemWidget('images/main/icon_lockDetail_monitoringTalkback.png', '点击对讲'.tr, Colors.white, (){ }), SizedBox(width: (1.sw - 80.w)/3), - bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", "长按开锁", AppColors.mainColor, (){ + bottomBtnItemWidget('images/main/icon_lockDetail_monitoringUnlock.png', '长按开锁'.tr, AppColors.mainColor, (){ }) ]); } Widget bottomBtnItemWidget(String iconUrl, String name, Color backgroundColor, Function() onClick) { - var wh = 80.w; + double wh = 80.w; return GestureDetector( onTap: onClick, child: SizedBox( height: 140.h, child: Column( crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ Container( width: wh, height: wh, diff --git a/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart b/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart index 7e4910cb..19ca548d 100755 --- a/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart +++ b/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart @@ -68,7 +68,6 @@ class AddPalmLogic extends BaseGetXController { final List token = reply.data.sublist(5, 9); final List saveStrList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, saveStrList); - AppLog.log('添加卡token:$token'); IoSenderManage.senderAddPalmWithTimeCycleCoercionCommand( keyID:'1', diff --git a/lib/main/lockDetail/palm/addPalm/addPalm_page.dart b/lib/main/lockDetail/palm/addPalm/addPalm_page.dart index 10b6163a..2756df54 100755 --- a/lib/main/lockDetail/palm/addPalm/addPalm_page.dart +++ b/lib/main/lockDetail/palm/addPalm/addPalm_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -5,7 +6,6 @@ import 'package:star_lock/main/lockDetail/palm/addPalm/addPalm_logic.dart'; import 'package:star_lock/main/lockDetail/palm/addPalm/addPalm_state.dart'; import '../../../../../app_settings/app_colors.dart'; -import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; import '../../../../tools/appRouteObserver.dart'; @@ -25,7 +25,7 @@ class _AddPalmPageState extends State with RouteAware{ return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: '添加掌静脉', + barTitle: '添加掌静脉'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( @@ -44,23 +44,23 @@ class _AddPalmPageState extends State with RouteAware{ SizedBox( height: 60.h, ), - Container( - padding: EdgeInsets.only(left: 20.w, right: 20.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: Text( - '请自然张开手掌,掌心正对摄像头,距离约一个成年\n人手掌宽度(约10厘米)。', - textAlign: TextAlign.left, - maxLines: null, - style: - TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), - ), - ), - ], - ), - ), + // Container( + // padding: EdgeInsets.only(left: 20.w, right: 20.w), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.start, + // children: [ + // Expanded( + // child: Text( + // '添加掌静脉提示'.tr, + // textAlign: TextAlign.left, + // maxLines: null, + // style: + // TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), + // ), + // ), + // ], + // ), + // ), SizedBox( height: 120.h, ), @@ -92,8 +92,8 @@ class _AddPalmPageState extends State with RouteAware{ child: Center( child: Text( state.ifConnectScuess.value - ? '已连接到锁,请自然张开手掌,掌心正对摄像头' - : '尝试连接设备...', + ? '已连接到锁,请自然张开手掌,掌心正对摄像头'.tr + : '尝试连接设备...'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp))), ) ) diff --git a/lib/main/lockDetail/palm/addPalmType/addPalmType_logic.dart b/lib/main/lockDetail/palm/addPalmType/addPalmType_logic.dart index beffc114..b5fcbd58 100755 --- a/lib/main/lockDetail/palm/addPalmType/addPalmType_logic.dart +++ b/lib/main/lockDetail/palm/addPalmType/addPalmType_logic.dart @@ -49,7 +49,7 @@ class AddPalmTypeLogic extends BaseGetXController { // } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } // AppLog.log("state.timeLimitBeginTime.value:${state.timeLimitBeginTime.value} startDate:$startDate"); diff --git a/lib/main/lockDetail/palm/addPalmType/addPalmType_page.dart b/lib/main/lockDetail/palm/addPalmType/addPalmType_page.dart index 38f06b82..ae0f0fbd 100755 --- a/lib/main/lockDetail/palm/addPalmType/addPalmType_page.dart +++ b/lib/main/lockDetail/palm/addPalmType/addPalmType_page.dart @@ -15,20 +15,21 @@ import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../tools/commonItem.dart'; +import '../../../../tools/key_name_item.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; - -class AddPalmTypePage extends StatefulWidget { // 从添加员工进入 传入员工名字 +class AddPalmTypePage extends StatefulWidget { + // 从添加员工进入 传入员工名字 const AddPalmTypePage({Key? key}) : super(key: key); @override State createState() => _AddPalmTypePageState(); } -class _AddPalmTypePageState extends State with SingleTickerProviderStateMixin { +class _AddPalmTypePageState extends State + with SingleTickerProviderStateMixin { final AddPalmTypeLogic logic = Get.put(AddPalmTypeLogic()); final AddPalmTypeState state = Get.find().state; @@ -78,10 +79,10 @@ class _AddPalmTypePageState extends State with SingleTickerProv return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyBottomWidget() ], ), @@ -93,10 +94,10 @@ class _AddPalmTypePageState extends State with SingleTickerProv return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyTimeLimitWidget(), // SizedBox(height: 10.h), keyBottomWidget() @@ -110,10 +111,10 @@ class _AddPalmTypePageState extends State with SingleTickerProv return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyCyclicDate(), SizedBox(height: 10.h), keyBottomWidget() @@ -126,21 +127,6 @@ class _AddPalmTypePageState extends State with SingleTickerProv } } - // 密码命名输入框 - Widget perpetualKeyWidget( - String titleStr, String rightTitle, TextEditingController controller) { - return Column( - children: [ - CommonItem( - leftTitel: titleStr, - rightTitle: '', - isHaveRightWidget: true, - rightWidget: getTFWidget(rightTitle)), - Container(height: 10.h), - ], - ); - } - // 限时顶部选择日期 Widget keyTimeLimitWidget() { return Column( @@ -154,23 +140,25 @@ class _AddPalmTypePageState extends State with SingleTickerProv final PDuration selectDate = PDuration.parse( DateTime.parse(state.timeLimitBeginTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { - state.timeLimitBeginTime.value = - DateTool().getYMDHNDateString(p, 1); - }); + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { + state.timeLimitBeginTime.value = + DateTool().getYMDHNDateString(p, 1); + }); })), Obx(() => CommonItem( leftTitel: '失效时间'.tr, rightTitle: state.timeLimitEndTime.value, isHaveDirection: true, action: () { - final PDuration selectDate = - PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value)); + final PDuration selectDate = PDuration.parse( + DateTime.tryParse(state.timeLimitEndTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { - state.timeLimitEndTime.value = - DateTool().getYMDHNDateString(p, 1); - }); + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { + state.timeLimitEndTime.value = + DateTool().getYMDHNDateString(p, 1); + }); })), Container(height: 10.h), ], @@ -184,18 +172,18 @@ class _AddPalmTypePageState extends State with SingleTickerProv Obx(() => CommonItem( leftTitel: '有效期'.tr, rightTitle: - '${state.cycleBeginTime.value}\n${state.cycleEndTime.value}', + '${state.cycleBeginTime.value}\n${state.cycleEndTime.value}', isHaveDirection: true, isHaveLine: true, action: () async { - final result = - await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -212,7 +200,8 @@ class _AddPalmTypePageState extends State with SingleTickerProv isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -232,10 +221,12 @@ class _AddPalmTypePageState extends State with SingleTickerProv visible: state.effectiveDateTime.value.isNotEmpty, child: CommonItem( leftTitel: '有效时间'.tr, - rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}', + rightTitle: + '${state.effectiveDateTime.value}-${state.failureDateTime.value}', isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -266,10 +257,10 @@ class _AddPalmTypePageState extends State with SingleTickerProv isTipsImg: false, isHaveRightWidget: true, rightWidget: - SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))), + SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: '胁迫掌静脉', + leftTitel: '胁迫掌静脉'.tr, rightTitle: '', isTipsImg: false, isHaveRightWidget: true, @@ -279,13 +270,13 @@ class _AddPalmTypePageState extends State with SingleTickerProv color: Colors.white, padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 20.h), child: Text( - "${"当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。".tr}\n${"请不要将胁迫掌静脉用于日常开锁"}", + "${"当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。".tr}\n${"请不要将胁迫掌静脉用于日常开锁".tr}", style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), )), SizedBox(height: 30.h), SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { @@ -304,59 +295,6 @@ class _AddPalmTypePageState extends State with SingleTickerProv ); } - // 接受者信息输入框 - Widget getTFWidget(String tfStr) { - return Container( - // color: Colors.red, - height: 65.h, - width: 300.w, - padding: EdgeInsets.only(top: 5.h), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: TextField( - //输入框一行 - maxLines: 1, - inputFormatters: [ - FilteringTextInputFormatter.deny('\n'), - LengthLimitingTextInputFormatter(50), - ], - style: TextStyle( - fontSize: 22.sp, color: AppColors.darkGrayTextColor), - controller: state.nameController, - autofocus: false, - textAlign: TextAlign.end, - decoration: InputDecoration( - //输入里面输入文字内边距设置 - // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), - hintText: tfStr, - hintStyle: TextStyle(fontSize: 22.sp), - focusedBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - disabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - enabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - border: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - contentPadding: const EdgeInsets.symmetric(vertical: 0), - ), - ), - ), - SizedBox( - width: 10.w, - ), - ], - ), - ); - } - //isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹 CupertinoSwitch _isStressFingerprint() { return CupertinoSwitch( @@ -400,12 +338,8 @@ class _AddPalmTypePageState extends State with SingleTickerProv onTap: (int index) { FocusScope.of(context).requestFocus(FocusNode()); }, - tabs: state.fromType.value == 1 - ? _itemTabs.map(_tab).toList() - : _fromCheckInTypeItemTabs - .map(_tab) - .toList(), - isScrollable: true, + tabs: _itemTabs.map(_tab).toList(), + isScrollable: false, indicatorColor: Colors.red, unselectedLabelColor: Colors.black, unselectedLabelStyle: TextStyle( @@ -422,13 +356,18 @@ class _AddPalmTypePageState extends State with SingleTickerProv borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, width: 30.w), + labelPadding: EdgeInsets.symmetric(horizontal: 10.w), + padding: EdgeInsets.zero, // 去除TabBar两侧的间隙 ); } Tab _tab(ItemView item) { return Tab( - child: SizedBox( - width: 1.sw / 5, + child: Container( + // color: Colors.red, + width: (1.sw - 10.w * 5) / 3, + // width: 1.sw / 4, + alignment: Alignment.center, child: Text(item.title, textAlign: TextAlign.center))); } @@ -437,12 +376,10 @@ class _AddPalmTypePageState extends State with SingleTickerProv child: TabBarView( controller: state.tabController, children: state.fromType.value == 1 - ? _itemTabs - .map((ItemView item) => Obx(indexChangeWidget)) - .toList() + ? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList() : _fromCheckInTypeItemTabs - .map((ItemView item) => Obx(indexChangeWidget)) - .toList(), + .map((ItemView item) => Obx(indexChangeWidget)) + .toList(), ), ); } @@ -453,4 +390,4 @@ class ItemView { final String title; final String selectType; -} \ No newline at end of file +} diff --git a/lib/main/lockDetail/palm/palmDetail/palmDetail_logic.dart b/lib/main/lockDetail/palm/palmDetail/palmDetail_logic.dart index 8bf669e0..49328f87 100755 --- a/lib/main/lockDetail/palm/palmDetail/palmDetail_logic.dart +++ b/lib/main/lockDetail/palm/palmDetail/palmDetail_logic.dart @@ -1,9 +1,9 @@ + import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart'; -import 'package:star_lock/blue/io_type.dart'; import 'package:star_lock/main/lockDetail/palm/palmDetail/palmDetail_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; diff --git a/lib/main/lockDetail/palm/palmDetail/palmDetail_page.dart b/lib/main/lockDetail/palm/palmDetail/palmDetail_page.dart index 7941a11d..e8621160 100755 --- a/lib/main/lockDetail/palm/palmDetail/palmDetail_page.dart +++ b/lib/main/lockDetail/palm/palmDetail/palmDetail_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -15,7 +16,6 @@ import '../../../../tools/showIosTipView.dart'; import '../../../../tools/showTFView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'palmDetail_state.dart'; class PalmDetailPage extends StatefulWidget { @@ -34,14 +34,14 @@ class _PalmDetailPageState extends State with RouteAware { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '掌静脉详情', + barTitle: '掌静脉详情'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: ListView( children: [ Obx(() => CommonItem( - leftTitel: '掌静脉号', + leftTitel: '掌静脉号'.tr, rightTitle: state.typeNumber.value, isHaveDirection: false, isHaveLine: true)), @@ -104,7 +104,7 @@ class _PalmDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4 , child: Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + leftTitel: '有效日'.tr, rightTitle: logic.weekDayStr.join(','), isHaveDirection: true, isHaveLine: true, @@ -129,7 +129,7 @@ class _PalmDetailPageState extends State with RouteAware { Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: '有效时间', + leftTitel: '有效时间'.tr, rightTitle: '${DateTool().dateToHNString(state.starTime.value)}-${DateTool().dateToHNString(state.endTime.value)}', isHaveDirection: true, @@ -163,7 +163,7 @@ class _PalmDetailPageState extends State with RouteAware { )), SizedBox(height: 10.h), Obx(() => CommonItem( - leftTitel: '胁迫掌静脉', + leftTitel: '胁迫掌静脉'.tr, rightTitle: '', isTipsImg: false, isHaveLine: true, @@ -218,7 +218,7 @@ class _PalmDetailPageState extends State with RouteAware { controller: state.changeNameController, sureClick: () { if (state.changeNameController.text.isEmpty) { - logic.showToast('请输入姓名'); + logic.showToast('请输入姓名'.tr); return; } Get.back(); @@ -237,8 +237,8 @@ class _PalmDetailPageState extends State with RouteAware { context: context, builder: (BuildContext context) { return ShowIosTipView( - title: '提示', - tipTitle: '确定要删除吗?', + title: '提示'.tr, + tipTitle: '确定要删除吗?'.tr, sureClick: () async { Get.back(); // String? idStr = await Storage.getUid(); diff --git a/lib/main/lockDetail/palm/palmList/palmList_logic.dart b/lib/main/lockDetail/palm/palmList/palmList_logic.dart index 15a00abc..b18e3609 100755 --- a/lib/main/lockDetail/palm/palmList/palmList_logic.dart +++ b/lib/main/lockDetail/palm/palmList/palmList_logic.dart @@ -23,12 +23,14 @@ class PalmListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { - // 添加掌静脉开始(重置锁里面所有掌静脉) - if ((reply is SenderAddPalmWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) { - _replyAddPalmBegin(reply); - } - }); + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) { + // 添加掌静脉开始(重置锁里面所有掌静脉) + if ((reply is SenderAddPalmWithTimeCycleCoercionReply) && + (state.ifCurrentScreen.value == true)) { + _replyAddPalmBegin(reply); + } + }); } // 添加卡片开始(此处用作删除卡片) @@ -37,23 +39,23 @@ class PalmListLogic extends BaseGetXController { switch (status) { case 0x00: - //成功 + //成功 cancelBlueConnetctToastTimer(); - if(state.isDeletAll == true){ + if (state.isDeletAll == true) { resetPalmData(); - }else{ + } else { deletPalmData(); } break; case 0x06: - //无权限 + //无权限 final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); + await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = - changeStringListToIntList(privateKey!); + changeStringListToIntList(privateKey!); final List? signKey = - await Storage.getStringList(saveBlueSignKey); + await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final List token = reply.data.sublist(5, 9); @@ -81,7 +83,7 @@ class PalmListLogic extends BaseGetXController { isBeforeAddUser: false); break; default: - //失败 + //失败 break; } } @@ -93,59 +95,60 @@ class PalmListLogic extends BaseGetXController { dismissEasyLoading(); }); BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState deviceConnectionState) async { - if (deviceConnectionState == BluetoothConnectionState.connected) { - final List? signKey = + (BluetoothConnectionState deviceConnectionState) async { + if (deviceConnectionState == BluetoothConnectionState.connected) { + final List? signKey = await Storage.getStringList(saveBlueSignKey); - final List signKeyDataList = changeStringListToIntList(signKey!); + final List signKeyDataList = changeStringListToIntList(signKey!); - final List? privateKey = + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - final List? token = await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - IoSenderManage.senderAddPalmWithTimeCycleCoercionCommand( - keyID: state.deletKeyID, - userID: (await Storage.getUid())!, - palmNo: state.deletPalmVeinNo, - useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 - isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 - startDate: 0x11223344, - endDate: 0x11223344, - startTime: '0', - endTime: '0', - needAuthor: 1, - signKey: signKeyDataList, - privateKey: getPrivateKeyList, - token: getTokenList, - isBeforeAddUser: false); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { - dismissEasyLoading(); - cancelBlueConnetctToastTimer(); - if (state.ifCurrentScreen.value == true) { - showBlueConnetctToast(); - } - } - }); + IoSenderManage.senderAddPalmWithTimeCycleCoercionCommand( + keyID: state.deletKeyID, + userID: (await Storage.getUid())!, + palmNo: state.deletPalmVeinNo, + useCountLimit: 0xffff, + operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + isAdmin: 0, + isForce: 0, // 是否是胁迫 + isRound: 0, // 是否是循环 + weekRound: 0, // 周循环 + startDate: 0x11223344, + endDate: 0x11223344, + startTime: '0', + endTime: '0', + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + isBeforeAddUser: false); + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + } + }); } // 获取掌静脉列表 - Future getPalmListData({required bool isRefresh}) async { + Future getPalmListData( + {required bool isRefresh}) async { // 如果是下拉刷新,清空已有数据 if (isRefresh) { state.fingerprintItemListData.clear(); pageNo = 1; } final FingerprintListDataEntity entity = - await ApiRepository.to.getPalmListData( + await ApiRepository.to.getPalmListData( lockId: state.lockId.value.toString(), pageNo: pageNo.toString(), pageSize: pageSize, @@ -162,9 +165,8 @@ class PalmListLogic extends BaseGetXController { // 删除所有掌静脉 Future resetPalmData() async { - final LoginEntity entity = await ApiRepository.to.resetPalmData( - lockId: state.lockId.value - ); + final LoginEntity entity = + await ApiRepository.to.resetPalmData(lockId: state.lockId.value); if (entity.errorCode!.codeIsSuccessful) { showToast('重置成功'.tr, something: () { getPalmListData(isRefresh: true); @@ -211,13 +213,13 @@ class PalmListLogic extends BaseGetXController { String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4 if (fingerprintItemData.palmVeinType! == 1) { keyDateTypeStr = - '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久'; + '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}'; } else if (fingerprintItemData.palmVeinType! == 2) { keyDateTypeStr = - '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时'; + '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}'; } else if (fingerprintItemData.palmVeinType! == 4) { keyDateTypeStr = - '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环'; + '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}'; } return keyDateTypeStr; } diff --git a/lib/main/lockDetail/palm/palmList/palmList_page.dart b/lib/main/lockDetail/palm/palmList/palmList_page.dart index 190098eb..b1336f25 100755 --- a/lib/main/lockDetail/palm/palmList/palmList_page.dart +++ b/lib/main/lockDetail/palm/palmList/palmList_page.dart @@ -56,7 +56,7 @@ class _PalmListPageState extends State with RouteAware { backgroundColor: AppColors.mainBackgroundColor, resizeToAvoidBottomInset: false, appBar: TitleAppBar( - barTitle: '掌静脉', + barTitle: '掌静脉'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -74,7 +74,7 @@ class _PalmListPageState extends State with RouteAware { } ShowTipView().showIosTipWithContentDialog( - '重置后,该锁的卡都将被删除哦,确认要重置吗?'.tr, () async { + '重置后,该锁的掌静脉都将被删除哦,确认要重置吗?'.tr, () async { state.isDeletAll = true; state.deletKeyID = '0'; state.deletPalmVeinNo = 0; @@ -106,7 +106,7 @@ class _PalmListPageState extends State with RouteAware { SizedBox(height: 20.h), Expanded(child: _buildMainUI()), AddBottomWhiteBtn( - btnName: '添加掌静脉', + btnName: '添加掌静脉'.tr, onClick: () async { await Get.toNamed(Routers.addPalmTypePage, arguments: { 'lockId': state.lockId.value, diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index f2c09851..e53bccf0 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -202,52 +202,52 @@ class PasswordKeyDetailLogic extends BaseGetXController { break; case 5: //周未循环 5 在周未开始和结束时间指定时间段内有效 - useDateStr = '周末 $starHour:00-$endHour:00'; + useDateStr = '周末'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 6: //每日循环 6 每天开始和结束时间指定时间段内有效 - useDateStr = '每日 $starHour:00-$endHour:00'; + useDateStr = '每日'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 7: //工作日循环 7 工作日开始和结束时间指定的时间段内有效 - useDateStr = '工作日 $starHour:00-$endHour:00'; + useDateStr = '工作日'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 8: //周一循环 8 每周一开始和结束时间指定时间段内有效 - useDateStr = '周一 $starHour:00-$endHour:00'; + useDateStr = '周一'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 9: //周二循环 9 每周二开始和结束时间指定时间段内有效 - useDateStr = '周二 $starHour:00-$endHour:00'; + useDateStr = '周二'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 10: //周三循环 10 每周三开始和结束时间指定时间段内有效 - useDateStr = '周三 $starHour:00-$endHour:00'; + useDateStr = '周三'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 11: //周四循环 11 每周四开始和结束时间指定时间段内有效 - useDateStr = '周四 $starHour:00-$endHour:00'; + useDateStr = '周四'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 12: //周五循环 12 每周五开始和结束时间指定时间段内有效 - useDateStr = '周五 $starHour:00-$endHour:00'; + useDateStr = '周五'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 13: //周六循环 13 每周六开始和结束时间指定时间段内有效 - useDateStr = '周六 $starHour:00-$endHour:00'; + useDateStr = '周六'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; case 14: //周日循环 14 每周日开始和结束时间指定时间段内有效 - useDateStr = '周日 $starHour:00-$endHour:00'; + useDateStr = '周日'.tr + '$starHour:00-$endHour:00'; state.isCirculation.value = true; break; default: @@ -269,64 +269,64 @@ class PasswordKeyDetailLogic extends BaseGetXController { case 1: //单次 1 只能在开始时间后6小时内使用一次 useDateStr = - '类型:永久\n有效期:${startDateStr.toLocal().toString().substring(0, 16)} -- ${endDateStr.toLocal().toString().substring(0, 16)}'; + '类型'.tr + ':' + '永久'.tr + '\n' + '有效期'.tr + ':${startDateStr.toLocal().toString().substring(0, 16)} -- ${endDateStr.toLocal().toString().substring(0, 16)}'; break; case 2: //永久 2 从开始时间开始永久有效,必需在开始时间24小时内使用一次,否则将失效 - useDateStr = '类型:永久'; + useDateStr = '类型'.tr + ':' + '永久'.tr; break; case 3: //限期 3 在开始和结束时间内有效,必需在开始时间24小时内使用一次,否则将失效 useDateStr = - '类型:限时\n有效期:${startDateStr.toLocal().toString().substring(0, 16)}-${endDateStr.toLocal().toString().substring(0, 16)}'; + '类型'.tr + ':' + '限时'.tr + '\n' + '有效期'.tr + ':${startDateStr.toLocal().toString().substring(0, 16)}-${endDateStr.toLocal().toString().substring(0, 16)}'; break; case 4: //删除 4 在锁上使用后会删除之前在锁上使用过的密码 - useDateStr = '类型:清空'; + useDateStr = '类型'.tr + ':' + '清空'.tr; break; case 5: //周未循环 5 在周未开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n 周末 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周末'.tr + ' $starHour:00-$endHour:00'; break; case 6: //每日循环 6 每天开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n每日 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '每日'.tr + ' $starHour:00-$endHour:00'; break; case 7: //工作日循环 7 工作日开始和结束时间指定的时间段内有效 - useDateStr = '类型:循环\n工作日 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '工作日'.tr + ' $starHour:00-$endHour:00'; break; case 8: //周一循环 8 每周一开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周一 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周一'.tr + ' $starHour:00-$endHour:00'; break; case 9: //周二循环 9 每周二开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周二 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周二'.tr + ' $starHour:00-$endHour:00'; break; case 10: //周三循环 10 每周三开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周三 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周三'.tr + ' $starHour:00-$endHour:00'; break; case 11: //周四循环 11 每周四开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周四 $starHour:00 -$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周四'.tr + ' $starHour:00 -$endHour:00'; break; case 12: //周五循环 12 每周五开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周五 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周五'.tr + ' $starHour:00-$endHour:00'; break; case 13: //周六循环 13 每周六开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周六 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周六'.tr + ' $starHour:00-$endHour:00'; break; case 14: //周日循环 14 每周日开始和结束时间指定时间段内有效 - useDateStr = '类型:循环\n周日 $starHour:00-$endHour:00'; + useDateStr = '类型'.tr + ':' + '循环'.tr + '\n' + '周日'.tr + ' $starHour:00-$endHour:00'; break; default: } - return '您好,您的密码是:${state.itemData.value.keyboardPwd}\n$useDateStr\n密码名字:${state.itemData.value.keyboardPwdName}'; + return '您好,您的密码是'.tr + ':${state.itemData.value.keyboardPwd}\n$useDateStr\n${'密码名字'.tr}:${state.itemData.value.keyboardPwdName}'; } @override diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart index cd0c487c..65be1a07 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart @@ -17,7 +17,6 @@ import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; class PasswordKeyDetailPage extends StatefulWidget { @@ -90,7 +89,7 @@ class _PasswordKeyDetailPageState extends State context, state.inputNameController); })), Obx(() => CommonItem( - leftTitel: '有效期', + leftTitel: '有效期'.tr, rightTitle: logic.getUseDateStr(), isHaveLine: state.isCirculation.value, isHaveDirection: state.itemData.value.isCustom! == 1, @@ -291,7 +290,7 @@ class _PasswordKeyDetailPageState extends State : '修改密码'.tr, tipTitle: inputController.text.isNotEmpty ? inputController.text - : '请输入6-9位密码', + : '请输入6-9位密码'.tr, controller: inputController, keyboardType: inputController == state.inputNameController ? TextInputType.text @@ -307,7 +306,7 @@ class _PasswordKeyDetailPageState extends State if (inputController.text.isEmpty || inputController.text.length < 6 || inputController.text.length > 9) { - logic.showToast('请输入6-9位密码'); + logic.showToast('请输入6-9位密码'.tr); return; } } @@ -343,7 +342,7 @@ class _PasswordKeyDetailPageState extends State width: ScreenUtil().screenWidth, child: Center( child: Text( - '分享', + '分享'.tr, style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor, @@ -393,10 +392,10 @@ class _PasswordKeyDetailPageState extends State List initBottomSheetList() { final List widgetList = []; - widgetList.add(buildCenter3('images/icon_wechat.png', '微信好友', 0)); - widgetList.add(buildCenter3('images/icon_message.png', '短信', 1)); - widgetList.add(buildCenter3('images/icon_email.png', '邮件', 2)); - widgetList.add(buildCenter3('images/icon_more.png', '更多', 3)); + widgetList.add(buildCenter3('images/icon_wechat.png', '微信好友'.tr, 0)); + widgetList.add(buildCenter3('images/icon_message.png', '短信'.tr, 1)); + widgetList.add(buildCenter3('images/icon_email.png', '邮件'.tr, 2)); + widgetList.add(buildCenter3('images/icon_more.png', '更多'.tr, 3)); return widgetList; } diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart index 9f4185a0..23135066 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart @@ -80,12 +80,12 @@ class PasswordKeyDetailChangeDateLogic extends BaseGetXController { final int endTimeTimestamp = DateTool().dateToTimestamp(state.selectFailureDate.value, 1); if (beginTimeTimestamp > endTimeTimestamp || beginTimeTimestamp == endTimeTimestamp) { - showToast('失效时间需大于生效时间'); + showToast('失效时间需晚于生效时间'.tr); return; } if (endTimeTimestamp < DateTime.now().millisecondsSinceEpoch) { - showToast('生效时间需大于当前时间'); + showToast('生效时间需晚于当前时间'.tr); return; } @@ -103,9 +103,9 @@ class PasswordKeyDetailChangeDateLogic extends BaseGetXController { keyboardPwdType: 3, pwdRight: state.pwdRight); if (entity.errorCode!.codeIsSuccessful) { - showToast('修改成功', something: (){ + showToast('修改成功'.tr, something: (){ eventBus.fire(GetPasswordListRefreshUI()); - AppLog.log('beginTimeTimestamp:$beginTimeTimestamp endTimeTimestamp:$endTimeTimestamp'); + // AppLog.log('beginTimeTimestamp:$beginTimeTimestamp endTimeTimestamp:$endTimeTimestamp'); Get.back(result: { 'beginTimeTimestamp': beginTimeTimestamp.toString(), 'endTimeTimestamp': endTimeTimestamp.toString(), diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart index fbe193a4..87b6606e 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart @@ -11,7 +11,6 @@ import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/dateTool.dart'; @@ -43,7 +42,7 @@ class _PasswordKeyDetailChangeDatePage extends State= state.endDate) { - logic.showToast('失效时间要大于生效时间'.tr); + logic.showToast('失效时间需晚于生效时间'.tr); return; } diff --git a/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart index 07de005a..1b9ce0f4 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; -import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_state.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -15,7 +14,6 @@ import '../../../../blue/io_reply.dart'; import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/sender_manage.dart'; -import '../../../../mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/storage.dart'; import '../passwordKey_perpetual/passwordKeyEntity.dart'; @@ -332,62 +330,62 @@ class PasswordKeyListLogic extends BaseGetXController { case 1: //单次 1 只能在开始时间后6小时内使用一次 useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)} ${"单次".tr}'; + '${startDateStr.toLocal().toString().substring(0, 16)} ${'单次'.tr}'; break; case 2: //永久 2 从开始时间开始永久有效,必需在开始时间24小时内使用一次,否则将失效 useDateStr = - '${sendDateStr.toLocal().toString().substring(0, 16)} ${"永久".tr} ${indexEntity.isCustom! == 1 ? "自定义".tr : ""}'; + '${sendDateStr.toLocal().toString().substring(0, 16)} ${'永久'.tr} ${indexEntity.isCustom! == 1 ? '自定义'.tr : ''}'; break; case 3: //限期 3 在开始和结束时间内有效,必需在开始时间24小时内使用一次,否则将失效 useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)} - ${endDateStr.toLocal().toString().substring(0, 16)} ${"限时".tr} ${indexEntity.isCustom! == 1 ? "自定义".tr : ""}'; + '${startDateStr.toLocal().toString().substring(0, 16)} - ${endDateStr.toLocal().toString().substring(0, 16)} ${'限时'.tr} ${indexEntity.isCustom! == 1 ? '自定义'.tr : ''}'; break; case 4: //删除 4 在锁上使用后会删除之前在锁上使用过的密码 useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)} ${"清空码".tr}'; + '${startDateStr.toLocal().toString().substring(0, 16)} ${'清空码'.tr}'; break; case 5: //周未循环 5 在周未开始和结束时间指定时间段内有效 - useDateStr = '${"周末".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周末'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 6: //每日循环 6 每天开始和结束时间指定时间段内有效 - useDateStr = '${"每日".tr}$starHour:00-$endHour:00 ${"循环"}'; + useDateStr = '${'每日'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 7: //工作日循环 7 工作日开始和结束时间指定的时间段内有效 - useDateStr = '${"工作日".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'工作日'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 8: //周一循环 8 每周一开始和结束时间指定时间段内有效 - useDateStr = '${"周一".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周一'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 9: //周二循环 9 每周二开始和结束时间指定时间段内有效 - useDateStr = '${"周二".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周二'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 10: //周三循环 10 每周三开始和结束时间指定时间段内有效 - useDateStr = '${"周三".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周三'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 11: //周四循环 11 每周四开始和结束时间指定时间段内有效 - useDateStr = '${"周四".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周四'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 12: //周五循环 12 每周五开始和结束时间指定时间段内有效 - useDateStr = '${"周五".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周五'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 13: //周六循环 13 每周六开始和结束时间指定时间段内有效 - useDateStr = '${"周六".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周六'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; case 14: //周天循环 14 每周日开始和结束时间指定时间段内有效 - useDateStr = '${"周日".tr}$starHour:00-$endHour:00 ${"循环".tr}'; + useDateStr = '${'周日'.tr}$starHour:00-$endHour:00 ${'循环'.tr}'; break; default: diff --git a/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart b/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart index 30d1cf37..c9883358 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -17,7 +18,6 @@ import '../../../../tools/keySearchWidget.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class PasswordKeyListPage extends StatefulWidget { const PasswordKeyListPage({Key? key}) : super(key: key); @@ -114,9 +114,10 @@ class _PasswordKeyListPageState extends State btnName: '获取密码'.tr, onClick: () async { await Get.toNamed(Routers.passwordKeyPerpetualPage, - arguments: { + arguments: { 'keyInfo': state.keyInfo.value - })!.then((Object? val) { + })! + .then((Object? val) { if (val != null) { getHttpData(isRefresh: true); } @@ -177,13 +178,17 @@ class _PasswordKeyListPageState extends State ), ], ), - child: _electronicKeyItem(index, 'images/icon_password.png', - passwordKeyListItem.keyboardPwdName!, useDateStr, () async { - await Get.toNamed(Routers.passwordKeyDetailPage, - arguments: { + child: _electronicKeyItem( + index, + 'images/icon_password.png', + passwordKeyListItem.keyboardPwdName!, + useDateStr, () async { + await Get.toNamed(Routers.passwordKeyDetailPage, + arguments: { 'itemData': passwordKeyListItem - })!.then((Object? val) { - getHttpData(isRefresh: true); + })! + .then((Object? val) { + getHttpData(isRefresh: true); // if (val == 'deletScuess') { // state.itemDataList.removeWhere( // (PasswordKeyListItem item) => @@ -220,8 +225,9 @@ class _PasswordKeyListPageState extends State return GestureDetector( onTap: action, child: Container( - height: 90.h, + // height: 90.h, // margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w), + padding: EdgeInsets.only(top: 10.h, bottom: 10.h), color: Colors.white, child: Row( children: [ @@ -234,27 +240,19 @@ class _PasswordKeyListPageState extends State SizedBox( width: 20.w, ), - Expanded( + SizedBox( + width: 1.sw - 70.w - 60.w, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( children: [ - SizedBox( - width: passwordKeyListItem.keyboardPwdStatus == 2 || - passwordKeyListItem.keyboardPwdStatus == 3 - ? 1.sw - 110.w - 100.w - : 1.sw - 110.w - 50.w, - child: Row(children: [ - Flexible( - child: Text(lockTypeTitle, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor)), - ) - ]), + Expanded( + child: Text(lockTypeTitle, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor)), ), SizedBox(width: 10.w), if (passwordKeyListItem.keyboardPwdStatus == 2) @@ -279,8 +277,6 @@ class _PasswordKeyListPageState extends State Flexible( child: Text( useDateStr, - maxLines: 1, - overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 18.sp, color: AppColors.placeholderTextColor), @@ -292,7 +288,7 @@ class _PasswordKeyListPageState extends State ], ), ), - SizedBox(width: 20.h), + SizedBox(width: 20.w), ], ), ), diff --git a/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_state.dart b/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_state.dart index 0ba3e1c1..68f3851e 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_state.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_state.dart @@ -5,19 +5,19 @@ import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKe import '../../../lockMian/entity/lockListInfo_entity.dart'; class PasswordKeyListState { - final keyInfo = LockListInfoItemEntity().obs; - final itemDataList = [].obs; - var itemData = PasswordKeyListItem(); - final TextEditingController searchController = TextEditingController(); - - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) - - var pwdNo = 0; - var pwd = "0"; - var encrpyKey = []; PasswordKeyListState() { Map map = Get.arguments; - keyInfo.value = map["keyInfo"]; + keyInfo.value = map['keyInfo']; } + final Rx keyInfo = LockListInfoItemEntity().obs; + final RxList itemDataList = [].obs; + PasswordKeyListItem itemData = PasswordKeyListItem(); + final TextEditingController searchController = TextEditingController(); + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) + + int pwdNo = 0; + String pwd = '0'; + List encrpyKey = []; } diff --git a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart index 4b1357b2..3c9e006e 100755 --- a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart @@ -6,6 +6,7 @@ import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/pass import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_state.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_modelVendor.dart'; @@ -15,6 +16,7 @@ import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/sender_manage.dart'; import '../../../../tools/baseGetXController.dart'; +import '../../../../tools/bugly/bugly_tool.dart'; import '../../../../tools/commonDataManage.dart'; import '../../../../tools/dateTool.dart'; import '../../../../tools/storage.dart'; @@ -75,7 +77,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { } if (startDate >= endDate) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } } @@ -101,28 +103,28 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { } if (state.loopStartHours.value >= state.loopEndHours.value) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } - if (state.loopModeStr.value == '周末') { + if (state.loopModeStr.value == '周末'.tr) { getKeyType = '5'; - } else if (state.loopModeStr.value == '每日') { + } else if (state.loopModeStr.value == '每日'.tr) { getKeyType = '6'; - } else if (state.loopModeStr.value == '工作日') { + } else if (state.loopModeStr.value == '工作日'.tr) { getKeyType = '7'; - } else if (state.loopModeStr.value == '星期一') { + } else if (state.loopModeStr.value == '星期一'.tr) { getKeyType = '8'; - } else if (state.loopModeStr.value == '星期二') { + } else if (state.loopModeStr.value == '星期二'.tr) { getKeyType = '9'; - } else if (state.loopModeStr.value == '星期三') { + } else if (state.loopModeStr.value == '星期三'.tr) { getKeyType = '10'; - } else if (state.loopModeStr.value == '星期四') { + } else if (state.loopModeStr.value == '星期四'.tr) { getKeyType = '11'; - } else if (state.loopModeStr.value == '星期五') { + } else if (state.loopModeStr.value == '星期五'.tr) { getKeyType = '12'; - } else if (state.loopModeStr.value == '星期六') { + } else if (state.loopModeStr.value == '星期六'.tr) { getKeyType = '13'; - } else if (state.loopModeStr.value == '星期日') { + } else if (state.loopModeStr.value == '星期日'.tr) { getKeyType = '14'; } } else if (state.widgetType.value == 5) { @@ -178,7 +180,15 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { endDate: getFailureDateTime, addType: '1', pwdRight: state.isAdministrator.value == true ? 1 : 0); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('add_password', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_password_result':'成功', + }); + state.isSendSuccess.value = true; state.sendSucceedType.value = state.widgetType.value; state.pwdNameStr = state.nameController.text; @@ -189,6 +199,12 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { updatePWDNumberRequest(entity.data!.keyboardPwdId.toString()); } } else { + UmengCommonSdk.onEvent('add_password', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_password_result':'${entity.errorMsg}', + }); showToast('${entity.errorMsg}'); } } @@ -228,11 +244,16 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = - EventBusManager().eventBus!.on().listen((Reply reply) async { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) async { // 设置自定义密码 - if ((reply is SenderCustomPasswordsReply) && - (state.ifCurrentScreen.value == true)) { + if ((reply is SenderCustomPasswordsReply) && (state.ifCurrentScreen.value == true)) { + BuglyTool.uploadException( + message: '添加密码结果,解析数据', + detail: '添加密码结果,解析数据:${reply.data}', + eventStr: '添加密码事件结果', + upload: true + ); + final int status = reply.data[2]; switch (status) { case 0x00: @@ -345,12 +366,12 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { if (state.isPermanent.value == false) { if (startDate < DateTool().dateToTimestamp(DateTool().getNowDateWithType(2), 1)) { - showToast('生效时间要大于当前时间'); + showToast('生效时间需晚于当前时间'.tr); return; } if (endDate <= startDate) { - showToast('失效时间需大于生效时间'); + showToast('失效时间需晚于生效时间'.tr); return; } } else { @@ -360,7 +381,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { if (state.pwdController.text.length < 6 || state.pwdController.text.length > 9) { - showToast('请输入6-9位数字密码'); + showToast('请输入6-9位数字'.tr); return; } @@ -369,22 +390,60 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { } state.sureBtnState.value = 1; + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); + + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + final String command = SenderCustomPasswordsCommand( + keyID: '1', + userID: await Storage.getUid(), + pwdNo: 0, + pwd: state.pwdController.text, + operate: 0, + isAdmin: state.isAdministrator.value == true ? 1 : 0, + useCountLimit: 0xffff, + startTime: startDate ~/ 1000, + endTime: endDate ~/ 1000, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList + ).toString(); + + showEasyLoading(); - showBlueConnetctToastTimer(action: () { + showBlueConnetctToastTimer(action: () async { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('add_password', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_password_result':'添加自定义密码超时', + }); + + BuglyTool.uploadException( + message: '添加密码超时处理-添加密码失败', + detail: '添加密码超时,添加密码失败--senderCustomPasswordsCommand:$command', + eventStr: '添加密码事件超时', + upload: true + ); + dismissEasyLoading(); state.sureBtnState.value = 0; }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { - final List? signKey = - await Storage.getStringList(saveBlueSignKey); + final List? signKey = await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); - final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = - changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); @@ -404,8 +463,22 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { signKey: signKeyDataList, privateKey: getPrivateKeyList, token: getTokenList); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('add_password', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'add_password_result':'添加自定义密码断开', + }); + + BuglyTool.uploadException( + message: '添加密码断开-添加密码失败', + detail: '添加密码断开,添加密码失败--senderCustomPasswordsCommand:$command', + eventStr: '添加密码事件断开连接', + upload: true + ); + dismissEasyLoading(); cancelBlueConnetctToastTimer(); state.sureBtnState.value = 0; @@ -427,31 +500,35 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { switch (getPwdType) { case 0: // 永久 从开始时间开始永久有效,必需在开始时间24小时内使用一次,否则将失效 - useDateStr = '类型:永久'; + useDateStr = '类型'.tr + ':' + '永久'; break; case 1: //限时 在开始和结束时间内有效,必需在开始时间24小时内使用一次,否则将失效 - useDateStr = - '类型:限时\n有效期:${state.beginTime.value} -- ${state.endTime.value}'; + useDateStr = '类型'.tr + + ':' + + '限时\n${'有效期'.tr}:${state.beginTime.value} -- ${state.endTime.value}'; break; case 2: //单次 只能在开始时间后6小时内使用一次 - useDateStr = - '类型:单次\n有效期:${state.beginTime.value} -- ${state.endTime.value}'; + useDateStr = '类型'.tr + + ':' + + '单次\n${'有效期'.tr}:${state.beginTime.value} -- ${state.endTime.value}'; break; case 3: //自定义 if (state.isPermanent.value == false) { - useDateStr = - '类型:自定义-限时\n有效期:${state.customBeginTime.value} -- ${state.customEndTime.value}'; + useDateStr = '类型'.tr + + ':' + + '自定义-限时\n${'有效期'.tr}:${state.customBeginTime.value} -- ${state.customEndTime.value}'; } else { - useDateStr = '类型:自定义-永久'; + useDateStr = '类型:自定义-永久'.tr; } break; case 4: //周未循环 在周未开始和结束时间指定时间段内有效 - useDateStr = - '类型:循环\n${state.loopModeStr.value} ${state.loopEffectiveDate.value}:00-${state.loopFailureDate.value}'; + useDateStr = '类型'.tr + + ':' + + '循环\n${state.loopModeStr.value} ${state.loopEffectiveDate.value}:00-${state.loopFailureDate.value}'; break; case 5: //删除 4 在锁上使用后会删除之前在锁上使用过的密码 @@ -460,7 +537,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { default: } - return '您好,您的密码是:${state.getPwdStr.value}\n$useDateStr\n密码名字:${state.pwdNameStr}'; + return '${'您好,您的密码是'.tr}:${state.getPwdStr.value}\n$useDateStr\n${'密码名字'.tr}:${state.pwdNameStr}'; } String addSpaces(String input) { diff --git a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart index 13dab788..edb88de7 100755 --- a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart +++ b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart @@ -1,7 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -26,7 +25,6 @@ import '../../../../tools/dateTool.dart'; import '../../../../tools/pickers/time_picker/model/pduration.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class PasswordKeyPerpetualPage extends StatefulWidget { const PasswordKeyPerpetualPage({Key? key}) : super(key: key); @@ -89,10 +87,7 @@ class _PasswordKeyPerpetualPageState extends State child: Column( children: [ perpetualKeyWidget( - false, - '姓名'.tr, - '请给密码命名'.tr, - state.nameController), + false, '姓名'.tr, '请给密码命名'.tr, state.nameController), keyBottomWidget( '密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。' .tr) @@ -108,10 +103,7 @@ class _PasswordKeyPerpetualPageState extends State children: [ keyTimeLimitWidget(), perpetualKeyWidget( - false, - '姓名'.tr, - '请给密码命名'.tr, - state.nameController), + false, '姓名'.tr, '请给密码命名'.tr, state.nameController), keyBottomWidget( '密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。' .tr) @@ -126,12 +118,8 @@ class _PasswordKeyPerpetualPageState extends State child: Column( children: [ perpetualKeyWidget( - false, - '姓名'.tr, - '请给密码命名'.tr, - state.nameController), - keyBottomWidget( - '密码有限期为6个小时,只能使用一次'.tr) + false, '姓名'.tr, '请给密码命名'.tr, state.nameController), + keyBottomWidget('密码有限期为6个小时,只能使用一次'.tr) ], ), ); @@ -148,18 +136,11 @@ class _PasswordKeyPerpetualPageState extends State else Container(), perpetualKeyWidget( - false, - '姓名'.tr, - '请给密码命名'.tr, - state.nameController), + false, '姓名'.tr, '请给密码命名'.tr, state.nameController), perpetualKeyWidget( - false, - '密码'.tr, - '请输入6-9位数字', - state.pwdController), + false, '密码'.tr, '请输入6-9位数字'.tr, state.pwdController), keyIfAdministratorWidget(), - keyBottomWidget( - '手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加'.tr) + keyBottomWidget('手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加'.tr) ], ), ); @@ -172,10 +153,7 @@ class _PasswordKeyPerpetualPageState extends State children: [ keyCirculationWidget(), perpetualKeyWidget( - true, - '姓名'.tr, - '请给密码命名'.tr, - state.nameController), + true, '姓名'.tr, '请给密码命名'.tr, state.nameController), keyBottomWidget( '密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。' .tr) @@ -190,10 +168,7 @@ class _PasswordKeyPerpetualPageState extends State child: Column( children: [ perpetualKeyWidget( - false, - '姓名'.tr, - '请给密码命名'.tr, - state.nameController), + false, '姓名'.tr, '请给密码命名'.tr, state.nameController), keyBottomWidget('清空密码底部提示'.tr) ], ), @@ -211,12 +186,74 @@ class _PasswordKeyPerpetualPageState extends State return Column( children: [ if (isTopHeight) SizedBox(height: 10.h) else Container(), - CommonItem( - leftTitel: titleStr, - rightTitle: '', - isHaveRightWidget: true, - rightWidget: getTFWidget(rightTitle, controller)), - SizedBox(height: 10.h), + // CommonItem( + // leftTitel: titleStr, + // rightTitle: '', + // isHaveRightWidget: true, + // rightWidget: getTFWidget(rightTitle, controller)), + // SizedBox(height: 10.h), + Container( + height: 65.h, + padding: EdgeInsets.only(left: 20.w, right: 20.w), + color: Colors.white, + child: Row( + children: [ + Text(titleStr, style: TextStyle(fontSize: 22.sp)), + SizedBox(width: 6.w), + Expanded( + child: TextField( + //输入框一行 + maxLines: 1, + inputFormatters: controller == state.pwdController + ? [ + FilteringTextInputFormatter.deny('\n'), + LengthLimitingTextInputFormatter(9), + FilteringTextInputFormatter.allow(RegExp(r'[0-9]')), + ] + : [ + FilteringTextInputFormatter.deny('\n'), + LengthLimitingTextInputFormatter(50), + ], + keyboardType: controller == state.nameController + ? TextInputType.text + : TextInputType.number, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + controller: controller, + autofocus: false, + textAlign: TextAlign.end, + // decoration: InputDecoration( + // //输入里面输入文字内边距设置 + // contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h), + // hintText: tfStr, + // hintStyle: TextStyle(fontSize: 22.sp), + // //不需要输入框下划线 + // border: InputBorder.none, + // ), + decoration: InputDecoration( + //输入里面输入文字内边距设置 + // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), + hintText: rightTitle, + hintStyle: TextStyle(fontSize: 22.sp), + focusedBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + disabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + enabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + border: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + contentPadding: const EdgeInsets.symmetric(vertical: 0), + ), + ), + ), + ], + ), + ) ], ); } @@ -243,7 +280,8 @@ class _PasswordKeyPerpetualPageState extends State day: DateTime.now().day, hour: 24), // minDate: PDuration.now(), - mode: DateMode.YMDHM, hourShow24: true, onConfirm: (PDuration p) { + mode: DateMode.YMDHM, + hourShow24: true, onConfirm: (PDuration p) { state.beginTime.value = DateTool().getYMDHNDateString(p, 4); }); }), @@ -267,8 +305,7 @@ class _PasswordKeyPerpetualPageState extends State month: DateTime.now().month, day: DateTime.now().day), mode: DateMode.YMDH, - hourShow24: true, - onConfirm: (PDuration p) { + hourShow24: true, onConfirm: (PDuration p) { state.endTime.value = DateTool().getYMDHNDateString(p, 4); }); }), @@ -367,16 +404,16 @@ class _PasswordKeyPerpetualPageState extends State isHaveDirection: true, action: () { final List pickerDataList = [ - '周末', - '每日', - '工作日', - '星期一', - '星期二', - '星期三', - '星期四', - '星期五', - '星期六', - '星期日' + '周末'.tr, + '每日'.tr, + '工作日'.tr, + '星期一'.tr, + '星期二'.tr, + '星期三'.tr, + '星期四'.tr, + '星期五'.tr, + '星期六'.tr, + '星期日'.tr ]; showPickerView(context, pickerDataList); }), @@ -388,7 +425,7 @@ class _PasswordKeyPerpetualPageState extends State CommonDataManage().currentKeyInfo.model == IoModelVendor.model_XL_WIFI), child: CommonItem( - leftTitel: '结束日期', + leftTitel: '结束日期'.tr, rightTitle: state.endTime.value, isHaveLine: true, isHaveDirection: true, @@ -473,9 +510,7 @@ class _PasswordKeyPerpetualPageState extends State height: 20.h, ), SubmitBtn( - btnName: state.widgetType.value == 3 - ? '设置密码' - : '获取密码'.tr, + btnName: state.widgetType.value == 3 ? '设置密码'.tr : '获取密码'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { @@ -486,7 +521,7 @@ class _PasswordKeyPerpetualPageState extends State logic.getKeyboardPwdRequest(); } } else { - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } }), ], @@ -515,7 +550,7 @@ class _PasswordKeyPerpetualPageState extends State height: 20.h, ), Text( - '操作成功,密码为', + '操作成功,密码为'.tr, style: TextStyle(fontSize: 22.sp, color: Colors.black), ), SizedBox( @@ -563,70 +598,70 @@ class _PasswordKeyPerpetualPageState extends State } // 接受者信息输入框 - Widget getTFWidget(String tfStr, TextEditingController editController) { - return SizedBox( - height: 65.h, - width: 300.w, - child: Row( - children: [ - Expanded( - child: TextField( - //输入框一行 - maxLines: 1, - inputFormatters: editController == state.pwdController - ? [ - FilteringTextInputFormatter.deny('\n'), - LengthLimitingTextInputFormatter(9), - FilteringTextInputFormatter.allow(RegExp(r'[0-9]')), - ] - : [ - FilteringTextInputFormatter.deny('\n'), - LengthLimitingTextInputFormatter(50), - ], - keyboardType: editController == state.nameController - ? TextInputType.text - : TextInputType.number, - style: TextStyle( - fontSize: 22.sp, color: AppColors.darkGrayTextColor), - controller: editController, - autofocus: false, - textAlign: TextAlign.end, - // decoration: InputDecoration( - // //输入里面输入文字内边距设置 - // contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h), - // hintText: tfStr, - // hintStyle: TextStyle(fontSize: 22.sp), - // //不需要输入框下划线 - // border: InputBorder.none, - // ), - decoration: InputDecoration( - //输入里面输入文字内边距设置 - // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), - hintText: tfStr, - hintStyle: TextStyle(fontSize: 22.sp), - focusedBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - disabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - enabledBorder: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - border: const OutlineInputBorder( - borderSide: - BorderSide(width: 0, color: Colors.transparent)), - contentPadding: const EdgeInsets.symmetric(vertical: 0), - ), - ), - ), - SizedBox( - width: 10.w, - ), - ], - ), - ); - } + // Widget getTFWidget(String tfStr, TextEditingController editController) { + // return SizedBox( + // height: 65.h, + // width: 300.w, + // child: Row( + // children: [ + // Expanded( + // child: TextField( + // //输入框一行 + // maxLines: 1, + // inputFormatters: editController == state.pwdController + // ? [ + // FilteringTextInputFormatter.deny('\n'), + // LengthLimitingTextInputFormatter(9), + // FilteringTextInputFormatter.allow(RegExp(r'[0-9]')), + // ] + // : [ + // FilteringTextInputFormatter.deny('\n'), + // LengthLimitingTextInputFormatter(50), + // ], + // keyboardType: editController == state.nameController + // ? TextInputType.text + // : TextInputType.number, + // style: TextStyle( + // fontSize: 22.sp, color: AppColors.darkGrayTextColor), + // controller: editController, + // autofocus: false, + // textAlign: TextAlign.end, + // // decoration: InputDecoration( + // // //输入里面输入文字内边距设置 + // // contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h), + // // hintText: tfStr, + // // hintStyle: TextStyle(fontSize: 22.sp), + // // //不需要输入框下划线 + // // border: InputBorder.none, + // // ), + // decoration: InputDecoration( + // //输入里面输入文字内边距设置 + // // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), + // hintText: tfStr, + // hintStyle: TextStyle(fontSize: 22.sp), + // focusedBorder: const OutlineInputBorder( + // borderSide: + // BorderSide(width: 0, color: Colors.transparent)), + // disabledBorder: const OutlineInputBorder( + // borderSide: + // BorderSide(width: 0, color: Colors.transparent)), + // enabledBorder: const OutlineInputBorder( + // borderSide: + // BorderSide(width: 0, color: Colors.transparent)), + // border: const OutlineInputBorder( + // borderSide: + // BorderSide(width: 0, color: Colors.transparent)), + // contentPadding: const EdgeInsets.symmetric(vertical: 0), + // ), + // ), + // ), + // SizedBox( + // width: 10.w, + // ), + // ], + // ), + // ); + // } CupertinoSwitch _switch() { return CupertinoSwitch( @@ -673,7 +708,7 @@ class _PasswordKeyPerpetualPageState extends State width: ScreenUtil().screenWidth, child: Center( child: Text( - '分享', + '分享'.tr, style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor, diff --git a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_state.dart b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_state.dart index 3e4d1162..3e872b82 100755 --- a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_state.dart +++ b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_state.dart @@ -27,7 +27,7 @@ class PasswordKeyPerpetualState { RxString loopFailureDate = DateTool().getNowDateWithType(7).obs; //失效时间 RxInt loopStartHours = DateTime.now().hour.obs; RxInt loopEndHours = DateTime.now().hour.obs; - RxString loopModeStr = '周末'.obs; //循环模式 + RxString loopModeStr = '周末'.tr.obs; //循环模式 RxString customBeginTime = DateTool().getNowDateWithType(2).obs; //默认为当前时间 开始时间 diff --git a/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart b/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart index 6e6eaa03..b4d746d0 100755 --- a/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart +++ b/lib/main/lockDetail/realTimePicture/realTimePicture_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:math'; @@ -31,7 +32,7 @@ class RealTimePictureLogic extends BaseGetXController { eventBus.on().listen((event) { if (event.tvList.isNotEmpty) { // 预加载图片数据 - Uint8List imageData = Uint8List.fromList(event.tvList); + final Uint8List imageData = Uint8List.fromList(event.tvList); // 更新状态 state.listData.value = imageData; } @@ -88,8 +89,8 @@ class RealTimePictureLogic extends BaseGetXController { } Future _readG711Data() async { - String filePath = 'assets/s10-g711.bin'; - List audioData = await G711().readAssetFile(filePath); + final String filePath = 'assets/s10-g711.bin'; + final List audioData = await G711().readAssetFile(filePath); // AppLog.log('发送读取711文件数据为:$audioData');// 数据为:$audioData // return; // AppLog.log('发送读取711文件数据长度为:${audioData.length}');// 数据为:$audioData @@ -99,21 +100,21 @@ class RealTimePictureLogic extends BaseGetXController { // AppLog.log('发送转换pcmBytes数据长度为:${pcmBytes.length}'); int start = 0; - int length = 320; + final int length = 320; while (start < audioData.length) { // await Future.delayed(const Duration(milliseconds: 50)); - int end = (start + length > audioData.length) + final int end = (start + length > audioData.length) ? audioData.length : start + length; - List sublist = audioData.sublist(start, end); + final List sublist = audioData.sublist(start, end); sendRecordData({ - "bytes": sublist, + 'bytes': sublist, // "udpSendDataFrameNumber": 0, - "lockID": UDPManage().lockId, - "lockIP": UDPManage().host, - "userMobile": await state.userUid, - "userMobileIP": await state.userMobileIP, + 'lockID': UDPManage().lockId, + 'lockIP': UDPManage().host, + 'userMobile': await state.userUid, + 'userMobileIP': await state.userMobileIP, }); AppLog.log(sublist.toString()); start += length; @@ -133,17 +134,17 @@ class RealTimePictureLogic extends BaseGetXController { // AppLog.log('change Get data.length:${frame.length} change Received data:$frame'); await Future.delayed(const Duration(milliseconds: 50)); sendRecordData({ - "bytes": frame, + 'bytes': frame, // "udpSendDataFrameNumber": 0, - "lockID": UDPManage().lockId, - "lockIP": UDPManage().host, - "userMobile": await state.userUid, - "userMobileIP": await state.userMobileIP, + 'lockID': UDPManage().lockId, + 'lockIP': UDPManage().host, + 'userMobile': await state.userUid, + 'userMobileIP': await state.userMobileIP, }); } errorListener(VoiceProcessorException error) { - AppLog.log("VoiceProcessorException: $error"); + AppLog.log('VoiceProcessorException: $error'); } state.voiceProcessor?.addFrameListener(frameListener); @@ -152,10 +153,10 @@ class RealTimePictureLogic extends BaseGetXController { try { if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) { await state.voiceProcessor?.start(320, 8000); - bool? isRecording = await state.voiceProcessor?.isRecording(); + final bool? isRecording = await state.voiceProcessor?.isRecording(); } else {} } on PlatformException catch (ex) { - AppLog.log("PlatformException: $ex"); + AppLog.log('PlatformException: $ex'); } finally {} } @@ -163,7 +164,7 @@ class RealTimePictureLogic extends BaseGetXController { try { await state.voiceProcessor?.stop(); } on PlatformException catch (ex) { - AppLog.log("PlatformException: $ex"); + AppLog.log('PlatformException: $ex'); } finally {} } @@ -172,16 +173,16 @@ class RealTimePictureLogic extends BaseGetXController { } sendRecordData(Map args) async { - List bytes = args["bytes"]; + final List bytes = args['bytes']; // int udpSendDataFrameNumber = args["udpSendDataFrameNumber"]; - String? lockID = args["lockID"]; - String? lockIP = args["lockIP"]; - String? userMobile = args["userMobile"]; - String? userMobileIP = args["userMobileIP"]; + final String? lockID = args['lockID']; + final String? lockIP = args['lockIP']; + final String? userMobile = args['userMobile']; + final String? userMobileIP = args['userMobileIP']; state.udpSendDataFrameNumber++; if (state.udpSendDataFrameNumber >= 65536) state.udpSendDataFrameNumber = 1; // 57 - List topBytes = []; + final List topBytes = []; topBytes.addAll([ 1, 1, 1, 1, // 时间戳 @@ -194,11 +195,11 @@ class RealTimePictureLogic extends BaseGetXController { 176, 4, // 保留 ]); - topBytes[6] = (state.udpSendDataFrameNumber & 0x000000FF); - topBytes[7] = ((state.udpSendDataFrameNumber & 0x0000FF00) >> 8); + topBytes[6] = state.udpSendDataFrameNumber & 0x000000FF; + topBytes[7] = (state.udpSendDataFrameNumber & 0x0000FF00) >> 8; topBytes.addAll(bytes); - AppLog.log("setVoiceBytes:$topBytes"); + AppLog.log('setVoiceBytes:$topBytes'); UDPSenderManage.sendMainProtocol( command: 152, @@ -231,14 +232,14 @@ class RealTimePictureLogic extends BaseGetXController { if (seg >= 8) { return 0x7F ^ mask; } else { - uval = (seg << 4); - uval |= ((pcmVal >> (seg + 3)) & 0xF); + uval = seg << 4; + uval |= (pcmVal >> (seg + 3)) & 0xF; return uval ^ mask; } } int search(int val) { - List table = [ + final List table = [ 0xFF, 0x1FF, 0x3FF, @@ -248,7 +249,7 @@ class RealTimePictureLogic extends BaseGetXController { 0x3FFF, 0x7FFF ]; - int size = 8; + final int size = 8; for (int i = 0; i < size; i++) { if (val <= table[i]) { return i; @@ -264,15 +265,15 @@ class RealTimePictureLogic extends BaseGetXController { } rms = sqrt(rms / frame.length); - double dbfs = 20 * log(rms / 32767.0) / log(10); - double normalizedValue = (dbfs + 50) / 50; + final double dbfs = 20 * log(rms / 32767.0) / log(10); + final double normalizedValue = (dbfs + 50) / 50; return normalizedValue.clamp(0.0, 1.0); } Future getPermissionStatus() async { - Permission permission = Permission.microphone; + final Permission permission = Permission.microphone; //granted 通过,denied 被拒绝,permanentlyDenied 拒绝且不在提示 - PermissionStatus status = await permission.status; + final PermissionStatus status = await permission.status; if (status.isGranted) { return true; } else if (status.isDenied) { @@ -287,7 +288,7 @@ class RealTimePictureLogic extends BaseGetXController { ///申请权限 void requestPermission(Permission permission) async { - PermissionStatus status = await permission.request(); + final PermissionStatus status = await permission.request(); if (status.isPermanentlyDenied) { openAppSettings(); } @@ -295,7 +296,6 @@ class RealTimePictureLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); _getTVDataRefreshUIAction(); @@ -306,13 +306,11 @@ class RealTimePictureLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose CallTalk().finishAVData(); _getTVDataRefreshUIEvent!.cancel(); _getUDPStatusRefreshUIEvent!.cancel(); diff --git a/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart b/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart index f6ae83fc..c2518d38 100755 --- a/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart +++ b/lib/main/lockDetail/realTimePicture/realTimePicture_page.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:convert'; @@ -5,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/realTimePicture/realTimePicture_state.dart'; import 'package:star_lock/talk/call/callTalk.dart'; import '../../../../app_settings/app_colors.dart'; @@ -19,19 +21,16 @@ class RealTimePicturePage extends StatefulWidget { State createState() => _RealTimePicturePageState(); } -class _RealTimePicturePageState extends State - with TickerProviderStateMixin { - final logic = Get.put(RealTimePictureLogic()); - final state = Get.find().state; +class _RealTimePicturePageState extends State with TickerProviderStateMixin { + final RealTimePictureLogic logic = Get.put(RealTimePictureLogic()); + final RealTimePictureState state = Get.find().state; @override void initState() { super.initState(); //写一个定时器,三十秒后页面自动返回 - state.autoBackTimer = Timer(const Duration(seconds: 30), () { - Get.back(); - }); + state.autoBackTimer = Timer(const Duration(seconds: 30), Get.back); state.animationController = AnimationController( vsync: this, // 确保使用的TickerProvider是当前Widget @@ -40,7 +39,7 @@ class _RealTimePicturePageState extends State ; state.animationController.repeat(); //动画开始、结束、向前移动或向后移动时会调用StatusListener - state.animationController.addStatusListener((status) { + state.animationController.addStatusListener((AnimationStatus status) { // AppLog.log("AnimationStatus:$status"); if (status == AnimationStatus.completed) { state.animationController.reset(); @@ -58,7 +57,7 @@ class _RealTimePicturePageState extends State void initiateUdpMonitorAction() { // 每隔一秒调用一次 udpMonitorAction 方法 state.realTimePicTimer = - Timer.periodic(const Duration(seconds: 1), (timer) { + Timer.periodic(const Duration(seconds: 1), (Timer timer) { state.elapsedSeconds++; logic.udpMonitorAction(); @@ -78,7 +77,7 @@ class _RealTimePicturePageState extends State height: 1.sh, child: Stack( alignment: Alignment.center, - children: [ + children: [ Obx( () => state.listData.value.isEmpty || state.listData.value.isEmpty ? Image.asset( @@ -109,7 +108,7 @@ class _RealTimePicturePageState extends State ? Positioned( bottom: 300.h, child: Text( - '正在创建安全连接...', + '正在创建安全连接...'.tr, style: TextStyle(color: Colors.black, fontSize: 26.sp), )) : Container()), @@ -123,7 +122,7 @@ class _RealTimePicturePageState extends State color: Colors.black.withOpacity(0.2), borderRadius: BorderRadius.circular(20.h)), child: Column( - children: [ + children: [ SizedBox(height: 20.h), bottomTopBtnWidget(), SizedBox(height: 20.h), @@ -141,7 +140,7 @@ class _RealTimePicturePageState extends State } Widget bottomTopBtnWidget() { - return Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + return Row(mainAxisAlignment: MainAxisAlignment.center, children: [ // 打开关闭声音 GestureDetector( onTap: () { @@ -156,9 +155,9 @@ class _RealTimePicturePageState extends State height: 40.w, image: state.isOpenVoice.value ? const AssetImage( - "images/main/icon_lockDetail_monitoringCloseVoice.png") + 'images/main/icon_lockDetail_monitoringCloseVoice.png') : const AssetImage( - "images/main/icon_lockDetail_monitoringOpenVoice.png"))), + 'images/main/icon_lockDetail_monitoringOpenVoice.png'))), ), ), SizedBox(width: 50.w), @@ -175,7 +174,7 @@ class _RealTimePicturePageState extends State width: 40.w, height: 40.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringScreenshot.png")), + 'images/main/icon_lockDetail_monitoringScreenshot.png')), ), ), SizedBox(width: 50.w), @@ -193,20 +192,20 @@ class _RealTimePicturePageState extends State height: 40.w, fit: BoxFit.fill, image: const AssetImage( - "images/main/icon_lockDetail_monitoringScreenRecording.png")), + 'images/main/icon_lockDetail_monitoringScreenRecording.png')), ), ), SizedBox(width: 50.w), GestureDetector( onTap: () { - logic.showToast('该功能暂未开放'); + logic.showToast('功能暂未开放'.tr); }, child: Image( width: 28.w, height: 28.w, fit: BoxFit.fill, image: - const AssetImage("images/main/icon_lockDetail_rectangle.png")) + const AssetImage('images/main/icon_lockDetail_rectangle.png')) // child: Container( // width: 50.w, // height: 50.w, @@ -223,12 +222,12 @@ class _RealTimePicturePageState extends State } Widget bottomBottomBtnWidget() { - return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ + return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ // 接听 Obx(() => bottomBtnItemWidget( getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async { //监视状态下不能发送录音 - logic.showToast("监视状态下不能发送录音"); + logic.showToast('监视状态下不能发送录音'.tr); }, longPress: () async { /* // 开始长按 @@ -259,15 +258,15 @@ class _RealTimePicturePageState extends State */ })), bottomBtnItemWidget( - "images/main/icon_lockDetail_hangUp.png", "挂断", Colors.red, () async { + 'images/main/icon_lockDetail_hangUp.png', '挂断'.tr, Colors.red, () async { // 挂断 logic.udpHangUpAction(); CallTalk().finishAVData(); Get.back(); }), - bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", - "开锁", AppColors.mainColor, () { - logic.showToast("监视中暂不能开锁"); + bottomBtnItemWidget('images/main/icon_lockDetail_monitoringUnlock.png', + '开锁', AppColors.mainColor, () { + logic.showToast('监视中暂不能开锁'.tr); /* showDeletPasswordAlertDialog(context); */ @@ -278,29 +277,29 @@ class _RealTimePicturePageState extends State String getAnswerBtnImg() { switch (state.udpStatus.value) { case 8: - return "images/main/icon_lockDetail_monitoringUnTalkback.png"; + return 'images/main/icon_lockDetail_monitoringUnTalkback.png'; case 9: - return "images/main/icon_lockDetail_monitoringTalkback.png"; + return 'images/main/icon_lockDetail_monitoringTalkback.png'; default: - return "images/main/icon_lockDetail_monitoringUnTalkback.png"; + return 'images/main/icon_lockDetail_monitoringUnTalkback.png'; } } String getAnswerBtnName() { switch (state.udpStatus.value) { case 8: - return "长按说话"; + return '长按说话'.tr; case 9: - return "松开发送"; + return '松开发送'.tr; default: - return "长按说话"; + return '长按说话'.tr; } } Widget bottomBtnItemWidget( String iconUrl, String name, Color backgroundColor, Function() onClick, {Function()? longPress, Function()? longPressUp}) { - var wh = 80.w; + double wh = 80.w; return GestureDetector( onTap: onClick, onLongPress: longPress, @@ -309,7 +308,7 @@ class _RealTimePicturePageState extends State height: 140.h, child: Column( crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ Container( width: wh, height: wh, @@ -335,24 +334,24 @@ class _RealTimePicturePageState extends State context: context, builder: (BuildContext context) { return ShowTFView( - title: "请输入六位数字开锁密码", - tipTitle: "", + title: '请输入六位数字开锁密码'.tr, + tipTitle: '', controller: state.passwordTF, - inputFormatters: [ + inputFormatters: [ LengthLimitingTextInputFormatter(6), //限制长度 - FilteringTextInputFormatter.allow(RegExp("[0-9]")), + FilteringTextInputFormatter.allow(RegExp('[0-9]')), ], sureClick: () async { //发送删除锁请求 if (state.passwordTF.text.isEmpty) { - logic.showToast("请输入开锁密码"); + logic.showToast('请输入开锁密码'.tr); return; } // List numbers = state.passwordTF.text.split('').map((char) => int.parse(char)).toList(); // 开锁 // lockID - List numbers = []; + List numbers = []; List lockIDData = utf8.encode(state.passwordTF.text); numbers.addAll(lockIDData); // topBytes = getFixedLengthList(lockIDData, 20 - lockIDData.length); diff --git a/lib/main/lockDetail/realTimePicture/realTimePicture_state.dart b/lib/main/lockDetail/realTimePicture/realTimePicture_state.dart index a3fb1356..2d526965 100755 --- a/lib/main/lockDetail/realTimePicture/realTimePicture_state.dart +++ b/lib/main/lockDetail/realTimePicture/realTimePicture_state.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:typed_data'; @@ -9,27 +10,31 @@ import 'package:network_info_plus/network_info_plus.dart'; import '../../../../tools/storage.dart'; class RealTimePictureState { - var isOpenVoice = false.obs; - var udpSendDataFrameNumber = 0; // 帧序号 + + RealTimePictureState() { + getLockName.value = Get.arguments['lockName'].toString(); + } + RxBool isOpenVoice = false.obs; + int udpSendDataFrameNumber = 0; // 帧序号 // var isSenderAudioData = false.obs;// 是否要发送音频数据 - var userMobileIP = NetworkInfo().getWifiIP(); - var userUid = Storage.getUid(); + Future userMobileIP = NetworkInfo().getWifiIP(); + Future userUid = Storage.getUid(); - var udpStatus = + RxInt udpStatus = 0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话 - var passwordTF = TextEditingController(); + TextEditingController passwordTF = TextEditingController(); - var listData = Uint8List(0).obs; //得到的视频流字节数据 - var listAudioData = [].obs; //得到的音频流字节数据 + Rx listData = Uint8List(0).obs; //得到的视频流字节数据 + RxList listAudioData = [].obs; //得到的音频流字节数据 late final VoiceProcessor? voiceProcessor; late Timer oneMinuteTimeTimer = Timer(const Duration(seconds: 1), () {}); // 定时器超过60秒关闭当前界面 - var oneMinuteTime = 0.obs; // 定时器秒数 + RxInt oneMinuteTime = 0.obs; // 定时器秒数 - var getLockName = ''.obs; //lockName + RxString getLockName = ''.obs; //lockName // 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次 late Timer answerTimer; @@ -41,9 +46,5 @@ class RealTimePictureState { Timer(const Duration(seconds: 1), () {}); //发送30秒监视后自动返回 late Timer realTimePicTimer = Timer(const Duration(seconds: 1), () {}); //监视命令定时器 - var elapsedSeconds = 0.obs; - - RealTimePictureState() { - getLockName.value = Get.arguments["lockName"].toString(); - } + RxInt elapsedSeconds = 0.obs; } diff --git a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart index b280dca7..7916fd7e 100644 --- a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart +++ b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart @@ -68,7 +68,6 @@ class AddRemoteControlLogic extends BaseGetXController{ final List token = reply.data.sublist(5, 9); final List saveStrList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, saveStrList); - AppLog.log('添加卡token:$token'); IoSenderManage.senderAddRemoteControlWithTimeCycleCoercionCommand( keyID:'1', diff --git a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_page.dart b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_page.dart index 2f959d73..1ac865d1 100644 --- a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_page.dart +++ b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_page.dart @@ -26,7 +26,7 @@ class _AddRemoteControlPageState extends State with RouteA return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '添加遥控', + barTitle: '添加遥控'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), diff --git a/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_logic.dart b/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_logic.dart index 28f89d64..40fd4680 100755 --- a/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_logic.dart +++ b/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_logic.dart @@ -51,7 +51,7 @@ class AddRemoteControlTypeLoigc extends BaseGetXController{ // } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } // AppLog.log("state.timeLimitBeginTime.value:${state.timeLimitBeginTime.value} startDate:$startDate"); diff --git a/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_page.dart b/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_page.dart index a3dc64f1..a06475f2 100755 --- a/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_page.dart +++ b/lib/main/lockDetail/remoteControl/addRemoteControlType/addRemoteControlType_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -13,10 +12,10 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/CustomUnderlineTabIndicator.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; +import '../../../../tools/key_name_item.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'addRemoteControlType_logic.dart'; import 'addRemoteControlType_state.dart'; @@ -24,21 +23,22 @@ class AddRemoteControlTypePage extends StatefulWidget { const AddRemoteControlTypePage({Key? key}) : super(key: key); @override - State createState() => _AddRemoteControlTypePageState(); + State createState() => + _AddRemoteControlTypePageState(); } -class _AddRemoteControlTypePageState extends State with SingleTickerProviderStateMixin { +class _AddRemoteControlTypePageState extends State + with SingleTickerProviderStateMixin { final AddRemoteControlTypeLoigc logic = Get.put(AddRemoteControlTypeLoigc()); - final AddRemoteControlTypeState state = Get.find().state; + final AddRemoteControlTypeState state = + Get.find().state; @override void initState() { super.initState(); - state.tabController = TabController( - vsync: this, - length: _itemTabs.length, - initialIndex: 0); + state.tabController = + TabController(vsync: this, length: _itemTabs.length, initialIndex: 0); state.tabController.addListener(() { WidgetsBinding.instance.addPostFrameCallback((_) { state.selectType.value = state.tabController.index.toString(); @@ -55,8 +55,7 @@ class _AddRemoteControlTypePageState extends State wit return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: - '添加遥控', + barTitle: '添加遥控'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -76,10 +75,10 @@ class _AddRemoteControlTypePageState extends State wit return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyBottomWidget() ], ), @@ -91,10 +90,10 @@ class _AddRemoteControlTypePageState extends State wit return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyTimeLimitWidget(), // SizedBox(height: 10.h), keyBottomWidget() @@ -108,10 +107,10 @@ class _AddRemoteControlTypePageState extends State wit return SingleChildScrollView( child: Column( children: [ - perpetualKeyWidget( - '姓名'.tr, - '请输入'.tr, - state.nameController), + KeyNameItem( + leftTitel: '姓名'.tr, + rightTitle: '请输入'.tr, + controller: state.nameController), keyCyclicDate(), SizedBox(height: 10.h), keyBottomWidget() @@ -152,23 +151,25 @@ class _AddRemoteControlTypePageState extends State wit final PDuration selectDate = PDuration.parse( DateTime.parse(state.timeLimitBeginTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { - state.timeLimitBeginTime.value = - DateTool().getYMDHNDateString(p, 1); - }); + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { + state.timeLimitBeginTime.value = + DateTool().getYMDHNDateString(p, 1); + }); })), Obx(() => CommonItem( leftTitel: '失效时间'.tr, rightTitle: state.timeLimitEndTime.value, isHaveDirection: true, action: () { - final PDuration selectDate = - PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value)); + final PDuration selectDate = PDuration.parse( + DateTime.tryParse(state.timeLimitEndTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { - state.timeLimitEndTime.value = - DateTool().getYMDHNDateString(p, 1); - }); + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { + state.timeLimitEndTime.value = + DateTool().getYMDHNDateString(p, 1); + }); })), Container(height: 10.h), ], @@ -182,17 +183,18 @@ class _AddRemoteControlTypePageState extends State wit Obx(() => CommonItem( leftTitel: '有效期'.tr, rightTitle: - '${state.cycleBeginTime.value}\n${state.cycleEndTime.value}', + '${state.cycleBeginTime.value}\n${state.cycleEndTime.value}', isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.cycleBeginTime.value, - 'endDate': state.cycleEndTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.cycleBeginTime.value = result['starDate']; @@ -209,7 +211,8 @@ class _AddRemoteControlTypePageState extends State wit isHaveDirection: true, isHaveLine: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -229,10 +232,12 @@ class _AddRemoteControlTypePageState extends State wit visible: state.effectiveDateTime.value.isNotEmpty, child: CommonItem( leftTitel: '有效时间'.tr, - rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}', + rightTitle: + '${state.effectiveDateTime.value}-${state.failureDateTime.value}', isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + final result = await Get.toNamed( + Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, 'starDate': state.cycleBeginTime.value, @@ -282,7 +287,7 @@ class _AddRemoteControlTypePageState extends State wit // )), SizedBox(height: 30.h), SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () async { final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { @@ -291,7 +296,8 @@ class _AddRemoteControlTypePageState extends State wit return; } - logic.checkRemoteControlNameDuplicatedData(state.nameController.text); + logic.checkRemoteControlNameDuplicatedData( + state.nameController.text); } else { // Get.toNamed(Routers.selectLockTypePage); logic.showToast('演示模式'.tr); @@ -332,16 +338,16 @@ class _AddRemoteControlTypePageState extends State wit hintStyle: TextStyle(fontSize: 22.sp), focusedBorder: const OutlineInputBorder( borderSide: - BorderSide(width: 0, color: Colors.transparent)), + BorderSide(width: 0, color: Colors.transparent)), disabledBorder: const OutlineInputBorder( borderSide: - BorderSide(width: 0, color: Colors.transparent)), + BorderSide(width: 0, color: Colors.transparent)), enabledBorder: const OutlineInputBorder( borderSide: - BorderSide(width: 0, color: Colors.transparent)), + BorderSide(width: 0, color: Colors.transparent)), border: const OutlineInputBorder( borderSide: - BorderSide(width: 0, color: Colors.transparent)), + BorderSide(width: 0, color: Colors.transparent)), contentPadding: const EdgeInsets.symmetric(vertical: 0), ), ), @@ -386,7 +392,6 @@ class _AddRemoteControlTypePageState extends State wit ItemView(title: '循环'.tr, selectType: '2'), ]; - TabBar _tabBar() { return TabBar( controller: state.tabController, @@ -394,7 +399,7 @@ class _AddRemoteControlTypePageState extends State wit FocusScope.of(context).requestFocus(FocusNode()); }, tabs: _itemTabs.map(_tab).toList(), - isScrollable: true, + isScrollable: false, indicatorColor: Colors.red, unselectedLabelColor: Colors.black, unselectedLabelStyle: TextStyle( @@ -411,13 +416,18 @@ class _AddRemoteControlTypePageState extends State wit borderSide: BorderSide(color: AppColors.mainColor, width: 4.w), strokeCap: StrokeCap.round, width: 30.w), + labelPadding: EdgeInsets.symmetric(horizontal: 10.w), + padding: EdgeInsets.zero, // 去除TabBar两侧的间隙 ); } Tab _tab(ItemView item) { return Tab( - child: SizedBox( - width: 1.sw / 5, + child: Container( + // color: Colors.red, + width: (1.sw - 10.w * 5) / 3, + // width: 1.sw / 4, + alignment: Alignment.center, child: Text(item.title, textAlign: TextAlign.center))); } @@ -425,9 +435,8 @@ class _AddRemoteControlTypePageState extends State wit return Expanded( child: TabBarView( controller: state.tabController, - children: _itemTabs - .map((ItemView item) => Obx(indexChangeWidget)) - .toList(), + children: + _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList(), ), ); } diff --git a/lib/main/lockDetail/remoteControl/remoteControlDetail/remoteControlDetail_page.dart b/lib/main/lockDetail/remoteControl/remoteControlDetail/remoteControlDetail_page.dart index 6e837329..f0ad4e40 100755 --- a/lib/main/lockDetail/remoteControl/remoteControlDetail/remoteControlDetail_page.dart +++ b/lib/main/lockDetail/remoteControl/remoteControlDetail/remoteControlDetail_page.dart @@ -13,7 +13,6 @@ import '../../../../tools/dateTool.dart'; import '../../../../tools/showTipView.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../lockMian/lockMain/lockMain_logic.dart'; import 'remoteControlDetail_logic.dart'; import 'remoteControlDetail_state.dart'; @@ -41,7 +40,7 @@ class _RemoteControlDetailPageState extends State with body: ListView( children: [ Obx(() => CommonItem( - leftTitel: '遥控号', + leftTitel: '遥控号'.tr, rightTitle: state.typeNumber.value, isHaveDirection: false, isHaveLine: true)), @@ -109,7 +108,7 @@ class _RemoteControlDetailPageState extends State with Obx(() => Visibility( visible: state.keyType.value == 4, child: Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr, + leftTitel: '有效日'.tr, rightTitle: logic.weekDayStr.join(','), isHaveDirection: true, isHaveLine: true, diff --git a/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_logic.dart b/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_logic.dart index bf959e07..be605206 100755 --- a/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_logic.dart +++ b/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_logic.dart @@ -211,13 +211,13 @@ class RemoteControlListLogic extends BaseGetXController{ String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4 if (fingerprintItemData.remoteType! == 1) { keyDateTypeStr = - '${DateTool().dateToYMDHNString((fingerprintItemData.createDate ?? 0).toString())} 永久'; + '${DateTool().dateToYMDHNString((fingerprintItemData.createDate ?? 0).toString())} ${'永久'.tr}'; } else if (fingerprintItemData.remoteType! == 2) { keyDateTypeStr = - '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时'; + '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}'; } else if (fingerprintItemData.remoteType! == 4) { keyDateTypeStr = - '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环'; + '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}'; } return keyDateTypeStr; } diff --git a/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_page.dart b/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_page.dart index 65819360..0fdfee6e 100755 --- a/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_page.dart +++ b/lib/main/lockDetail/remoteControl/remoteControlList/remoteControlList_page.dart @@ -16,7 +16,6 @@ import '../../../../tools/showTipView.dart'; import '../../../../tools/storage.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../fingerprint/fingerprintList/fingerprintListData_entity.dart'; import 'remoteControlList_logic.dart'; import 'remoteControlList_state.dart'; @@ -56,7 +55,7 @@ class _RemoteControlListPageState extends State with Rout backgroundColor: AppColors.mainBackgroundColor, resizeToAvoidBottomInset: false, appBar: TitleAppBar( - barTitle: '遥控', + barTitle: '遥控'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -107,8 +106,7 @@ class _RemoteControlListPageState extends State with Rout SizedBox(height: 20.h), Expanded(child: _buildMainUI()), AddBottomWhiteBtn( - btnName: - '添加遥控', + btnName: '添加遥控'.tr, onClick: () async { await Get.toNamed(Routers.addRemoteControlTypePage, arguments: { diff --git a/lib/main/lockDetail/videoLog/common/video/controller_widget.dart b/lib/main/lockDetail/videoLog/common/video/controller_widget.dart index d342986b..be227123 100755 --- a/lib/main/lockDetail/videoLog/common/video/controller_widget.dart +++ b/lib/main/lockDetail/videoLog/common/video/controller_widget.dart @@ -4,21 +4,16 @@ import 'package:video_player/video_player.dart'; import 'video_player_control.dart'; class ControllerWidget extends InheritedWidget { + + const ControllerWidget( + {required this.controlKey, required this.child, required this.controller, required this.videoInit, required this.title, Key? key + }) : super(key: key, child: child); final String title; final GlobalKey controlKey; final Widget child; final VideoPlayerController controller; final bool videoInit; - ControllerWidget( - {Key? key, - required this.controlKey, - required this.child, - required this.controller, - required this.videoInit, - required this.title - }) : super(key: key, child: child); - //定义一个便捷方法,方便子树中的widget获取共享数据 static ControllerWidget? of(BuildContext context) { return context.dependOnInheritedWidgetOfExactType(); @@ -26,7 +21,6 @@ class ControllerWidget extends InheritedWidget { @override bool updateShouldNotify(InheritedWidget oldWidget) { - // TODO: implement updateShouldNotify return false; } diff --git a/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart b/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart index 2b32e04d..99b9e77e 100755 --- a/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart +++ b/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart @@ -1,7 +1,8 @@ + import 'dart:io'; import 'dart:ui'; import 'package:flutter/material.dart'; -// import 'package:screen/screen.dart'; +import 'package:get/get.dart'; import 'package:video_player/video_player.dart'; import 'controller_widget.dart'; import 'video_player_control.dart'; @@ -10,7 +11,7 @@ import 'video_player_pan.dart'; enum VideoPlayerType { network, asset, file } class VideoPlayerUI extends StatefulWidget { - VideoPlayerUI.network({ + const VideoPlayerUI.network({ Key? key, required String this.url, // 当前需要播放的地址 required this.width, // 播放器尺寸(大于等于视频播放区域) @@ -19,7 +20,7 @@ class VideoPlayerUI extends StatefulWidget { }) : type = VideoPlayerType.network, super(key: key); - VideoPlayerUI.asset({ + const VideoPlayerUI.asset({ Key? key, required String dataSource, // 当前需要播放的地址 this.width = double.infinity, // 播放器尺寸(大于等于视频播放区域) @@ -126,8 +127,8 @@ class _VideoPlayerUIState extends State { } else { return Center( child: Text( - '暂无视频信息', - style: TextStyle(color: Colors.white), + '暂无视频信息'.tr, + style: const TextStyle(color: Colors.white), ), ); } @@ -142,11 +143,11 @@ class _VideoPlayerUIState extends State { ); } else if (_controller != null && _videoError) { return Text( - '加载出错', - style: TextStyle(color: Colors.white), + '加载出错'.tr, + style: const TextStyle(color: Colors.white), ); } else { - return SizedBox( + return const SizedBox( width: 30, height: 30, child: CircularProgressIndicator( @@ -186,15 +187,15 @@ class _VideoPlayerUIState extends State { }); } - void _videoListener() async { + Future _videoListener() async { if (_controller.value.hasError) { setState(() { _videoError = true; }); } else { - Duration? res = await _controller.position; + final Duration? res = await _controller.position; if (res! >= _controller.value.duration) { - await _controller.seekTo(Duration(seconds: 0)); + await _controller.seekTo(const Duration(seconds: 0)); await _controller.pause(); } if (_controller.value.isPlaying && _key.currentState != null) { diff --git a/lib/main/lockDetail/videoLog/common/video/video_player_control.dart b/lib/main/lockDetail/videoLog/common/video/video_player_control.dart index 662d53eb..060417c2 100755 --- a/lib/main/lockDetail/videoLog/common/video/video_player_control.dart +++ b/lib/main/lockDetail/videoLog/common/video/video_player_control.dart @@ -10,7 +10,7 @@ import 'controller_widget.dart'; import 'video_player_slider.dart'; class VideoPlayerControl extends StatefulWidget { - VideoPlayerControl({ + const VideoPlayerControl({ Key? key, }) : super(key: key); @@ -23,8 +23,8 @@ class VideoPlayerControlState extends State { bool get videoInit => ControllerWidget.of(context)!.videoInit; String get title=>ControllerWidget.of(context)!.title; // 记录video播放进度 - Duration _position = Duration(seconds: 0); - Duration _totalDuration = Duration(seconds: 0); + Duration _position = const Duration(seconds: 0); + Duration _totalDuration = const Duration(seconds: 0); late Timer _timer; // 计时器,用于延迟隐藏控件ui bool _hidePlayControl = true; // 控制是否隐藏控件ui double _playControlOpacity = 0; // 通过透明度动画显示/隐藏控件ui @@ -55,7 +55,7 @@ class VideoPlayerControlState extends State { child: AnimatedOpacity( // 加入透明度动画 opacity: _playControlOpacity, - duration: Duration(milliseconds: 300), + duration: const Duration(milliseconds: 300), child: Column( children: [_top(), _middle(), _bottom(context)], ), @@ -89,7 +89,7 @@ class VideoPlayerControlState extends State { // 底部控件的容器 width: double.infinity, height: 40, - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( // 来点黑色到透明的渐变优雅一下 begin: Alignment.bottomCenter, @@ -120,7 +120,7 @@ class VideoPlayerControlState extends State { ), Container( // 播放时间 - margin: EdgeInsets.only(left: 10), + margin: const EdgeInsets.only(left: 10), child: Text( '${DateUtil.formatDateMs( _position!.inMilliseconds, @@ -129,7 +129,7 @@ class VideoPlayerControlState extends State { _totalDuration!.inMilliseconds, format: 'mm:ss', )}', - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), ), ), IconButton( @@ -141,10 +141,7 @@ class VideoPlayerControlState extends State { _isFullScreen ? Icons.fullscreen_exit : Icons.fullscreen, color: Colors.white, ), - onPressed: () { - // 点击切换是否全屏 - _toggleFullScreen(); - }, + onPressed: _toggleFullScreen, ), ], ), @@ -161,7 +158,7 @@ class VideoPlayerControlState extends State { return Container( width: double.infinity, height: 40, - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( // 来点黑色到透明的渐变优雅一下 begin: Alignment.bottomCenter, @@ -173,23 +170,19 @@ class VideoPlayerControlState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ //在最上层或者不是横屏则隐藏按钮 - ModalRoute.of(context)!.isFirst && !_isFullScreen - ? Container() - : IconButton( - icon: Icon( + if (ModalRoute.of(context)!.isFirst && !_isFullScreen) Container() else IconButton( + icon: const Icon( Icons.arrow_back, color: Colors.white, ), onPressed: backPress), Text( title, - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), ), //在最上层或者不是横屏则隐藏按钮 - ModalRoute.of(context)!.isFirst && !_isFullScreen - ? Container() - : IconButton( - icon: Icon( + if (ModalRoute.of(context)!.isFirst && !_isFullScreen) Container() else IconButton( + icon: const Icon( Icons.arrow_back, color: Colors.transparent, ), @@ -230,7 +223,7 @@ class VideoPlayerControlState extends State { /// 如果显示就隐藏 if (_timer != null) _timer.cancel(); // 有计时器先移除计时器 _playControlOpacity = 0; - Future.delayed(Duration(milliseconds: 500)).whenComplete(() { + Future.delayed(const Duration(milliseconds: 500)).whenComplete(() { _hidePlayControl = true; // 延迟500ms(透明度动画结束)后,隐藏 }); } @@ -240,11 +233,11 @@ class VideoPlayerControlState extends State { void _startPlayControlTimer() { /// 计时器,用法和前端js的大同小异 if (_timer != null) _timer.cancel(); - _timer = Timer(Duration(seconds: 3), () { + _timer = Timer(const Duration(seconds: 3), () { /// 延迟3s后隐藏 setState(() { _playControlOpacity = 0; - Future.delayed(Duration(milliseconds: 500)).whenComplete(() { + Future.delayed(const Duration(milliseconds: 500)).whenComplete(() { _hidePlayControl = true; }); }); diff --git a/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart b/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart index bbbb43c1..81fc7918 100755 --- a/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart +++ b/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart @@ -1,7 +1,7 @@ import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; -//import 'package:screen/screen.dart'; import 'package:video_player/video_player.dart'; import '../after_layout.dart'; @@ -30,7 +30,7 @@ class _VideoPlayerPanState extends State String volumePercentage = ''; // 组件位移描述 double playDialogOpacity = 0.0; bool allowHorizontal = false; // 是否允许快进 - Duration position = Duration(seconds: 0); // 当前时间 + Duration position = const Duration(seconds: 0); // 当前时间 double brightness = 0.0; //亮度 bool brightnessOk = false; // 是否允许调节亮度 @@ -66,15 +66,15 @@ class _VideoPlayerPanState extends State Center( child: AnimatedOpacity( opacity: playDialogOpacity, - duration: Duration(milliseconds: 500), + duration: const Duration(milliseconds: 500), child: Container( - padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 6.0), - decoration: BoxDecoration( + padding: const EdgeInsets.symmetric(vertical: 5.0, horizontal: 6.0), + decoration: const BoxDecoration( color: Colors.black87, borderRadius: BorderRadius.all(Radius.circular(5.0))), child: Text( volumePercentage, - style: TextStyle(color: Colors.white, fontSize: 12), + style: const TextStyle(color: Colors.white, fontSize: 12), ), ), ), @@ -109,14 +109,14 @@ class _VideoPlayerPanState extends State /// 左边触摸 if (brightnessOk = true) { setState(() { - volumePercentage = '亮度:${(_setBrightnessValue() * 100).toInt()}%'; + volumePercentage = '${'亮度'.tr}:${(_setBrightnessValue() * 100).toInt()}%'; playDialogOpacity = 1.0; }); } } else { /// 右边触摸 setState(() { - volumePercentage = '音量:${(_setVerticalValue(num: 2) * 100).toInt()}%'; + volumePercentage = '${'音量'.tr}:${(_setVerticalValue(num: 2) * 100).toInt()}%'; playDialogOpacity = 1.0; }); } @@ -170,7 +170,7 @@ class _VideoPlayerPanState extends State } void _reset(BuildContext context) { - startPosition = Offset(0, 0); + startPosition = const Offset(0, 0); movePan = 0; layoutHeight = context.size!.height; layoutWidth = context.size!.width; @@ -202,12 +202,12 @@ class _VideoPlayerPanState extends State ); if (value >= 0) { setState(() { - volumePercentage = '快进至:$currentSecond'; + volumePercentage = '${'快进至'.tr}:$currentSecond'; playDialogOpacity = 1.0; }); } else { setState(() { - volumePercentage = '快退至:${(value * 100).toInt()}%'; + volumePercentage = '${'快退至'.tr}:${(value * 100).toInt()}%'; playDialogOpacity = 1.0; }); } diff --git a/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart b/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart index 190abe6b..1895fe46 100755 --- a/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart +++ b/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart @@ -7,11 +7,11 @@ import 'package:video_player/video_player.dart'; import 'controller_widget.dart'; class VideoPlayerSlider extends StatefulWidget { + + const VideoPlayerSlider({required this.startPlayControlTimer, required this.timer, Key? key}) : super(key: key); final Function startPlayControlTimer; final Timer timer; - VideoPlayerSlider({required this.startPlayControlTimer, required this.timer}); - @override _VideoPlayerSliderState createState() => _VideoPlayerSliderState(); } @@ -58,11 +58,11 @@ class _VideoPlayerSliderState extends State { data: SliderTheme.of(context).copyWith( //进度条滑块左边颜色 inactiveTrackColor: Colors.white, - overlayShape: RoundSliderOverlayShape( + overlayShape: const RoundSliderOverlayShape( //可继承SliderComponentShape自定义形状 overlayRadius: 10, //滑块外圈大小 ), - thumbShape: RoundSliderThumbShape( + thumbShape: const RoundSliderThumbShape( //可继承SliderComponentShape自定义形状 disabledThumbRadius: 7, //禁用是滑块大小 enabledThumbRadius: 7, //滑块大小 diff --git a/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart b/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart index 19e0ee91..f6d1dacd 100755 --- a/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart +++ b/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart @@ -1,23 +1,26 @@ +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; import 'editVideoLog_state.dart'; class EditVideoLogLogic extends BaseGetXController { EditVideoLogState state = EditVideoLogState(); - void deleteLockCloudStorageList() async { - var entity = await ApiRepository.to.deleteLockCloudStorageList( + Future deleteLockCloudStorageList() async { + final VersionUndateEntity entity = await ApiRepository.to.deleteLockCloudStorageList( recordIds: state.selectVideoLogList.value.map((e) => e.recordId).toList(), ); if (entity.errorCode!.codeIsSuccessful) { state.selectVideoLogList.value.clear(); - showToast('删除成功'); + showToast('删除成功'.tr); getLockCloudStorageList(); } } - void getLockCloudStorageList() async { - var entity = await ApiRepository.to.getLockCloudStorageList( + Future getLockCloudStorageList() async { + final VideoLogEntity entity = await ApiRepository.to.getLockCloudStorageList( lockId: state.getLockId.value, ); if (entity.errorCode!.codeIsSuccessful) { diff --git a/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart b/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart index 9ba5e6b1..d7957341 100755 --- a/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart +++ b/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart @@ -1,7 +1,9 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; import 'package:star_lock/tools/dateTool.dart'; @@ -17,21 +19,21 @@ class EditVideoLogPage extends StatefulWidget { } class _EditVideoLogPageState extends State { - final logic = Get.put(EditVideoLogLogic()); - final state = Get.find().state; + final EditVideoLogLogic logic = Get.put(EditVideoLogLogic()); + final EditVideoLogState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "已选${state.selectVideoLogList.value.length}项", + barTitle: '${'已选'.tr}${state.selectVideoLogList.value.length}${'项'.tr}', haveBack: true, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ TextButton( child: Text( - "全选".tr, + '全选'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () async { @@ -67,19 +69,19 @@ class _EditVideoLogPageState extends State { ], ), body: Column( - children: [ + children: [ Expanded( child: Obx(() => ListView.builder( itemCount: state.videoLogList.length, - itemBuilder: (c, index) { - CloudStorageData item = state.videoLogList[index]; + itemBuilder: (BuildContext c, int index) { + final CloudStorageData item = state.videoLogList[index]; return Column( - children: [ + children: [ Container( margin: EdgeInsets.only( left: 20.w, top: 15.w, bottom: 15.w), - child: Row(children: [ - Text(item.date ?? "", + child: Row(children: [ + Text(item.date ?? '', style: TextStyle(fontSize: 20.sp)), ])), mainListView(index, item) @@ -93,8 +95,8 @@ class _EditVideoLogPageState extends State { ); } - var itemW = (1.sw - 15.w * 4) / 3; - var itemH = (1.sw - 15.w * 4) / 3 + 40.h; + double itemW = (1.sw - 15.w * 4) / 3; + double itemH = (1.sw - 15.w * 4) / 3 + 40.h; Widget mainListView(int index, CloudStorageData itemData) { return GridView.builder( padding: EdgeInsets.only(left: 15.w, right: 15.w), @@ -110,8 +112,8 @@ class _EditVideoLogPageState extends State { crossAxisSpacing: 15.w, //子组件宽高长度比例 childAspectRatio: itemW / itemH), - itemBuilder: (context, index) { - RecordListData recordData = itemData.recordList![index]; + itemBuilder: (BuildContext context, int index) { + final RecordListData recordData = itemData.recordList![index]; return videoItem(recordData, index); }, ); @@ -133,9 +135,9 @@ class _EditVideoLogPageState extends State { setState(() {}); }, child: Stack( - children: [ + children: [ Column( - children: [ + children: [ Container( width: itemW, height: itemW, @@ -146,7 +148,7 @@ class _EditVideoLogPageState extends State { child: Image( fit: BoxFit.cover, image: Image.network(recordData.imagesUrl ?? - "images/icon_video_placeholder.jpg") + 'images/icon_video_placeholder.jpg') .image), ), ), @@ -165,8 +167,8 @@ class _EditVideoLogPageState extends State { width: 36.w, height: 36.w, image: state.selectVideoLogList.value.contains(recordData) - ? const AssetImage("images/icon_round_select.png") - : const AssetImage("images/icon_round_unSelect.png"))) + ? const AssetImage('images/icon_round_select.png') + : const AssetImage('images/icon_round_unSelect.png'))) ], )), ); @@ -175,14 +177,14 @@ class _EditVideoLogPageState extends State { Widget bottomBottomBtnWidget() { return SizedBox( width: 1.sw, - child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ bottomBtnItemWidget( - "images/main/icon_lockDetail_monitoringDownloadVideo.png", - "下载".tr, + 'images/main/icon_lockDetail_monitoringDownloadVideo.png', + '下载'.tr, Colors.white, () { if (state.selectVideoLogList.value.isNotEmpty) { - Get.toNamed(Routers.videoLogDownLoadPage, arguments: { - "downloadVideoLogList": state.selectVideoLogList.value + Get.toNamed(Routers.videoLogDownLoadPage, arguments: >{ + 'downloadVideoLogList': state.selectVideoLogList.value }); } else { logic.showToast('请选择要下载的视频'); @@ -190,8 +192,8 @@ class _EditVideoLogPageState extends State { }), SizedBox(width: 100.w), bottomBtnItemWidget( - "images/main/icon_lockDetail_monitoringDeletVideo.png", - "删除".tr, + 'images/main/icon_lockDetail_monitoringDeletVideo.png', + '删除'.tr, AppColors.mainColor, () { if (state.selectVideoLogList.value.isNotEmpty) { logic.deleteLockCloudStorageList(); @@ -205,14 +207,14 @@ class _EditVideoLogPageState extends State { Widget bottomBtnItemWidget( String iconUrl, String name, Color backgroundColor, Function() onClick) { - var wh = 40.w; + final double wh = 40.w; return GestureDetector( onTap: onClick, child: SizedBox( height: 140.h, child: Column( crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ SizedBox(height: 30.w), Image.asset(iconUrl, width: wh, height: wh, fit: BoxFit.fitWidth), SizedBox(height: 10.w), diff --git a/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart b/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart index 83d561e6..e7ae301e 100755 --- a/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart +++ b/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart @@ -2,10 +2,6 @@ import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; class EditVideoLogState { - var selectVideoLogList = [].obs; //选中的视频列表 - var isSelectAll = false.obs; - var videoLogList = [].obs; //全部的视频列表 - var getLockId = 0.obs; EditVideoLogState() { Map map = Get.arguments; @@ -17,4 +13,8 @@ class EditVideoLogState { getLockId.value = map['lockId']; } } + RxList selectVideoLogList = [].obs; //选中的视频列表 + RxBool isSelectAll = false.obs; + RxList videoLogList = [].obs; //全部的视频列表 + RxInt getLockId = 0.obs; } diff --git a/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart b/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart index eab12c80..5a23d226 100755 --- a/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart +++ b/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart @@ -1,9 +1,11 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_state.dart'; import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/noData.dart'; @@ -19,8 +21,8 @@ class VideoLogPage extends StatefulWidget { } class _VideoLogPageState extends State { - final logic = Get.put(VideoLogLogic()); - final state = Get.find().state; + final VideoLogLogic logic = Get.put(VideoLogLogic()); + final VideoLogState state = Get.find().state; @override Widget build(BuildContext context) { @@ -33,7 +35,7 @@ class _VideoLogPageState extends State { backgroundColor: AppColors.mainColor, ), body: Column( - children: [ + children: [ // 云存顶部 Visibility(visible: !state.isNavLocal.value, child: vipTip()), // 本地顶部 @@ -45,15 +47,15 @@ class _VideoLogPageState extends State { child: Expanded( child: ListView.builder( itemCount: state.videoLogList.length, - itemBuilder: (c, index) { - CloudStorageData item = state.videoLogList[index]; + itemBuilder: (BuildContext c, int index) { + final CloudStorageData item = state.videoLogList[index]; return Column( - children: [ + children: [ Container( margin: EdgeInsets.only( left: 20.w, top: 15.w, bottom: 15.w), - child: Row(children: [ - Text(item.date ?? "", + child: Row(children: [ + Text(item.date ?? '', style: TextStyle(fontSize: 20.sp)), ])), mainListView(index, item) @@ -67,14 +69,14 @@ class _VideoLogPageState extends State { child: state.localList.isNotEmpty ? ListView.builder( itemCount: 5, - itemBuilder: (c, index) { + itemBuilder: (BuildContext c, int index) { return Column( - children: [ + children: [ Container( margin: EdgeInsets.only( left: 20.w, top: 15.w, bottom: 15.w), - child: Row(children: [ - Text("2023.10.2$index", + child: Row(children: [ + Text('2023.10.2$index', style: TextStyle(fontSize: 20.sp)), ])), mainListView(index, CloudStorageData()), @@ -94,14 +96,14 @@ class _VideoLogPageState extends State { // color: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ TextButton( onPressed: () { setState(() { state.isNavLocal.value = false; }); }, - child: Obx(() => Text("云存".tr, + child: Obx(() => Text('云存'.tr, style: state.isNavLocal.value == true ? TextStyle( color: Colors.grey, @@ -117,7 +119,7 @@ class _VideoLogPageState extends State { state.isNavLocal.value = true; }); }, - child: Obx(() => Text("本地".tr, + child: Obx(() => Text('本地'.tr, style: state.isNavLocal.value == true ? TextStyle( color: Colors.white, @@ -147,23 +149,23 @@ class _VideoLogPageState extends State { color: const Color(0xFFF6F7F8), borderRadius: BorderRadius.circular(20.h)), child: Row( - children: [ + children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("3天滚动储存".tr, style: TextStyle(fontSize: 24.sp)), + children: [ + Text('3天滚动储存'.tr, style: TextStyle(fontSize: 24.sp)), SizedBox(height: 10.h), Text("${F.navTitle}${"已为本设备免费提供3大滚动视频储存服务".tr}", style: TextStyle(fontSize: 22.sp, color: Colors.grey)), ], )), SizedBox(width: 15.w), - Text("去升级".tr, style: TextStyle(fontSize: 22.sp)), + Text('去升级'.tr, style: TextStyle(fontSize: 22.sp)), Image( width: 40.w, height: 24.w, - image: const AssetImage("images/icon_right_black.png")) + image: const AssetImage('images/icon_right_black.png')) ], ), ), @@ -185,15 +187,15 @@ class _VideoLogPageState extends State { color: const Color(0xFFF6F7F8), borderRadius: BorderRadius.circular(20.h)), child: Row( - children: [ + children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ // SizedBox(height: 20.h), - Text("下载列表".tr, style: TextStyle(fontSize: 24.sp)), + Text('下载列表'.tr, style: TextStyle(fontSize: 24.sp)), SizedBox(height: 15.h), - Text("暂无下载内容".tr, + Text('暂无下载内容'.tr, style: TextStyle(fontSize: 22.sp, color: Colors.grey)), ], )), @@ -202,7 +204,7 @@ class _VideoLogPageState extends State { Image( width: 40.w, height: 24.w, - image: const AssetImage("images/icon_right_black.png")) + image: const AssetImage('images/icon_right_black.png')) ], ), ), @@ -215,8 +217,8 @@ class _VideoLogPageState extends State { margin: EdgeInsets.only(left: 20.w), child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(state.isNavLocal.value == true ? "已下载".tr : "全部视频".tr, + children: [ + Text(state.isNavLocal.value == true ? '已下载'.tr : '全部视频'.tr, style: TextStyle(fontSize: 26.sp, fontWeight: FontWeight.w500)), Expanded(child: SizedBox(width: 10.w)), IconButton( @@ -224,13 +226,13 @@ class _VideoLogPageState extends State { width: 40.w, height: 40.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringEditVoice.png")), + 'images/main/icon_lockDetail_monitoringEditVoice.png')), iconSize: 30, color: Colors.black54, onPressed: () { - Get.toNamed(Routers.editVideoLogPage, arguments: { - "videoDataList": state.videoLogList.value, - "lockId": state.getLockId.value + Get.toNamed(Routers.editVideoLogPage, arguments: { + 'videoDataList': state.videoLogList.value, + 'lockId': state.getLockId.value }); }, ) @@ -245,8 +247,8 @@ class _VideoLogPageState extends State { ); } - var itemW = (1.sw - 15.w * 4) / 3; - var itemH = (1.sw - 15.w * 4) / 3 + 40.h; + double itemW = (1.sw - 15.w * 4) / 3; + double itemH = (1.sw - 15.w * 4) / 3 + 40.h; // 云存列表 Widget mainListView(int index, CloudStorageData itemData) { @@ -264,8 +266,8 @@ class _VideoLogPageState extends State { crossAxisSpacing: 15.w, //子组件宽高长度比例 childAspectRatio: itemW / itemH), - itemBuilder: (context, index) { - RecordListData recordData = itemData.recordList![index]; + itemBuilder: (BuildContext context, int index) { + final RecordListData recordData = itemData.recordList![index]; return videoItem(recordData); }, ); @@ -274,16 +276,16 @@ class _VideoLogPageState extends State { Widget videoItem(RecordListData recordData) { return GestureDetector( onTap: () { - Get.toNamed(Routers.videoLogDetailPage, arguments: { - "recordData": recordData, - "videoDataList": state.videoLogList.value + Get.toNamed(Routers.videoLogDetailPage, arguments: { + 'recordData': recordData, + 'videoDataList': state.videoLogList.value }); }, child: SizedBox( width: itemW, height: itemH, child: Column( - children: [ + children: [ Container( width: itemW, height: itemW, @@ -294,7 +296,7 @@ class _VideoLogPageState extends State { child: Image( fit: BoxFit.cover, image: Image.network(recordData.imagesUrl ?? - "images/icon_video_placeholder.jpg") + 'images/icon_video_placeholder.jpg') .image), ), ), diff --git a/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart b/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart index b1d56954..28824226 100755 --- a/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart +++ b/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart @@ -145,7 +145,7 @@ class ControlsOverlay extends StatelessWidget { width: 50.w, height: 50.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringShareVideo_white.png")), + 'images/main/icon_lockDetail_monitoringShareVideo_white.png')), ), SizedBox(width: 20.w), Container( @@ -156,7 +156,7 @@ class ControlsOverlay extends StatelessWidget { width: 50.w, height: 50.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringDownloadVideo_white.png")), + 'images/main/icon_lockDetail_monitoringDownloadVideo_white.png')), ), SizedBox(width: 20.w), Container( @@ -167,7 +167,7 @@ class ControlsOverlay extends StatelessWidget { width: 50.w, height: 50.w, image: const AssetImage( - "images/main/icon_lockDetail_monitoringDeletVideo_white.png")), + 'images/main/icon_lockDetail_monitoringDeletVideo_white.png')), ), ], ), diff --git a/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart b/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart index dc3938d0..2791055d 100755 --- a/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart +++ b/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart @@ -1,14 +1,16 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart'; import 'package:star_lock/tools/dateTool.dart'; +import 'package:video_player/video_player.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; import 'videoLogDetail_logic.dart'; -import 'package:video_player/video_player.dart'; class VideoLogDetailPage extends StatefulWidget { const VideoLogDetailPage({Key? key}) : super(key: key); @@ -18,8 +20,8 @@ class VideoLogDetailPage extends StatefulWidget { } class _VideoLogDetailPageState extends State { - final logic = Get.put(VideoLogDetailLogic()); - final state = Get.find().state; + final VideoLogDetailLogic logic = Get.put(VideoLogDetailLogic()); + final VideoLogDetailState state = Get.find().state; @override void initState() { @@ -42,12 +44,12 @@ class _VideoLogDetailPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "视频播放".tr, + barTitle: '视频播放'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: Column( - children: [ + children: [ AspectRatio( aspectRatio: state.videoController.value.aspectRatio, child: Stack( @@ -58,10 +60,8 @@ class _VideoLogDetailPageState extends State { controller: state.videoController, recordData: state.recordData.value, ), - (state.videoController.value.isPlaying || - state.videoController.value.isBuffering) - ? Container() - : VideoProgressIndicator(state.videoController, + if (state.videoController.value.isPlaying || + state.videoController.value.isBuffering) Container() else VideoProgressIndicator(state.videoController, colors: VideoProgressColors( playedColor: AppColors.mainColor), allowScrubbing: true), @@ -73,9 +73,9 @@ class _VideoLogDetailPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Row( - children: [ + children: [ Text( DateTool().dateToYMDString( state.recordData.value.operateDate.toString()), @@ -84,7 +84,7 @@ class _VideoLogDetailPageState extends State { ), SizedBox(height: 15.h), Row( - children: [ + children: [ videoItem(true, state.recordData.value), ], ), @@ -93,15 +93,15 @@ class _VideoLogDetailPageState extends State { Expanded( child: ListView.builder( itemCount: state.videoLogList.length, - itemBuilder: (c, index) { + itemBuilder: (BuildContext c, int index) { CloudStorageData item = state.videoLogList[index]; return Column( - children: [ + children: [ Container( margin: EdgeInsets.only( left: 20.w, top: 15.w, bottom: 15.w), - child: Row(children: [ - Text(item.date ?? "", + child: Row(children: [ + Text(item.date ?? '', style: TextStyle(fontSize: 20.sp)), ])), mainListView(index, item) @@ -131,8 +131,8 @@ class _VideoLogDetailPageState extends State { ); } - var itemW = (1.sw - 15.w * 4) / 3; - var itemH = (1.sw - 15.w * 4) / 3 + 40.h; + double itemW = (1.sw - 15.w * 4) / 3; + double itemH = (1.sw - 15.w * 4) / 3 + 40.h; Widget mainListView(int index, CloudStorageData itemData) { return GridView.builder( padding: EdgeInsets.only(left: 15.w, right: 15.w), @@ -148,7 +148,7 @@ class _VideoLogDetailPageState extends State { crossAxisSpacing: 15.w, //子组件宽高长度比例 childAspectRatio: itemW / itemH), - itemBuilder: (context, index) { + itemBuilder: (BuildContext context, int index) { return videoItem(false, itemData.recordList![index]); }, ); @@ -159,12 +159,12 @@ class _VideoLogDetailPageState extends State { width: itemW, height: itemH, child: Stack( - children: [ + children: [ Column( - children: [ + children: [ ClipRRect( borderRadius: BorderRadius.circular(10.w), - child: Stack(children: [ + child: Stack(children: [ Container( width: itemW, height: itemW, @@ -175,7 +175,7 @@ class _VideoLogDetailPageState extends State { child: Image( fit: BoxFit.cover, image: Image.network(itemData.imagesUrl ?? - "images/icon_video_placeholder.jpg") + 'images/icon_video_placeholder.jpg') .image), ), ), @@ -197,7 +197,7 @@ class _VideoLogDetailPageState extends State { // padding: EdgeInsets.only(right: 10.w, left: 10.w), color: const Color.fromRGBO(0, 0, 0, 0.3), child: Center( - child: Text("播放中", + child: Text('播放中'.tr, style: TextStyle( color: Colors.white, fontSize: 22.sp))), )), @@ -216,7 +216,7 @@ class _VideoLogDetailPageState extends State { } String formatString(time) { - var shortName = time.toString().substring(2, 7); + String shortName = time.toString().substring(2, 7); return shortName; } diff --git a/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart b/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart index 43b426f3..0bce20e8 100755 --- a/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart +++ b/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart @@ -1,8 +1,9 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_state.dart'; import 'package:star_lock/tools/dateTool.dart'; import '../../../../app_settings/app_colors.dart'; @@ -18,22 +19,22 @@ class VideoLogDownLoadPage extends StatefulWidget { } class _VideoLogDownLoadPageState extends State { - final logic = Get.put(VideoLogDownLoadLogic()); - final state = Get.find().state; + final VideoLogDownLoadLogic logic = Get.put(VideoLogDownLoadLogic()); + final VideoLogDownLoadState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "下载列表".tr, + barTitle: '下载列表'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: Container( color: AppColors.greyBackgroundColor, child: Column( - children: [ + children: [ Expanded( child: Obx( () => state.videoLogDownloadList.isNotEmpty @@ -46,21 +47,21 @@ class _VideoLogDownLoadPageState extends State { ); } - var itemW = (1.sw - 15.w * 4) / 3; - var itemH = (1.sw - 15.w * 4) / 3 + 40.h; + double itemW = (1.sw - 15.w * 4) / 3; + double itemH = (1.sw - 15.w * 4) / 3 + 40.h; Widget mainListView(List itemList) { return ListView.separated( itemCount: itemList.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (c, index) { + separatorBuilder: (BuildContext c, int index) { return const Divider( height: 1, color: Colors.transparent, ); }, - itemBuilder: (c, index) { - RecordListData recordData = itemList[index]; + itemBuilder: (BuildContext c, int index) { + final RecordListData recordData = itemList[index]; return videoItem(recordData, index); }); } @@ -71,7 +72,7 @@ class _VideoLogDownLoadPageState extends State { EdgeInsets.only(left: 20.w, right: 20.w, bottom: 20.h, top: 20.h), color: Colors.white, child: Row( - children: [ + children: [ ClipRRect( borderRadius: BorderRadius.circular(10.w), child: Image( @@ -79,14 +80,14 @@ class _VideoLogDownLoadPageState extends State { width: 120.w, height: 80.w, image: Image.network(recordData.imagesUrl ?? - "images/icon_video_placeholder.jpg") + 'images/icon_video_placeholder.jpg') .image), ), SizedBox(width: 15.w), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + children: [ Text( DateTool() .dateToYMDHNString(recordData.operateDate.toString()), diff --git a/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart b/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart index 62d3b4a9..b62cba98 100755 --- a/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart +++ b/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_logic.dart @@ -6,7 +6,6 @@ class DemoModeLockDetailLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); Storage.setBool(ifIsDemoModeOrNot, true); @@ -14,14 +13,12 @@ class DemoModeLockDetailLogic extends BaseGetXController { @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose super.onClose(); } diff --git a/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart b/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart index 421e77cd..ffc757c6 100755 --- a/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart +++ b/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart @@ -5,7 +5,6 @@ import 'package:get/get.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../entity/lockListInfo_entity.dart'; import 'demoModeLockDetail_logic.dart'; @@ -30,7 +29,7 @@ class _DemoModeLockDetailPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '演示模式', + barTitle: '演示模式'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -62,7 +61,7 @@ class _DemoModeLockDetailPageState extends State { Row( children: [ Expanded( - child: Text('提示:当前界面为展示界面,添加设备后才能继续使用', + child: Text('提示:当前界面为展示界面,添加设备后才能继续使用'.tr, style: TextStyle( fontSize: 24.sp, color: AppColors.mainColor))), ], @@ -128,7 +127,7 @@ class _DemoModeLockDetailPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '门已上锁', + '门已上锁'.tr, style: TextStyle( fontSize: 26.sp, color: Colors.black, @@ -166,7 +165,7 @@ class _DemoModeLockDetailPageState extends State { width: 6.w, ), Text( - '超级管理员', + '超级管理员'.tr, style: TextStyle(fontSize: 20.sp, color: AppColors.btnDisableColor), ), @@ -188,7 +187,7 @@ class _DemoModeLockDetailPageState extends State { width: 6.w, ), Text( - '网关设备', + '网关设备英文'.tr, style: TextStyle(fontSize: 20.sp, color: AppColors.btnDisableColor), ), @@ -228,8 +227,8 @@ class _DemoModeLockDetailPageState extends State { // 考勤 // if (state.keyInfos.value.isAttendance == 1) { - showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', - '考勤'.tr, () { + showWidgetArr + .add(bottomItem('images/main/icon_main_clockingIn.png', '考勤'.tr, () { // gotoLogin(); Get.toNamed(Routers.checkingInListPage, arguments: LockListInfoItemEntity()); @@ -238,34 +237,35 @@ class _DemoModeLockDetailPageState extends State { final List defaultWidgetArr = [ // 电子钥匙 - bottomItem('images/main/icon_main_electronicKey.png', - '电子钥匙'.tr, () { + bottomItem('images/main/icon_main_electronicKey.png', '电子钥匙'.tr, () { // gotoLogin(); Get.toNamed(Routers.electronicKeyListPage, - arguments: {'keyInfo': LockListInfoItemEntity()}); + arguments: { + 'keyInfo': LockListInfoItemEntity() + }); }), // 密码 - bottomItem('images/main/icon_main_password.png', - '密码'.tr, () { + bottomItem('images/main/icon_main_password.png', '密码'.tr, () { // gotoLogin(); Get.toNamed(Routers.passwordKeyListPage, - arguments: {'keyInfo': LockListInfoItemEntity()}); + arguments: { + 'keyInfo': LockListInfoItemEntity() + }); }), // ic卡 - bottomItem('images/main/icon_main_icCard.png', - '卡'.tr, () { + bottomItem('images/main/icon_main_icCard.png', '卡'.tr, () { // gotoLogin(); - Get.toNamed(Routers.cardListPage, arguments: {'lockId': 0}); + Get.toNamed(Routers.cardListPage, + arguments: {'lockId': 0}); }), // 指纹 - bottomItem('images/main/icon_main_fingerprint.png', - '指纹'.tr, () { + bottomItem('images/main/icon_main_fingerprint.png', '指纹'.tr, () { // gotoLogin(); Get.toNamed(Routers.fingerprintListPage, @@ -273,14 +273,13 @@ class _DemoModeLockDetailPageState extends State { }), // 遥控 - bottomItem('images/main/icon_main_remoteControl.png', - '遥控'.tr, gotoLogin), + bottomItem('images/main/icon_main_remoteControl.png', '遥控'.tr, gotoLogin), ]; showWidgetArr.addAll(defaultWidgetArr); //可视对讲门锁新增->人脸 showWidgetArr.add( - bottomItem('images/main/icon_face.png', '人脸', () { + bottomItem('images/main/icon_face.png', '人脸'.tr, () { // gotoLogin(); Get.toNamed(Routers.faceListPage, arguments: { @@ -291,38 +290,39 @@ class _DemoModeLockDetailPageState extends State { //可视对讲门锁新增->监控 showWidgetArr.add( - bottomItem('images/main/icon_catEyes.png', '监控', gotoLogin), + bottomItem('images/main/icon_catEyes.png', '监控'.tr, gotoLogin), ); final List endWiddget = [ // 授权管理员 - bottomItem('images/main/icon_main_authorizedAdmin.png', - TranslationLoader.lanKeys!.authorizedAdmin!.tr, () { + bottomItem('images/main/icon_main_authorizedAdmin.png', '授权管理员'.tr, () { // gotoLogin(); Get.toNamed(Routers.authorizedAdminListPage, - arguments: {'keyInfo': LockListInfoItemEntity()}); + arguments: { + 'keyInfo': LockListInfoItemEntity() + }); }), // 操作记录 bottomItem('images/main/icon_main_operatingRecord.png', '操作记录'.tr, () { // gotoLogin(); Get.toNamed(Routers.lockOperatingRecordPage, - arguments: {'keyInfo': LockListInfoItemEntity()}); + arguments: { + 'keyInfo': LockListInfoItemEntity() + }); }), // 视频日志 - bottomItem('images/main/icon_lockDetail_videoLog.png', '视频日志', () { + bottomItem('images/main/icon_lockDetail_videoLog.png', '视频日志'.tr, () { //视频日志 Get.toNamed(Routers.videoLogPage); }), // 消息提醒 - bottomItem('images/main/icon_lockDetail_messageReminding.png', '消息提醒', + bottomItem('images/main/icon_lockDetail_messageReminding.png', '消息提醒'.tr, () { Get.toNamed(Routers.msgNotificationPage); }), // 设置 - bottomItem( - 'images/main/icon_main_set.png', TranslationLoader.lanKeys!.set!.tr, - () { + bottomItem('images/main/icon_main_set.png', '设置'.tr, () { Get.toNamed(Routers.demoModeLockSetPage); }), ]; @@ -360,6 +360,6 @@ class _DemoModeLockDetailPageState extends State { void gotoLogin() { // Get.toNamed(Routers.selectLockTypePage); - logic.showToast('演示模式'); + logic.showToast('演示模式'.tr); } } diff --git a/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart b/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart index 29c499a8..ba07467d 100755 --- a/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart +++ b/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart @@ -8,7 +8,6 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class DemoModeLockSetPage extends StatefulWidget { const DemoModeLockSetPage({Key? key}) : super(key: key); @@ -20,7 +19,6 @@ class DemoModeLockSetPage extends StatefulWidget { class _DemoModeLockSetPageState extends State { @override void initState() { - // TODO: implement initState super.initState(); } @@ -29,7 +27,7 @@ class _DemoModeLockSetPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.set!.tr, + barTitle: '设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -39,8 +37,7 @@ class _DemoModeLockSetPageState extends State { children: [ // 基本信息 CommonItem( - leftTitel: - TranslationLoader.lanKeys!.basicInformation!.tr, + leftTitel:'基本信息'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -55,7 +52,7 @@ class _DemoModeLockSetPageState extends State { ), // 门磁 CommonItem( - leftTitel: TranslationLoader.lanKeys!.doorMagnetic!.tr, + leftTitel: '门磁'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -66,8 +63,7 @@ class _DemoModeLockSetPageState extends State { }), // 无线键盘 CommonItem( - leftTitel: - TranslationLoader.lanKeys!.wirelessKeyboard!.tr, + leftTitel:'无线键盘'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -78,7 +74,7 @@ class _DemoModeLockSetPageState extends State { }), // 照明 CommonItem( - leftTitel: '照明', + leftTitel: '照明'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -87,7 +83,7 @@ class _DemoModeLockSetPageState extends State { }), // 开门器 CommonItem( - leftTitel: '开门器', + leftTitel: '开门器'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -97,9 +93,8 @@ class _DemoModeLockSetPageState extends State { SizedBox(height: 10.h), // 自动闭锁 CommonItem( - leftTitel: - TranslationLoader.lanKeys!.automaticBlocking!.tr, - rightTitle: TranslationLoader.lanKeys!.closed!.tr, + leftTitel: '自动闭锁'.tr, + rightTitle: '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -109,7 +104,7 @@ class _DemoModeLockSetPageState extends State { }), // 锁声音 CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockSound!.tr, + leftTitel: '锁声音'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -119,8 +114,8 @@ class _DemoModeLockSetPageState extends State { }), // 防撬报警 CommonItem( - leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr, - rightTitle: TranslationLoader.lanKeys!.closed!.tr, + leftTitel: '防撬报警'.tr, + rightTitle: '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -131,9 +126,8 @@ class _DemoModeLockSetPageState extends State { SizedBox(height: 10.h), // 常开模式 CommonItem( - leftTitel: - TranslationLoader.lanKeys!.normallyOpenMode!.tr, - rightTitle: TranslationLoader.lanKeys!.closed!.tr, + leftTitel:'常开模式'.tr, + rightTitle: '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -142,8 +136,8 @@ class _DemoModeLockSetPageState extends State { }), // 远程开锁 CommonItem( - leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr, - rightTitle: TranslationLoader.lanKeys!.closed!.tr, + leftTitel: '远程开锁'.tr, + rightTitle: '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -153,8 +147,8 @@ class _DemoModeLockSetPageState extends State { }), // 重置键 CommonItem( - leftTitel: TranslationLoader.lanKeys!.resetButton!.tr, - rightTitle: TranslationLoader.lanKeys!.closed!.tr, + leftTitel: '重置键'.tr, + rightTitle: '已关闭'.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -165,7 +159,7 @@ class _DemoModeLockSetPageState extends State { SizedBox(height: 10.h), //---田总新增展示 CommonItem( - leftTitel: '面容开锁', + leftTitel: '面容开锁'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -173,7 +167,7 @@ class _DemoModeLockSetPageState extends State { gotoAddLock(); }), CommonItem( - leftTitel: '消息提醒', + leftTitel: '消息提醒'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -181,7 +175,7 @@ class _DemoModeLockSetPageState extends State { gotoAddLock(); }), CommonItem( - leftTitel: '猫眼设置', + leftTitel: '猫眼设置'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -189,7 +183,7 @@ class _DemoModeLockSetPageState extends State { gotoAddLock(); }), CommonItem( - leftTitel: '开门方向设置', + leftTitel: '开门方向设置'.tr, rightTitle: '', isHaveDirection: true, isHaveLine: true, @@ -197,7 +191,7 @@ class _DemoModeLockSetPageState extends State { gotoAddLock(); }), CommonItem( - leftTitel: '电机功率设置', + leftTitel: '电机功率设置'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -205,12 +199,12 @@ class _DemoModeLockSetPageState extends State { gotoAddLock(); }), // 支持蓝牙广播(关闭则不能使用蓝牙主动开锁) - CommonItem( - leftTitel: '蓝牙广播', - rightTitle: '', - isHaveLine: false, - isHaveRightWidget: true, - rightWidget: _lockRemindSwitch()), + // CommonItem( + // leftTitel: '蓝牙广播', + // rightTitle: '', + // isHaveLine: false, + // isHaveRightWidget: true, + // rightWidget: _lockRemindSwitch()), // ), SizedBox(height: 10.h), //-----新增至此 @@ -233,13 +227,13 @@ class _DemoModeLockSetPageState extends State { rightWidget: _openCheckInSwitch()), // 开锁提醒 CommonItem( - leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr, + leftTitel: '开锁提醒'.tr, rightTitle: '', isHaveLine: false, isHaveRightWidget: true, rightWidget: _lockRemindSwitch()), CommonItem( - leftTitel: '开锁时是否需联网', + leftTitel: '开锁时是否需联网'.tr, rightTitle: '', isHaveLine: false, isHaveRightWidget: true, @@ -247,8 +241,7 @@ class _DemoModeLockSetPageState extends State { SizedBox(height: 10.h), // wifi配网 CommonItem( - leftTitel: TranslationLoader - .lanKeys!.wifiDistributionNetwork!.tr, + leftTitel: 'WiFi配网'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -257,7 +250,7 @@ class _DemoModeLockSetPageState extends State { }), // 锁时间 CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockTime!.tr, + leftTitel: '锁时间'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -266,7 +259,7 @@ class _DemoModeLockSetPageState extends State { }), // 诊断 CommonItem( - leftTitel: TranslationLoader.lanKeys!.diagnose!.tr, + leftTitel: '诊断'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -275,7 +268,7 @@ class _DemoModeLockSetPageState extends State { }), // 上传数据 CommonItem( - leftTitel: TranslationLoader.lanKeys!.uploadData!.tr, + leftTitel: '上传数据'.tr, rightTitle: '', isHaveLine: true, isHaveDirection: true, @@ -293,7 +286,7 @@ class _DemoModeLockSetPageState extends State { // }), // 锁升级 CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockEscalation!.tr, + leftTitel: '锁升级'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, @@ -305,7 +298,7 @@ class _DemoModeLockSetPageState extends State { padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 30.h), child: SubmitBtn( - btnName: '退出演示模式', + btnName: '退出演示模式'.tr, isDelete: true, onClick: () { Get.close(2); @@ -344,6 +337,6 @@ class _DemoModeLockSetPageState extends State { void gotoAddLock() { // Get.toNamed(Routers.selectLockTypePage); - EasyLoading.showToast('演示模式', duration: 2000.milliseconds); + EasyLoading.showToast('演示模式'.tr, duration: 2000.milliseconds); } } diff --git a/lib/main/lockMian/entity/lockListInfo_entity.dart b/lib/main/lockMian/entity/lockListInfo_entity.dart index 839c8248..e8677d82 100755 --- a/lib/main/lockMian/entity/lockListInfo_entity.dart +++ b/lib/main/lockMian/entity/lockListInfo_entity.dart @@ -1,9 +1,4 @@ class LockListInfoEntity { - int? errorCode; - String? description; - String? errorMsg; - LockListInfoGroupEntity? data; - LockListInfoEntity( {this.errorCode, this.description, this.errorMsg, this.data}); @@ -15,6 +10,10 @@ class LockListInfoEntity { ? LockListInfoGroupEntity.fromJson(json['data']) : null; } + int? errorCode; + String? description; + String? errorMsg; + LockListInfoGroupEntity? data; Map toJson() { final Map data = {}; @@ -29,12 +28,6 @@ class LockListInfoEntity { } class LockListInfoGroupEntity { - List? groupList; - int? pageNo; - int? pageSize; - int? pages; - int? total; - LockListInfoGroupEntity( {this.groupList, this.pageNo, this.pageSize, this.pages, this.total}); @@ -50,6 +43,11 @@ class LockListInfoGroupEntity { pages = json['pages']; total = json['total']; } + List? groupList; + int? pageNo; + int? pageSize; + int? pages; + int? total; Map toJson() { final Map data = {}; @@ -65,16 +63,6 @@ class LockListInfoGroupEntity { } class GroupList { - String? groupName; - int? groupId; - List? lockList; - - bool _isChecked = false; - - bool get isChecked => _isChecked ?? false; - - set isChecked(bool value) => _isChecked = value; - GroupList({this.groupName, this.groupId, this.lockList}); GroupList.fromJson(Map json) { @@ -87,6 +75,15 @@ class GroupList { }); } } + String? groupName; + int? groupId; + List? lockList; + + bool _isChecked = false; + + bool get isChecked => _isChecked ?? false; + + set isChecked(bool value) => _isChecked = value; Map toJson() { final Map data = {}; @@ -98,7 +95,7 @@ class GroupList { return data; } - GroupList copy(){ + GroupList copy() { return GroupList( groupName: groupName, groupId: groupId, @@ -108,44 +105,6 @@ class GroupList { } class LockListInfoItemEntity { - int? keyId; - int? lockId; - String? lockName; - String? lockAlias; - int? electricQuantity; - String? fwVersion; - String? hwVersion; - int? keyType; - int? passageMode; - int? userType; - int? startDate; - int? endDate; - List? weekDays; - int? remoteEnable; - int? faceAuthentication; //是否实名认证:0-未知,1-是,2-否 - int? lastFaceValidateTime; - int? nextFaceValidateTime; //下次人脸认证时间 - int? keyRight; - int? keyStatus; - int? isLockOwner; - int? sendDate; - int? lockUserNo; - int? senderUserId; - int? electricQuantityDate; - int? electricQuantityStandby; - int? isOnlyManageSelf; - int? restoreCount; - String? model; - String? vendor; - Bluetooth? bluetooth; - LockFeature? lockFeature; - LockSetting? lockSetting; - int? hasGateway; - int? appUnlockOnline; - String? mac; - int? initUserNo; - int? updateDate; - LockListInfoItemEntity({ this.keyId, this.lockId, @@ -231,6 +190,43 @@ class LockListInfoItemEntity { initUserNo = json['initUserNo']; updateDate = json['updateDate']; } + int? keyId; + int? lockId; + String? lockName; + String? lockAlias; + int? electricQuantity; + String? fwVersion; + String? hwVersion; + int? keyType; + int? passageMode; + int? userType; + int? startDate; + int? endDate; + List? weekDays; + int? remoteEnable; + int? faceAuthentication; //是否实名认证:0-未知,1-是,2-否 + int? lastFaceValidateTime; + int? nextFaceValidateTime; //下次人脸认证时间 + int? keyRight; + int? keyStatus; + int? isLockOwner; + int? sendDate; + int? lockUserNo; + int? senderUserId; + int? electricQuantityDate; + int? electricQuantityStandby; + int? isOnlyManageSelf; + int? restoreCount; + String? model; + String? vendor; + Bluetooth? bluetooth; + LockFeature? lockFeature; + LockSetting? lockSetting; + int? hasGateway; + int? appUnlockOnline; + String? mac; + int? initUserNo; + int? updateDate; Map toJson() { final Map data = {}; @@ -285,18 +281,12 @@ class LockListInfoItemEntity { return isLockOwner == 1; } - LockListInfoItemEntity copy(){ + LockListInfoItemEntity copy() { return LockListInfoItemEntity.fromJson(toJson()); } } class Bluetooth { - String? bluetoothDeviceId; - String? bluetoothDeviceName; - List? publicKey; - List? privateKey; - List? signKey; - Bluetooth( {this.bluetoothDeviceId, this.bluetoothDeviceName, @@ -311,6 +301,11 @@ class Bluetooth { privateKey = json['privateKey'].cast(); signKey = json['signKey'].cast(); } + String? bluetoothDeviceId; + String? bluetoothDeviceName; + List? publicKey; + List? privateKey; + List? signKey; Map toJson() { final Map data = {}; @@ -324,18 +319,6 @@ class Bluetooth { } class LockFeature { - int? password; - int? icCard; - int? fingerprint; - int? fingerVein; - int? palmVein; - int? isSupportIris; - int? d3Face; - int? bluetoothRemoteControl; - int? videoIntercom; - int? isSupportCatEye; - int? isSupportBackupBattery; - LockFeature({ this.password, this.icCard, @@ -348,6 +331,7 @@ class LockFeature { this.videoIntercom, this.isSupportCatEye, this.isSupportBackupBattery, + this.isNoSupportedBlueBroadcast, }); LockFeature.fromJson(Map json) { @@ -362,7 +346,20 @@ class LockFeature { videoIntercom = json['videoIntercom']; isSupportCatEye = json['isSupportCatEye']; isSupportBackupBattery = json['isSupportBackupBattery']; + isNoSupportedBlueBroadcast = json['isNoSupportedBlueBroadcast']; } + int? password; + int? icCard; + int? fingerprint; + int? fingerVein; + int? palmVein; + int? isSupportIris; + int? d3Face; + int? bluetoothRemoteControl; + int? videoIntercom; + int? isSupportCatEye; + int? isSupportBackupBattery; + int? isNoSupportedBlueBroadcast; Map toJson() { final Map data = {}; @@ -377,15 +374,12 @@ class LockFeature { data['videoIntercom'] = videoIntercom; data['isSupportCatEye'] = isSupportCatEye; data['isSupportBackupBattery'] = isSupportBackupBattery; + data['isNoSupportedBlueBroadcast'] = isNoSupportedBlueBroadcast; return data; } } class LockSetting { - int? attendance; - int? appUnlockOnline; - int? remoteUnlock; - LockSetting({ this.attendance, this.appUnlockOnline, @@ -397,6 +391,9 @@ class LockSetting { appUnlockOnline = json['appUnlockOnline']; remoteUnlock = json['remoteUnlock']; } + int? attendance; + int? appUnlockOnline; + int? remoteUnlock; Map toJson() { final Map data = {}; diff --git a/lib/main/lockMian/lockList/lockList_logic.dart b/lib/main/lockMian/lockList/lockList_logic.dart index 9844d980..de47a294 100755 --- a/lib/main/lockMian/lockList/lockList_logic.dart +++ b/lib/main/lockMian/lockList/lockList_logic.dart @@ -1,6 +1,6 @@ + import 'dart:async'; -import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; @@ -20,7 +20,6 @@ import '../../../tools/dateTool.dart'; import '../../../tools/eventBusEventManage.dart'; import '../../../tools/showTipView.dart'; import '../../../tools/storage.dart'; -import '../../../translations/trans_lib.dart'; import '../entity/lockListInfo_entity.dart'; import 'lockList_state.dart'; @@ -42,7 +41,6 @@ class LockListLogic extends BaseGetXController { !(element.lockAlias?.contains(state.searchStr.value) ?? true)); }); } - // AppLog.log('lockList!.length:${_groupDataList[0].lockList!.length}'); return list; } @@ -53,7 +51,6 @@ class LockListLogic extends BaseGetXController { _groupDataList = []; } _groupDataList.addAll(entity.groupList!); - // AppLog.log('_groupDataList[0].lockList!.length:${_groupDataList[0].lockList!.length}'); update(); } @@ -103,7 +100,7 @@ class LockListLogic extends BaseGetXController { case 0x07: //无权限 dismissEasyLoading(); - showToast('用户无权限'); + showToast('用户无权限'.tr); break; case 0x09: // 权限校验错误 @@ -301,7 +298,7 @@ class LockListLogic extends BaseGetXController { void showDeletAlertTipDialog({String? showContent = ''}) { // bool isContains = BlueManage().connectDeviceName!.contains("T9A"); final String content = showContent!.isEmpty - ? "${"删除设备失败,请确保在设备附近,设备未被连接,设备已打开".tr}${BlueManage().connectDeviceName.contains("T9A") == true ? "。如果是全自动锁,请使屏幕变亮".tr : ""}" + ? "${"删除设备失败,请确保在设备附近,设备未被连接,设备已打开".tr}。${BlueManage().connectDeviceName.contains("T9A") == true ? "如果是全自动锁,请使屏幕变亮".tr : ""}" : showContent; showCupertinoDialog( context: Get.context!, diff --git a/lib/main/lockMian/lockList/lockList_page.dart b/lib/main/lockMian/lockList/lockList_page.dart index 6871b95e..793790d8 100755 --- a/lib/main/lockMian/lockList/lockList_page.dart +++ b/lib/main/lockMian/lockList/lockList_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -273,7 +274,6 @@ class _LockListPageState extends State with RouteAware { @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -282,7 +282,6 @@ class _LockListPageState extends State with RouteAware { @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); diff --git a/lib/main/lockMian/lockList/lockList_xhj_page.dart b/lib/main/lockMian/lockList/lockList_xhj_page.dart index 8937b161..790e985e 100755 --- a/lib/main/lockMian/lockList/lockList_xhj_page.dart +++ b/lib/main/lockMian/lockList/lockList_xhj_page.dart @@ -1,8 +1,8 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; -import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockMian/lockList/lockList_state.dart'; import '../../../appRouters.dart'; @@ -145,8 +145,10 @@ class _LockListXHJPageState extends State with RouteAware { } //设备多层级列表 - Widget _buildLockExpandedList(BuildContext context, int index, GroupList itemData) { - final List lockItemList = itemData.lockList ?? []; + Widget _buildLockExpandedList( + BuildContext context, int index, GroupList itemData) { + final List lockItemList = + itemData.lockList ?? []; // AppLog.log('lockItemList[0].lockAlias:${lockItemList[0].lockAlias}'); final List list = forItems(lockItemList); return LockListGroupView( @@ -162,7 +164,7 @@ class _LockListXHJPageState extends State with RouteAware { crossAxisCount: 2, crossAxisSpacing: 15.w, mainAxisSpacing: 15.h, - childAspectRatio: 1.1, + childAspectRatio: 0.95, ), padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.w), shrinkWrap: true, @@ -288,29 +290,41 @@ class _LockListXHJPageState extends State with RouteAware { const Spacer(), Column( children: [ - Row( - children: [ - Image.asset( - logic.showElectricIcon(keyInfo.electricQuantity!), - width: 30.w, - height: 24.w, - ), - SizedBox(width: 2.w), - Text( - '${keyInfo.electricQuantity!}%', - style: TextStyle( - fontSize: 16.sp, - color: AppColors.darkGrayTextColor), - ), - ], + SizedBox( + width: (1.sw - 10.w * 3) / 2 - 48.w - 50.w, + child: Row( + children: [ + Spacer(), + Image.asset( + logic.showElectricIcon(keyInfo.electricQuantity!), + width: 30.w, + height: 24.w, + ), + SizedBox(width: 2.w), + Text( + '${keyInfo.electricQuantity!}%', + style: TextStyle( + fontSize: 16.sp, + color: AppColors.darkGrayTextColor), + ), + ], + ), ), - Text( - keyInfo.isLockOwner == 1 - ? '超级管理员'.tr - : (keyInfo.keyRight == 1 ? '授权管理员'.tr : '普通用户'.tr), - style: TextStyle( - fontSize: 16.sp, - color: AppColors.darkGrayTextColor), + SizedBox( + width: (1.sw - 10.w * 3) / 2 - 48.w - 50.w, + child: Text( + keyInfo.isLockOwner == 1 + ? '超级管理员'.tr + : (keyInfo.keyRight == 1 + ? '授权管理员'.tr + : '普通用户'.tr), + maxLines: 1, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.right, + style: TextStyle( + fontSize: 16.sp, + color: AppColors.darkGrayTextColor), + ), ) ], ), @@ -324,69 +338,70 @@ class _LockListXHJPageState extends State with RouteAware { style: lockAliasTextStyle, maxLines: 2, ), - Row( - children: [ - Visibility( - visible: keyInfo.passageMode == 1, - child: Container( - padding: EdgeInsets.only( - top: 2.h, right: 3.w, left: 3.w, bottom: 1.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.w), - color: AppColors.openPassageModeColor, - ), - child: Text('常开模式开启'.tr, - style: TextStyle( - fontSize: 18.sp, - color: AppColors.appBarIconColor)), - )), - if (keyInfo.passageMode == 1) - SizedBox( - width: 5.w, - ), - Visibility( - visible: keyInfo.lockSetting!.remoteUnlock == 1, - child: Row( - children: [ - Container( - padding: EdgeInsets.only( - top: 2.h, right: 3.w, left: 3.w, bottom: 1.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.w), - color: AppColors.mainColor, - ), - child: Text( - '远程开锁'.tr, - style: TextStyle( - fontSize: 18.sp, color: Colors.white), - ), - ), - ], - )), - ], - ), Visibility( - visible: logic.getShowType(keyInfo), - child: Padding( - padding: EdgeInsets.only(top: 5.h), - child: Row( - children: [ - Container( - padding: EdgeInsets.only(right: 5.w, left: 5.w), + visible: keyInfo.passageMode == 1, + child: Container( + padding: EdgeInsets.only( + top: 2.h, right: 3.w, left: 3.w, bottom: 1.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.w), + color: AppColors.openPassageModeColor, + ), + child: Text('常开模式开启'.tr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 18.sp, color: AppColors.appBarIconColor)), + )), + if (keyInfo.passageMode == 1) + SizedBox( + height: 5.h, + ), + Visibility( + visible: keyInfo.lockSetting!.remoteUnlock == 1, + child: Row( + children: [ + Flexible( + child: Container( + padding: EdgeInsets.only( + top: 2.h, right: 3.w, left: 3.w, bottom: 1.h), decoration: BoxDecoration( borderRadius: BorderRadius.circular(5.w), - color: DateTool() - .compareTimeIsOvertime(keyInfo.endDate!) - ? AppColors.listTimeYellowColor - : AppColors.mainColor, + color: AppColors.mainColor, + ), + child: Text( + '远程开锁'.tr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: + TextStyle(fontSize: 18.sp, color: Colors.white), ), - child: Text(logic.getKeyEffective(keyInfo), - style: TextStyle( - fontSize: 18.sp, color: Colors.white) - // child: Text(logic.compareTimeIsOvertime(keyInfo.endDate!) ? "已过期" : "余${logic.compareTimeGetDaysFromNow(keyInfo.endDate!)}天", style: TextStyle(fontSize: 18.sp, color: Colors.white) - ), ), - ], + ), + ], + )), + Visibility( + visible: logic.getShowType(keyInfo), + child: Flexible( + child: Padding( + padding: EdgeInsets.only(top: 5.h), + child: Container( + padding: EdgeInsets.only(right: 5.w, left: 5.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.w), + color: + DateTool().compareTimeIsOvertime(keyInfo.endDate!) + ? AppColors.listTimeYellowColor + : AppColors.mainColor, + ), + child: Text(logic.getKeyEffective(keyInfo), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: + TextStyle(fontSize: 18.sp, color: Colors.white) + // child: Text(logic.compareTimeIsOvertime(keyInfo.endDate!) ? "已过期" : "余${logic.compareTimeGetDaysFromNow(keyInfo.endDate!)}天", style: TextStyle(fontSize: 18.sp, color: Colors.white) + ), + ), ), )), SizedBox(height: 5.h), @@ -408,11 +423,15 @@ class _LockListXHJPageState extends State with RouteAware { color: AppColors.darkGrayTextColor), ), SizedBox(width: 5.w), - Text( - useKeyTypeListStr[2], - style: TextStyle( - fontSize: 16.sp, - color: AppColors.darkGrayTextColor), + Expanded( + child: Text( + useKeyTypeListStr[2], + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.sp, + color: AppColors.darkGrayTextColor), + ), ), ], ), diff --git a/lib/main/lockMian/lockMain/lockMain_logic.dart b/lib/main/lockMian/lockMain/lockMain_logic.dart index f21acef9..d2b3c08c 100755 --- a/lib/main/lockMian/lockMain/lockMain_logic.dart +++ b/lib/main/lockMian/lockMain/lockMain_logic.dart @@ -187,7 +187,7 @@ class LockMainLogic extends BaseGetXController { if (!notificationEnabled) { //推送未开启 ShowTipView().showIosTipWithContentDialog( - '为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。'.tr, () async { + '为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。', () async { openAppSettings(); }); } @@ -309,6 +309,7 @@ class LockMainLogic extends BaseGetXController { await jpushProvider.initLocalNotification(isCancelLocalPush: false); // 开启UDP + // AppLog.log('onReady() LockMainLogic'); UdpHelp().openUDP(); BlueManage(); } diff --git a/lib/main/lockMian/lockMain/lockMain_page.dart b/lib/main/lockMian/lockMain/lockMain_page.dart index 8117adf5..24aef551 100755 --- a/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/lib/main/lockMian/lockMain/lockMain_page.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -18,7 +19,6 @@ import '../../../tools/EasyRefreshTool.dart'; import '../../../tools/eventBusEventManage.dart'; import '../../../tools/storage.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import '../../lockDetail/lockDetail/lockDetail_page.dart'; import '../entity/lockListInfo_entity.dart'; import '../lockList/lockList_page.dart'; @@ -203,10 +203,10 @@ class _StarLockMainPageState extends State with BaseWidget, Au ], ), Container( - // padding: EdgeInsets.all(30.w), + padding: EdgeInsets.only(left:30.w, right: 30.w), child: Text( - TranslationLoader - .lanKeys!.whenAddingLockThePhoneMustBeNextToTheLock!.tr, + '添加锁时,手机必须在锁旁边'.tr, + textAlign: TextAlign.center, style: TextStyle( fontSize: 26.sp, // fontWeight: FontWeight.w800, @@ -219,7 +219,7 @@ class _StarLockMainPageState extends State with BaseWidget, Au Container() else SubmitBtn( - btnName: '演示模式', + btnName: '演示模式'.tr, onClick: () { Get.toNamed(Routers.demoModeLockDetailPage); }, diff --git a/lib/main/lockMian/lockMain/lockMain_state.dart b/lib/main/lockMian/lockMain/lockMain_state.dart index f7cf04c4..cb50a8e2 100755 --- a/lib/main/lockMian/lockMain/lockMain_state.dart +++ b/lib/main/lockMian/lockMain/lockMain_state.dart @@ -7,11 +7,11 @@ import '../entity/lockListInfo_entity.dart'; class LockMainState { // 0是无数据 1是有一条数据 2是有很多条数据 - var dataLength = 100.obs; - var lockListInfoGroupEntity = LockListInfoGroupEntity().obs; + RxInt dataLength = 100.obs; + Rx lockListInfoGroupEntity = LockListInfoGroupEntity().obs; // 网络连接状态 0没有网络 1有网络 - var networkConnectionStatus = 0.obs; + RxInt networkConnectionStatus = 0.obs; // late Timer timer; } \ No newline at end of file diff --git a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart index 77c18a63..71b0f5db 100755 --- a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart +++ b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart @@ -3,6 +3,7 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_page.dart'; import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_state.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; @@ -11,6 +12,8 @@ import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; +import '../../../../tools/store_service.dart'; + class LockMainXHJLogic extends BaseGetXController { final LockMainXHJState state = LockMainXHJState(); @@ -25,6 +28,22 @@ class LockMainXHJLogic extends BaseGetXController { Future getUserInfoRequest() async { final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo(); if (entity.errorCode!.codeIsSuccessful) { + final String languageCodeAndCountryCode = entity.data!.lang!; + if (languageCodeAndCountryCode.isEmpty) { + await StoreService.to.saveLanguageCode(''); + } else if (languageCodeAndCountryCode.contains('-')) { + final List parts = languageCodeAndCountryCode.split('-'); + final Locale locale = Locale(parts[0], parts[1]); + await Get.updateLocale(locale); + await StoreService.to.saveLanguageCode(locale.toString()); + } else if (languageCodeAndCountryCode.contains('_')) { + final List parts = languageCodeAndCountryCode.split('_'); + final Locale locale = Locale(parts[0], parts[1]); + await Get.updateLocale(locale); + AppLog.log('用户信息请求成功 更新locale: $locale'); + await StoreService.to.saveLanguageCode(locale.toString()); + } + Storage.setBool(saveIsVip, entity.data!.isVip == 1); if (entity.data!.deviceId != null) { if (entity.data!.deviceId!.isEmpty) { diff --git a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart index 32aa6cf9..b9dd1342 100755 --- a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart +++ b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart @@ -5,7 +5,6 @@ import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/baseWidget.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_page.dart'; import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart'; -import 'package:star_lock/mine/mall/lockMall_page.dart'; import 'package:star_lock/mine/message/messageList/messageList_xhj_page.dart'; import 'package:star_lock/mine/mineSet/mineSet/mineSet_page.dart'; diff --git a/lib/main_dev.dart b/lib/main_dev.dart index 194d5e31..f1af640a 100755 --- a/lib/main_dev.dart +++ b/lib/main_dev.dart @@ -5,6 +5,6 @@ import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.dev; - AppLog.log('dev调用了main函数'); + // AppLog.log('dev调用了main函数'); await runner.main(); } diff --git a/lib/main_local.dart b/lib/main_local.dart index 51b4662a..cacb90f6 100755 --- a/lib/main_local.dart +++ b/lib/main_local.dart @@ -5,6 +5,6 @@ import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.local; - AppLog.log('local调用了main函数'); + // AppLog.log('local调用了main函数'); await runner.main(); } diff --git a/lib/main_pre.dart b/lib/main_pre.dart index 3420ca9c..27329ef8 100755 --- a/lib/main_pre.dart +++ b/lib/main_pre.dart @@ -1,10 +1,9 @@ -import 'app_settings/app_settings.dart'; import 'flavors.dart'; import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.pre; - AppLog.log('pre调用了main函数'); + // AppLog.log('pre调用了main函数'); await runner.main(); } diff --git a/lib/main_sky_full.dart b/lib/main_sky_full.dart index 2a8188d5..6743577f 100755 --- a/lib/main_sky_full.dart +++ b/lib/main_sky_full.dart @@ -5,6 +5,6 @@ import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.sky; - AppLog.log('sky_full调用了main函数'); + // AppLog.log('sky_full调用了main函数'); await runner.main(); } diff --git a/lib/main_sky_lite.dart b/lib/main_sky_lite.dart index 80f60e49..bac7be6b 100755 --- a/lib/main_sky_lite.dart +++ b/lib/main_sky_lite.dart @@ -6,6 +6,6 @@ import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.sky; F.isLite = true; - AppLog.log('sky_lite调用了main函数'); + // AppLog.log('sky_lite调用了main函数'); await runner.main(); } diff --git a/lib/main_xhj_full.dart b/lib/main_xhj_full.dart index 76db6238..3fcdeafa 100755 --- a/lib/main_xhj_full.dart +++ b/lib/main_xhj_full.dart @@ -5,6 +5,6 @@ import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.xhj; - AppLog.log('xhj_full调用了main函数'); + // AppLog.log('xhj_full调用了main函数'); await runner.main(); } diff --git a/lib/main_xhj_lite.dart b/lib/main_xhj_lite.dart index 9b6a97c6..d24e296d 100755 --- a/lib/main_xhj_lite.dart +++ b/lib/main_xhj_lite.dart @@ -6,6 +6,6 @@ import 'main.dart' as runner; Future main() async { F.appFlavor = Flavor.xhj; F.isLite = true; - AppLog.log('xhj_lite调用了main函数'); + // AppLog.log('xhj_lite调用了main函数'); await runner.main(); } diff --git a/lib/mine/about/about_console.dart b/lib/mine/about/about_console.dart index 1673d87c..9796f51f 100755 --- a/lib/mine/about/about_console.dart +++ b/lib/mine/about/about_console.dart @@ -8,21 +8,18 @@ class AboutConsole extends GetxController { int _clickCount = 0; Timer? _timer; - void handleTap() async { + Future handleTap() async { _clickCount++; if (_clickCount == 1) { // 开始一个新的计时器 - _timer = Timer(const Duration(seconds: 3), () { - // 3秒内没有点击到15次,则重置 - _resetCounter(); - }); + _timer = Timer(const Duration(seconds: 3), _resetCounter); } if (_clickCount >= 15) { _timer?.cancel(); _resetCounter(); - bool? openDeBug = await Storage.getBool(isOpenDeBug); + final bool? openDeBug = await Storage.getBool(isOpenDeBug); if (openDeBug == true) { DeBug.closeFloatWidget(); await Storage.setBool(isOpenDeBug, false); diff --git a/lib/mine/about/about_page.dart b/lib/mine/about/about_page.dart index 98d1318c..91c2dd68 100755 --- a/lib/mine/about/about_page.dart +++ b/lib/mine/about/about_page.dart @@ -1,6 +1,4 @@ - import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:package_info_plus/package_info_plus.dart'; @@ -30,6 +28,8 @@ class _AboutPageState extends State { @override void initState() { super.initState(); + // AppLog.log('Get.locale!: ${Get.locale.toString()}'); + initPackageInfo(); } @@ -87,7 +87,8 @@ class _AboutPageState extends State { isHaveDirection: true, action: () { Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.introduceURL, + 'url': XSConstantMacro.introduceURL + + '?lang=${Get.locale!.toString()}', 'title': '介绍'.tr }); }), @@ -104,7 +105,8 @@ class _AboutPageState extends State { isHaveDirection: true, action: () { Get.toNamed(Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.userAgreementURL, + 'url': XSConstantMacro.userAgreementURL + + '?lang=${Get.locale!.toString()}', 'title': '用户协议'.tr }); }), @@ -121,7 +123,8 @@ class _AboutPageState extends State { isHaveDirection: true, action: () { Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.privacyPolicyURL, + 'url': XSConstantMacro.privacyPolicyURL + + '?lang=${Get.locale!.toString()}', 'title': '隐私政策'.tr }); }), @@ -138,7 +141,8 @@ class _AboutPageState extends State { isHaveDirection: true, action: () { Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.collectionListURL, + 'url': XSConstantMacro.collectionListURL + + '?lang=${Get.locale!.toString()}', 'title': '个人信息收集清单'.tr }); }), @@ -149,13 +153,14 @@ class _AboutPageState extends State { endIndent: 20.w, ), CommonItem( - leftTitel:'应用权限说明'.tr, + leftTitel: '应用权限说明'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, action: () { Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.appPermissionDescURL, + 'url': XSConstantMacro.appPermissionDescURL + + '?lang=${Get.locale!.toString()}', 'title': '应用权限说明'.tr }); }), @@ -166,13 +171,14 @@ class _AboutPageState extends State { endIndent: 20.w, ), CommonItem( - leftTitel:'第三方信息共享清单'.tr, + leftTitel: '第三方信息共享清单'.tr, rightTitle: '', isHaveLine: false, isHaveDirection: true, action: () { Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.thirdPartyInfShareListURL, + 'url': XSConstantMacro.thirdPartyInfShareListURL + + '?lang=${Get.locale!.toString()}', 'title': '第三方信息共享清单'.tr }); }), diff --git a/lib/mine/about/debug/controller.dart b/lib/mine/about/debug/controller.dart index b5c67ff1..4a0f282e 100755 --- a/lib/mine/about/debug/controller.dart +++ b/lib/mine/about/debug/controller.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:math'; @@ -19,10 +20,10 @@ import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/storage.dart'; class DebugConsoleController { - final List logs; - final _streamController = BehaviorSubject>(); DebugConsoleController({List? logs}) : logs = logs ?? []; + final List logs; + final BehaviorSubject> _streamController = BehaviorSubject>(); Stream> get stream => _streamController.stream; @@ -54,53 +55,53 @@ class DebugConsoleController { notifyUpdate(); } - void showMore(BuildContext context) { - showBottomSheet( - context: context, - builder: (context) { - return Container( - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(width: 1, color: AppColors.btnDisableColor), - borderRadius: BorderRadius.circular(30.w), - ), - height: Get.height * 0.7, - width: Get.width, - padding: EdgeInsets.all(16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text('辅助测试的按钮'), - SizedBox( - height: 25.h, - ), - Expanded( - child: Wrap( - children: [ - ElevatedButton( - onPressed: () { - EasyLoading.show(); - randomlyCreate32Users(0, 33) - .then((value) => EasyLoading.dismiss()) - .catchError(EasyLoading.dismiss); - }, - child: const Text('给锁设备创建 32个用户')), - ElevatedButton( - onPressed: () { - EasyLoading.show(); - sendCleanUpUsers() - .then((value) => EasyLoading.dismiss()) - .catchError(EasyLoading.dismiss); - }, - child: const Text('清除用户,只保留超级管理员')), - ], - ), - ), - ], - ), - ); - }); - } + // void showMore(BuildContext context) { + // showBottomSheet( + // context: context, + // builder: (context) { + // return Container( + // decoration: BoxDecoration( + // color: Colors.white, + // border: Border.all(width: 1, color: AppColors.btnDisableColor), + // borderRadius: BorderRadius.circular(30.w), + // ), + // height: Get.height * 0.7, + // width: Get.width, + // padding: EdgeInsets.all(16.w), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const Text('辅助测试的按钮'), + // SizedBox( + // height: 25.h, + // ), + // Expanded( + // child: Wrap( + // children: [ + // ElevatedButton( + // onPressed: () { + // EasyLoading.show(); + // randomlyCreate32Users(0, 33) + // .then((value) => EasyLoading.dismiss()) + // .catchError(EasyLoading.dismiss); + // }, + // child: const Text('给锁设备创建 32个用户')), + // ElevatedButton( + // onPressed: () { + // EasyLoading.show(); + // sendCleanUpUsers() + // .then((value) => EasyLoading.dismiss()) + // .catchError(EasyLoading.dismiss); + // }, + // child: const Text('清除用户,只保留超级管理员')), + // ], + // ), + // ), + // ], + // ), + // ); + // }); + // } //随机创建 32个用户 Future randomlyCreate32Users(int count, int max) async { diff --git a/lib/mine/about/debug/debug_console.dart b/lib/mine/about/debug/debug_console.dart index ebb3406a..20ae4137 100755 --- a/lib/mine/about/debug/debug_console.dart +++ b/lib/mine/about/debug/debug_console.dart @@ -317,7 +317,9 @@ class _DebugConsoleState extends State { child: const Text('清除日志'), ), PopupMenuItem( - onTap: () => widget.controller.showMore(context), + onTap: () { + // widget.controller.showMore(context); + }, child: const Text('更多'), ), ], diff --git a/lib/mine/about/debug/debug_tool.dart b/lib/mine/about/debug/debug_tool.dart index 20e1d58e..c6a8ffcd 100755 --- a/lib/mine/about/debug/debug_tool.dart +++ b/lib/mine/about/debug/debug_tool.dart @@ -15,13 +15,13 @@ class DeBug { static late OverlayEntry overlayEntry; static void showFloatWidget() { - Rx offset = Offset(20, 100).obs; // 初始位置 - overlayEntry = OverlayEntry(builder: (context) { + final Rx offset = const Offset(20, 100).obs; // 初始位置 + overlayEntry = OverlayEntry(builder: (BuildContext context) { return Obx(() => Positioned( left: offset.value.dx, top: offset.value.dy, child: GestureDetector( - onPanUpdate: (details) { + onPanUpdate: (DragUpdateDetails details) { offset.value += details.delta; }, child: FloatingActionButton( @@ -51,7 +51,7 @@ class DeBug { }, child: DebugConsole( controller: DebugConsole.instance, - actions: [], + actions: >[], expandStackTrace: false, savePath: null, ), diff --git a/lib/mine/about/debug/tile.dart b/lib/mine/about/debug/tile.dart index 1a1a6b4e..c9648e59 100755 --- a/lib/mine/about/debug/tile.dart +++ b/lib/mine/about/debug/tile.dart @@ -1,3 +1,4 @@ + import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -8,10 +9,10 @@ import 'package:star_lock/mine/about/debug/debug_tool.dart'; import 'package:star_lock/mine/about/debug/log.dart'; class DebugConsoleTile extends StatefulWidget { - final DebugConsoleLog log; - final bool expanded; const DebugConsoleTile(this.log, {key, this.expanded = false}); + final DebugConsoleLog log; + final bool expanded; @override State createState() => _DebugConsoleTileState(); @@ -101,9 +102,9 @@ class _DebugConsoleTileState extends State { } class DeBugText extends StatefulWidget { - final DebugConsoleLog log; DeBugText(this.log, {key}); + final DebugConsoleLog log; @override State createState() => _DeBugTextState(); @@ -114,13 +115,13 @@ class _DeBugTextState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('详细日志'), + title: Text('详细日志'.tr), ), body: SafeArea( child: GestureDetector( onTap: () { Clipboard.setData(ClipboardData(text: widget.log.message)); - EasyLoading.showToast('已复制到剪切板'); + EasyLoading.showToast('已复制到剪切板'.tr); }, child: SingleChildScrollView( child: Padding( diff --git a/lib/mine/about/webviewShow_state.dart b/lib/mine/about/webviewShow_state.dart index fde33736..b619fe79 100755 --- a/lib/mine/about/webviewShow_state.dart +++ b/lib/mine/about/webviewShow_state.dart @@ -1,16 +1,17 @@ import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:webview_flutter/webview_flutter.dart'; class WebviewShowState { - late WebViewController webViewController = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted); - var webURL = ''; - var webTitle = ''; - var webProgress = 0.0.obs; - WebviewShowState() { Map map = Get.arguments; - webURL = map["url"]; + webURL = map['url']; webTitle = map['title']; + AppLog.log('webURL: $webURL'); } + late WebViewController webViewController = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted); + String webURL = ''; + String webTitle = ''; + RxDouble webProgress = 0.0.obs; } diff --git a/lib/mine/addLock/addLock/addLock_page.dart b/lib/mine/addLock/addLock/addLock_page.dart index 94facfc2..d43bdab6 100755 --- a/lib/mine/addLock/addLock/addLock_page.dart +++ b/lib/mine/addLock/addLock/addLock_page.dart @@ -9,7 +9,6 @@ import '../../../app_settings/app_colors.dart'; import '../../../baseWidget.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class AddLockPage extends StatefulWidget { const AddLockPage({Key? key}) : super(key: key); @@ -28,12 +27,12 @@ class _AddLockPageState extends State with BaseWidget { backgroundColor: Colors.white, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.addLock!.tr, + barTitle: '添加锁'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.addLock!.tr, + barTitle: '添加锁'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -51,7 +50,7 @@ class _AddLockPageState extends State with BaseWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - TranslationLoader.lanKeys!.lightTouchScreen!.tr, + '摸亮触摸屏'.tr, style: TextStyle( fontSize: 24.sp, ), @@ -69,15 +68,20 @@ class _AddLockPageState extends State with BaseWidget { SizedBox( height: 120.h, ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - TranslationLoader.lanKeys!.lightTouchScreenTip!.tr, - style: TextStyle( - fontSize: 20.sp, fontWeight: FontWeight.w500), - ), - ], + Container( + width: 1.sw, + padding: EdgeInsets.only(left: 20.w, right: 20.w), + child: Wrap( + alignment: WrapAlignment.center, + children: [ + Text( + '摸亮触摸屏,锁进入可添加状态,点击下一步'.tr, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20.sp,fontWeight: FontWeight.w500), + ), + ], + ), ), SizedBox( height: 120.h, @@ -85,7 +89,7 @@ class _AddLockPageState extends State with BaseWidget { Container( margin: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, borderRadius: 20.w, onClick: () { logic.getNearByLimits(); diff --git a/lib/mine/addLock/addLockSelectCountry/addLockSelectCountry_page.dart b/lib/mine/addLock/addLockSelectCountry/addLockSelectCountry_page.dart index b7112ab4..9ff29fc2 100755 --- a/lib/mine/addLock/addLockSelectCountry/addLockSelectCountry_page.dart +++ b/lib/mine/addLock/addLockSelectCountry/addLockSelectCountry_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/addLock/addLockSelectCountry/addLockSelectCountry_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../appRouters.dart'; @@ -12,7 +13,6 @@ import '../../../login/selectCountryRegion/common/countryRegionEntity.dart'; import '../../../network/api_repository.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'addLockSelectCountry_logic.dart'; class AddLockSelectCountryPage extends StatefulWidget { @@ -23,8 +23,8 @@ class AddLockSelectCountryPage extends StatefulWidget { } class _AddLockSelectCountryPageState extends State { - final logic = Get.put(AddLockSelectCountryLogic()); - final state = Get.find().state; + final AddLockSelectCountryLogic logic = Get.put(AddLockSelectCountryLogic()); + final AddLockSelectCountryState state = Get.find().state; List countriesList = []; int selectindex = 10000; @@ -35,14 +35,12 @@ class _AddLockSelectCountryPageState extends State { SuspensionUtil.setShowSuspensionStatus( countriesList.cast()); - Future.delayed(const Duration(milliseconds: 20), () { - getCountriesListRequest(); - }); + Future.delayed(const Duration(milliseconds: 20), getCountriesListRequest); } //请求国家/地区json文件 Future getCountriesListRequest() async { - CountryRegionEntity entity = await ApiRepository.to.getCountryRegion('1'); + final CountryRegionEntity entity = await ApiRepository.to.getCountryRegion('1'); countriesList.clear(); if (entity.errorCode!.codeIsSuccessful) { countriesList.addAll(entity.dataList!); @@ -57,8 +55,8 @@ class _AddLockSelectCountryPageState extends State { void _handleList(List list) { if (list.isEmpty) return; for (int i = 0, length = list.length; i < length; i++) { - CountryRegionModel countryModel = list[i]; - String tag = countryModel.group!; + final CountryRegionModel countryModel = list[i]; + final String tag = countryModel.group!; if (RegExp('[A-Z]').hasMatch(tag)) { list[i].tagIndex = tag; } else { @@ -79,8 +77,7 @@ class _AddLockSelectCountryPageState extends State { resizeToAvoidBottomInset: false, backgroundColor: const Color(0xFFFFFFFF), appBar: TitleAppBar( - barTitle: - "请选择您的位置", + barTitle: '请选择您的位置'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -89,11 +86,11 @@ class _AddLockSelectCountryPageState extends State { Expanded( child: ListView.builder( itemCount: countriesList.length, - itemBuilder: (c, index) { - CountryRegionModel model = countriesList[index]; + itemBuilder: (BuildContext c, int index) { + final CountryRegionModel model = countriesList[index]; return CommonItem( leftTitel: model.name, - rightTitle: "", + rightTitle: '', allHeight: 60.h, isHaveLine: true, isHaveRightWidget: true, @@ -118,40 +115,40 @@ class _AddLockSelectCountryPageState extends State { children: [ TextButton( child: Text( - "跳过", + '跳过'.tr, style: TextStyle(color: Colors.black, fontSize: 24.sp), ), onPressed: () { Get.toNamed(Routers.saveLockPage, arguments: { - "addressInfo": {}, - "pwdTimestamp": state.pwdTimestamp.value, - "lockInfo": state.lockInfo, - "featureValue": state.featureValue, - "featureSettingValue": state.featureSettingValue, - "featureSettingParams": state.featureSettingParams, - "isFromMap": 0, + 'addressInfo': {}, + 'pwdTimestamp': state.pwdTimestamp.value, + 'lockInfo': state.lockInfo, + 'featureValue': state.featureValue, + 'featureSettingValue': state.featureSettingValue, + 'featureSettingParams': state.featureSettingParams, + 'isFromMap': 0, }); }, ), TextButton( child: Text( - TranslationLoader.lanKeys!.next!.tr, + '下一步'.tr, style: TextStyle(color: Colors.black, fontSize: 24.sp), ), onPressed: () { if(selectindex == 10000){ - logic.showToast("请选择国家"); + logic.showToast('请选择国家'.tr); return; } - CountryRegionModel model = countriesList[selectindex]; + final CountryRegionModel model = countriesList[selectindex]; Get.toNamed(Routers.saveLockPage, arguments: { - "addressInfo": {"country":model.name}, - "pwdTimestamp": state.pwdTimestamp.value, - "lockInfo": state.lockInfo, - "featureValue": state.featureValue, - "featureSettingValue": state.featureSettingValue, - "featureSettingParams": state.featureSettingParams, - "isFromMap": 0, + 'addressInfo': {'country':model.name}, + 'pwdTimestamp': state.pwdTimestamp.value, + 'lockInfo': state.lockInfo, + 'featureValue': state.featureValue, + 'featureSettingValue': state.featureSettingValue, + 'featureSettingParams': state.featureSettingParams, + 'isFromMap': 0, }); // Navigator.pushNamed(context, Routers.saveLockPage); }, diff --git a/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart b/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart index dd6c9add..bc55b983 100755 --- a/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart +++ b/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart @@ -56,14 +56,12 @@ class LockAddressGaoDeLogic extends BaseGetXController{ @override void onReady() { - // TODO: implement onReady super.onReady(); } @override void onInit() { - // TODO: implement onInit super.onInit(); // AMapFlutterLocation.updatePrivacyAgree(true); @@ -75,7 +73,6 @@ class LockAddressGaoDeLogic extends BaseGetXController{ @override void onClose() { - // TODO: implement onClose super.onClose(); } diff --git a/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart b/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart index cd61b9d7..44483d67 100755 --- a/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart +++ b/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart @@ -1,15 +1,16 @@ + import 'dart:async'; import 'dart:io'; -import 'package:flutter/material.dart'; +import 'package:amap_flutter_base/amap_flutter_base.dart'; import 'package:amap_flutter_location/amap_flutter_location.dart'; import 'package:amap_flutter_location/amap_location_option.dart'; - +import 'package:amap_flutter_map/amap_flutter_map.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:amap_flutter_map/amap_flutter_map.dart'; -import 'package:amap_flutter_base/amap_flutter_base.dart'; +import 'package:star_lock/mine/addLock/lockAddress/gaode/lockAddressGaoDe_state.dart'; import 'package:star_lock/widget/permission/permission_dialog.dart'; import '../../../../appRouters.dart'; @@ -18,7 +19,6 @@ import '../../../../blue/blue_manage.dart'; import '../../../../flavors.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import 'lockAddressGaoDe_logic.dart'; class LockAddressGaoDePage extends StatefulWidget { @@ -30,8 +30,8 @@ class LockAddressGaoDePage extends StatefulWidget { class _LockAddressGaoDePageState extends State with RouteAware { - final logic = Get.put(LockAddressGaoDeLogic()); - final state = Get.find().state; + final LockAddressGaoDeLogic logic = Get.put(LockAddressGaoDeLogic()); + final LockAddressGaoDeState state = Get.find().state; // 高德地图 static AMapApiKey amapApiKeys = @@ -90,7 +90,7 @@ class _LockAddressGaoDePageState extends State // } Future requestPermission() async { - final status = await PermissionDialog.request(Permission.location); + final bool status = await PermissionDialog.request(Permission.location); if(Platform.isIOS){ _setLocationOption(); requestIOSLocation(); @@ -103,7 +103,7 @@ class _LockAddressGaoDePageState extends State } Future requestAndroidLocation() async { - location.onLocationChanged().listen((event) { + location.onLocationChanged().listen((Map event) { if (event.isNotEmpty) { setState(() { addressInfo = event; @@ -116,7 +116,7 @@ class _LockAddressGaoDePageState extends State Future requestIOSLocation() async { location = AMapFlutterLocation() ..setLocationOption(AMapLocationOption()) - ..onLocationChanged().listen((event) { + ..onLocationChanged().listen((Map event) { // AppLog.log("listenLocationChanged$event"); // EasyLoading.dismiss(); if (event.isNotEmpty) { @@ -134,39 +134,39 @@ class _LockAddressGaoDePageState extends State return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockAddress!.tr, + barTitle: '锁地址'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: ListView( - children: [ + children: [ Container( margin: EdgeInsets.only(left: 25.w, top: 40.h, bottom: 40.w), child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text("地理位置".tr, style: TextStyle(fontSize: 50.sp)), + children: [ + Text('地理位置'.tr, style: TextStyle(fontSize: 50.sp)), ], ), ), SizedBox( - child: (addressInfo != null && addressInfo!.containsKey("latitude")) + child: (addressInfo != null && addressInfo!.containsKey('latitude')) ? Column( - children: [ + children: [ SizedBox( height: 1.sw / 5 * 4, width: 1.sw, child: AMapWidget( apiKey: amapApiKeys, // 初始化地图中心 - initialCameraPosition: (CameraPosition( + initialCameraPosition: CameraPosition( target: LatLng( double.parse( addressInfo!['latitude'].toString()), double.parse( addressInfo!['longitude'].toString())), zoom: 10.0, - )), + ), //定位小蓝点 myLocationStyleOptions: MyLocationStyleOptions( true, @@ -191,9 +191,9 @@ class _LockAddressGaoDePageState extends State EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w), child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Flexible( - child: Text("检查以确保以下地址是正确的".tr, + child: Text('检查以确保以下地址是正确的'.tr, style: TextStyle(fontSize: 24.sp))), ], ), @@ -205,13 +205,13 @@ class _LockAddressGaoDePageState extends State margin: EdgeInsets.only( left: 25.w, top: 20.h, right: 25.w), child: Column( - children: [ + children: [ Row( - children: [ + children: [ Expanded( child: Text( - addressInfo!["address"].toString() ?? - "", + addressInfo!['address'].toString() ?? + '', style: const TextStyle( color: Colors.grey, fontSize: 16, @@ -235,41 +235,41 @@ class _LockAddressGaoDePageState extends State SizedBox(height: 200.h), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ + children: [ TextButton( child: Text( - "跳过".tr, + '跳过'.tr, style: TextStyle(color: Colors.black, fontSize: 24.sp), ), onPressed: () { - Get.toNamed(Routers.addLockSelectCountryPage, arguments: { - "addressInfo": {}, - "pwdTimestamp": state.pwdTimestamp.value, - "lockInfo": state.lockInfo, - "featureValue": state.featureValue, - "featureSettingValue": state.featureSettingValue, - "featureSettingParams": state.featureSettingParams, + Get.toNamed(Routers.addLockSelectCountryPage, arguments: { + 'addressInfo': {}, + 'pwdTimestamp': state.pwdTimestamp.value, + 'lockInfo': state.lockInfo, + 'featureValue': state.featureValue, + 'featureSettingValue': state.featureSettingValue, + 'featureSettingParams': state.featureSettingParams, }); }, ), TextButton( child: Text( - TranslationLoader.lanKeys!.next!.tr, + '下一步'.tr, style: TextStyle(color: Colors.black, fontSize: 24.sp), ), onPressed: () { if (addressInfo!.isEmpty) { - logic.showToast("还未获取到位置信息哦,请耐心等待一下!".tr); + logic.showToast('还未获取到位置信息哦,请耐心等待一下!'.tr); return; } - Get.toNamed(Routers.saveLockPage, arguments: { - "addressInfo": addressInfo, - "pwdTimestamp": state.pwdTimestamp.value, - "lockInfo": state.lockInfo, - "featureValue": state.featureValue, - "featureSettingValue": state.featureSettingValue, - "featureSettingParams": state.featureSettingParams, - "isFromMap": 1, + Get.toNamed(Routers.saveLockPage, arguments: { + 'addressInfo': addressInfo, + 'pwdTimestamp': state.pwdTimestamp.value, + 'lockInfo': state.lockInfo, + 'featureValue': state.featureValue, + 'featureSettingValue': state.featureSettingValue, + 'featureSettingParams': state.featureSettingParams, + 'isFromMap': 1, }); // Navigator.pushNamed(context, Routers.saveLockPage); }, @@ -297,7 +297,7 @@ class _LockAddressGaoDePageState extends State locationOption.desiredLocationAccuracyAuthorizationMode = AMapLocationAccuracyAuthorizationMode.ReduceAccuracy; - locationOption.fullAccuracyPurposeKey = "AMapLocationScene"; + locationOption.fullAccuracyPurposeKey = 'AMapLocationScene'; ///设置Android端连续定位的定位间隔 locationOption.locationInterval = 2000; @@ -330,7 +330,6 @@ class _LockAddressGaoDePageState extends State @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 diff --git a/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart b/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart index 0d461d86..469b211a 100755 --- a/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart +++ b/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart @@ -3,22 +3,4 @@ import '../../../../tools/baseGetXController.dart'; class LockAddressLogic extends BaseGetXController { - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - } - } \ No newline at end of file diff --git a/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart b/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart index df739b71..b57e744c 100755 --- a/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart +++ b/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart @@ -7,7 +7,6 @@ import 'package:get/get.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class LockAddressPage extends StatefulWidget { const LockAddressPage({Key? key}) : super(key: key); @@ -24,18 +23,18 @@ class _LockAddressPageState extends State with RouteAware{ return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockAddress!.tr, + barTitle: '锁地址'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.next!.tr, + '下一步'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { if(addressInfo!.isEmpty){ - EasyLoading.showToast("请先获取到位置信息哦!", duration: 2000.milliseconds); + EasyLoading.showToast('请先获取到位置信息哦'.tr, duration: 2000.milliseconds); return; } Get.toNamed(Routers.saveLockPage, arguments: addressInfo); diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 61f35c3c..426ddef6 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -13,6 +13,7 @@ import 'package:star_lock/blue/io_protocol/io_getPrivateKey.dart'; import 'package:star_lock/blue/io_protocol/io_getPublicKey.dart'; import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart'; import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart'; +import 'package:star_lock/blue/io_type.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart'; import 'package:star_lock/mine/addLock/nearbyLock/nearbyLock_page.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -44,7 +45,7 @@ class NearbyLockLogic extends BaseGetXController { // 点击连接设备 void connect(String deviceName) { - showTitleEasyLoading('获取锁信息 1/3'); + showTitleEasyLoading('${'获取锁信息'.tr} 1/3'); showBlueConnetctToastTimer(action: () { dismissEasyLoading(); }); @@ -52,7 +53,7 @@ class NearbyLockLogic extends BaseGetXController { (BluetoothConnectionState state) async { // AppLog.log('点击要添加的设备了'); if (state == BluetoothConnectionState.connected) { - AppLog.log('开始获取公钥'); + // AppLog.log('开始获取公钥'); IoSenderManage.getPublicKey(lockId: deviceName); } else if (state == BluetoothConnectionState.disconnected) { dismissEasyLoading(); @@ -100,15 +101,15 @@ class NearbyLockLogic extends BaseGetXController { switch (reply.status) { case 0x00: //成功 - AppLog.log('获取公钥成功'); + // AppLog.log('获取公钥成功'); // 储存公钥 final List publicKey = reply.data.sublist(3); final List saveStrList = changeIntListToStringList(publicKey); Storage.setStringList(saveBluePublicKey, saveStrList); // 获取私钥 - AppLog.log('开始获取私钥'); - showTitleEasyLoading('获取锁信息 2/3'); + // AppLog.log('开始获取私钥'); + showTitleEasyLoading('${'获取锁信息'.tr} 2/3'); IoSenderManage.getPrivateKey( lockId: BlueManage().connectDeviceName, keyID: '1', @@ -126,7 +127,7 @@ class NearbyLockLogic extends BaseGetXController { Future _replyGetPrivateKeyKey(Reply reply) async { switch (reply.status) { case 0x00: - AppLog.log('获取私钥成功'); + // AppLog.log('获取私钥成功'); //成功 reply.data.removeAt(0); @@ -147,7 +148,7 @@ class NearbyLockLogic extends BaseGetXController { (0xff & timestamp[1]) << 16 | (0xff & timestamp[2]) << 8 | (0xFF & timestamp[3]); - showTitleEasyLoading('获取锁信息 3/3'); + showTitleEasyLoading('${'获取锁信息'.tr} 3/3'); _getStarLockStatus(); break; default: @@ -161,7 +162,7 @@ class NearbyLockLogic extends BaseGetXController { switch (status) { case 0x00: //成功 - AppLog.log('获取锁状态成功'); + // AppLog.log('获取锁状态成功'); // 厂商名称 int index = 3; final List vendor = reply.data.sublist(index, index + 20); @@ -169,13 +170,13 @@ class NearbyLockLogic extends BaseGetXController { state.lockInfo['vendor'] = vendorStr; // state.lockInfo["vendor"] = "XL"; index = index + 20; - AppLog.log('厂商名称 vendorStr:$vendorStr'); + // AppLog.log('厂商名称 vendorStr:$vendorStr'); // 锁设备类型 final int product = reply.data[index]; state.lockInfo['product'] = product; index = index + 1; - AppLog.log('锁设备类型 product:$product'); + // AppLog.log('锁设备类型 product:$product'); // 产品名称 final List model = reply.data.sublist(index, index + 20); @@ -183,21 +184,21 @@ class NearbyLockLogic extends BaseGetXController { state.lockInfo['model'] = modelStr; // state.lockInfo["model"] = "JL-BLE-01"; index = index + 20; - AppLog.log('产品名称 mmodelStr:$modelStr'); + // AppLog.log('产品名称 mmodelStr:$modelStr'); // 软件版本 final List fwVersion = reply.data.sublist(index, index + 20); final String fwVersionStr = utf8String(fwVersion); state.lockInfo['fwVersion'] = fwVersionStr; index = index + 20; - AppLog.log('软件版本 fwVersionStr:$fwVersionStr'); + // AppLog.log('软件版本 fwVersionStr:$fwVersionStr'); // 硬件版本 final List hwVersion = reply.data.sublist(index, index + 20); final String hwVersionStr = utf8String(hwVersion); state.lockInfo['hwVersion'] = hwVersionStr; index = index + 20; - AppLog.log('硬件版本 hwVersionStr:$hwVersionStr'); + // AppLog.log('硬件版本 hwVersionStr:$hwVersionStr'); // 厂商序列号 final List serialNum0 = reply.data.sublist(index, index + 16); @@ -205,41 +206,40 @@ class NearbyLockLogic extends BaseGetXController { state.lockInfo['serialNum0'] = serialNum0Str; // state.lockInfo["serialNum0"] = "${DateTime.now().millisecondsSinceEpoch ~/ 10}"; index = index + 16; - AppLog.log('厂商序列号 serialNum0Str:${serialNum0Str.length}'); + AppLog.log('厂商序列号 serialNum0Str:$serialNum0Str'); // 成品商序列号 final List serialNum1 = reply.data.sublist(index, index + 16); final String serialNum1Str = utf8String(serialNum1); state.lockInfo['serialNum1'] = serialNum1Str; index = index + 16; - AppLog.log('成品商序列号 serialNum1Str:$serialNum1Str'); + // AppLog.log('成品商序列号 serialNum1Str:$serialNum1Str'); // 蓝牙名称 final List btDeviceName = reply.data.sublist(index, index + 16); final String btDeviceNameStr = utf8String(btDeviceName); state.lockInfo['btDeviceName'] = btDeviceNameStr; index = index + 16; - AppLog.log('蓝牙名称 btDeviceNameStr:$btDeviceNameStr'); + // AppLog.log('蓝牙名称 btDeviceNameStr:$btDeviceNameStr'); // 电池剩余电量 final int battRemCap = reply.data[index]; state.lockInfo['electricQuantity'] = battRemCap; index = index + 1; - AppLog.log('电池剩余电量 battRemCap:$battRemCap'); + // AppLog.log('电池剩余电量 battRemCap:$battRemCap'); // 备用电池剩余电量 final int battRemCapStandby = reply.data[index]; state.lockInfo['electricQuantityStandby'] = battRemCapStandby; index = index + 1; - AppLog.log('电池剩余电量 battRemCap:$battRemCap'); + // AppLog.log('电池剩余电量 battRemCap:$battRemCap'); // 重置次数 final List restoreCounter = reply.data.sublist(index, index + 2); state.lockInfo['restoreCount'] = restoreCounter[0] * 256 + restoreCounter[1]; index = index + 2; - AppLog.log( - '重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}'); + // AppLog.log('重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}'); // 重置时间 final List restoreDate = reply.data.sublist(index, index + 4); @@ -250,14 +250,14 @@ class NearbyLockLogic extends BaseGetXController { // String restoreDateStr = DateTool().dateToYMDHNSString(restoreDateValue.toString()); state.lockInfo['restoreDate'] = restoreDateValue * 1000; index = index + 4; - AppLog.log('重置时间 restoreDateValue:$restoreDateValue'); + // AppLog.log('重置时间 restoreDateValue:$restoreDateValue'); // 主控芯片型号 final List icPartNo = reply.data.sublist(index, index + 10); final String icPartNoStr = utf8String(icPartNo); state.lockInfo['icPartNo'] = icPartNoStr; index = index + 10; - AppLog.log('主控芯片型号 icPartNoStr:$icPartNoStr'); + // AppLog.log('主控芯片型号 icPartNoStr:$icPartNoStr'); // 有效时间 final List indate = reply.data.sublist(index, index + 4); @@ -268,14 +268,14 @@ class NearbyLockLogic extends BaseGetXController { // String indateStr = DateTool().dateToYMDHNSString("$indateValue"); state.lockInfo['indate'] = indateValue * 1000; index = index + 4; - AppLog.log('有效时间 indateValue:$indateValue'); + // AppLog.log('有效时间 indateValue:$indateValue'); // mac地址 final List macAddress = reply.data.sublist(index, index + 20); final String macAddressStr = utf8String(macAddress); state.lockInfo['mac'] = macAddressStr; index = index + 20; - AppLog.log('mac地址 macAddressStr:$macAddressStr'); + // AppLog.log('mac地址 macAddressStr:$macAddressStr'); //时区偏移 state.lockInfo['timezoneOffset'] = @@ -290,7 +290,7 @@ class NearbyLockLogic extends BaseGetXController { // 获取到锁给的字符数组 final int featureNetxLength = index + featureValueLength; if (reply.data.length < featureNetxLength) { - showToast('锁数据异常,请重试'); + showToast('锁数据异常,请重试'.tr); return; } final List featureValue = @@ -310,7 +310,7 @@ class NearbyLockLogic extends BaseGetXController { // 使能锁特征值说明(本机启用的功能) final int featureEnNextLength = index + featureEnValLength; if (reply.data.length < featureEnNextLength) { - showToast('锁数据异常,请重试'); + showToast('锁数据异常,请重试'.tr); return; } final List featureEnVal = @@ -366,7 +366,7 @@ class NearbyLockLogic extends BaseGetXController { // if (state == BluetoothConnectionState.connected) { // dismissEasyLoading(); - AppLog.log('开始获取锁状态'); + // AppLog.log('开始获取锁状态'); final List? privateKey = await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -378,9 +378,9 @@ class NearbyLockLogic extends BaseGetXController { DateTime.fromMillisecondsSinceEpoch(getLocalTime() * 1000), [yyyy, '-', mm, '-', dd, ' ', HH, ':', nn, ':', ss]); - AppLog.log('state.serverTime:${state.serverTime} getUTCDate:$getUTCDate ' - 'getLocalTime:${getLocalTime()} getLocalDate:$getLocalDate ' - '差值:${getLocalTime() - state.serverTime}'); + // AppLog.log('state.serverTime:${state.serverTime} getUTCDate:$getUTCDate ' + // 'getLocalTime:${getLocalTime()} getLocalDate:$getLocalDate ' + // '差值:${getLocalTime() - state.serverTime}'); IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), @@ -392,7 +392,7 @@ class NearbyLockLogic extends BaseGetXController { } void startScanBlueList() { - BlueManage().startScan(2000, (List list) { + BlueManage().startScan(2000, DeviceType.blue, (List list) { state.devices.clear(); for (int i = 0; i < list.length; i++) { final ScanResult device = list[i]; @@ -414,17 +414,17 @@ class NearbyLockLogic extends BaseGetXController { // 点击连接设备,升级 ota 固件 void oTAUpgrade(String deviceName) { - showTitleEasyLoading('连接设备中...'); + showTitleEasyLoading('连接设备中...'.tr); this.deviceName = deviceName; BlueManage().blueSendData(deviceName, (BluetoothConnectionState state) async { - AppLog.log('连接设备'); + // AppLog.log('连接设备'); if (state == BluetoothConnectionState.connected) { - AppLog.log('连接成功'); + // AppLog.log('连接成功'); dismissEasyLoading(); otaUpdate(); } else if (state == BluetoothConnectionState.disconnected) { - AppLog.log('连接失败'); + // AppLog.log('连接失败'); dismissEasyLoading(); } }, isAddEquipment: true); @@ -498,10 +498,10 @@ class NearbyLockLogic extends BaseGetXController { } if (otaCount <= otaIndex) { final int now = DateTime.now().millisecondsSinceEpoch; - final String msg = - '传输完成 时间:${now - startSecond}秒 otaCount:$otaCount otaIndex:$otaIndex '; + // final String msg = '传输完成 时间:${now - startSecond}秒 otaCount:$otaCount otaIndex:$otaIndex '; closeOTADAta(); - AppLog.log(msg); + AppLog.log( + '传输完成 时间:${now - startSecond}秒 otaCount:$otaCount otaIndex:$otaIndex '); // showToast(msg); return; } @@ -674,7 +674,8 @@ class NearbyLockLogic extends BaseGetXController { // AppLog.log('bluetoothRequest:$e'); // } final bool bluetoothRequest = await PermissionDialog.requestBluetooth(); - final bool locationRequest = await PermissionDialog.request(Permission.location); + final bool locationRequest = + await PermissionDialog.request(Permission.location); AppLog.log('locationRequest:$locationRequest'); if (!bluetoothRequest || !locationRequest) { return; @@ -684,5 +685,4 @@ class NearbyLockLogic extends BaseGetXController { state.ifCurrentScreen.value = true; startScanBlueList(); } - } diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_page.dart b/lib/mine/addLock/nearbyLock/nearbyLock_page.dart index 37274cf2..97275540 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_page.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_page.dart @@ -9,7 +9,6 @@ import 'package:star_lock/mine/addLock/nearbyLock/nearbyLock_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/appRouteObserver.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'nearbyLock_logic.dart'; class NearbyLockPage extends StatefulWidget { @@ -29,7 +28,7 @@ class _NearbyLockPageState extends State with RouteAware { backgroundColor: AppColors.mainBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.nearbyLock!.tr, + barTitle: '附近的锁'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -40,7 +39,7 @@ class _NearbyLockPageState extends State with RouteAware { SizedBox(width: 30.w) ]), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.nearbyLock!.tr, + barTitle: '附近的锁'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -65,7 +64,8 @@ class _NearbyLockPageState extends State with RouteAware { child: ListView.separated( itemCount: state.devices.length, itemBuilder: (BuildContext c, int index) { - return nearbyLockItem('images/icon_lockGroup_item.png', state.devices[index], () { + return nearbyLockItem( + 'images/icon_lockGroup_item.png', state.devices[index], () { String advName = state.devices[index].advertisementData.advName; state.selectLockName.value = advName; logic.getServerDatetime(); diff --git a/lib/mine/addLock/saveLock/saveLock_logic.dart b/lib/mine/addLock/saveLock/saveLock_logic.dart index 68232ed1..2074d793 100755 --- a/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -6,6 +6,7 @@ import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart'; import 'package:star_lock/mine/addLock/saveLock/entity/SaveLockEntity.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../app_settings/app_settings.dart'; import '../../../blue/blue_manage.dart'; @@ -17,6 +18,7 @@ import '../../../blue/sender_manage.dart'; import '../../../network/api_repository.dart'; import '../../../tools/baseGetXController.dart'; import '../../../tools/commonDataManage.dart'; +import '../../../tools/dateTool.dart'; import '../../../tools/eventBusEventManage.dart'; import '../../../tools/storage.dart'; import 'saveLock_state.dart'; @@ -404,8 +406,14 @@ class SaveLockLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) { state.lockId = entity.data!.lockId!; + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('save_lock_result', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'save_lock_result':'成功', + }); backAction(); - // await senderCustomPasswords(); // BlueManage().disconnect(BlueManage().connectDeviceMacAddress); @@ -413,6 +421,14 @@ class SaveLockLogic extends BaseGetXController { // Get.close(state.isFromMap == 1 ? 5 : 6); } else { state.sureBtnState.value = 0; + + final String getMobile = (await Storage.getMobile())!; + UmengCommonSdk.onEvent('save_lock_result', { + 'lock_name':BlueManage().connectDeviceName, + 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date':DateTool().getNowDateWithType(1), + 'save_lock_result':'${entity.errorCode}--${entity.errorMsg}', + }); } } diff --git a/lib/mine/addLock/saveLock/saveLock_page.dart b/lib/mine/addLock/saveLock/saveLock_page.dart index b8cc25cf..1b5c15fb 100755 --- a/lib/mine/addLock/saveLock/saveLock_page.dart +++ b/lib/mine/addLock/saveLock/saveLock_page.dart @@ -10,7 +10,6 @@ import '../../../app_settings/app_colors.dart'; import '../../../tools/appRouteObserver.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'saveLock_logic.dart'; class SaveLockPage extends StatefulWidget { @@ -29,7 +28,7 @@ class _SaveLockPageState extends State with RouteAware { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.addLock!.tr, + barTitle: '添加锁'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -45,10 +44,8 @@ class _SaveLockPageState extends State with RouteAware { children: [ Flexible( child: Text( - TranslationLoader - .lanKeys!.addSuccessfullyPleaseRename!.tr, - style: TextStyle( - fontSize: 24.sp, fontWeight: FontWeight.w500))), + '如需修改名字请重新命名,点击确定添加锁'.tr, + style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w500))), ], ), ), diff --git a/lib/mine/addLock/selectLockType/selectLockType_page.dart b/lib/mine/addLock/selectLockType/selectLockType_page.dart index bbd8fff8..bb8dfa20 100755 --- a/lib/mine/addLock/selectLockType/selectLockType_page.dart +++ b/lib/mine/addLock/selectLockType/selectLockType_page.dart @@ -9,7 +9,6 @@ import '../../../app_settings/app_colors.dart'; import '../../../baseWidget.dart'; import '../../../tools/commonDataManage.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'selectLockType_logic.dart'; class SelectLockTypePage extends StatefulWidget { @@ -29,12 +28,12 @@ class _SelectLockTypePageState extends State with BaseWidget backgroundColor: AppColors.mainBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectLockType!.tr, + barTitle: '选择锁类型'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectLockType!.tr, + barTitle: '选择锁类型'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -78,37 +77,37 @@ class _SelectLockTypePageState extends State with BaseWidget //所有的锁类型匹配 List getLockTypeList() { return [ - lockTypeItem('images/lockType/lockType_doorLock.png', TranslationLoader.lanKeys!.doorLock!.tr, () { + lockTypeItem('images/lockType/lockType_doorLock.png', '门锁'.tr, () { CommonDataManage().seletLockType = 1; Navigator.pushNamed(context, Routers.addLockPage, arguments: {'getLockType': 1}); }), if (!F.isLite) lockTypeItem('images/lockType/lockType_NFCLock.png', - TranslationLoader.lanKeys!.NFCPassiveLock!.tr, () { + 'NFC无源锁'.tr, () { CommonDataManage().seletLockType = 2; // Navigator.pushNamed(context, Routers.addLockPage); }), if (!F.isLite) lockTypeItem('images/lockType/lockType_padlock.png', - TranslationLoader.lanKeys!.padlock!.tr, () { + '挂锁'.tr, () { CommonDataManage().seletLockType = 3; // Navigator.pushNamed(context, Routers.addLockPage); }), lockTypeItem('images/lockType/lockType_safeLock.png', - TranslationLoader.lanKeys!.safeLock!.tr, () { + '保险箱锁'.tr, () { CommonDataManage().seletLockType = 4; Navigator.pushNamed(context, Routers.addLockPage, arguments: {'getLockType': 4}); }), lockTypeItem('images/lockType/lockType_parkingLock.png', - TranslationLoader.lanKeys!.parkingLock!.tr, () { + '车位锁'.tr, () { CommonDataManage().seletLockType = 5; Navigator.pushNamed(context, Routers.addLockPage, arguments: {'getLockType': 5}); }), lockTypeItem('images/lockType/lockType_entranceGuardLock.png', - TranslationLoader.lanKeys!.itelligentAccessControl!.tr, () { + '智能门禁'.tr, () { CommonDataManage().seletLockType = 6; Navigator.pushNamed(context, Routers.addLockPage, arguments: {'getLockType': 6}); @@ -120,9 +119,9 @@ class _SelectLockTypePageState extends State with BaseWidget // }), if (!F.isLite) lockTypeItem('images/lockType/lockType_gatewayLock.png', - TranslationLoader.lanKeys!.gateway!.tr, () { + '网关'.tr, () { CommonDataManage().seletLockType = 7; - // Navigator.pushNamed(context, Routers.gatewayListPage); + Get.toNamed(Routers.selectGatewayTypeNextTipPage); }), if (!F.isLite) lockTypeItem('images/lockType/lockType_camera.png', '网络摄像头'.tr, () { @@ -148,11 +147,11 @@ class _SelectLockTypePageState extends State with BaseWidget mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(TranslationLoader.lanKeys!.allLock!.tr, + Text('所有锁'.tr, style: TextStyle( fontSize: 24.sp, )), - Text(TranslationLoader.lanKeys!.searchAllLockType!.tr, + Text('搜索所有锁类型'.tr, style: TextStyle( fontSize: 20.sp, color: AppColors.darkGrayTextColor)), ], diff --git a/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_logic.dart b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_logic.dart new file mode 100644 index 00000000..1cf70a9e --- /dev/null +++ b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_logic.dart @@ -0,0 +1,197 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; +import 'package:network_info_plus/network_info_plus.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../../blue/blue_manage.dart'; +import '../../../../blue/io_gateway/io_gateway_configuringWifi.dart'; +import '../../../../blue/io_reply.dart'; +import '../../../../blue/io_tool/io_tool.dart'; +import '../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../blue/sender_manage.dart'; +import '../../../../login/login/entity/LoginEntity.dart'; +import '../../../../network/api_repository.dart'; +import 'gatewayConfigurationWifi_state.dart'; +import 'getGatewayConfiguration_entity.dart'; + +class GatewayConfigurationWifiLogic extends BaseGetXController { + final GatewayConfigurationWifiState state = GatewayConfigurationWifiState(); + + Future gatewayDistributionNetwork() async { + final LoginEntity entity = await ApiRepository.to + .gatewayDistributionNetwork( + gatewayName: state.gatewayNameTF.text, + gatewayMac: state.gatewayModel.mac, + serialNumber: state.gatewayModel.serialNum, + gatewayType: 2, + networkName: state.wifiNameTF.text, + networkMac: state.gatewayModel.wifiMac, + version: state.gatewayModel.gatewayVersion, + gatewayJson: jsonDecode(state.gatewayJson)); + if (entity.errorCode!.codeIsSuccessful) { + showToast('配网成功'.tr, something: () { + // eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.close(4); + }); + } + } + + Future getGatewayConfiguration() async { + final GetGatewayConfigurationEntity entity = + await ApiRepository.to.getGatewayConfiguration(); + if (entity.errorCode!.codeIsSuccessful) { + state.getGatewayConfigurationStr = entity.data ?? ''; + // AppLog.log('state.getGatewayConfigurationStr:${state.getGatewayConfigurationStr}'); + } + } + + // 监听设备返回的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) async { + // WIFI配网 + // if(reply is GatewayConfiguringWifiReply) { + // _replySenderConfiguringWifi(reply); + // } + + // WIFI配网结果 + if (reply is GatewayConfiguringWifiResultReply) { + _replySenderConfiguringWifiResult(reply); + } + }); + } + + // WIFI配网 + // Future _replySenderConfiguringWifi(Reply reply) async { + // final int status = reply.data[2]; + // + // switch(status){ + // case 0x00: + // //成功 + // state.sureBtnState.value = 0; + // cancelBlueConnetctToastTimer(); + // dismissEasyLoading(); + // gatewayDistributionNetwork(); + // break; + // default: + // //失败 + // dismissEasyLoading(); + // break; + // } + // } + + // WIFI配网结果 + Future _replySenderConfiguringWifiResult(Reply reply) async { + final int status = reply.data[2]; + state.sureBtnState.value = 0; + switch (status) { + case 0x00: + //成功 + cancelBlueConnetctToastTimer(); + dismissEasyLoading(); + final int secretKeyJsonLength = (reply.data[3] << 8) + reply.data[4]; + final List secretKeyList = + reply.data.sublist(5, 5 + secretKeyJsonLength); + state.gatewayJson = utf8String(secretKeyList); + + gatewayDistributionNetwork(); + break; + default: + //失败 + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + showToast('配网失败'.tr); + break; + } + } + + // 点击配置wifi + Future senderConfiguringWifiAction() async { + AppLog.log( + 'state.getGatewayConfigurationStr:${state.getGatewayConfigurationStr}'); + if (state.wifiNameTF.text.isEmpty) { + showToast('请输入wifi名称'.tr); + return; + } + + if (state.wifiPasswardTF.text.isEmpty) { + showToast('请输入WiFi密码'.tr); + return; + } + + if (state.gatewayNameTF.text.isEmpty) { + showToast('请输入网关名称'.tr); + return; + } + + if (state.sureBtnState.value == 1) { + return; + } + state.sureBtnState.value = 1; + + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + state.sureBtnState.value = 0; + }); + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { + if (connectionState == BluetoothConnectionState.connected) { + IoSenderManage.gatewayConfiguringWifiCommand( + ssid: state.wifiNameTF.text, + password: state.wifiPasswardTF.text, + gatewayConfigurationStr: state.getGatewayConfigurationStr, + ); + } else if (connectionState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.sureBtnState.value = 0; + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + } + }, isAddEquipment: true); + } + + final NetworkInfo _networkInfo = NetworkInfo(); + Future getWifiName() async { + String ssid = ''; + ssid = (await _networkInfo.getWifiName())!; + ssid = ssid ?? ''; + ssid = ssid.replaceAll(r'"', ''); + return ssid ?? ''; + } + + @override + void onReady() { + super.onReady(); + + if (state.wifiNameTF.text.isEmpty) { + getWifiName().then((String value) { + state.wifiNameTF.text = value; + // update(); + // AppLog.log('wifiNameTF:${state.wifiNameTF.text} value:$value'); + }); + } + + getGatewayConfiguration(); + + _initReplySubscription(); + } + + @override + void onInit() { + super.onInit(); + } + + @override + void onClose() { + _replySubscription.cancel(); + super.onClose(); + } +} diff --git a/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart index 660ed8b4..02433378 100755 --- a/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart +++ b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart @@ -1,13 +1,16 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; +import 'gatewayConfigurationWifi_logic.dart'; +import 'gatewayConfigurationWifi_state.dart'; class GatewayConfigurationWifiPage extends StatefulWidget { const GatewayConfigurationWifiPage({Key? key}) : super(key: key); @@ -18,130 +21,124 @@ class GatewayConfigurationWifiPage extends StatefulWidget { } class _GatewayConfigurationWifiPageState - extends State { - final _wifiPassward = TextEditingController(); - final _gatewayNamePassward = TextEditingController(); + extends State with RouteAware { + final GatewayConfigurationWifiLogic logic = + Get.put(GatewayConfigurationWifiLogic()); + final GatewayConfigurationWifiState state = + Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.gateway!.tr, + barTitle: '配置网络'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ - Container( - width: 1.sw, - color: const Color(0xFFF2F6F9), - padding: EdgeInsets.all(15.h), - child: Text( - TranslationLoader.lanKeys!.gatewayConfigurationWifiTip!.tr, - style: TextStyle( - color: AppColors.darkGrayTextColor, fontSize: 20.sp), - )), + children: [ + // Container( + // width: 1.sw, + // color: const Color(0xFFF2F6F9), + // padding: EdgeInsets.all(15.h), + // child: Text( + // '不支持5G WiFi网络,请选择2.4G WiFi网络进行配置'.tr, + // style: TextStyle( + // color: AppColors.darkGrayTextColor, fontSize: 20.sp), + // )), Expanded( child: ListView( - children: [ + children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.wifiName!.tr, - rightTitle: "XinHongJia", - allHeight: 100.h, + leftTitel: 'WiFi名称'.tr, + rightTitle: '', + isHaveRightWidget: true, + allHeight: 80.h, isHaveLine: true, - isHaveDirection: true, - action: () { - // Navigator.pushNamed(context, Routers.minePersonInfoSetSafetyProblemPage); - }), + rightWidget: getTFWidget(state.wifiNameTF, '请输入wifi名称'.tr)), CommonItem( - leftTitel: TranslationLoader.lanKeys!.wifiPassward!.tr, - rightTitle: "", + leftTitel: 'WiFi密码'.tr, + rightTitle: '', isHaveRightWidget: true, - rightWidget: getTFWidget( - _wifiPassward, - TranslationLoader - .lanKeys!.pleaseEnterTheWiFiPassword!.tr)), + rightWidget: + getTFWidget(state.wifiPasswardTF, '请输入WiFi密码'.tr)), SizedBox( height: 10.h, ), CommonItem( - leftTitel: TranslationLoader.lanKeys!.gatewayName!.tr, - rightTitle: "", + leftTitel: '网关名称'.tr, + rightTitle: '', isHaveRightWidget: true, - rightWidget: getTFWidget(_gatewayNamePassward, - TranslationLoader.lanKeys!.pleaseEnterGatewayName!.tr)), + rightWidget: + getTFWidget(state.gatewayNameTF, '请输入网关名称'.tr)), SizedBox( height: 10.h, ), CommonItem( - leftTitel: TranslationLoader.lanKeys!.wifiMAC!.tr, - rightTitle: "48:55:19:7d:84:7a", - allHeight: 100.h, + leftTitel: '网络MAC'.tr, + rightTitle: state.gatewayModel.mac, + // allHeight: 100.h, isHaveLine: false), - SizedBox( - height: 10.h, - ), - Visibility( - visible: true, - child: Column( - children: [ - CommonItem( - leftTitel: TranslationLoader.lanKeys!.ipAddress!.tr, - rightTitle: "192.168.1.1", - allHeight: 100.h, - isHaveLine: true), - CommonItem( - leftTitel: - TranslationLoader.lanKeys!.subnetMask!.tr, - rightTitle: "255.255.255.0", - allHeight: 100.h, - isHaveLine: true), - CommonItem( - leftTitel: - TranslationLoader.lanKeys!.defaultGateway!.tr, - rightTitle: "192.168.1.1", - allHeight: 100.h, - isHaveLine: true), - SizedBox( - height: 10.h, - ), - CommonItem( - leftTitel: TranslationLoader.lanKeys! - .automaticallyGetTheDNSServerAddress!.tr, - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, height: 50.h, child: _switch())), - Visibility( - visible: true, - child: Column( - children: [ - CommonItem( - leftTitel: TranslationLoader - .lanKeys!.preferredDNS!.tr, - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: getTFWidget( - _gatewayNamePassward, - '请输入'.tr,)), - CommonItem( - leftTitel: TranslationLoader - .lanKeys!.alternativeDNS!.tr, - rightTitle: "", - isHaveLine: false, - isHaveRightWidget: true, - rightWidget: getTFWidget( - _gatewayNamePassward, - '请输入'.tr,)), - ], - )), - ], - )), - SizedBox( - height: 50.h, - ), + // SizedBox( + // height: 10.h, + // ), + // Obx(() => Visibility( + // visible: state.isUseStaticIP.value, + // child: Column( + // children: [ + // CommonItem( + // leftTitel: 'IP地址'.tr, + // // rightTitle: '192.168.1.1', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: getTFWidget(state.ipAddressTF, '请输入IP地址'.tr) + // ), + // CommonItem( + // leftTitel: '子网掩码'.tr, + // // rightTitle: '255.255.255.0', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: getTFWidget(state.subnetMaskTF, '请输入子网掩码'.tr)), + // CommonItem( + // leftTitel: '默认网关'.tr, + // // rightTitle: '192.168.1.1', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: getTFWidget(state.defaultGatewayTF, '请输入默认网关'.tr) + // ), + // SizedBox(height: 10.h,), + // Obx(() => CommonItem( + // leftTitel: '自动获取DNS服务器地址'.tr, + // rightTitle: '', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: SizedBox( + // width: 60.w, height: 50.h, child: _switch()))), + // Visibility( + // visible: !state.isAutomaticallyGetDNSServerAddress.value, + // child: Column( + // children: [ + // CommonItem( + // leftTitel: '首选DNS'.tr, + // rightTitle: '', + // isHaveLine: true, + // isHaveRightWidget: true, + // rightWidget: getTFWidget( + // state.firstChoiceDNSTF, + // '请输入'.tr)), + // CommonItem( + // leftTitel: '备选DNS'.tr, + // rightTitle: '', + // isHaveLine: false, + // isHaveRightWidget: true, + // rightWidget: getTFWidget( + // state.alternativeDNSTF, + // '请输入'.tr,)), + // ], + // )), + // ], + // ))), + SizedBox(height: 50.h), Container( margin: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( @@ -152,36 +149,38 @@ class _GatewayConfigurationWifiPageState padding: EdgeInsets.only(top: 15.w, bottom: 15.w), onClick: () { // Navigator.pushNamed(context, Routers.selectGatewayPage); + logic.senderConfiguringWifiAction(); }), ), - SizedBox( - height: 10.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - GestureDetector( - child: SizedBox( - // width: 150.w, - height: 50.h, - // color: Colors.red, - child: Center( - child: Text( - TranslationLoader.lanKeys!.noStaticIPIsUsed!.tr, - style: TextStyle( - fontSize: 22.sp, color: AppColors.mainColor)), - ), - ), - onTap: () { - // Navigator.pushNamed(context, Routers.starLockForgetPasswordPage); - }, - ), - SizedBox(width: 30.w), - ], - ), - SizedBox( - height: 50.h, - ), + SizedBox(height: 10.h), + // Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // Obx(() => GestureDetector( + // child: SizedBox( + // // width: 150.w, + // height: 50.h, + // // color: Colors.red, + // child: Center( + // child: Text( + // state.isUseStaticIP.value + // ? '不使用静态IP'.tr + // : '使用静态IP'.tr, + // style: TextStyle( + // fontSize: 22.sp, color: AppColors.mainColor)), + // ), + // ), + // onTap: () { + // state.isUseStaticIP.value = !state.isUseStaticIP.value; + // + // }, + // )), + // SizedBox(width: 30.w), + // ], + // ), + // SizedBox( + // height: 50.h, + // ), ], ), ) @@ -196,21 +195,35 @@ class _GatewayConfigurationWifiPageState height: 50.h, width: 300.w, child: Row( - children: [ + children: [ Expanded( child: TextField( + // 设置TextField font大小 //输入框一行 maxLines: 1, controller: controller, autofocus: false, textAlign: TextAlign.end, + style: TextStyle( + fontSize: 22.sp, // 设置字体大小 + ), decoration: InputDecoration( //输入里面输入文字内边距设置 - contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), hintText: tfStr, hintStyle: TextStyle(fontSize: 22.sp), - //不需要输入框下划线 - border: InputBorder.none, + focusedBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + disabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + enabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + border: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + contentPadding: const EdgeInsets.symmetric(vertical: 0), ), ), ), @@ -222,18 +235,64 @@ class _GatewayConfigurationWifiPageState ); } - CupertinoSwitch _switch() { - bool _isOn = false; - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: _isOn, - onChanged: (value) { - setState(() { - _isOn = value; - }); - }, - ); + // CupertinoSwitch _switch() { + // return CupertinoSwitch( + // activeColor: CupertinoColors.activeBlue, + // trackColor: CupertinoColors.systemGrey5, + // thumbColor: CupertinoColors.white, + // value: state.isAutomaticallyGetDNSServerAddress.value, + // onChanged: (bool value) { + // state.isAutomaticallyGetDNSServerAddress.value = !state.isAutomaticallyGetDNSServerAddress.value; + // }, + // ); + // } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + state.ifCurrentScreen.value = true; + } + + /// 返回上一个界面 当前界面即将消失 + @override + void didPop() { + super.didPop(); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + state.ifCurrentScreen.value = true; + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; } } diff --git a/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_state.dart b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_state.dart new file mode 100644 index 00000000..f1e73db0 --- /dev/null +++ b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_state.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../selectGateway/getGatewayInfo_model.dart'; + +class GatewayConfigurationWifiState { + GatewayConfigurationWifiState() { + var map = Get.arguments; + if (map['wifiName'] != null && map['wifiName'] != '') { + wifiNameTF.text = map['wifiName']; + } + + if (map['gatewayModel'] != null && map['gatewayModel'] != '') { + gatewayModel = map['gatewayModel']; + gatewayNameTF.text = gatewayModel.gatewayName; + // AppLog.log('gatewayModel.mac:${gatewayModel.mac} gatewayModel.mac:${gatewayModel.mac}'); + } + } + + GetGatewayInfoModel gatewayModel = GetGatewayInfoModel(); + RxBool isUseStaticIP = false.obs; + + final TextEditingController wifiNameTF = TextEditingController(); + final TextEditingController wifiPasswardTF = TextEditingController(); + final TextEditingController gatewayNameTF = TextEditingController(); + final TextEditingController ipAddressTF = TextEditingController(); + final TextEditingController subnetMaskTF = TextEditingController(); + final TextEditingController defaultGatewayTF = TextEditingController(); + + RxBool isAutomaticallyGetDNSServerAddress = true.obs; + final TextEditingController firstChoiceDNSTF = TextEditingController(); + final TextEditingController alternativeDNSTF = TextEditingController(); + + String gatewayJson = ''; + String getGatewayConfigurationStr = ''; + // RxString wifiName = '请选择WiFi'.obs; + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) +} diff --git a/lib/mine/gateway/addGateway/gatewayConfigurationWifi/getGatewayConfiguration_entity.dart b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/getGatewayConfiguration_entity.dart new file mode 100644 index 00000000..869b98b8 --- /dev/null +++ b/lib/mine/gateway/addGateway/gatewayConfigurationWifi/getGatewayConfiguration_entity.dart @@ -0,0 +1,30 @@ +import 'dart:convert'; + +class GetGatewayConfigurationEntity { + GetGatewayConfigurationEntity({ + this.description, + this.errorCode, + this.data, + this.errorMsg, + }); + + GetGatewayConfigurationEntity.fromJson(dynamic json) { + description = json['description']; + errorCode = json['errorCode']; + data = jsonEncode(json['data']); + errorMsg = json['errorMsg']; + } + String? description; + int? errorCode; + String? data; + String? errorMsg; + + Map toJson() { + final map = {}; + map['description'] = description; + map['errorCode'] = errorCode; + map['data'] = data; + map['errorMsg'] = errorMsg; + return map; + } +} diff --git a/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_logic.dart b/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_logic.dart new file mode 100644 index 00000000..28f471e9 --- /dev/null +++ b/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_logic.dart @@ -0,0 +1,151 @@ +import 'dart:async'; + +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart'; +import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../../../blue/io_tool/io_tool.dart'; +import '../../../../blue/blue_manage.dart'; +import '../../../../blue/io_reply.dart'; +import '../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../blue/sender_manage.dart'; +import '../../../../tools/storage.dart'; +import 'gatewayGetWifiList_state.dart'; + +class GatewayGetWifiListLogic extends BaseGetXController { + final GatewayGetWifiListState state = GatewayGetWifiListState(); + + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) { + if (reply is GatewayGetWifiReply) { + _replySendGetWifiParameters(reply); + } + + if (reply is GatewayGetWifiListReply) { + _replyGetWifiListParameters(reply); + } + }); + } + + // 发送获取wifi列表数据解析 + Future _replySendGetWifiParameters(Reply reply) async { + final int status = reply.data[2]; + switch (status) { + case 0x00: + //成功 + showEasyLoading(); + cancelBlueConnetctToastTimer(); + Future.delayed(5.seconds, dismissEasyLoading); + break; + case 0x06: + // 需要鉴权 + + // var token = await Storage.getStringList(saveBlueToken); + // List getTokenList = changeStringListToIntList(token!); + // + // var privateKey = await Storage.getStringList(saveBluePrivateKey); + // List getPrivateKeyList = changeStringListToIntList(privateKey!); + // + // var publicKey = await Storage.getStringList(saveBluePublicKey); + // List publicKeyDataList = changeStringListToIntList(publicKey!); + // + // IoSenderManage.getWifiListCommand( + // keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), + // userID: await Storage.getUid(), + // token: getTokenList, + // needAuthor: 1, + // publicKey: publicKeyDataList, + // privateKey: getPrivateKeyList, + // ); + break; + default: + break; + } + } + + // 获取WiFi数据解析 + Future _replyGetWifiListParameters(Reply reply) async { + final int status = reply.data[2]; + switch (status) { + case 0x00: + //成功 + // showEasyLoading(); + dismissEasyLoading(); + state.sureBtnState.value = 0; + + if (reply.data[3] > 0) { + reply.data.removeRange(0, 4); + // 把得到的数据按33位分割成数组 然后塞进一个新的数组里面 + final List> getList = splitList(reply.data, 33); + final List> uploadList = >[]; + for (int i = 0; i < getList.length; i++) { + final List indexList = getList[i]; + final Map indexMap = {}; + final List wifiName = indexList.sublist(0, 32); + indexMap['wifiName'] = utf8String(wifiName); + indexMap['rssi'] = (indexList.last - 255).toString(); + uploadList.add(indexMap); + state.wifiNameDataList.value = uploadList; + } + } + + break; + default: + break; + } + } + + // 获取wifi列表 + Future senderGetWifiListWifiAction() async { + if (state.sureBtnState.value == 1) { + return; + } + state.sureBtnState.value = 1; + + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + state.sureBtnState.value = 0; + }); + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { + if (connectionState == BluetoothConnectionState.connected) { + IoSenderManage.gatewayGetWifiCommand( + userID: await Storage.getUid(), + ); + } else if (connectionState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + } + }, isAddEquipment: true); + } + + @override + void onReady() { + super.onReady(); + + _initReplySubscription(); + } + + @override + void onInit() { + super.onInit(); + + senderGetWifiListWifiAction(); + } + + @override + void onClose() { + super.onClose(); + _replySubscription.cancel(); + } +} diff --git a/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_page.dart b/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_page.dart new file mode 100644 index 00000000..fc031e43 --- /dev/null +++ b/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_page.dart @@ -0,0 +1,182 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/appRouteObserver.dart'; +import '../../../../tools/noData.dart'; +import '../../../../tools/submitBtn.dart'; +import '../../../../tools/titleAppBar.dart'; +import 'gatewayGetWifiList_logic.dart'; +import 'gatewayGetWifiList_state.dart'; + +class GatewayGetWifiListPage extends StatefulWidget { + const GatewayGetWifiListPage({Key? key}) : super(key: key); + + @override + State createState() => _GatewayGetWifiListPageState(); +} + +class _GatewayGetWifiListPageState extends State with RouteAware{ + final GatewayGetWifiListLogic logic = Get.put(GatewayGetWifiListLogic()); + final GatewayGetWifiListState state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: 'WIFI列表'.tr, + haveBack: true, + actionsList: [ + TextButton( + child: Text( + '刷新'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: logic.senderGetWifiListWifiAction, + ), + ], + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + Expanded( + child: Obx(() => state.wifiNameDataList.value.isNotEmpty ? ListView.builder( + itemCount: state.wifiNameDataList.value.length, + itemBuilder: (BuildContext c, int index) { + Map wifiNameStr = state.wifiNameDataList.value[index]; + return _messageListItem(wifiNameStr['wifiName'], wifiNameStr['rssi'], () { + Get.toNamed(Routers.gatewayConfigurationWifiPage, arguments: { + 'wifiName': wifiNameStr['wifiName'], + 'gatewayModel': state.gatewayModel + }); + }); + }) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 64.h)), + ), + SubmitBtn( + btnName: '手动配网'.tr, + fontSize: 28.sp, + borderRadius: 20.w, + padding: EdgeInsets.only(top: 25.w, bottom: 25.w), + onClick: () { + Get.toNamed(Routers.gatewayConfigurationWifiPage, arguments: { + 'wifiName': '', + 'gatewayModel': state.gatewayModel + }); + }), + SizedBox( + height: 64.h, + ) + ], + ) + ); + } + + Widget _messageListItem(String wifiName, String rssi, Function() action) { + return GestureDetector( + onTap: action, + child: Container( + height: 90.h, + width: 1.sw, + margin: EdgeInsets.only(bottom: 2.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10.w), + ), + child: Container( + width: 1.sw, + height: 80.h, + margin: EdgeInsets.only(left: 20.w, right: 40.w), + child: Column( + children: [ + SizedBox( + height: 79.h, + width: 1.sw - 20.w*2, + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + '$wifiName(${rssi}db)', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 22.sp, color: AppColors.blackColor), + ), + ), + // Text( + // rssi, + // maxLines: 1, + // overflow: TextOverflow.ellipsis, + // style: TextStyle( + // fontSize: 22.sp, color: AppColors.blackColor), + // ) + ], + ), + ), + Container( + height: 1.h, + color: AppColors.greyLineColor, + ), + ], + ), + ), + ), + ); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + state.ifCurrentScreen.value = true; + } + + /// 返回上一个界面 当前界面即将消失 + @override + void didPop() { + super.didPop(); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + state.ifCurrentScreen.value = true; + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; + } +} diff --git a/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_state.dart b/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_state.dart new file mode 100644 index 00000000..0ef78d83 --- /dev/null +++ b/lib/mine/gateway/addGateway/gatewayGetWifiList/gatewayGetWifiList_state.dart @@ -0,0 +1,20 @@ + + +import 'package:get/get.dart'; + +import '../selectGateway/getGatewayInfo_model.dart'; + +class GatewayGetWifiListState{ + GatewayGetWifiListState() { + var map = Get.arguments; + if (map['gatewayModel'] != null && map['gatewayModel'] != '') { + gatewayModel = map['gatewayModel']; + } + } + + final RxList> wifiNameDataList = >[].obs; + + GetGatewayInfoModel gatewayModel = GetGatewayInfoModel(); + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; +} \ No newline at end of file diff --git a/lib/mine/gateway/addGateway/selectGateway/getGatewayInfo_model.dart b/lib/mine/gateway/addGateway/selectGateway/getGatewayInfo_model.dart new file mode 100644 index 00000000..96494831 --- /dev/null +++ b/lib/mine/gateway/addGateway/selectGateway/getGatewayInfo_model.dart @@ -0,0 +1,7 @@ +class GetGatewayInfoModel { + late String gatewayName; + late String mac; + late String serialNum; + late String gatewayVersion; + late String wifiMac; +} diff --git a/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart new file mode 100644 index 00000000..89289209 --- /dev/null +++ b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart @@ -0,0 +1,211 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_settings.dart'; +import '../../../../blue/blue_manage.dart'; +import '../../../../blue/io_gateway/io_gateway_getStatus.dart'; +import '../../../../blue/io_reply.dart'; +import '../../../../blue/io_tool/io_tool.dart'; +import '../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../blue/io_type.dart'; +import '../../../../blue/sender_manage.dart'; +import '../../../../tools/storage.dart'; +import '../../../../widget/permission/permission_dialog.dart'; +import 'getGatewayInfo_model.dart'; +import 'selectGatewayList_state.dart'; + +class SelectGatewayListLogic extends BaseGetXController { + SelectGatewayListState state = SelectGatewayListState(); + + // 监听设备返回的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) async { + // 获取网关状态 + if (reply is GatewayGetStatusReply) { + _replyGatewayGetStatusReply(reply); + } + }); + } + + // WIFI配网结果 + Future _replyGatewayGetStatusReply(Reply reply) async { + final int status = reply.data[2]; + + switch (status) { + case 0x00: + //成功 + // state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); + dismissEasyLoading(); + + final GetGatewayInfoModel gatewayModel = GetGatewayInfoModel(); + gatewayModel.gatewayName = + state.currentDevice!.advertisementData.advName; + + // 网关MAC地址 + int index = 3; + final List macList = reply.data.sublist(index, index + 20); + final String macStr = utf8String(macList); + // lockInfo['mac'] = macStr; + gatewayModel.mac = macStr; + index = index + 20; + // AppLog.log('网关MAC地址 macList:$macList macStr:$macStr'); + + // 网关序列号 + final List serialNum = reply.data.sublist(index, index + 20); + final String serialNumStr = utf8String(serialNum); + // lockInfo['serialNum'] = serialNumStr; + gatewayModel.serialNum = serialNumStr; + index = index + 20; + // AppLog.log('网关序列号 serialNum:$serialNum serialNumStr:$serialNumStr'); + + // 网关版本 + final List gatewayVersion = reply.data.sublist(index, index + 20); + final String gatewayVersionStr = utf8String(gatewayVersion); + // lockInfo['gatewayVersion'] = gatewayVersionStr; + gatewayModel.gatewayVersion = gatewayVersionStr; + index = index + 20; + // AppLog.log('软件版本 gatewayVersion:$gatewayVersion gatewayVersionStr:$gatewayVersionStr'); + + // wifiMac地址 + final List wifiMac = reply.data.sublist(index, index + 20); + final String wifiMacStr = utf8String(wifiMac); + // lockInfo['wifiMac'] = wifiMacStr; + gatewayModel.wifiMac = wifiMacStr; + index = index + 20; + AppLog.log('wifiMac地址 wifiMac:$wifiMac wifiMacStr:$wifiMacStr'); + // gatewayModel.wifiMac = '00:00:00:00:00:00'; + + Get.toNamed(Routers.gatewayGetWifiListPage, arguments: { + 'gatewayModel': gatewayModel, + }); + break; + default: + //失败 + dismissEasyLoading(); + showToast('配网失败'.tr); + break; + } + } + + void startScanBlueList() { + BlueManage().startScan(2000, DeviceType.gateway, (List list) { + AppLog.log('ScanResultList:$list'); + state.devices.clear(); + for (int i = 0; i < list.length; i++) { + final ScanResult device = list[i]; + // if ((device.advertisementData.serviceUuids.isNotEmpty + // ? device.advertisementData.serviceUuids[0] + // : '') + // .toString()[31] != + // '1') { + state.devices.add(list[i]); + // AppLog.log('device:${list[i]}'); + // } + } + }); + } + + Future stopScanBlueList() async { + // BlueManage().disconnect(); + await BlueManage().stopScan(); + } + + void blueDisconnect() { + BlueManage().disconnect(); + } + + Future getNearByLimits() async { + if (!Platform.isIOS) { + final bool bluetoothRequest = await PermissionDialog.requestBluetooth(); + final bool locationRequest = + await PermissionDialog.request(Permission.location); + AppLog.log('locationRequest:$locationRequest'); + if (!bluetoothRequest || !locationRequest) { + return; + } + } + startScanBlueList(); + } + + // 获取网关状态 + Future senderGatewayGetStatusAction() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { + if (connectionState == BluetoothConnectionState.connected) { + IoSenderManage.gatewayGetStatusCommand( + lockID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + ); + } else if (connectionState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } + } + }, isAddEquipment: true); + } + + // 点击连接设备 + void connect(ScanResult device) { + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); + BlueManage().blueSendData(device.advertisementData.advName, + (BluetoothConnectionState bluetoothConnectionState) async { + // AppLog.log('点击要添加的设备了'); + if (bluetoothConnectionState == BluetoothConnectionState.connected) { + dismissEasyLoading(); + + // 没有网关调试,做假数据调试 + // final GetGatewayInfoModel gatewayModel = GetGatewayInfoModel(); + // gatewayModel.mac = 'C1:1E:0D:E0:0C:A9'; + // gatewayModel.serialNum = DateTime.now().millisecondsSinceEpoch.toString(); + // gatewayModel.gatewayVersion = '1.0.1'; + // gatewayModel.wifiMac = 'C1:1E:0D:E0:0C:A9'; + // Get.toNamed(Routers.gatewayGetWifiListPage, arguments: { + // 'gatewayModel':gatewayModel, + // }); + + senderGatewayGetStatusAction(); + } else { + dismissEasyLoading(); + } + }, isAddEquipment: true); + } + + @override + void onInit() { + super.onInit(); + + _initReplySubscription(); + } + + @override + void onReady() { + super.onReady(); + + AppLog.log('扫描网关列表 onReadyonReady被调用了'); + getNearByLimits(); + } + + @override + void dispose() { + super.dispose(); + _replySubscription.cancel(); + } +} diff --git a/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_page.dart b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_page.dart index d812ce6d..e05dc70e 100755 --- a/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_page.dart +++ b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_page.dart @@ -1,11 +1,18 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; +import 'package:star_lock/tools/noData.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; +import 'selectGatewayList_logic.dart'; +import 'selectGatewayList_state.dart'; class SelectGatewayListPage extends StatefulWidget { const SelectGatewayListPage({Key? key}) : super(key: key); @@ -14,31 +21,51 @@ class SelectGatewayListPage extends StatefulWidget { State createState() => _SelectGatewayListPageState(); } -class _SelectGatewayListPageState extends State { +class _SelectGatewayListPageState extends State + with RouteAware { + final SelectGatewayListLogic logic = Get.put(SelectGatewayListLogic()); + final SelectGatewayListState state = Get.find().state; + @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectGateway!.tr, + barTitle: '选择网关'.tr, haveBack: true, - backgroundColor: AppColors.mainColor), - body: ListView.builder( - itemCount: 10, - itemBuilder: (c, index) { - return _selectGatewayListListItem( - 'images/mine/icon_mine_gatewayListMainIcon.png', - "G2 41c21c", - "-34", () { - Navigator.pushNamed( - context, Routers.gatewayConfigurationWifiPage); - }); - }), + backgroundColor: AppColors.mainColor, + actionsList: [ + CupertinoActivityIndicator( + radius: 18.w, + color: Colors.white, + ), + SizedBox(width: 30.w) + ]), + body: + // ListView.builder( + // itemCount: 10, + // itemBuilder: (BuildContext c, int index) { + // return _selectGatewayListListItem( + // 'images/mine/icon_mine_gatewayListMainIcon.png', + // 'G2 41c21c', + // '-34', () { + // Navigator.pushNamed( + // context, Routers.gatewayConfigurationWifiPage); + // }); + // }) + Obx(() => ListView.builder( + itemCount: state.devices.length, + itemBuilder: (BuildContext c, int index) { + final ScanResult device = state.devices[index]; + return _selectGatewayListListItem(device, () { + state.currentDevice = device; + logic.connect(device); + }); + })), ); } - Widget _selectGatewayListListItem(String lockTypeIcon, String gateWayName, - String networkSignal, Function() action) { + Widget _selectGatewayListListItem(ScanResult device, Function() action) { return GestureDetector( onTap: action, child: Container( @@ -56,7 +83,7 @@ class _SelectGatewayListPageState extends State { width: 10.w, ), Image.asset( - lockTypeIcon, + 'images/mine/icon_mine_gatewayListMainIcon.png', width: 60.w, height: 60.w, ), @@ -67,37 +94,32 @@ class _SelectGatewayListPageState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Container( - // color: Colors.red, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - gateWayName, - style: TextStyle(fontSize: 24.sp), - ), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + device.advertisementData.advName ?? '未知设备', + style: TextStyle(fontSize: 24.sp), + ), + ], ), SizedBox(height: 5.h), - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Image.asset( - 'images/mine/icon_mine_gatewaySignal_strong.png', - width: 22.w, - height: 22.w, - ), - SizedBox( - width: 10.w, - ), - Text( - networkSignal, - style: TextStyle(fontSize: 22.sp), - ), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + 'images/mine/icon_mine_gatewaySignal_strong.png', + width: 22.w, + height: 22.w, + ), + SizedBox( + width: 10.w, + ), + Text( + device.rssi.toString(), + style: TextStyle(fontSize: 22.sp), + ), + ], ), SizedBox(width: 20.h), ], @@ -118,4 +140,55 @@ class _SelectGatewayListPageState extends State { ), ); } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + } + + /// 返回上一个界面 当前界面即将消失 + @override + Future didPop() async { + super.didPop(); + + EasyLoading.isShow ? EasyLoading.dismiss() : null; + logic.cancelBlueConnetctToastTimer(); + logic.blueDisconnect(); + await Future.delayed(Duration(milliseconds: 500)); + await logic.stopScanBlueList(); + AppLog.log('停止网关列表 didPop被调用了'); + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + AppLog.log('扫描网关列表 didPopNext被调用了'); + logic.blueDisconnect(); + logic.startScanBlueList(); + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + logic.cancelBlueConnetctToastTimer(); + logic.stopScanBlueList(); + } } diff --git a/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_state.dart b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_state.dart new file mode 100644 index 00000000..f66a0940 --- /dev/null +++ b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_state.dart @@ -0,0 +1,9 @@ +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; + +class SelectGatewayListState { + RxList devices = [].obs; + + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + ScanResult? currentDevice; +} diff --git a/lib/mine/gateway/addGateway/selectGatewayType/selectGatewayType_page.dart b/lib/mine/gateway/addGateway/selectGatewayType/selectGatewayType_page.dart index c8b9a5dc..cb55f107 100755 --- a/lib/mine/gateway/addGateway/selectGatewayType/selectGatewayType_page.dart +++ b/lib/mine/gateway/addGateway/selectGatewayType/selectGatewayType_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -5,7 +6,6 @@ import 'package:get/get.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class SelectGatewayTypePage extends StatefulWidget { const SelectGatewayTypePage({Key? key}) : super(key: key); @@ -20,13 +20,13 @@ class _SelectGatewayTypePageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectGatewayType!.tr, + barTitle: '选择网关类型'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( children: [ _selectGatewayType( - 'images/mine/icon_mine_selectGatewayType_G2.png', "G2(Wi-Fi)", + 'images/mine/icon_mine_selectGatewayType_G2.png', 'G2(Wi-Fi)', () { Navigator.pushNamed(context, Routers.selectGatewayTypeNextTipPage); }), @@ -34,7 +34,7 @@ class _SelectGatewayTypePageState extends State { height: 2.h, ), _selectGatewayType( - 'images/mine/icon_mine_selectGatewayType_G4.png', "G4(4G) ", + 'images/mine/icon_mine_selectGatewayType_G4.png', 'G4(4G) ', () { Navigator.pushNamed(context, Routers.selectGatewayTypeNextTipPage); }), diff --git a/lib/mine/gateway/addGateway/selectGatewayTypeNextTip/selectGatewayTypeNextTip_page.dart b/lib/mine/gateway/addGateway/selectGatewayTypeNextTip/selectGatewayTypeNextTip_page.dart index 20571a19..6626f63f 100755 --- a/lib/mine/gateway/addGateway/selectGatewayTypeNextTip/selectGatewayTypeNextTip_page.dart +++ b/lib/mine/gateway/addGateway/selectGatewayTypeNextTip/selectGatewayTypeNextTip_page.dart @@ -6,7 +6,6 @@ import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class SelectGatewayTypeNextTipPage extends StatefulWidget { const SelectGatewayTypeNextTipPage({Key? key}) : super(key: key); @@ -23,7 +22,7 @@ class _SelectGatewayTypeNextTipPageState return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.addGateway!.tr, + barTitle: '添加网关'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( @@ -31,7 +30,7 @@ class _SelectGatewayTypeNextTipPageState SizedBox(height: 40.h), Center( child: Text( - TranslationLoader.lanKeys!.turnThePowerBackOn!.tr, + '重新通电'.tr, style: TextStyle(fontSize: 24.sp), )), SizedBox(height: 80.h), @@ -42,10 +41,10 @@ class _SelectGatewayTypeNextTipPageState bottom: 50.h, left: 120.w, child: Text( - TranslationLoader.lanKeys!.indicatorLight!.tr, + '指示灯'.tr, style: TextStyle(fontSize: 20.sp), )), - Image.asset("images/mine/icon_mine_selectGatewayType_next.png", + Image.asset('images/mine/icon_mine_selectGatewayType_next.png', width: 220.w, height: 220.w), ], ), @@ -54,7 +53,7 @@ class _SelectGatewayTypeNextTipPageState padding: EdgeInsets.all(20.w), child: Center( child: Text( - TranslationLoader.lanKeys!.selectGatewayTypeNextTip!.tr, + '网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 18.sp), ))), @@ -62,7 +61,7 @@ class _SelectGatewayTypeNextTipPageState Container( padding: EdgeInsets.only(left: 20.w, right: 20.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, onClick: () { Navigator.pushNamed(context, Routers.selectGatewayPage); }), diff --git a/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_entity.dart b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_entity.dart new file mode 100644 index 00000000..30517dc5 --- /dev/null +++ b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_entity.dart @@ -0,0 +1,81 @@ +class GatewayConnectionLockListEntity { + + GatewayConnectionLockListEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + GatewayConnectionLockListEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + + Data({this.list, this.total, this.pageNo, this.pageSize}); + + Data.fromJson(Map json) { + if (json['list'] != null) { + list = []; + json['list'].forEach((v) { + list!.add(GatewayConnectionLockItemEntity.fromJson(v)); + }); + } + total = json['total']; + pageNo = json['pageNo']; + pageSize = json['pageSize']; + } + List? list; + int? total; + int? pageNo; + int? pageSize; + + Map toJson() { + final Map data = {}; + if (list != null) { + data['list'] = list!.map((v) => v.toJson()).toList(); + } + data['total'] = total; + data['pageNo'] = pageNo; + data['pageSize'] = pageSize; + return data; + } +} + +class GatewayConnectionLockItemEntity { + + GatewayConnectionLockItemEntity({this.lockId, this.lockAlias, this.rssi}); + + GatewayConnectionLockItemEntity.fromJson(Map json) { + lockId = json['lockId']; + lockAlias = json['lockAlias']; + rssi = json['rssi']; + } + int? lockId; + String? lockAlias; + int? rssi; + + Map toJson() { + final Map data = {}; + data['lockId'] = lockId; + data['lockAlias'] = lockAlias; + data['rssi'] = rssi; + return data; + } +} \ No newline at end of file diff --git a/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_logic.dart b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_logic.dart new file mode 100644 index 00000000..d670c100 --- /dev/null +++ b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_logic.dart @@ -0,0 +1,36 @@ +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../login/login/entity/LoginEntity.dart'; +import '../../../network/api_repository.dart'; +import 'gatewayConnectionLockList_entity.dart'; +import 'gatewayConnectionLockList_state.dart'; + +class GatewayConnectionLockListLogic extends BaseGetXController { + GatewayConnectionLockListState state = GatewayConnectionLockListState(); + + // 网关-附近的锁 + Future + gatewayConnectionLockListDataRequest() async { + final GatewayConnectionLockListEntity entity = await ApiRepository.to + .gatewayConnectionLockLoadData(gatewayId: state.gatewayId.value); + if (entity.errorCode!.codeIsSuccessful) { + state.itemDataList.value = entity.data!.list!; + } + return entity; + } + + Future gatewayScanDevice() async { + final LoginEntity entity = await ApiRepository.to + .gatewayScanDevice(gatewayId: state.gatewayId.value); + if (entity.errorCode!.codeIsSuccessful) { + gatewayConnectionLockListDataRequest(); + } + } + + @override + void onReady() { + super.onReady(); + + gatewayConnectionLockListDataRequest(); + } +} diff --git a/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_page.dart b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_page.dart index e8fc166b..803d8baa 100755 --- a/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_page.dart +++ b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_page.dart @@ -1,95 +1,131 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../../app_settings/app_colors.dart'; +import '../../../tools/noData.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; +import 'gatewayConnectionLockList_entity.dart'; +import 'gatewayConnectionLockList_logic.dart'; +import 'gatewayConnectionLockList_state.dart'; class GatewayConnectionLockListPage extends StatefulWidget { const GatewayConnectionLockListPage({Key? key}) : super(key: key); @override - State createState() => _GatewayConnectionLockListPageState(); + State createState() => + _GatewayConnectionLockListPageState(); } -class _GatewayConnectionLockListPageState extends State { +class _GatewayConnectionLockListPageState + extends State { + final GatewayConnectionLockListLogic logic = + Get.put(GatewayConnectionLockListLogic()); + final GatewayConnectionLockListState state = + Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar(barTitle: TranslationLoader.lanKeys!.gateway!.tr, haveBack:true, backgroundColor: AppColors.mainColor), + appBar: TitleAppBar( + barTitle: '网关'.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + onPressed: logic.gatewayScanDevice, + child: Text('扫描设备'.tr, + style: TextStyle(color: Colors.white, fontSize: 22.sp))) + ], + ), body: Column( - children: [ + children: [ Container( width: 1.sw, color: Colors.grey.shade300, - padding: EdgeInsets.all(15.h), - child: Text(TranslationLoader.lanKeys!.gatewayConnectionLock!.tr) - ), - Expanded( - child: ListView.builder( - itemCount:10, - itemBuilder: (c, index){ - return _gatewayConnectionLockListItem('images/mine/icon_mine_gatewaySignal_prompt.png', "MCBN01 8f3106", TranslationLoader.lanKeys!.strongSignal!.tr,(){ - // Navigator.pushNamed(context, Routers.gatewayDetailPage); - }); - } - ), - ) + padding: EdgeInsets.all(10.h), + child: Text('网关连接的锁'.tr, style: TextStyle(fontSize: 24.sp))), + Obx(() => Expanded( + child: state.itemDataList.value.isNotEmpty + ? ListView.builder( + itemCount: 10, + itemBuilder: (BuildContext c, int index) { + final GatewayConnectionLockItemEntity entity = + state.itemDataList[index]; + return _gatewayConnectionLockListItem( + 'images/mine/icon_mine_gatewaySignal_prompt.png', + entity.lockAlias ?? '', + '信号强'.tr, () { + // Navigator.pushNamed(context, Routers.gatewayDetailPage); + }); + }) + : NoData(), + )) ], ), ); } - Widget _gatewayConnectionLockListItem(String lockTypeIcon, String gateWayName, String signalStrength, Function() action){ + Widget _gatewayConnectionLockListItem(String lockTypeIcon, String gateWayName, + String signalStrength, Function() action) { return GestureDetector( onTap: action, child: Container( // height: 100.h, margin: const EdgeInsets.only(bottom: 2), - padding: EdgeInsets.only(left: 10.w, right: 20.w, top: 20.h, bottom: 20.h), - decoration: BoxDecoration( + padding: + EdgeInsets.only(left: 15.w, right: 20.w, top: 15.h, bottom: 15.h), + decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10.w), ), child: Row( - children: [ - SizedBox(width: 10.w,), - Image.asset(lockTypeIcon, width: 90.w, height: 90.w,), - SizedBox(width: 20.w,), + children: [ + Image.asset( + lockTypeIcon, + width: 70.w, + height: 70.w, + ), + SizedBox( + width: 20.w, + ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - // color: Colors.red, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(gateWayName, style: TextStyle(fontSize: 32.sp, fontWeight: FontWeight.w500), ), - ], - ), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(gateWayName, + style: TextStyle( + fontSize: 24.sp, fontWeight: FontWeight.w500)), + ], ), - SizedBox(height:5.h), - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Image.asset('images/mine/icon_mine_gatewaySignal_strong.png', width: 40.w, height: 40.w,), - SizedBox(width: 10.w,), - Text(signalStrength, style: TextStyle(fontSize: 28.sp, fontWeight: FontWeight.w500), ), - ], - ), + SizedBox(height: 5.h), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + 'images/mine/icon_mine_gatewaySignal_strong.png', + width: 30.w, + height: 30.w, + ), + SizedBox( + width: 10.w, + ), + Text( + signalStrength, + style: TextStyle( + fontSize: 22.sp, fontWeight: FontWeight.w500), + ), + ], ), - SizedBox(width:20.h), + SizedBox(width: 20.h), ], ), ), - SizedBox(width:20.h), - + SizedBox(width: 20.h), ], ), ), diff --git a/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_state.dart b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_state.dart new file mode 100644 index 00000000..5d64b9c7 --- /dev/null +++ b/lib/mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_state.dart @@ -0,0 +1,17 @@ + +import 'package:get/get.dart'; + +import 'gatewayConnectionLockList_entity.dart'; + +class GatewayConnectionLockListState{ + GatewayConnectionLockListState() { + var map = Get.arguments; + if (map['gatewayId'] > 0) { + gatewayId.value = map['gatewayId']; + } + } + + var gatewayId = 0.obs; + + final itemDataList = [].obs; +} \ No newline at end of file diff --git a/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart b/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart new file mode 100644 index 00000000..5ea251f0 --- /dev/null +++ b/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart @@ -0,0 +1,38 @@ +import 'package:get/get.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../login/login/entity/LoginEntity.dart'; +import '../../../network/api_repository.dart'; +import '../../../tools/showTipView.dart'; +import 'gatewayDetail_state.dart'; + +class GatewayDetailLogic extends BaseGetXController { + GatewayDetailState state = GatewayDetailState(); + + Future deletGateway(int isForce) async { + final LoginEntity entity = await ApiRepository.to.gatewayDelet( + gatewayId: state.getewayItemData.value.gatewayId ?? 0, + isForce: isForce); + if (entity.errorCode!.codeIsSuccessful) { + showToast('删除成功'.tr, something: () { + // eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.back(); + }); + } else if (entity.errorCode! == 10005) { + ShowTipView().showIosTipWithContentDialog( + '是否要强制删除?(强制删除后,网关要初始化才能被添加)'.tr, () => deletGateway(1)); + } + } + + Future updateGateway(String gatewayName) async { + final LoginEntity entity = await ApiRepository.to.gatewayUpdate( + gatewayId: state.getewayItemData.value.gatewayId ?? 0, + gatewayName: gatewayName); + if (entity.errorCode!.codeIsSuccessful) { + showToast('修改成功'.tr, something: () { + // eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.back(); + }); + } + } +} diff --git a/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart b/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart index b68780dd..1c1a19d6 100755 --- a/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart +++ b/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -6,9 +7,11 @@ import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/showTFView.dart'; +import '../../../tools/showTipView.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; +import 'gatewayDetail_logic.dart'; +import 'gatewayDetail_state.dart'; class GatewayDetailPage extends StatefulWidget { const GatewayDetailPage({Key? key}) : super(key: key); @@ -18,83 +21,93 @@ class GatewayDetailPage extends StatefulWidget { } class _GatewayDetailPageState extends State { - final _changeGatewayNameController = TextEditingController(); + final GatewayDetailLogic logic = Get.put(GatewayDetailLogic()); + final GatewayDetailState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.gateway!.tr, + barTitle: '网关'.tr, haveBack: true, backgroundColor: AppColors.mainColor), - body: ListView( - children: [ - CommonItem( - leftTitel: TranslationLoader.lanKeys!.designation!.tr, - rightTitle: '星锁网关', - isHaveLine: true, - isHaveDirection: true, - action: () { - showCupertinoAlertDialog(context); - }), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.state!.tr, - rightTitle: '在线', - isHaveLine: true, - isHaveDirection: false), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.wifiName!.tr, - rightTitle: 'XinHongJia', - isHaveLine: true, - isHaveDirection: false), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.networkMAC!.tr, - rightTitle: '39:23:df:34:12', - isHaveLine: false, - isHaveDirection: false), - SizedBox( - height: 10.h, - ), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.nearbyLock!.tr, - rightTitle: '2', - isHaveLine: true, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.gatewayConnectionLockPage); - }), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.gatewayUpgrade!.tr, - rightTitle: '', - isHaveLine: false, - isHaveDirection: true, - action: () {}), - SizedBox( - height: 80.h, - ), - SubmitBtn( - btnName: '删除'.tr, - isDelete: true, - borderRadius: 20.w, - fontSize: 32.sp, - margin: EdgeInsets.only(left: 30.w, right: 30.w), - padding: EdgeInsets.only(top: 15.w, bottom: 15.w), - onClick: () {}), - ], - ), + body: Obx(() => ListView( + children: [ + CommonItem( + leftTitel: '名称'.tr, + rightTitle: state.getewayItemData.value.gatewayName, + isHaveLine: true, + isHaveDirection: true, + action: () { + ShowTipView().showTFViewAlertDialog( + state.changeGatewayNameController, + '请输入姓名'.tr, + '请输入姓名'.tr, () { + if (state.changeGatewayNameController.text.isEmpty) { + logic.showToast('请输入姓名'.tr); + return; + } + Get.back(); + logic.updateGateway( + state.changeGatewayNameController.text); + }, inputFormatters: [ + FilteringTextInputFormatter.deny('\n'), + LengthLimitingTextInputFormatter(50), + ]); + }), + CommonItem( + leftTitel: '状态'.tr, + rightTitle: state.getewayItemData.value.isOnline == 1 + ? '在线'.tr + : '离线'.tr, + isHaveLine: true, + isHaveDirection: false), + CommonItem( + leftTitel: 'WiFi名称'.tr, + rightTitle: state.getewayItemData.value.networkName, + isHaveLine: true, + isHaveDirection: false), + CommonItem( + leftTitel: '网络MAC'.tr, + rightTitle: state.getewayItemData.value.gatewayMac, + isHaveLine: false, + isHaveDirection: false), + SizedBox( + height: 10.h, + ), + CommonItem( + leftTitel: '附近的锁'.tr, + // rightTitle: state.getewayItemData.value.lockNum.toString(), + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.gatewayConnectionLockPage, arguments: { + 'gatewayId': state.getewayItemData.value.gatewayId ?? 0 + }); + }), + // CommonItem( + // leftTitel: '网关升级'.tr, + // rightTitle: '', + // isHaveLine: false, + // isHaveDirection: true, + // action: () {}), + SizedBox( + height: 80.h, + ), + SubmitBtn( + btnName: '删除'.tr, + isDelete: true, + borderRadius: 20.w, + fontSize: 32.sp, + margin: EdgeInsets.only(left: 30.w, right: 30.w), + padding: EdgeInsets.only(top: 15.w, bottom: 15.w), + onClick: () { + ShowTipView().showIosTipWithContentDialog( + '确定要删除吗?'.tr, () => logic.deletGateway(0)); + }), + ], + )), ); } - - // 修改名字 - void showCupertinoAlertDialog(BuildContext context) { - showDialog( - context: context, - builder: (BuildContext context) { - return ShowTFView( - title: '修改姓名'.tr, - tipTitle: '请输入', - controller: _changeGatewayNameController); - }); - } } diff --git a/lib/mine/gateway/gatewayDetail/gatewayDetail_state.dart b/lib/mine/gateway/gatewayDetail/gatewayDetail_state.dart new file mode 100644 index 00000000..8f2a30ea --- /dev/null +++ b/lib/mine/gateway/gatewayDetail/gatewayDetail_state.dart @@ -0,0 +1,19 @@ + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../mineSet/transferGateway/selectGetewayList_entity.dart'; + +class GatewayDetailState{ + GatewayDetailState() { + var map = Get.arguments; + if (map['getewayItemData'] != null && map['getewayItemData'] != '') { + getewayItemData.value = map['getewayItemData']; + changeGatewayNameController.text = getewayItemData.value.gatewayName!; + } + } + + Rx getewayItemData = GetewayItemData().obs; + + final TextEditingController changeGatewayNameController = TextEditingController(); +} \ No newline at end of file diff --git a/lib/mine/gateway/gatewayList/gatewayList_logic.dart b/lib/mine/gateway/gatewayList/gatewayList_logic.dart new file mode 100644 index 00000000..cb99572f --- /dev/null +++ b/lib/mine/gateway/gatewayList/gatewayList_logic.dart @@ -0,0 +1,57 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../login/login/entity/LoginEntity.dart'; +import '../../../network/api_repository.dart'; +import '../../mineSet/transferGateway/selectGetewayList_entity.dart'; +import 'gatewayList_state.dart'; + +class GatewayListLogic extends BaseGetXController { + GatewayListState state = GatewayListState(); + + // 获取网关列表 + Future getGatewayListData( + {required bool isRefresh}) async { + // 如果是下拉刷新,清空已有数据 + if (isRefresh) { + state.getewayListData.clear(); + pageNo = 1; + } + final GetewayDataEntity entity = await ApiRepository.to.getGatewayListData( + pageNo: pageNo.toString(), + pageSize: pageSize, + ); + if (entity.errorCode!.codeIsSuccessful) { + // 更新数据列表 + state.getewayListData.addAll(entity.data!.list!); + // 更新页码 + pageNo++; + } + return entity; + } + + // 测试配网成功 + // Future gatewayDistributionNetwork() async{ + // final LoginEntity entity = await ApiRepository.to.gatewayDistributionNetwork( + // gatewayName: '测试网关添加', + // gatewayMac: '48:6F:73:52:A1:C3', + // serialNumber: '1.0.0', + // gatewayType: 2, + // networkName: '测试网关添加WiFi名字', + // networkMac: '48:6F:73:52:A1:C3', + // version: '1.0.0', + // ); + // if(entity.errorCode!.codeIsSuccessful){ + // showToast('配网成功', something:(){ + // + // }); + // } + // } + + // @override + // void onInit() { + // super.onInit(); + // gatewayDistributionNetwork(); + // } + +} \ No newline at end of file diff --git a/lib/mine/gateway/gatewayList/gatewayList_page.dart b/lib/mine/gateway/gatewayList/gatewayList_page.dart index 7721c875..95b8a9c1 100755 --- a/lib/mine/gateway/gatewayList/gatewayList_page.dart +++ b/lib/mine/gateway/gatewayList/gatewayList_page.dart @@ -1,11 +1,16 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/tools/noData.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; +import '../../../tools/EasyRefreshTool.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; +import '../../mineSet/transferGateway/selectGetewayList_entity.dart'; +import 'gatewayList_logic.dart'; +import 'gatewayList_state.dart'; class GatewayListPage extends StatefulWidget { const GatewayListPage({Key? key}) : super(key: key); @@ -15,18 +20,36 @@ class GatewayListPage extends StatefulWidget { } class _GatewayListPageState extends State { + final GatewayListLogic logic = Get.put(GatewayListLogic()); + final GatewayListState state = Get.find().state; + + Future getHttpData({required bool isRefresh}) async { + logic.getGatewayListData(isRefresh: isRefresh).then((GetewayDataEntity value) { + if (mounted) { + setState(() {}); + } + }); + } + + @override + void initState() { + super.initState(); + + getHttpData(isRefresh: true); + } + @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.gateway!.tr, + barTitle: '网关'.tr, haveBack: true, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ GestureDetector( onTap: () { - Navigator.pushNamed(context, Routers.selectGatewayTypePage); + Get.toNamed(Routers.selectGatewayTypeNextTipPage)!.then((dynamic value) => getHttpData(isRefresh: true)); }, child: Image.asset( 'images/icon_add_white.png', @@ -38,31 +61,36 @@ class _GatewayListPageState extends State { ), ], ), - body: ListView.separated( - itemCount: 5, - itemBuilder: (c, index) { - return _gatewatListItem( - 'images/mine/icon_mine_gatewayListMainIcon.png', - "星锁网关", - "在线", - "2", () { - Navigator.pushNamed(context, Routers.gatewayDetailPage); - }); - }, - separatorBuilder: (BuildContext context, int index) { - return Divider( - height: 1, - color: AppColors.greyLineColor, - indent: 20.w, - endIndent: 0, - ); - }, - ), + body: EasyRefreshTool( + onRefresh: () { + getHttpData(isRefresh: true); + }, + onLoad: () { + getHttpData(isRefresh: false); + }, + child: state.getewayListData.isNotEmpty ?ListView.separated( + itemCount: state.getewayListData.length, + itemBuilder: (BuildContext c, int index) { + final GetewayItemData item = state.getewayListData[index]; + return _gatewatListItem(item, () { + Get.toNamed(Routers.gatewayDetailPage, arguments: { + 'getewayItemData': item + })!.then((dynamic value) => getHttpData(isRefresh: true)); + }); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider( + height: 1, + color: AppColors.greyLineColor, + indent: 20.w, + endIndent: 0, + ); + }, + ):NoData()), ); } - Widget _gatewatListItem(String lockTypeIcon, String gateWayName, - String isOnline, String lockNumber, Function() action) { + Widget _gatewatListItem(GetewayItemData getewayItemData, Function() action) { return GestureDetector( onTap: action, child: Container( @@ -75,12 +103,12 @@ class _GatewayListPageState extends State { borderRadius: BorderRadius.circular(10.w), ), child: Row( - children: [ + children: [ SizedBox( width: 10.w, ), Image.asset( - lockTypeIcon, + 'images/mine/icon_mine_gatewayListMainIcon.png', width: 60.w, height: 60.w, ), @@ -90,54 +118,49 @@ class _GatewayListPageState extends State { Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - // color: Colors.red, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - gateWayName, - style: TextStyle(fontSize: 24.sp), - ), - ], - ), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + getewayItemData.gatewayName ?? '', + style: TextStyle(fontSize: 24.sp), + ), + ], ), SizedBox(height: 5.h), - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Image.asset( - 'images/mine/icon_mine_gatewayListOnline.png', - width: 22.w, - height: 22.w, - ), - SizedBox( - width: 10.w, - ), - Text( - "在线", - style: TextStyle(fontSize: 18.sp), - ), - SizedBox( - width: 80.w, - ), - Image.asset( - 'images/mine/icon_mine_gatewayListNumber.png', - width: 22.w, - height: 22.w, - ), - SizedBox( - width: 10.w, - ), - Text( - "2", - style: TextStyle( - fontSize: 18.sp, fontWeight: FontWeight.w500), - ), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + 'images/mine/icon_mine_gatewayListOnline.png', + width: 22.w, + height: 22.w, + ), + SizedBox( + width: 10.w, + ), + Text( + getewayItemData.isOnline == 1 ? '在线' : '离线', + style: TextStyle(fontSize: 18.sp), + ), + SizedBox( + width: 80.w, + ), + Image.asset( + 'images/mine/icon_mine_gatewayListNumber.png', + width: 22.w, + height: 22.w, + ), + SizedBox( + width: 10.w, + ), + Text( + getewayItemData.lockNum.toString(), + style: TextStyle( + fontSize: 18.sp, fontWeight: FontWeight.w500), + ), + ], ), SizedBox(width: 20.h), ], diff --git a/lib/mine/gateway/gatewayList/gatewayList_state.dart b/lib/mine/gateway/gatewayList/gatewayList_state.dart new file mode 100644 index 00000000..26c33cbf --- /dev/null +++ b/lib/mine/gateway/gatewayList/gatewayList_state.dart @@ -0,0 +1,9 @@ + +import 'package:get/get.dart'; + +import '../../mineSet/transferGateway/selectGetewayList_entity.dart'; + +class GatewayListState{ + final RxList getewayListData = [].obs; + +} \ No newline at end of file diff --git a/lib/mine/mall/lockMall_logic.dart b/lib/mine/mall/lockMall_logic.dart index 0a5684e7..c9c6e204 100755 --- a/lib/mine/mall/lockMall_logic.dart +++ b/lib/mine/mall/lockMall_logic.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:fluwx/fluwx.dart'; import 'package:get/get.dart'; @@ -12,7 +11,6 @@ import 'package:star_lock/mine/mall/webview/webview_logic.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../../app_settings/app_settings.dart'; import '../../tools/baseGetXController.dart'; import '../../tools/wechat/pay/wx_pay_tool.dart'; import '../../tools/wechat/wechatManageTool.dart'; @@ -114,10 +112,10 @@ class LockMallLogic extends BaseGetXController { Get.back(); } else { if (_lastPressedAt == null || - DateTime.now().difference(_lastPressedAt!) > Duration(seconds: 2)) { + DateTime.now().difference(_lastPressedAt!) > const Duration(seconds: 2)) { // 如果两次返回键时间间隔大于 2 秒,则提示再次按下返回键退出 _lastPressedAt = DateTime.now(); - showToast('再返回一次退出${F.title}'); + showToast('再返回一次退出'.tr + F.title); return false; // 阻止返回操作 } SystemNavigator.pop(); @@ -149,9 +147,4 @@ class LockMallLogic extends BaseGetXController { super.onInit(); getMallURLRequest(); } - - @override - void onClose() { - super.onClose(); - } } diff --git a/lib/mine/mall/lockMall_state.dart b/lib/mine/mall/lockMall_state.dart index 2f7e687c..ee57e25a 100755 --- a/lib/mine/mall/lockMall_state.dart +++ b/lib/mine/mall/lockMall_state.dart @@ -6,15 +6,15 @@ import 'package:webview_flutter/webview_flutter.dart'; class LockMallState { LockMallState({required this.allowReturn}); - var lockMallUrl = "".obs; - var webProgress = 0.0.obs; + RxString lockMallUrl = ''.obs; + RxDouble webProgress = 0.0.obs; bool allowReturn; bool canGoBack = false; late WebViewController mallWebView = initWebViewController(); //初始化webView控制器 WebViewController initWebViewController() { - WebViewController allWebView = WebViewController(); + final WebViewController allWebView = WebViewController(); allWebView.setJavaScriptMode(JavaScriptMode.unrestricted); allWebView.setBackgroundColor(Colors.white); allWebView.setUserAgent(WebViewLogic.userAgent); diff --git a/lib/mine/message/messageDetail/messageDetail_logic.dart b/lib/mine/message/messageDetail/messageDetail_logic.dart index 72571baa..8614f6e2 100755 --- a/lib/mine/message/messageDetail/messageDetail_logic.dart +++ b/lib/mine/message/messageDetail/messageDetail_logic.dart @@ -9,8 +9,8 @@ class MessageDetailLogic extends BaseGetXController { final MessageDetailState state = MessageDetailState(); //请求密码钥匙列表 - void readMessageDataRequest() async { - MessageListEntity entity = await ApiRepository.to.readMessageLoadData(messageId:state.itemData.value.id!); + Future readMessageDataRequest() async { + final MessageListEntity entity = await ApiRepository.to.readMessageLoadData(messageId:state.itemData.value.id!); if (entity.errorCode!.codeIsSuccessful) { eventBus.fire(ReadMessageRefreshUI()); } @@ -18,20 +18,12 @@ class MessageDetailLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); readMessageDataRequest(); } - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - } - @override void onClose() { - // TODO: implement onClose super.onClose(); } } \ No newline at end of file diff --git a/lib/mine/message/messageDetail/messageDetail_page.dart b/lib/mine/message/messageDetail/messageDetail_page.dart index 24d6b720..4534dade 100755 --- a/lib/mine/message/messageDetail/messageDetail_page.dart +++ b/lib/mine/message/messageDetail/messageDetail_page.dart @@ -1,7 +1,9 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; +import 'package:star_lock/mine/message/messageDetail/messageDetail_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/dateTool.dart'; @@ -16,8 +18,8 @@ class MessageDetailPage extends StatefulWidget { } class _MessageDetailPageState extends State { - final logic = Get.put(MessageDetailLogic()); - final state = Get.find().state; + final MessageDetailLogic logic = Get.put(MessageDetailLogic()); + final MessageDetailState state = Get.find().state; @override Widget build(BuildContext context) { @@ -25,12 +27,12 @@ class _MessageDetailPageState extends State { backgroundColor: AppColors.mainBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: "消息详情".tr, + barTitle: '消息详情'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( - barTitle: "消息详情".tr, + barTitle: '消息详情'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -41,7 +43,7 @@ class _MessageDetailPageState extends State { margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.h), child: Obx(() => Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Text( "${"创建时间".tr}:${DateTool().dateToYMDHNString(state.itemData.value.createdAt!.toString())}", style: TextStyle( diff --git a/lib/mine/message/messageList/messageList_logic.dart b/lib/mine/message/messageList/messageList_logic.dart index dc4e0b22..6c119cee 100755 --- a/lib/mine/message/messageList/messageList_logic.dart +++ b/lib/mine/message/messageList/messageList_logic.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -8,14 +7,14 @@ import 'messageList_entity.dart'; import 'messageList_state.dart'; typedef BlockDeletSuccssCallback = void Function(); + class MessageListLogic extends BaseGetXController { final MessageListState state = MessageListState(); //请求消息列表 Future messageListDataRequest() async { - MessageListEntity entity = await ApiRepository.to.messageListLoadData( - pageNo:pageNo.toString(), - pageSize:pageSize); + final MessageListEntity entity = await ApiRepository.to + .messageListLoadData(pageNo: pageNo.toString(), pageSize: pageSize); if (entity.errorCode!.codeIsSuccessful) { if (pageNo == 1) { state.itemDataList.value = entity.data!.list!; @@ -31,16 +30,19 @@ class MessageListLogic extends BaseGetXController { } // 删除消息 - void deletMessageDataRequest(String messageId, BlockDeletSuccssCallback blockDeletSuccssCallback) async { - MessageListEntity entity = await ApiRepository.to.deletMessageLoadData(messageId:messageId); + Future deletMessageDataRequest(String messageId, + BlockDeletSuccssCallback blockDeletSuccssCallback) async { + final MessageListEntity entity = + await ApiRepository.to.deletMessageLoadData(messageId: messageId); if (entity.errorCode!.codeIsSuccessful) { blockDeletSuccssCallback(); } } // 清空消息 - void deletAllMessageDataRequest() async { - MessageListEntity entity = await ApiRepository.to.deletAllMessageLoadData(); + Future deletAllMessageDataRequest() async { + final MessageListEntity entity = + await ApiRepository.to.deletAllMessageLoadData(); if (entity.errorCode!.codeIsSuccessful) { pageNo = 1; messageListDataRequest(); @@ -49,9 +51,11 @@ class MessageListLogic extends BaseGetXController { // 刷新消息列表 StreamSubscription? _readMessageRefreshUIEvent; + void _readMessageRefreshUIAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _readMessageRefreshUIEvent = eventBus.on().listen((event) { + _readMessageRefreshUIEvent = + eventBus.on().listen((event) { pageNo = 1; messageListDataRequest(); }); @@ -59,24 +63,23 @@ class MessageListLogic extends BaseGetXController { @override void onReady() { - // TODO: implement onReady super.onReady(); // messageListDataRequest(); _readMessageRefreshUIAction(); - } - @override - void onInit() { - // TODO: implement onInit - super.onInit(); + // 收到切换语言消息,重新拉取一下列表 + eventBus + .on() + .listen((ChangeLanguageBlockLastLanguageEvent event) { + pageNo = 1; + messageListDataRequest(); + }); } @override void onClose() { - // TODO: implement onClose super.onClose(); _readMessageRefreshUIEvent?.cancel(); } - -} \ No newline at end of file +} diff --git a/lib/mine/message/messageList/messageList_page.dart b/lib/mine/message/messageList/messageList_page.dart index c6d5aba9..dd0cb4ed 100755 --- a/lib/mine/message/messageList/messageList_page.dart +++ b/lib/mine/message/messageList/messageList_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/message/messageList/messageList_state.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/noData.dart'; import '../../../appRouters.dart'; @@ -10,10 +13,8 @@ import '../../../tools/dateTool.dart'; import '../../../tools/showTipView.dart'; import '../../../tools/storage.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'messageList_entity.dart'; import 'messageList_logic.dart'; -import 'package:flutter_slidable/flutter_slidable.dart'; class MessageListPage extends StatefulWidget { MessageListPage({Key? key, this.showAppBar = true}) : super(key: key); @@ -25,8 +26,8 @@ class MessageListPage extends StatefulWidget { class _MessageListPageState extends State with TickerProviderStateMixin { - final logic = Get.put(MessageListLogic()); - final state = Get.find().state; + final MessageListLogic logic = Get.put(MessageListLogic()); + final MessageListState state = Get.find().state; void getHttpData() { logic.messageListDataRequest().then((MessageListEntity value) { @@ -47,26 +48,28 @@ class _MessageListPageState extends State backgroundColor: AppColors.mainBackgroundColor, appBar: widget.showAppBar ? TitleAppBar( - barTitle: TranslationLoader.lanKeys!.message!.tr, + barTitle: '消息'.tr, haveBack: true, - actionsList: [ - TextButton( - child: Text( - "清空".tr, - style: TextStyle(color: Colors.white, fontSize: 24.sp), - ), - onPressed: () async { - var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - ShowTipView().showIosTipWithContentDialog("是否清空?".tr, () async { - logic.deletAllMessageDataRequest(); - }); - } else { - logic.showToast("演示模式".tr); - } - }, - ), - ], + actionsList: [ + TextButton( + child: Text( + '清空'.tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: () async { + final bool? isDemoMode = + await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + ShowTipView().showIosTipWithContentDialog('是否清空?'.tr, + () async { + logic.deletAllMessageDataRequest(); + }); + } else { + logic.showToast('演示模式'.tr); + } + }, + ), + ], backgroundColor: AppColors.mainColor) : null, body: EasyRefreshTool(onRefresh: () { @@ -80,15 +83,15 @@ class _MessageListPageState extends State : SlidableAutoCloseBehavior( child: ListView.builder( itemCount: state.itemDataList.value.length, - itemBuilder: (c, index) { - MessageItemEntity messageItemEntity = + itemBuilder: (BuildContext c, int index) { + final MessageItemEntity messageItemEntity = state.itemDataList.value[index]; return Slidable( key: ValueKey(messageItemEntity.id), endActionPane: ActionPane( extentRatio: 0.2, motion: const ScrollMotion(), - children: [ + children: [ SlidableAction( onPressed: (BuildContext context) { logic.deletMessageDataRequest( @@ -105,9 +108,10 @@ class _MessageListPageState extends State ], ), child: _messageListItem(messageItemEntity, () { - Get.toNamed(Routers.messageDetailPage, arguments: { - "messageItemEntity": messageItemEntity - }); + Get.toNamed(Routers.messageDetailPage, + arguments: { + 'messageItemEntity': messageItemEntity + }); }), ); }), @@ -133,18 +137,24 @@ class _MessageListPageState extends State margin: EdgeInsets.only(left: 20.w, right: 20.w), child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ Row( - children: [ - messageItemEntity.readAt! == 0 ? Container( - width: 10.w, - height: 10.w, - decoration: BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.circular(5.w), - ), - ):Container(), - messageItemEntity.readAt! == 0 ? SizedBox(width: 5.w) : Container(), + children: [ + if (messageItemEntity.readAt! == 0) + Container( + width: 10.w, + height: 10.w, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(5.w), + ), + ) + else + Container(), + if (messageItemEntity.readAt! == 0) + SizedBox(width: 5.w) + else + Container(), Flexible( child: Text( messageItemEntity.data!, @@ -162,7 +172,7 @@ class _MessageListPageState extends State SizedBox(height: 10.h), Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ // Image.asset('images/mine/icon_mine_gatewaySignal_strong.png', width: 40.w, height: 40.w,), // SizedBox(width: 10.w,), Text( diff --git a/lib/mine/message/messageList/messageList_xhj_page.dart b/lib/mine/message/messageList/messageList_xhj_page.dart index ace80c85..f1b9710e 100755 --- a/lib/mine/message/messageList/messageList_xhj_page.dart +++ b/lib/mine/message/messageList/messageList_xhj_page.dart @@ -1,5 +1,7 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; import 'package:star_lock/mine/message/messageList/messageList_state.dart'; import 'package:star_lock/tools/noData.dart'; @@ -10,11 +12,8 @@ import '../../../tools/EasyRefreshTool.dart'; import '../../../tools/dateTool.dart'; import '../../../tools/showTipView.dart'; import '../../../tools/storage.dart'; -import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'messageList_entity.dart'; import 'messageList_logic.dart'; -import 'package:flutter_slidable/flutter_slidable.dart'; class MessageListXHJPage extends StatefulWidget { MessageListXHJPage({Key? key, this.showAppBar = true}) : super(key: key); diff --git a/lib/mine/mine/safeVerify/safeVerify_logic.dart b/lib/mine/mine/safeVerify/safeVerify_logic.dart index c590b381..3382bf78 100755 --- a/lib/mine/mine/safeVerify/safeVerify_logic.dart +++ b/lib/mine/mine/safeVerify/safeVerify_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/cupertino.dart'; @@ -6,13 +7,14 @@ import 'package:get/get_navigation/src/extension_navigation.dart'; import 'package:get/get_utils/get_utils.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; +import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; +import 'package:star_lock/login/selectCountryRegion/common/index.dart'; import 'package:star_lock/mine/mine/safeVerify/safeVerify_state.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/storage.dart'; import '../../../login/login/entity/LoginData.dart'; -import 'package:star_lock/login/selectCountryRegion/common/index.dart'; -import 'package:star_lock/tools/storage.dart'; class SafeVerifyLogic extends BaseGetXController { final SafeVerifyState state = SafeVerifyState(); @@ -36,9 +38,9 @@ class SafeVerifyLogic extends BaseGetXController { //获取验证码请求 void sendValidationCode() async { - var entity = await ApiRepository.to.sendValidationCodeAuth( - countryCode: "", - account: "", + final SendValidationCodeEntity entity = await ApiRepository.to.sendValidationCodeAuth( + countryCode: '', + account: '', channel: state.channel.value, codeType: state.codeType.value, xWidth: state.xWidth.value.toString()); @@ -49,10 +51,10 @@ class SafeVerifyLogic extends BaseGetXController { //删除账号请求 Future deleteAccountRequest() async { - LoginEntity entity = + final LoginEntity entity = await ApiRepository.to.deleteAccount(state.channel.value, state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { - showToast("验证成功,账号已删除"); + showToast('验证成功,账号已删除'.tr); //删除账号成功, Get.offNamedUntil(Routers.starLockLoginPage, (route) => false); } @@ -81,7 +83,7 @@ class SafeVerifyLogic extends BaseGetXController { ///初始化本地数据 void initLoginData() async { - final data = await Storage.getString(saveUserLoginData); + final String? data = await Storage.getString(saveUserLoginData); if (data != null && data.isNotEmpty) { state.loginData.value = LoginData.fromJson(jsonDecode(data)); bool mobileIsNotEmpty = state.loginData.value.mobile != null && state.loginData.value.mobile!.isNotEmpty; @@ -105,20 +107,10 @@ class SafeVerifyLogic extends BaseGetXController { } } - @override - void onReady() { - super.onReady(); - } - @override void onInit() { super.onInit(); initLoginData(); } - - @override - void onClose() { - super.onClose(); - } } diff --git a/lib/mine/mine/safeVerify/safeVerify_page.dart b/lib/mine/mine/safeVerify/safeVerify_page.dart index 01f1b863..ac73e112 100755 --- a/lib/mine/mine/safeVerify/safeVerify_page.dart +++ b/lib/mine/mine/safeVerify/safeVerify_page.dart @@ -1,12 +1,11 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/mine/mine/safeVerify/safeVerify_logic.dart'; +import 'package:star_lock/mine/mine/safeVerify/safeVerify_state.dart'; import 'package:star_lock/tools/submitBtn.dart'; import 'package:star_lock/tools/titleAppBar.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class SafeVerifyPage extends StatefulWidget { const SafeVerifyPage({Key? key}) : super(key: key); @@ -16,8 +15,8 @@ class SafeVerifyPage extends StatefulWidget { } class _SafeVerifyPageState extends State { - final logic = Get.put(SafeVerifyLogic()); - final state = Get.find().state; + final SafeVerifyLogic logic = Get.put(SafeVerifyLogic()); + final SafeVerifyState state = Get.find().state; @override void initState() { @@ -30,7 +29,7 @@ class _SafeVerifyPageState extends State { resizeToAvoidBottomInset: false, backgroundColor: const Color(0xFFFFFFFF), appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.safeVerify!.tr, + barTitle: '安全验证'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: safeVerifyColumn()); @@ -69,25 +68,24 @@ class _SafeVerifyPageState extends State { height: 30.h, ), Obx(() => GestureDetector( - onTap: (){ - if(state.canResend.value){ - logic.sendValidationCode(); - } - }, - child: Container( - padding: EdgeInsets.only(left:20.w, right: 20.w, top: 10.h, bottom: 10.h), + onTap: () { + if (state.canResend.value) { + logic.sendValidationCode(); + } + }, + child: Container( + padding: EdgeInsets.only( + left: 20.w, right: 20.w, top: 10.h, bottom: 10.h), // height: 60.h, width: 200.w, decoration: BoxDecoration( color: AppColors.mainColor, - borderRadius: BorderRadius.circular(10.h), - // borderRadius: BorderRadius.circular(30.w) + borderRadius: BorderRadius.circular(10.h), + // borderRadius: BorderRadius.circular(30.w) ), - child:Text(state.btnText.value, + child: Text(state.btnText.value, textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 22.sp)), + style: TextStyle(color: Colors.white, fontSize: 22.sp)), // SubmitBtn( // btnName: state.btnText.value, // onClick: state.canResend.value ? () { @@ -95,7 +93,7 @@ class _SafeVerifyPageState extends State { // } : null, // ), ), - )), + )), SizedBox( height: 60.h, ), @@ -103,53 +101,52 @@ class _SafeVerifyPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Obx(() => Padding( - padding: EdgeInsets.only(left: 60.w, right: 60.w), - child: Text( - '请点击获取验证码,验证码将发送到${state.accountStr.value}', - style: TextStyle( - color: AppColors.darkGrayTextColor, fontSize: 22.sp), - ), - )), + padding: EdgeInsets.only(left: 60.w, right: 60.w), + child: Text( + '${'请点击获取验证码,验证码将发送到'.tr}${state.accountStr.value}', + style: TextStyle( + color: AppColors.darkGrayTextColor, fontSize: 22.sp), + ), + )), SizedBox(height: 10.h), Obx(() => Visibility( - visible: state.isToggle.value, - child: GestureDetector( - onTap: (){ - if(state.channel.value == '1'){ - // 手机号切换为邮箱 - state.channel.value = '2'; - state.accountStr.value = state.loginData.value.email!; - }else{ - // 邮箱切换为手机号 - state.channel.value = '1'; - state.accountStr.value = state.loginData.value.mobile!; - } - }, - child: Container( - margin: EdgeInsets.only(left: 60.w, right: 60.w), - padding: EdgeInsets.only(left:10.w, right: 10.w, top: 5.h, bottom: 5.h), - // height: 60.h, - width: 100.w, - decoration: BoxDecoration( - color: AppColors.mainColor, - borderRadius: BorderRadius.circular(10.h), - // borderRadius: BorderRadius.circular(30.w) + visible: state.isToggle.value, + child: GestureDetector( + onTap: () { + if (state.channel.value == '1') { + // 手机号切换为邮箱 + state.channel.value = '2'; + state.accountStr.value = state.loginData.value.email!; + } else { + // 邮箱切换为手机号 + state.channel.value = '1'; + state.accountStr.value = state.loginData.value.mobile!; + } + }, + child: Container( + margin: EdgeInsets.only(left: 60.w, right: 60.w), + padding: EdgeInsets.all(10.w), + // height: 60.h, + // width: 100.w, + decoration: BoxDecoration( + color: AppColors.mainColor, + borderRadius: BorderRadius.circular(10.h), + // borderRadius: BorderRadius.circular(30.w) + ), + child: Text('切换'.tr, + textAlign: TextAlign.center, + style: + TextStyle(color: Colors.white, fontSize: 22.sp)), + ), ), - child:Text("切换", - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 22.sp)), - ), - ), - )), + )), ], ), SizedBox( height: 120.h, ), Obx(() => SubmitBtn( - btnName: '验证', + btnName: '验证'.tr, isDisabled: state.canSub.value, onClick: () { logic.deleteAccountRequest(); diff --git a/lib/mine/mine/safeVerify/safeVerify_state.dart b/lib/mine/mine/safeVerify/safeVerify_state.dart index 894d2cc4..49b8fa8d 100755 --- a/lib/mine/mine/safeVerify/safeVerify_state.dart +++ b/lib/mine/mine/safeVerify/safeVerify_state.dart @@ -1,45 +1,44 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/login/login/entity/LoginData.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class SafeVerifyState { + + SafeVerifyState() { + resetResend(); + } final TextEditingController codeController = TextEditingController(); static int currentTimeMillis() { return DateTime.now().millisecondsSinceEpoch; } - var countryCode = '+86'.obs; - var countryId = '9'.obs; - var codeType = '5'.obs; // //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) - var verificationCode = ''.obs; - var xWidth = ''.obs; // 滑动验证码滑动位置 - var canSub = false.obs; - var date = currentTimeMillis().toString().obs; - var accountStr = ''.obs; - var toggleStr = ''.obs; //可切换字眼 - var isToggle = false.obs; //是否点击切换 - var channel = '1'.obs; //短信通道 1 短信,2 邮箱 + RxString countryCode = '+86'.obs; + RxString countryId = '9'.obs; + RxString codeType = '5'.obs; // //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) + RxString verificationCode = ''.obs; + RxString xWidth = ''.obs; // 滑动验证码滑动位置 + RxBool canSub = false.obs; + RxString date = currentTimeMillis().toString().obs; + RxString accountStr = ''.obs; + RxString toggleStr = ''.obs; //可切换字眼 + RxBool isToggle = false.obs; //是否点击切换 + RxString channel = '1'.obs; //短信通道 1 短信,2 邮箱 bool get codeIsOK => verificationCode.value.isNotEmpty; - var canResend = false.obs; - var btnText = ''.obs; - var totalSeconds = 120; - var currentSecond = 120; + RxBool canResend = false.obs; + RxString btnText = ''.obs; + int totalSeconds = 120; + int currentSecond = 120; - final loginData = LoginData().obs; - - SafeVerifyState() { - resetResend(); - } + final Rx loginData = LoginData().obs; void resetResend() { canResend.value = totalSeconds == currentSecond; btnText.value = !canResend.value ? '$currentSecond s' - : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + : btnText.value = '获取验证码'.tr; } void onClose() {} diff --git a/lib/mine/mine/starLockMine_logic.dart b/lib/mine/mine/starLockMine_logic.dart index c1d1bdf2..9e69a978 100755 --- a/lib/mine/mine/starLockMine_logic.dart +++ b/lib/mine/mine/starLockMine_logic.dart @@ -28,7 +28,6 @@ class StarLockMineLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) {} } - /// 刷新电子钥匙列表 StreamSubscription? _mineInfoChangeRefreshUIEvent; void _mineInfoChangeRefreshUIAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus diff --git a/lib/mine/mine/starLockMine_page.dart b/lib/mine/mine/starLockMine_page.dart index e1e98bf1..fad1ad1d 100755 --- a/lib/mine/mine/starLockMine_page.dart +++ b/lib/mine/mine/starLockMine_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -13,6 +12,7 @@ import '../../baseWidget.dart'; import '../../tools/customNetworkImage.dart'; import '../../tools/submitBtn.dart'; import '../../tools/wechat/wechatManageTool.dart'; +import '../../tools/wechat/wx_push_miniProgram/wx_push_miniProgram.dart'; import 'starLockMine_logic.dart'; class StarLockMinePage extends StatefulWidget { @@ -43,7 +43,24 @@ class StarLockMinePageState extends State with BaseWidget { topWidget(), bottomListWidget(), SizedBox( - height: 40.h, + height: 80.h, + ), + GestureDetector( + onTap: () { + WechatManageTool.getAppInfo(() { + WxPushWeChatMiniProgramTool.pushWeChatMiniProgram( + 'wxbe340095d2b8fd51'); + }); + }, + child: Padding( + padding: EdgeInsets.only(left: 20.w, right: 20.w), + child: Image.asset( + 'images/mine/icon_mine_wan_miniprogram.png', + // width: 400.w, + // height: 151.h, + fit: BoxFit.fill, + ), + ), ), ], ), @@ -152,19 +169,14 @@ class StarLockMinePageState extends State with BaseWidget { } Widget bottomListWidget() { - return Expanded( - child: ListView( - padding: EdgeInsets.only( - left: 60.w, - top: 50.h, - ), - children: [ - // mineItem('images/mine/icon_mine_main_personInfo.png', - // TranslationLoader.lanKeys!.personalInformation!.tr, () { - // Navigator.pushNamed(context, Routers.minePersonInfoPage); - // }), - mineItem('images/mine/icon_mine_main_addLock.png', - '添加设备'.tr, () { + return Container( + padding: EdgeInsets.only( + left: 60.w, + top: 50.h, + ), + child: Column( + children: [ + mineItem('images/mine/icon_mine_main_addLock.png', '添加设备'.tr, () { Get.back(); Get.toNamed(Routers.selectLockTypePage); }), @@ -172,8 +184,7 @@ class StarLockMinePageState extends State with BaseWidget { // TranslationLoader.lanKeys!.gateway!.tr, () { // Navigator.pushNamed(context, Routers.gatewayListPage); // }), - mineItem('images/mine/icon_mine_main_message.png', - '消息'.tr, () { + mineItem('images/mine/icon_mine_main_message.png', '消息'.tr, () { Get.back(); Get.toNamed(Routers.messageListPage); // Toast.show(msg: "功能暂未开放"); @@ -183,31 +194,30 @@ class StarLockMinePageState extends State with BaseWidget { // TranslationLoader.lanKeys!.supportStaff!.tr, () { // Navigator.pushNamed(context, Routers.supportStaffPage); // }), - mineItem('images/mine/icon_mine_main_set.png', - '设置'.tr, () { + mineItem('images/mine/icon_mine_main_set.png', '设置'.tr, () { Get.back(); Get.toNamed(Routers.mineSetPage); }), //上架审核 - if (F.isLite) - Container() - else - mineItem('images/mine/icon_mine_main_vip.png', '增值服务'.tr, () { - Get.back(); - Get.toNamed(Routers.valueAddedServicesPage); - }), - if (F.isLite) - Container() - else - mineItem('images/mine/icon_mine_main_shoppingcart.png', '配件商城'.tr, + // if (F.isLite) + // Container() + // else + mineItem('images/mine/icon_mine_main_vip.png', '增值服务'.tr, () { + Get.back(); + Get.toNamed(Routers.valueAddedServicesPage); + }), + // if (F.isLite) + // Container() + // else + mineItem('images/mine/icon_mine_main_shoppingcart.png', '配件商城'.tr, + () { + Get.back(); + Get.toNamed(Routers.lockMallPage); + }), + if (F.isSKY && Get.locale!.languageCode == 'zh') + mineItem('images/mine/icon_mine_main_supportStaff.png', '客服'.tr, () { Get.back(); - Get.toNamed(Routers.lockMallPage); - }), - if (F.isSKY) - mineItem('images/mine/icon_mine_main_shoppingcart.png', - '客服'.tr, () { - Get.back(); WechatManageTool.getAppInfo(CustomerTool.openCustomerService); }), mineItem('images/mine/icon_mine_main_about.png', '关于'.tr, () { @@ -219,39 +229,39 @@ class StarLockMinePageState extends State with BaseWidget { ); } - Widget keyBottomWidget() { - return Column( - children: [ - SubmitBtn( - btnName: '退出'.tr, - borderRadius: 20.w, - fontSize: 32.sp, - margin: EdgeInsets.only(left: 60.w, right: 60.w), - padding: EdgeInsets.only(top: 15.w, bottom: 15.w), - onClick: () {}), - Container( - padding: EdgeInsets.only(right: 30.w), - // color: Colors.red, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - child: Text( - '删除账号'.tr, - style: TextStyle( - color: AppColors.mainColor, fontWeight: FontWeight.w500), - ), - onPressed: () {}, - ), - ], - ), - ), - SizedBox( - height: 30.h, - ) - ], - ); - } + // Widget keyBottomWidget() { + // return Column( + // children: [ + // SubmitBtn( + // btnName: '退出'.tr, + // borderRadius: 20.w, + // fontSize: 32.sp, + // margin: EdgeInsets.only(left: 60.w, right: 60.w), + // padding: EdgeInsets.only(top: 15.w, bottom: 15.w), + // onClick: () {}), + // Container( + // padding: EdgeInsets.only(right: 30.w), + // // color: Colors.red, + // child: Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // TextButton( + // child: Text( + // '删除账号'.tr, + // style: TextStyle( + // color: AppColors.mainColor, fontWeight: FontWeight.w500), + // ), + // onPressed: () {}, + // ), + // ], + // ), + // ), + // SizedBox( + // height: 30.h, + // ) + // ], + // ); + // } Widget mineItem( String lockTypeIcon, String lockTypeTitle, Function() action) { diff --git a/lib/mine/mineMultiLanguage/mineMultiLanguage_logic.dart b/lib/mine/mineMultiLanguage/mineMultiLanguage_logic.dart index 6d011497..459615f6 100755 --- a/lib/mine/mineMultiLanguage/mineMultiLanguage_logic.dart +++ b/lib/mine/mineMultiLanguage/mineMultiLanguage_logic.dart @@ -1,14 +1,36 @@ - import 'dart:ui'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import '../../main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; +import '../../network/api_repository.dart'; +import '../../tools/eventBusEventManage.dart'; +import '../../tools/store_service.dart'; +import '../../translations/app_dept.dart'; +import '../../translations/current_locale_tool.dart'; import 'mineMultiLanguage_state.dart'; class MineMultiLanguageLogic extends GetxController { final MineMultiLanguageState state = MineMultiLanguageState(); - void changeLanguage(Locale l) { - if(l == Get.locale)return; - Get.updateLocale(l); - state.resetLan(); + //更新个人信息 + Future updateUserLangInfo(Locale l) async { + // AppLog.log('lanTypeTitle: $lanTypeTitle'); + String lang = l.toString(); + if (state.currentLanguageType.value == LanguageType.system) { + lang = ''; + } + final PasswordKeyListEntity entity = + await ApiRepository.to.updateUserLangInfo(lang: lang); + if (entity.errorCode!.codeIsSuccessful) { + await changeLanguage(l); + eventBus.fire(ChangeLanguageBlockLastLanguageEvent()); + } } -} \ No newline at end of file + + Future changeLanguage(Locale l) async { + await Get.updateLocale(l); + await StoreService.to.saveLanguageCode( + CurrentLocaleTool.convertLocale(Get.locale!).toString()); + } +} diff --git a/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart b/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart index 623bcdc2..87e1c395 100755 --- a/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart +++ b/lib/mine/mineMultiLanguage/mineMultiLanguage_page.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/mineMultiLanguage/mineMultiLanguage_state.dart'; +import 'package:star_lock/translations/current_locale_tool.dart'; import '../../app_settings/app_colors.dart'; import '../../tools/commonItem.dart'; -import '../../tools/eventBusEventManage.dart'; import '../../tools/titleAppBar.dart'; import '../../translations/app_dept.dart'; -import '../../translations/trans_lib.dart'; import 'mineMultiLanguage_logic.dart'; class MineMultiLanguagePage extends StatefulWidget { @@ -18,60 +18,94 @@ class MineMultiLanguagePage extends StatefulWidget { } class _MineMultiLanguagePageState extends State { - final logic = Get.put(MineMultiLanguageLogic()); - final state = Get.find().state; + final MineMultiLanguageLogic logic = Get.put(MineMultiLanguageLogic()); + final MineMultiLanguageState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.multilingual!.tr, - haveBack: true, - backgroundColor: AppColors.mainColor), - body: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: _children(), - ) - ); + barTitle: '多语言'.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + onPressed: () async { + await logic.updateUserLangInfo(state.seletLocale); + final String lanTypeTitle = + ExtensionLanguageType.fromLocale(state.seletLocale) + .lanTitle; + Get.back(result: {'currentLanguage': lanTypeTitle}); + }, + child: Text( + '保存'.tr, + style: TextStyle( + color: Colors.white, + fontSize: 22.sp, + ), + ), + ), + ], + ), + body: Obx(() => ListView( + // mainAxisAlignment: MainAxisAlignment.start, + // mainAxisSize: MainAxisSize.min, + children: _children(), + ))); } List _children() { - List l = []; - // l.add( - // CommonItem( - // leftTitel: '跟随系统', - // rightTitle: "", - // isHaveLine: true, - // isHaveDirection: false, - // isHaveRightWidget: true, - // rightWidget: Container(), - // action: () { - // // logic.changeLanguage(e); - // }), - // ); + final List l = []; + l.add( + CommonItem( + leftTitel: '跟随系统', + rightTitle: '', + isHaveLine: true, + isHaveDirection: false, + isHaveRightWidget: true, + rightWidget: state.currentLanguageType.value == LanguageType.system + ? Image( + image: const AssetImage('images/icon_item_checked.png'), + width: 30.w, + height: 30.w, + fit: BoxFit.contain, + ) + : Container(), + action: () { + state.seletLocale = + CurrentLocaleTool.convertLocale(Get.deviceLocale!); + state.currentLanguageType.value = LanguageType.system; + }), + ); for (int i = 0; i < state.languages.length; i++) { - var e = state.languages[i]; - var lanType = ExtensionLanguageType.fromLanguageCode(e.languageCode); + final Locale e = state.languages[i]; + final LanguageType lanType = ExtensionLanguageType.fromLocale(e); + // AppLog.log('e:$e lanType:$lanType state.currentLanguageType.value:${state.currentLanguageType.value} Get.locale!.languageCode:${Get.locale!.languageCode} Get.locale!.countryCode:${Get.locale!.countryCode}'); + + if (state.currentLanguageType.value == lanType) { + state.seletLocale = e; + } l.add( CommonItem( leftTitel: lanType.lanTitle, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveDirection: false, isHaveRightWidget: true, - rightWidget: Obx(() => state.currentLanguageType.value == lanType + rightWidget: state.currentLanguageType.value == lanType ? Image( - image: const AssetImage("images/icon_item_checked.png"), + image: const AssetImage('images/icon_item_checked.png'), width: 30.w, height: 30.w, fit: BoxFit.contain, ) - : Container()), + : Container(), action: () { - logic.changeLanguage(e); - eventBus.fire(ChangeLanguageBlockLastLanguageEvent(lanType.lanTitle)); + // logic.updateUserLangInfo(e); + state.seletLocale = e; + state.currentLanguageType.value = + ExtensionLanguageType.fromLocale(state.seletLocale); }), ); } diff --git a/lib/mine/mineMultiLanguage/mineMultiLanguage_state.dart b/lib/mine/mineMultiLanguage/mineMultiLanguage_state.dart index b20d4dea..c424b8e9 100755 --- a/lib/mine/mineMultiLanguage/mineMultiLanguage_state.dart +++ b/lib/mine/mineMultiLanguage/mineMultiLanguage_state.dart @@ -1,4 +1,3 @@ - import 'dart:ui'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; @@ -7,20 +6,16 @@ import '../../tools/store_service.dart'; import '../../translations/app_dept.dart'; class MineMultiLanguageState { + // MineMultiLanguageState() { + // resetLan(); + // } List get languages { return appDept.deptSupportedLocales; } - var currentLanguageType = ExtensionLanguageType.fromLanguageCode(Get.locale!.languageCode).obs; + Rx currentLanguageType = + ExtensionLanguageType.fromLocale(Get.locale!).obs; - MineMultiLanguageState() { - resetLan(); - } - - void resetLan() { - currentLanguageType.value = ExtensionLanguageType.fromLanguageCode(Get.locale!.languageCode); - AppLog.log("currentLanguageType.value:${currentLanguageType.value}"); - StoreService.to.saveLanguageCode(Get.locale!.languageCode); - } -} \ No newline at end of file + late Locale seletLocale; +} diff --git a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart index 64dd0f93..fce7e2bf 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart @@ -1,9 +1,11 @@ + import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:get/get_navigation/src/extension_navigation.dart'; import 'package:get/get_utils/get_utils.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -14,7 +16,7 @@ class MineUnbindPhoneOrEmailLogic extends BaseGetXController { late Timer _timer; void _startTimer() { - _timer = Timer.periodic(1.seconds, (timer) { + _timer = Timer.periodic(1.seconds, (Timer timer) { if (state.currentSecond > 1) { state.currentSecond--; } else { @@ -30,8 +32,8 @@ class MineUnbindPhoneOrEmailLogic extends BaseGetXController { } //获取验证码请求 - void sendValidationCode() async { - var entity = await ApiRepository.to.sendValidationCodeAuth( + Future sendValidationCode() async { + final SendValidationCodeEntity entity = await ApiRepository.to.sendValidationCodeAuth( countryCode: '', account: '', channel:state.channel.value, @@ -44,26 +46,26 @@ class MineUnbindPhoneOrEmailLogic extends BaseGetXController { //获取解绑手机号Token Future unbindPhoneTokenRequest() async { - MineUnbindPhoneOrEmailEntity entity = + final MineUnbindPhoneOrEmailEntity entity = await ApiRepository.to.unbindPhoneToken(state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { state.unbindToken.value = entity.data!.token!; - Get.toNamed(Routers.mineBindPhoneOrEmailPage, arguments: { - "isFrom": state.channel.value, - "unbindToken": state.unbindToken.value + Get.toNamed(Routers.mineBindPhoneOrEmailPage, arguments: { + 'isFrom': state.channel.value, + 'unbindToken': state.unbindToken.value }); } } //获取解绑邮箱Token Future unbindEmailTokenRequest() async { - MineUnbindPhoneOrEmailEntity entity = + final MineUnbindPhoneOrEmailEntity entity = await ApiRepository.to.unbindEmailToken(state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { state.unbindToken.value = entity.data!.token!; - Get.toNamed(Routers.mineBindPhoneOrEmailPage, arguments: { - "isFrom": state.channel.value, - "unbindToken": state.unbindToken.value + Get.toNamed(Routers.mineBindPhoneOrEmailPage, arguments: { + 'isFrom': state.channel.value, + 'unbindToken': state.unbindToken.value }); } } @@ -83,18 +85,4 @@ class MineUnbindPhoneOrEmailLogic extends BaseGetXController { state.canSub.value = state.codeIsOK; } - @override - void onReady() { - super.onReady(); - } - - @override - void onInit() { - super.onInit(); - } - - @override - void onClose() { - super.onClose(); - } } diff --git a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart index ed736c82..d656135c 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart @@ -1,27 +1,27 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart'; import 'package:star_lock/tools/tf_input_haveBorder.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class MineUnbindPhoneOrEmailPage extends StatefulWidget { const MineUnbindPhoneOrEmailPage({Key? key}) : super(key: key); @override - State createState() => - _MineUnbindPhoneOrEmailState(); + State createState() => _MineUnbindPhoneOrEmailState(); } class _MineUnbindPhoneOrEmailState extends State { - final logic = Get.put(MineUnbindPhoneOrEmailLogic()); - final state = Get.find().state; + final MineUnbindPhoneOrEmailLogic logic = Get.put(MineUnbindPhoneOrEmailLogic()); + final MineUnbindPhoneOrEmailState state = Get.find().state; @override Widget build(BuildContext context) { @@ -29,12 +29,12 @@ class _MineUnbindPhoneOrEmailState extends State { backgroundColor: AppColors.mainBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, + barTitle: '修改账号'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, + barTitle: '修改账号'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -42,13 +42,13 @@ class _MineUnbindPhoneOrEmailState extends State { ), ), body: Column( - children: [ + children: [ Container( width: 1.sw, color: AppColors.greyBackgroundColor, padding: EdgeInsets.only(left: 15.w, top: 10.h, bottom: 10.h), child: Text( - TranslationLoader.lanKeys!.modifyAccountTip!.tr, + '为了你的账号安全,修改账号前请先使用验证码验证'.tr, style: TextStyle(fontSize: 20.sp), )), Obx(() => Container( @@ -79,7 +79,7 @@ class _MineUnbindPhoneOrEmailState extends State { )))), SizedBox(height: 50.w), Obx(() => SubmitBtn( - btnName: TranslationLoader.lanKeys!.next!.tr, + btnName: '下一步'.tr, isDisabled: state.canSub.value, onClick: () { if (state.channel.value == '1') { @@ -91,7 +91,7 @@ class _MineUnbindPhoneOrEmailState extends State { SizedBox(height: 50.w), Row( mainAxisAlignment: MainAxisAlignment.end, - children: [ + children: [ GestureDetector( child: SizedBox( // width: 150.w, @@ -99,7 +99,7 @@ class _MineUnbindPhoneOrEmailState extends State { // color: Colors.red, child: Center( child: Text( - '${TranslationLoader.lanKeys!.forgetPassword!.tr}?', + '${'忘记密码'.tr}?', style: TextStyle( fontSize: 18.sp, color: AppColors.mainColor)), ), diff --git a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart index 2a03136b..6048cd79 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart @@ -1,36 +1,13 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class MineUnbindPhoneOrEmailState { - final TextEditingController codeController = TextEditingController(); - - static int currentTimeMillis() { - return DateTime.now().millisecondsSinceEpoch; - } - - var countryCode = ''.obs; - var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) - var channel = '1'.obs; //短信通道 1 短信,2 邮箱 - var unbindToken = ''.obs; //解绑Token - var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; - var mobileOrEmailStr = ''.obs; - var verificationCode = ''.obs; - var xWidth = ''.obs; // 滑动验证码滑动位置 - var canSub = false.obs; - var date = currentTimeMillis().toString().obs; - - bool get codeIsOK => verificationCode.value.isNotEmpty; - - var canResend = false.obs; - var btnText = ''.obs; - var totalSeconds = 120; - var currentSecond = 120; MineUnbindPhoneOrEmailState() { Map map = Get.arguments; - channel.value = map["isFrom"]; - if (channel.value == "1") { + channel.value = map['isFrom']; + if (channel.value == '1') { mobileOrEmailStr.value = map['mobile']; codeType.value = '4'; } else { @@ -40,12 +17,35 @@ class MineUnbindPhoneOrEmailState { resetResend(); } + final TextEditingController codeController = TextEditingController(); + + static int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } + + RxString countryCode = ''.obs; + RxString codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) + RxString channel = '1'.obs; //短信通道 1 短信,2 邮箱 + RxString unbindToken = ''.obs; //解绑Token + RxString uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; + RxString mobileOrEmailStr = ''.obs; + RxString verificationCode = ''.obs; + RxString xWidth = ''.obs; // 滑动验证码滑动位置 + RxBool canSub = false.obs; + RxString date = currentTimeMillis().toString().obs; + + bool get codeIsOK => verificationCode.value.isNotEmpty; + + RxBool canResend = false.obs; + RxString btnText = ''.obs; + int totalSeconds = 120; + int currentSecond = 120; void resetResend() { canResend.value = totalSeconds == currentSecond; btnText.value = !canResend.value ? '$currentSecond s' - : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + : btnText.value = '获取验证码'.tr; } void onClose() {} diff --git a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart index 87b00cef..68b12099 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart @@ -1,9 +1,6 @@ -import 'dart:async'; import 'package:flutter/cupertino.dart'; -import 'package:get/get_utils/get_utils.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart'; -import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; class PersonInfoEditAccountLogic extends BaseGetXController { @@ -55,19 +52,9 @@ class PersonInfoEditAccountLogic extends BaseGetXController { state.canSub.value = state.codeIsOK; } - @override - void onReady() { - super.onReady(); - } - @override void onInit() { super.onInit(); state.initLoginData(); } - - @override - void onClose() { - super.onClose(); - } } diff --git a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart index 8dabf109..3d8396af 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart @@ -1,13 +1,14 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/tf_input_haveBorder.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class MinePersonInfoEditAccountNextPage extends StatefulWidget { const MinePersonInfoEditAccountNextPage({Key? key}) : super(key: key); @@ -17,10 +18,9 @@ class MinePersonInfoEditAccountNextPage extends StatefulWidget { _MinePersonInfoEditAccountNextPageState(); } -class _MinePersonInfoEditAccountNextPageState - extends State { - final logic = Get.put(PersonInfoEditAccountLogic()); - final state = Get.find().state; +class _MinePersonInfoEditAccountNextPageState extends State { + final PersonInfoEditAccountLogic logic = Get.put(PersonInfoEditAccountLogic()); + final PersonInfoEditAccountState state = Get.find().state; @override Widget build(BuildContext context) { @@ -28,12 +28,12 @@ class _MinePersonInfoEditAccountNextPageState backgroundColor: AppColors.mainBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, + barTitle: '修改账号'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, + barTitle: '修改账号'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -41,13 +41,13 @@ class _MinePersonInfoEditAccountNextPageState ), ), body: Column( - children: [ + children: [ Container( width: 1.sw, // color: Colors.grey, padding: EdgeInsets.only(left: 30.w, top: 15.h, bottom: 15.h), child: Text( - TranslationLoader.lanKeys!.pleaseEnterNewAccountNumber!.tr, + '请输入新账号'.tr, style: TextStyle(fontWeight: FontWeight.w600, fontSize: 24.sp), )), @@ -79,7 +79,7 @@ class _MinePersonInfoEditAccountNextPageState // ), child: Center( child: Text( - '${"获取".tr}${TranslationLoader.lanKeys!.verificationCode!.tr}', + '获取验证码'.tr, textAlign: TextAlign.center, style: TextStyle( color: Colors.grey, diff --git a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart index 9821c692..3e719e22 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart @@ -1,57 +1,16 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/login/login/entity/LoginData.dart'; import 'package:star_lock/login/selectCountryRegion/common/index.dart'; import 'package:star_lock/tools/storage.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class PersonInfoEditAccountState { - final TextEditingController accountController = TextEditingController(); - final TextEditingController codeController = TextEditingController(); - - static int currentTimeMillis() { - return DateTime.now().millisecondsSinceEpoch; - } - - var countryCode = '+86'.obs; - var countryId = '9'.obs; - var codeType = '3'.obs; ////1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) - var channel = '1'.obs; //短信通道 1 短信,2 邮箱 - var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; - var newAccountStr = ''.obs; - var verificationCode = ''.obs; - var xWidth = ''.obs; // 滑动验证码滑动位置 - var canSub = false.obs; - var date = currentTimeMillis().toString().obs; - - bool get accountIsOK => newAccountStr.value.isNotEmpty; - bool get codeIsOK => verificationCode.value.isNotEmpty; - - var canResend = false.obs; - var btnText = ''.obs; - var totalSeconds = 120; - var currentSecond = 120; - - final loginData = LoginData().obs; - - ///本地存储 登录信息 - void saveLoginData(LoginData? data) async { - await Storage.setString(saveUserLoginData, jsonEncode(data)); - loginData.value = data!; - } - - ///初始化本地数据 - void initLoginData() async { - final data = await Storage.getString(saveUserLoginData); - if (data != null && data.isNotEmpty) { - loginData.value = LoginData.fromJson(jsonDecode(data)); - } - } PersonInfoEditAccountState() { Map map = Get.arguments; - channel.value = map["isFrom"]; - if (channel.value == "1") { + channel.value = map['isFrom']; + if (channel.value == '1') { codeType.value = '3'; } else { codeType.value = '6'; @@ -59,12 +18,53 @@ class PersonInfoEditAccountState { resetResend(); } + final TextEditingController accountController = TextEditingController(); + final TextEditingController codeController = TextEditingController(); + + static int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } + + RxString countryCode = '+86'.obs; + RxString countryId = '9'.obs; + RxString codeType = '3'.obs; ////1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) + RxString channel = '1'.obs; //短信通道 1 短信,2 邮箱 + RxString uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; + RxString newAccountStr = ''.obs; + RxString verificationCode = ''.obs; + RxString xWidth = ''.obs; // 滑动验证码滑动位置 + RxBool canSub = false.obs; + RxString date = currentTimeMillis().toString().obs; + + bool get accountIsOK => newAccountStr.value.isNotEmpty; + bool get codeIsOK => verificationCode.value.isNotEmpty; + + RxBool canResend = false.obs; + RxString btnText = ''.obs; + int totalSeconds = 120; + int currentSecond = 120; + + final Rx loginData = LoginData().obs; + + ///本地存储 登录信息 + Future saveLoginData(LoginData? data) async { + await Storage.setString(saveUserLoginData, jsonEncode(data)); + loginData.value = data!; + } + + ///初始化本地数据 + Future initLoginData() async { + final String? data = await Storage.getString(saveUserLoginData); + if (data != null && data.isNotEmpty) { + loginData.value = LoginData.fromJson(jsonDecode(data)); + } + } void resetResend() { canResend.value = totalSeconds == currentSecond; btnText.value = !canResend.value ? '$currentSecond s' - : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + : btnText.value = '获取验证码'.tr; } void onClose() {} diff --git a/lib/mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart b/lib/mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart index a3d88782..3524a456 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart @@ -1,6 +1,6 @@ -import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter/src/services/text_formatter.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -9,7 +9,6 @@ import '../../../app_settings/app_colors.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/tf_loginInput.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class MinePersonInfoEditIphonePage extends StatefulWidget { const MinePersonInfoEditIphonePage({Key? key}) : super(key: key); @@ -19,19 +18,17 @@ class MinePersonInfoEditIphonePage extends StatefulWidget { _MinePersonInfoEditIphonePageState(); } -class _MinePersonInfoEditIphonePageState - extends State { +class _MinePersonInfoEditIphonePageState extends State { final TextEditingController _phoneController = TextEditingController(); final TextEditingController _codeController = TextEditingController(); - late Timer _timer; - int _seconds = 60; + final int _seconds = 60; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.iphone!.tr, + barTitle: '手机'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( @@ -42,7 +39,7 @@ class _MinePersonInfoEditIphonePageState width: 1.sw, padding: EdgeInsets.only(top: 5.h, bottom: 5.h), child: Text( - TranslationLoader.lanKeys!.changeIphoneTip!.tr, + '找回密码和登录新设备时,可通过绑定的手机验证'.tr, style: TextStyle(fontSize: 20.sp), )), GestureDetector( @@ -58,7 +55,7 @@ class _MinePersonInfoEditIphonePageState SizedBox(width: 5.w), Expanded( child: Text( - TranslationLoader.lanKeys!.countryAndRegion!.tr, + '国家/地区'.tr, style: TextStyle( fontSize: 22.sp, fontWeight: FontWeight.w500))), @@ -67,7 +64,7 @@ class _MinePersonInfoEditIphonePageState mainAxisAlignment: MainAxisAlignment.end, children: [ Text( - '中国+86', + '${'中国'.tr}+86', textAlign: TextAlign.end, style: TextStyle( fontSize: 22.sp, fontWeight: FontWeight.w500), @@ -95,7 +92,7 @@ class _MinePersonInfoEditIphonePageState leftWidget: const SizedBox(), hintText: '密码'.tr, - inputFormatters: [ + inputFormatters: const [ // LengthLimitingTextInputFormatter(20), ]), SizedBox(height: 10.w), @@ -108,7 +105,7 @@ class _MinePersonInfoEditIphonePageState leftWidget: const SizedBox(), hintText: '请输入验证码'.tr, - inputFormatters: [ + inputFormatters: const [ // LengthLimitingTextInputFormatter(20), ]), ), @@ -126,7 +123,7 @@ class _MinePersonInfoEditIphonePageState child: Center( child: Text( _seconds == 60 - ? '${"获取".tr} ${TranslationLoader.lanKeys!.verificationCode!.tr}' + ? '获取验证码'.tr : (_seconds < 10) ? '0$_seconds s' : '$_seconds s', diff --git a/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart b/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart index 4006fab0..92504cae 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginData.dart'; +import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_state.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; import '../../../../network/api_repository.dart'; @@ -12,12 +14,12 @@ class MinePersonInfoEditNameLogic extends BaseGetXController { final MinePersonInfoEditNamePageState state = MinePersonInfoEditNamePageState(); //更新个人信息-昵称 Future updateUserInfoRequest() async { - var entity = await ApiRepository.to.updateUserNameInfo( + final PasswordKeyListEntity entity = await ApiRepository.to.updateUserNameInfo( nickname: state.inputNickName.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast("操作成功"); - final loginData = await Storage.getLoginData(); + showToast('操作成功'.tr); + final LoginData? loginData = await Storage.getLoginData(); loginData!.nickname = state.inputNickName.value; Storage.saveLoginData(loginData); eventBus.fire(MineInfoChangeRefreshUI()); diff --git a/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart b/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart index 9e7cc817..6c9692b2 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart @@ -1,14 +1,15 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/tf_loginInput.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class MinePersonInfoEditNamePage extends StatefulWidget { const MinePersonInfoEditNamePage({Key? key}) : super(key: key); @@ -18,10 +19,9 @@ class MinePersonInfoEditNamePage extends StatefulWidget { _MinePersonInfoEditNamePageState(); } -class _MinePersonInfoEditNamePageState - extends State { - final logic = Get.put(MinePersonInfoEditNameLogic()); - final state = Get.find().state; +class _MinePersonInfoEditNamePageState extends State { + final MinePersonInfoEditNameLogic logic = Get.put(MinePersonInfoEditNameLogic()); + final MinePersonInfoEditNamePageState state = Get.find().state; @override Widget build(BuildContext context) { @@ -29,18 +29,18 @@ class _MinePersonInfoEditNamePageState backgroundColor: AppColors.greyBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.changeNickName!.tr, + barTitle: '修改昵称'.tr, haveBack: true, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.save!.tr, + '保存'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { if (state.nickNameIsOK == false) { - logic.showToast("请输入昵称"); + logic.showToast('请输入昵称'.tr); } else { logic.updateUserInfoRequest(); } @@ -49,21 +49,21 @@ class _MinePersonInfoEditNamePageState ], ), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.changeNickName!.tr, + barTitle: '修改昵称'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, titleColor: AppColors.blackColor, - actionsList: [ + actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.save!.tr, + '保存'.tr, style: TextStyle(color: AppColors.blackColor, fontSize: 24.sp), ), onPressed: () { if (state.nickNameIsOK == false) { - logic.showToast("请输入昵称"); + logic.showToast('请输入昵称'.tr); } else { logic.updateUserInfoRequest(); } @@ -81,7 +81,7 @@ class _MinePersonInfoEditNamePageState Widget listView() { Widget view = Column( mainAxisSize: MainAxisSize.min, - children: [ + children: [ LoginInput( controller: state.nickNameController, onchangeAction: (textStr) { @@ -90,8 +90,8 @@ class _MinePersonInfoEditNamePageState isPwd: false, leftWidget: SizedBox(width: 15.w), hintText: - "${'请输入'.tr}${TranslationLoader.lanKeys!.nickName!.tr}", - inputFormatters: [ + '请输入昵称'.tr, + inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), ], diff --git a/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart b/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart index 954ad23e..d997871e 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart @@ -1,8 +1,11 @@ + import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/login/login/entity/LoginData.dart'; +import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -16,7 +19,7 @@ class MineBindPhoneOrEmailLogic extends BaseGetXController { late Timer _timer; void _startTimer() { - _timer = Timer.periodic(1.seconds, (timer) { + _timer = Timer.periodic(1.seconds, (Timer timer) { if (state.currentSecond > 1) { state.currentSecond--; } else { @@ -32,8 +35,8 @@ class MineBindPhoneOrEmailLogic extends BaseGetXController { } //获取验证码请求 - void sendValidationCode() async { - var entity = await ApiRepository.to.sendValidationCodeAuth( + Future sendValidationCode() async { + final SendValidationCodeEntity entity = await ApiRepository.to.sendValidationCodeAuth( countryCode: state.channel.value == '1' ? state.countryCode.value : '', account: state.inputAccount.value, channel: state.channel.value, @@ -46,35 +49,35 @@ class MineBindPhoneOrEmailLogic extends BaseGetXController { //绑定邮箱请求 Future bindEmailRequest() async { - PasswordKeyListEntity entity = await ApiRepository.to.bindEmail( + final PasswordKeyListEntity entity = await ApiRepository.to.bindEmail( state.inputAccount.value, state.verificationCode.value, state.unbindToken.value); if (entity.errorCode!.codeIsSuccessful) { - showToast("邮箱绑定成功".tr, something: () async { - final loginData = await Storage.getLoginData(); + showToast('邮箱绑定成功'.tr, something: () async { + final LoginData? loginData = await Storage.getLoginData(); loginData!.email = state.inputAccount.value; Storage.saveLoginData(loginData); eventBus.fire(MineInfoChangeRefreshUI()); - Get.until((route) => route.settings.name == Routers.minePersonInfoPage); + Get.until((Route route) => route.settings.name == Routers.minePersonInfoPage); }); } } //绑定手机请求 Future bindMobileRequest() async { - PasswordKeyListEntity entity = await ApiRepository.to.bindPhone( + final PasswordKeyListEntity entity = await ApiRepository.to.bindPhone( state.countryCode.value, state.inputAccount.value, state.verificationCode.value, state.unbindToken.value); if (entity.errorCode!.codeIsSuccessful) { - showToast("手机绑定成功".tr, something: () async { - final loginData = await Storage.getLoginData(); + showToast('手机绑定成功'.tr, something: () async { + final LoginData? loginData = await Storage.getLoginData(); loginData!.mobile = state.inputAccount.value; Storage.saveLoginData(loginData); eventBus.fire(MineInfoChangeRefreshUI()); - Get.until((route) => route.settings.name == Routers.minePersonInfoPage); + Get.until((Route route) => route.settings.name == Routers.minePersonInfoPage); }); } } @@ -99,18 +102,4 @@ class MineBindPhoneOrEmailLogic extends BaseGetXController { state.canSub.value = state.codeIsOK; } - @override - void onReady() { - super.onReady(); - } - - @override - void onInit() { - super.onInit(); - } - - @override - void onClose() { - super.onClose(); - } } diff --git a/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart b/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart index 22f156d3..5adc52bf 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart @@ -13,7 +13,6 @@ import '../../../tools/commonItem.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/tf_loginInput.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class MineBindPhoneOrEmailPage extends StatefulWidget { const MineBindPhoneOrEmailPage({Key? key}) : super(key: key); @@ -34,15 +33,15 @@ class _MineBindPhoneOrEmailPageState extends State { appBar: F.sw( skyCall: () => TitleAppBar( barTitle: state.channel.value == '1' - ? TranslationLoader.lanKeys!.mobileNumber!.tr - : TranslationLoader.lanKeys!.email!.tr, + ? '手机号'.tr + : '邮箱'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( barTitle: state.channel.value == '1' - ? TranslationLoader.lanKeys!.mobileNumber!.tr - : TranslationLoader.lanKeys!.email!.tr, + ? '手机号'.tr + : '邮箱'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -59,12 +58,12 @@ class _MineBindPhoneOrEmailPageState extends State { padding: EdgeInsets.only(top: 5.h, bottom: 5.h), child: Text( state.channel.value == '1' - ? TranslationLoader.lanKeys!.changeIphoneTip!.tr - : TranslationLoader.lanKeys!.changeEmailTip!.tr, + ? '找回密码和登录新设备时,可通过绑定的手机验证'.tr + : '找回密码和登录新设备时,可通过绑定的邮箱验证'.tr, style: TextStyle(fontSize: 20.sp), )), CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isPadding: false, @@ -94,8 +93,8 @@ class _MineBindPhoneOrEmailPageState extends State { }, leftWidget: const SizedBox(), hintText: state.channel.value == '1' - ? '${'请输入'.tr}${TranslationLoader.lanKeys!.mobileNumber!.tr}' - : '${'请输入'.tr}${TranslationLoader.lanKeys!.email!.tr}', + ? '请输入手机号'.tr + : '请输入邮箱'.tr, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), @@ -111,7 +110,7 @@ class _MineBindPhoneOrEmailPageState extends State { logic.checkNext(state.codeController); }, hintText: - '${'请输入'.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}', + '请输入验证码'.tr, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), diff --git a/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart b/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart index c6619187..1df1ea38 100755 --- a/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart +++ b/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart @@ -1,8 +1,25 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class MineBindPhoneOrEmailState { + + MineBindPhoneOrEmailState() { + Map map = Get.arguments; + if (map['unbindToken'] != null) { + unbindToken.value = map['unbindToken']; + } + channel.value = map['isFrom']; + //短信通道 1 短信,2 邮箱 + //短信类型 1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + if (channel.value == '1') { + codeType.value = '3'; + } else { + codeType.value = '6'; + } + + resetResend(); + } final TextEditingController accountController = TextEditingController(); final TextEditingController codeController = TextEditingController(); @@ -10,49 +27,32 @@ class MineBindPhoneOrEmailState { return DateTime.now().millisecondsSinceEpoch; } - var countryCode = '86'.obs; - var countryName = '中国'.obs; + RxString countryCode = '86'.obs; + RxString countryName = '中国'.tr.obs; - var countryId = '9'.obs; - var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) - var channel = '1'.obs; //短信通道 1 短信,2 邮箱 - var verificationCode = ''.obs; - var xWidth = ''.obs; // 滑动验证码滑动位置 - var canSub = false.obs; - var date = currentTimeMillis().toString().obs; - var inputAccount = ''.obs; //新账号 - var unbindToken = ''.obs; //解绑的Token + RxString countryId = '9'.obs; + RxString codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) + RxString channel = '1'.obs; //短信通道 1 短信,2 邮箱 + RxString verificationCode = ''.obs; + RxString xWidth = ''.obs; // 滑动验证码滑动位置 + RxBool canSub = false.obs; + RxString date = currentTimeMillis().toString().obs; + RxString inputAccount = ''.obs; //新账号 + RxString unbindToken = ''.obs; //解绑的Token - var accountIsOK = false.obs; + RxBool accountIsOK = false.obs; bool get codeIsOK => verificationCode.value.isNotEmpty; - var canResend = false.obs; - var btnText = ''.obs; - var totalSeconds = 120; - var currentSecond = 120; - - MineBindPhoneOrEmailState() { - Map map = Get.arguments; - if (map["unbindToken"] != null) { - unbindToken.value = map["unbindToken"]; - } - channel.value = map["isFrom"]; - //短信通道 1 短信,2 邮箱 - //短信类型 1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 - if (channel.value == "1") { - codeType.value = "3"; - } else { - codeType.value = "6"; - } - - resetResend(); - } + RxBool canResend = false.obs; + RxString btnText = ''.obs; + int totalSeconds = 120; + int currentSecond = 120; void resetResend() { canResend.value = totalSeconds == currentSecond; btnText.value = !canResend.value ? '$currentSecond s' - : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + : btnText.value = '获取验证码'.tr; } void onClose() {} diff --git a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart index a5a13ac2..810038cf 100755 --- a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; @@ -40,20 +41,17 @@ class MinePersonInfoLogic extends BaseGetXController { } // 上传头像 - Future uploadFile( - MinePersonGetUploadFileInfoEntity - minePersonGetUploadFileInfoEntity) async { - // Map user = minePersonGetUploadFileInfoEntity.data!.formData!; + Future uploadFile(MinePersonGetUploadFileInfoEntity minePersonGetUploadFileInfoEntity) async { final File bytes = File(state.image!.path); final Uint8List enc = await bytes.readAsBytes(); - // user[minePersonGetUploadFileInfoEntity.data!.fileField!] = enc; final FormData form = FormData(minePersonGetUploadFileInfoEntity.data!.formData!); - form.files.add(MapEntry( - minePersonGetUploadFileInfoEntity.data!.fileField!, - MultipartFile(enc, - filename: - minePersonGetUploadFileInfoEntity.data!.formData!['key']))); + form.files.add( + MapEntry( + minePersonGetUploadFileInfoEntity.data!.fileField!, + MultipartFile(enc, filename: minePersonGetUploadFileInfoEntity.data!.formData!['key']) + ) + ); final LoginEntity entity = await ApiRepository.to.uploadFile( url: minePersonGetUploadFileInfoEntity.data!.uploadUrl!, body: form); @@ -133,19 +131,10 @@ class MinePersonInfoLogic extends BaseGetXController { } } - @override - void onReady() { - super.onReady(); - } - @override void onInit() { super.onInit(); getUserInfoRequest(); } - - @override - void onClose() { - } } diff --git a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart index da6afb8c..0a970b68 100755 --- a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart @@ -13,7 +13,6 @@ import '../../../appRouters.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/customNetworkImage.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class MinePersonInfoPage extends StatefulWidget { MinePersonInfoPage({Key? key, this.showAbout = false}) @@ -35,7 +34,7 @@ class _MinePersonInfoPageState extends State { skyCall: () => AppColors.mainBackgroundColor, xhjCall: () => AppColors.mainBackgroundColor), appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.personalInformation!.tr, + barTitle: '个人信息'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -50,7 +49,7 @@ class _MinePersonInfoPageState extends State { child: Column( children: [ Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.avatar!.tr, + leftTitel: '头像'.tr, rightTitle: '', allHeight: 100.h, isHaveLine: true, @@ -69,7 +68,7 @@ class _MinePersonInfoPageState extends State { }, )), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.nickName!.tr, + leftTitel: '昵称'.tr, rightTitle: state.mineInfoData.value.nickname != null ? state.mineInfoData.value.nickname! : '', @@ -83,7 +82,7 @@ class _MinePersonInfoPageState extends State { }).then((Object? value) => logic.getUserInfoRequest()); })), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.mobileNumber!.tr, + leftTitel: '手机号'.tr, // rightTitle: (state.mineInfoData.value.mobile ?? '').isNotEmpty // ? state.mineInfoData.value.mobile! // : TranslationLoader.lanKeys!.goBind!.tr, @@ -135,7 +134,7 @@ class _MinePersonInfoPageState extends State { } })), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.email!.tr, + leftTitel: '邮箱'.tr, // rightTitle: (state.mineInfoData.value.email??'').isNotEmpty // ? state.mineInfoData.value.email! // : TranslationLoader.lanKeys!.goBind!.tr, @@ -188,7 +187,7 @@ class _MinePersonInfoPageState extends State { context, Routers.minePersonInfoResetPasswordPage); }), Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.safetyProblem!.tr, + leftTitel: '安全问题'.tr, isHaveRightWidget: true, // rightTitle: state.mineInfoData.value.haveSafeAnswer == 0 // ? '去设置'.tr @@ -216,8 +215,7 @@ class _MinePersonInfoPageState extends State { } })), Obx(() => CommonItem( - leftTitel: - TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: state.mineInfoData.value.countryName != null ? state.mineInfoData.value.countryName! : '', @@ -240,7 +238,7 @@ class _MinePersonInfoPageState extends State { builder: (BuildContext context) { return AlertBottomWidget( topTitle: '', - items: const ['拍照', '从相册选择'], + items: ['拍照'.tr, '从相册选择'.tr], chooseCallback: logic.chooseCallback, ); }); diff --git a/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart b/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart index 45ebdc29..b728f414 100755 --- a/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart @@ -10,7 +10,8 @@ import 'package:star_lock/tools/baseGetXController.dart'; import '../../../tools/regularExpression.dart'; class MinePersonInfoResetPasswordLogic extends BaseGetXController { - final MinePersonInfoResetPasswordState state = MinePersonInfoResetPasswordState(); + final MinePersonInfoResetPasswordState state = + MinePersonInfoResetPasswordState(); Future changePasswordRequest() async { // if(state.newPwd.value.length < 8){ @@ -28,22 +29,20 @@ class MinePersonInfoResetPasswordLogic extends BaseGetXController { // return; // } - if(state.newPwd.value != state.surePwd.value){ + if (state.newPwd.value != state.surePwd.value) { showToast('两次密码不一致哦'.tr); return; } - if(!RegularExpression().validateString(state.newPwd.value)){ + if (!RegularExpression().validateString(state.newPwd.value)) { showToast('密码需至少包含数字/字母/字符中的2种组合'.tr); return; } final LoginEntity entity = await ApiRepository.to.changePassword( - state.date.value, - state.surePwd.value, - state.oldPwd.value); + state.date.value, state.surePwd.value, state.oldPwd.value); if (entity.errorCode!.codeIsSuccessful) { - showToast('重置成功'); + showToast('重置成功'.tr); Get.back(); } } @@ -66,6 +65,7 @@ class MinePersonInfoResetPasswordLogic extends BaseGetXController { } void _resetCanSub() { - state.canSub.value = state.oldPwdIsOK && state.newPwdIsOK && state.surePwdIsOK; + state.canSub.value = + state.oldPwdIsOK && state.newPwdIsOK && state.surePwdIsOK; } } diff --git a/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart b/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart index 75e38406..94718501 100755 --- a/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart @@ -24,8 +24,10 @@ class MinePersonInfoResetPasswordPage extends StatefulWidget { class _MinePersonInfoResetPasswordPageState extends State { - final MinePersonInfoResetPasswordLogic logic = Get.put(MinePersonInfoResetPasswordLogic()); - final MinePersonInfoResetPasswordState state = Get.find().state; + final MinePersonInfoResetPasswordLogic logic = + Get.put(MinePersonInfoResetPasswordLogic()); + final MinePersonInfoResetPasswordState state = + Get.find().state; @override Widget build(BuildContext context) { @@ -52,22 +54,23 @@ class _MinePersonInfoResetPasswordPageState loginView(), SizedBox(height: 50.w), Obx(() => SubmitBtn( - btnName: TranslationLoader.lanKeys!.save!.tr, + btnName: '保存'.tr, fontSize: 30.sp, borderRadius: 20.w, isDisabled: state.canSub.value, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), - onClick: state.canSub.value ? () async { - final bool isNetWork = - await LockMainLogic.to()?.judgeTheNetwork() ?? - false; - if (!isNetWork) { - return; - } + onClick: state.canSub.value + ? () async { + final bool isNetWork = + await LockMainLogic.to()?.judgeTheNetwork() ?? + false; + if (!isNetWork) { + return; + } - logic.changePasswordRequest(); - } : null - )), + logic.changePasswordRequest(); + } + : null)), SizedBox(height: 40.w), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -78,8 +81,7 @@ class _MinePersonInfoResetPasswordPageState height: 60.h, // color: Colors.red, child: Center( - child: Text( - '${TranslationLoader.lanKeys!.forgetPassword!.tr}?', + child: Text('${'忘记密码'.tr}?', style: TextStyle( color: AppColors.mainColor, fontSize: 18.sp)), ), @@ -105,11 +107,10 @@ class _MinePersonInfoResetPasswordPageState }, isPwd: true, leftWidget: Text( - '${TranslationLoader.lanKeys!.originalPassword!.tr} ', + '${'原密码'.tr} ', style: TextStyle(fontSize: 22.sp), ), hintText: '', - isLogin: true, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), @@ -120,11 +121,10 @@ class _MinePersonInfoResetPasswordPageState }, isPwd: true, leftWidget: Text( - '${TranslationLoader.lanKeys!.newPassword!.tr} ', + '${'新密码'.tr} ', style: TextStyle(fontSize: 22.sp), ), hintText: '', - isLogin: true, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), @@ -140,14 +140,13 @@ class _MinePersonInfoResetPasswordPageState style: TextStyle(fontSize: 22.sp), ), hintText: '', - isLogin: true, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), Container( width: 1.sw, padding: EdgeInsets.only(top: 15.h, bottom: 10.h), - child: Text(TranslationLoader.lanKeys!.registerPasswordTip!.tr, + child: Text('密码必须是8-20位,至少包括数字/字母/符号中的2种'.tr, style: TextStyle( fontSize: 18.w, color: AppColors.darkGrayTextColor))), ], diff --git a/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart b/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart index a00bcbb2..fde998fb 100755 --- a/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart @@ -1,10 +1,10 @@ + import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; @@ -12,8 +12,8 @@ class MineSetSafetyProblemLogic extends BaseGetXController { final MineSetSafetyProblemState state = MineSetSafetyProblemState(); //用户信息 Future getQuestionListRequest() async { - var entity = - await ApiRepository.to.getQuestionList("", state.countryCode.value); + final entity = + await ApiRepository.to.getQuestionList('', state.countryCode.value); if (entity.errorCode!.codeIsSuccessful) { state.firstProblemList.value = entity.data!.firstList!; state.secondProblemList.value = entity.data!.secondList!; @@ -24,10 +24,10 @@ class MineSetSafetyProblemLogic extends BaseGetXController { //设置安全信息 Future setSafeAnswerRequest() async { getRequestAnswerList(); - var entity = + final entity = await ApiRepository.to.setSafeAnswer(state.questionAndAnswerList.value); if (entity.errorCode!.codeIsSuccessful) { - showToast("操作成功"); + showToast('操作成功'.tr); Get.until((route) => route.settings.name == Routers.minePersonInfoPage); } } @@ -35,10 +35,10 @@ class MineSetSafetyProblemLogic extends BaseGetXController { //修改安全信息 Future updateSafeAnswerRequest() async { getRequestAnswerList(); - var entity = await ApiRepository.to + final entity = await ApiRepository.to .updateSafeAnswer(state.questionAndAnswerList.value); if (entity.errorCode!.codeIsSuccessful) { - showToast("操作成功"); + showToast('操作成功'.tr); Get.until((route) => route.settings.name == Routers.minePersonInfoPage); } } @@ -47,7 +47,7 @@ class MineSetSafetyProblemLogic extends BaseGetXController { state.questionAndAnswerList.value.clear(); for (int i = 0; i < 3; i++) { if (i == 0) { - SafetyProblemData data = SafetyProblemData(); + final SafetyProblemData data = SafetyProblemData(); data.question = state.firstProblemStr.value; data.answer = state.firstAnswerStr.value; data.questionId = state.firstQuestionId.value; @@ -56,7 +56,7 @@ class MineSetSafetyProblemLogic extends BaseGetXController { } state.questionAndAnswerList.value.add(data); } else if (i == 1) { - SafetyProblemData data = SafetyProblemData(); + final SafetyProblemData data = SafetyProblemData(); data.question = state.secondProblemStr.value; data.answer = state.secondAnswerStr.value; data.questionId = state.secondQuestionId.value; @@ -65,7 +65,7 @@ class MineSetSafetyProblemLogic extends BaseGetXController { } state.questionAndAnswerList.value.add(data); } else if (i == 2) { - SafetyProblemData data = SafetyProblemData(); + final SafetyProblemData data = SafetyProblemData(); data.question = state.thirdProblemStr.value; data.answer = state.thirdAnswerStr.value; data.questionId = state.thirdQuestionId.value; @@ -96,12 +96,9 @@ class MineSetSafetyProblemLogic extends BaseGetXController { void _resetCanSub() { state.canSub.value = state.answerIsOK && - state.firstProblemStr.value != - TranslationLoader.lanKeys!.problemOne!.tr && - state.secondProblemStr.value != - TranslationLoader.lanKeys!.problemTwo!.tr && - state.thirdProblemStr.value != - TranslationLoader.lanKeys!.problemThree!.tr; + state.firstProblemStr.value != '问题一'.tr && + state.secondProblemStr.value != '问题二'.tr && + state.thirdProblemStr.value != '问题三'.tr; } @override diff --git a/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart b/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart index 576c34cd..44c35b88 100755 --- a/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart @@ -1,16 +1,17 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class MinePersonInfoSetSafetyProblemPage extends StatefulWidget { const MinePersonInfoSetSafetyProblemPage({Key? key}) : super(key: key); @@ -22,8 +23,8 @@ class MinePersonInfoSetSafetyProblemPage extends StatefulWidget { class _MinePersonInfoSetSafetyProblemPageState extends State { - final logic = Get.put(MineSetSafetyProblemLogic()); - final state = Get.find().state; + final MineSetSafetyProblemLogic logic = Get.put(MineSetSafetyProblemLogic()); + final MineSetSafetyProblemState state = Get.find().state; @override void initState() { @@ -38,12 +39,12 @@ class _MinePersonInfoSetSafetyProblemPageState backgroundColor: AppColors.mainBackgroundColor, appBar: F.sw( skyCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.safetyProblem!.tr, + barTitle: '安全问题'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), xhjCall: () => TitleAppBar( - barTitle: TranslationLoader.lanKeys!.safetyProblem!.tr, + barTitle: '安全问题'.tr, haveBack: true, backgroundColor: Colors.white, iconColor: AppColors.blackColor, @@ -57,7 +58,7 @@ class _MinePersonInfoSetSafetyProblemPageState color: AppColors.greyBackgroundColor, padding: EdgeInsets.all(20.h), child: Text( - TranslationLoader.lanKeys!.safetyProblemTip!.tr, + '当你手机丢了,可以通过回答设置的安全问题来登录新设备'.tr, style: TextStyle(fontSize: 18.sp), )), Obx(() => _safityProblemItem( @@ -108,7 +109,7 @@ class _MinePersonInfoSetSafetyProblemPageState children: [ CommonItem( leftTitel: problemTitle, - rightTitle: "", + rightTitle: '', isHaveLine: true, isHaveDirection: true, action: action), @@ -127,7 +128,7 @@ class _MinePersonInfoSetSafetyProblemPageState //输入里面输入文字内边距设置 // contentPadding: const EdgeInsets.only(top: 8.0, left: -19.0, right: -15.0, bottom: 8.0), // labelText: label, - hintText: TranslationLoader.lanKeys!.pleaseEnterYourAnswer!.tr, + hintText: '请输入你的答案'.tr, //不需要输入框下划线 border: InputBorder.none, hintStyle: TextStyle(fontSize: 22.sp)), @@ -152,9 +153,9 @@ class _MinePersonInfoSetSafetyProblemPageState } Future _selectProblemBottomSheet(List dataList, int problemIndex) async { - List getProblemList = []; + final List getProblemList = []; for (int i = 0; i < dataList.length; i++) { - SafetyProblemData data = dataList[i]; + final SafetyProblemData data = dataList[i]; getProblemList.add(data.question!); } showModalBottomSheet( @@ -163,12 +164,12 @@ class _MinePersonInfoSetSafetyProblemPageState borderRadius: BorderRadiusDirectional.circular(10)), builder: (BuildContext context) { return AlertBottomWidget( - topTitle: '选择问题', + topTitle: '选择问题'.tr, items: getProblemList, chooseCallback: (value) { - int getSelectIndex = value; - String getSelectProblem = getProblemList[getSelectIndex]; - SafetyProblemData data = dataList[getSelectIndex]; + final int getSelectIndex = value; + final String getSelectProblem = getProblemList[getSelectIndex]; + final SafetyProblemData data = dataList[getSelectIndex]; if (problemIndex == 1) { // SafetyProblemData data = dataList[getSelectIndex]; state.firstProblemStr.value = getSelectProblem; diff --git a/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart b/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart index 97b0c11d..9ffbd23e 100755 --- a/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart +++ b/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart @@ -1,58 +1,58 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class MineSetSafetyProblemState { - final TextEditingController fristAnswerController = TextEditingController(); - final TextEditingController secondAnswerController = TextEditingController(); - final TextEditingController thirdAnswerController = TextEditingController(); - - var firstProblemList = [].obs; - var secondProblemList = [].obs; - var thirdProblemList = [].obs; - - var firstProblemStr = TranslationLoader.lanKeys!.problemOne!.tr.obs; - var secondProblemStr = TranslationLoader.lanKeys!.problemTwo!.tr.obs; - var thirdProblemStr = TranslationLoader.lanKeys!.problemThree!.tr.obs; - - var firstQuestionId = 0.obs; - var secondQuestionId = 0.obs; - var thirdQuestionId = 0.obs; - - var firstAnswerId = 0.obs; - var secondAnswerId = 0.obs; - var thirdAnswerId = 0.obs; - - var firstAnswerStr = ''.obs; - var secondAnswerStr = ''.obs; - var thirdAnswerStr = ''.obs; - var countryCode = ''.obs; - - var questionAndAnswerList = [].obs; - var isUpdateAnswer = false.obs; - - bool get answerIsOK => - firstAnswerStr.value.isNotEmpty && - secondAnswerStr.value.isNotEmpty && - thirdAnswerStr.value.isNotEmpty; - var canSub = false.obs; MineSetSafetyProblemState() { if (Get.arguments != null) { Map map = Get.arguments; isUpdateAnswer.value = true; - firstProblemStr.value = map["firstProblemStr"]; - secondProblemStr.value = map["secondProblemStr"]; - thirdProblemStr.value = map["thirdProblemStr"]; - firstAnswerStr.value = map["firstAnswerStr"]; - secondAnswerStr.value = map["secondAnswerStr"]; - thirdAnswerStr.value = map["thirdAnswerStr"]; - firstQuestionId.value = map["firstQuestionId"]; - secondQuestionId.value = map["secondQuestionId"]; - thirdQuestionId.value = map["thirdQuestionId"]; - firstAnswerId.value = map["firstAnswerId"]; - secondAnswerId.value = map["secondAnswerId"]; - thirdAnswerId.value = map["thirdAnswerId"]; + firstProblemStr.value = map['firstProblemStr']; + secondProblemStr.value = map['secondProblemStr']; + thirdProblemStr.value = map['thirdProblemStr']; + firstAnswerStr.value = map['firstAnswerStr']; + secondAnswerStr.value = map['secondAnswerStr']; + thirdAnswerStr.value = map['thirdAnswerStr']; + firstQuestionId.value = map['firstQuestionId']; + secondQuestionId.value = map['secondQuestionId']; + thirdQuestionId.value = map['thirdQuestionId']; + firstAnswerId.value = map['firstAnswerId']; + secondAnswerId.value = map['secondAnswerId']; + thirdAnswerId.value = map['thirdAnswerId']; } } + final TextEditingController fristAnswerController = TextEditingController(); + final TextEditingController secondAnswerController = TextEditingController(); + final TextEditingController thirdAnswerController = TextEditingController(); + + RxList firstProblemList = [].obs; + RxList secondProblemList = [].obs; + RxList thirdProblemList = [].obs; + + RxString firstProblemStr = '问题一'.tr.obs; + RxString secondProblemStr = '问题二'.tr.obs; + RxString thirdProblemStr = '问题三'.tr.obs; + + RxInt firstQuestionId = 0.obs; + RxInt secondQuestionId = 0.obs; + RxInt thirdQuestionId = 0.obs; + + RxInt firstAnswerId = 0.obs; + RxInt secondAnswerId = 0.obs; + RxInt thirdAnswerId = 0.obs; + + RxString firstAnswerStr = ''.obs; + RxString secondAnswerStr = ''.obs; + RxString thirdAnswerStr = ''.obs; + RxString countryCode = ''.obs; + + RxList questionAndAnswerList = [].obs; + RxBool isUpdateAnswer = false.obs; + + bool get answerIsOK => + firstAnswerStr.value.isNotEmpty && + secondAnswerStr.value.isNotEmpty && + thirdAnswerStr.value.isNotEmpty; + RxBool canSub = false.obs; } diff --git a/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart b/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart index 9bf60297..e1e42c73 100755 --- a/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart @@ -10,23 +10,22 @@ class MineViewSafetyProblemLogic extends BaseGetXController { //获取已设置的安全信息 Future getOwnQuestionListRequest() async { - MineViewSafetyProblemEntity entity = - await ApiRepository.to.getOwnQuestionList(); + final MineViewSafetyProblemEntity entity = await ApiRepository.to.getOwnQuestionList(); if (entity.errorCode!.codeIsSuccessful) { if (entity.dataList != null) { - SafetyProblemData safeData1 = entity.dataList![0]; + final SafetyProblemData safeData1 = entity.dataList![0]; state.firstProblemStr.value = safeData1.question!; state.firstAnswerStr.value = safeData1.answer!; state.firstQuestionId.value = safeData1.questionId!; state.firstAnswerId.value = safeData1.answerId!; - SafetyProblemData safeData2 = entity.dataList![1]; + final SafetyProblemData safeData2 = entity.dataList![1]; state.secondProblemStr.value = safeData2.question!; state.secondAnswerStr.value = safeData2.answer!; state.secondQuestionId.value = safeData2.questionId!; state.secondAnswerId.value = safeData2.answerId!; - SafetyProblemData safeData3 = entity.dataList![2]; + final SafetyProblemData safeData3 = entity.dataList![2]; state.thirdProblemStr.value = safeData3.question!; state.thirdAnswerStr.value = safeData3.answer!; state.thirdQuestionId.value = safeData3.questionId!; diff --git a/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart b/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart index 784e6511..a2475bb1 100755 --- a/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart +++ b/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart @@ -1,13 +1,14 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class MinePersonInfoViewSafetyProblemPage extends StatefulWidget { const MinePersonInfoViewSafetyProblemPage({Key? key}) : super(key: key); @@ -17,10 +18,9 @@ class MinePersonInfoViewSafetyProblemPage extends StatefulWidget { _MinePersonInfoViewSafetyProblemPageState(); } -class _MinePersonInfoViewSafetyProblemPageState - extends State { - final logic = Get.put(MineViewSafetyProblemLogic()); - final state = Get.find().state; +class _MinePersonInfoViewSafetyProblemPageState extends State { + final MineViewSafetyProblemLogic logic = Get.put(MineViewSafetyProblemLogic()); + final MineViewSafetyProblemState state = Get.find().state; @override void initState() { @@ -34,14 +34,14 @@ class _MinePersonInfoViewSafetyProblemPageState return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.safetyProblem!.tr, + barTitle: '安全问题'.tr, haveBack: true, - actionsList: [ + actionsList: [ TextButton( onPressed: () { Navigator.pushNamed( context, Routers.minePersonInfoSetSafetyProblemPage, - arguments: { + arguments: { 'firstProblemStr': state.firstProblemStr.value, 'secondProblemStr': state.secondProblemStr.value, 'thirdProblemStr': state.thirdProblemStr.value, @@ -63,13 +63,13 @@ class _MinePersonInfoViewSafetyProblemPageState ], backgroundColor: AppColors.mainColor), body: ListView( - children: [ + children: [ Container( width: 1.sw, color: AppColors.greyBackgroundColor, padding: EdgeInsets.all(20.h), child: Text( - TranslationLoader.lanKeys!.safetyProblemTip!.tr, + '当你手机丢了,可以通过回答设置的安全问题来登录新设备'.tr, style: TextStyle(fontSize: 18.sp), )), Obx(() => _safityProblemItem( @@ -86,7 +86,7 @@ class _MinePersonInfoViewSafetyProblemPageState Widget _safityProblemItem(String problemTitle, String answerTitle) { return Column( - children: [ + children: [ CommonItem( leftTitel: problemTitle, rightTitle: '', diff --git a/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart b/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart index 61fa4bbe..baeebf7c 100755 --- a/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart +++ b/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart @@ -1,20 +1,20 @@ + import 'package:get/get.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class MineViewSafetyProblemState { - var firstProblemStr = TranslationLoader.lanKeys!.problemOne!.tr.obs; - var secondProblemStr = TranslationLoader.lanKeys!.problemTwo!.tr.obs; - var thirdProblemStr = TranslationLoader.lanKeys!.problemThree!.tr.obs; + RxString firstProblemStr = '问题一'.tr.obs; + RxString secondProblemStr = '问题二'.tr.obs; + RxString thirdProblemStr = '问题三'.tr.obs; - var firstAnswerStr = ''.obs; - var secondAnswerStr = ''.obs; - var thirdAnswerStr = ''.obs; + RxString firstAnswerStr = ''.obs; + RxString secondAnswerStr = ''.obs; + RxString thirdAnswerStr = ''.obs; - var firstQuestionId = 0.obs; - var secondQuestionId = 0.obs; - var thirdQuestionId = 0.obs; + RxInt firstQuestionId = 0.obs; + RxInt secondQuestionId = 0.obs; + RxInt thirdQuestionId = 0.obs; - var firstAnswerId = 0.obs; - var secondAnswerId = 0.obs; - var thirdAnswerId = 0.obs; + RxInt firstAnswerId = 0.obs; + RxInt secondAnswerId = 0.obs; + RxInt thirdAnswerId = 0.obs; } diff --git a/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_logic.dart b/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_logic.dart index cc40ce7f..d78d0ee6 100755 --- a/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_logic.dart +++ b/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_logic.dart @@ -1,5 +1,4 @@ import 'package:get/get.dart'; -import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart'; import '../../../network/api_repository.dart'; @@ -34,7 +33,7 @@ class AppUnlockNeedMobileNetworkingLockLogic extends BaseGetXController { final SelectLockListEntity entity = await ApiRepository.to.setAppUnlockMustOnline(state.selectLockIdList); if (entity.errorCode!.codeIsSuccessful) { - showToast('操作成功'); + showToast('操作成功'.tr); //刷新锁列表,更新锁详情--手机需联网标识 if (Get.isRegistered()) { diff --git a/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_page.dart b/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_page.dart index 63f4e28c..581e3db1 100755 --- a/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_page.dart +++ b/lib/mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -11,7 +12,6 @@ import '../../../tools/noData.dart'; import '../../../tools/storage.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; import 'appUnlockNeedMobileNetworkingLock_logic.dart'; class APPUnlockNeedMobileNetworkingLockPage extends StatefulWidget { @@ -48,8 +48,7 @@ class _APPUnlockNeedMobileNetworkingLockPageState extends State[ Expanded( child: Text( - TranslationLoader.lanKeys! - .appUnlockRequiresMobilePhoneAccessToTheLockTip!.tr, + '对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁'.tr, style: TextStyle(fontSize: 22.sp), )), ], ), ), CommonItem( - leftTitel: TranslationLoader.lanKeys!.checkAll!.tr, + leftTitel: '全选'.tr, rightTitle: '', allHeight: 70.h, isHaveLine: false, diff --git a/lib/mine/mineSet/authorityManagement/authorityManagement_page.dart b/lib/mine/mineSet/authorityManagement/authorityManagement_page.dart index f741f1c6..50c93a16 100755 --- a/lib/mine/mineSet/authorityManagement/authorityManagement_page.dart +++ b/lib/mine/mineSet/authorityManagement/authorityManagement_page.dart @@ -9,7 +9,6 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/tools/ExpandedListView.dart'; import 'package:star_lock/tools/noData.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import 'package:star_lock/translations/trans_lib.dart'; class AuthorityManagementPage extends StatefulWidget { const AuthorityManagementPage({Key? key}) : super(key: key); @@ -34,7 +33,7 @@ class _AuthorityManagementPageState extends State List tabs = [ '姓名'.tr, - TranslationLoader.lanKeys!.device!.tr + '设备'.tr ]; @override @@ -52,7 +51,7 @@ class _AuthorityManagementPageState extends State appBar: AppBar( backgroundColor: AppColors.mainColor, title: Text( - TranslationLoader.lanKeys!.authorityManagement!.tr, + '批量授权'.tr, style: TextStyle( color: Colors.white, fontSize: 28.sp, @@ -335,7 +334,7 @@ class _AuthorityManagementPageState extends State //去授权按钮-姓名 Widget _buildDeauthorizationBtn1() { return SubmitBtn( - btnName: TranslationLoader.lanKeys!.deAuthorize!.tr, + btnName: '去授权'.tr, onClick: () { Navigator.pushNamed(context, Routers.getDeviceListPage); }, @@ -345,7 +344,7 @@ class _AuthorityManagementPageState extends State //去授权按钮-关联设备 Widget _buildDeauthorizationBtn2() { return SubmitBtn( - btnName: TranslationLoader.lanKeys!.deAuthorize!.tr, + btnName: '去授权'.tr, onClick: () { Navigator.pushNamed(context, Routers.getNameListPage); }, diff --git a/lib/mine/mineSet/authorityManagement/getDeviceList_page.dart b/lib/mine/mineSet/authorityManagement/getDeviceList_page.dart index ddb2b122..9c1bc1eb 100755 --- a/lib/mine/mineSet/authorityManagement/getDeviceList_page.dart +++ b/lib/mine/mineSet/authorityManagement/getDeviceList_page.dart @@ -5,7 +5,6 @@ import 'package:star_lock/tools/submitBtn.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class GetDeviceListPage extends StatefulWidget { const GetDeviceListPage({Key? key}) : super(key: key); @@ -21,7 +20,7 @@ class _GetDeviceListPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.associatedDevice!.tr, + barTitle: '关联设备'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -33,7 +32,7 @@ class _GetDeviceListPageState extends State { padding: EdgeInsets.only( left: 30.w, top: 16.w, right: 30.w, bottom: 16.w), child: Text( - '请选择姓名要关联哪些设备', + '请选择姓名要关联哪些设备'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 20.sp), textAlign: TextAlign.start, @@ -77,7 +76,7 @@ class _GetDeviceListPageState extends State { height: 20.h, ), SubmitBtn( - btnName: '确定', + btnName: '确定'.tr, onClick: () {}, ), SizedBox( diff --git a/lib/mine/mineSet/authorityManagement/getNameList_page.dart b/lib/mine/mineSet/authorityManagement/getNameList_page.dart index f63fb1c9..d74e907f 100755 --- a/lib/mine/mineSet/authorityManagement/getNameList_page.dart +++ b/lib/mine/mineSet/authorityManagement/getNameList_page.dart @@ -5,7 +5,6 @@ import 'package:star_lock/tools/submitBtn.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class GetNameListPage extends StatefulWidget { const GetNameListPage({Key? key}) : super(key: key); @@ -21,7 +20,7 @@ class _GetNameListPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.associatedName!.tr, + barTitle: '关联姓名'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -33,7 +32,7 @@ class _GetNameListPageState extends State { padding: EdgeInsets.only( left: 30.w, top: 16.w, right: 30.w, bottom: 16.w), child: Text( - '请选择设备要关联哪些姓名', + '请选择设备要关联哪些姓名'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 20.sp), textAlign: TextAlign.start, @@ -78,7 +77,7 @@ class _GetNameListPageState extends State { height: 20.h, ), SubmitBtn( - btnName: '确定', + btnName: '确定'.tr, onClick: () {}, ), SizedBox( diff --git a/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministratorManage/addAuthorizedAdministratorManage_page.dart b/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministratorManage/addAuthorizedAdministratorManage_page.dart index 5b623a1f..f644b995 100755 --- a/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministratorManage/addAuthorizedAdministratorManage_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministratorManage/addAuthorizedAdministratorManage_page.dart @@ -4,7 +4,6 @@ import 'package:get/get.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'addAuthorizedAdministratorManage_tabbar.dart'; class AddAuthorizedAdministratorManagePage extends StatefulWidget { @@ -22,7 +21,7 @@ class _AddAuthorizedAdministratorManagePageState extends State addAuthorizedAdminRequest() async { if (state.emailOrPhoneController.text.isEmpty) { - showToast('请输入接收者账号'); + showToast('请输入接收者账号'.tr); return; } if (state.keyNameController.text.isEmpty) { - showToast('请输入接收者姓名'); + showToast('请输入接收者姓名'.tr); return; } @@ -42,16 +41,16 @@ class AddAuthorizedAdministratorLogic extends BaseGetXController { endDate = DateTool().dateToTimestamp(state.endDate.value, 1).toString(); if (startDate.isEmpty) { - showToast('请选择开始时间'); + showToast('请选择开始时间'.tr); return; } if (endDate.isEmpty) { - showToast('请选择结束时间'); + showToast('请选择结束时间'.tr); return; } if (int.parse(startDate) >= int.parse(endDate)) { - showToast('失效时间要大于生效时间'); + showToast('失效时间需晚于生效时间'.tr); return; } } @@ -70,13 +69,12 @@ class AddAuthorizedAdministratorLogic extends BaseGetXController { isOnlyManageSelf: state.onlyManageYouCreatesUser.value == true ? 1 : 2, ); if (entity.errorCode!.codeIsSuccessful) { - state.isSendSuccess.value = true; state.isCreateUser.value = false; state.getKeyId.value = entity.data!.keyId ?? 0; // Toast.show(msg: "添加成功"); - eventBus.fire(AuthorizedAdministratorListPageRefreshUI()); + Get.back(); } else { // showToast("${entity.errorMsg}"); if (entity.errorCode == 425) { @@ -93,7 +91,7 @@ class AddAuthorizedAdministratorLogic extends BaseGetXController { context: Get.context!, builder: (BuildContext context) { return CupertinoAlertDialog( - title: const Text('接收者号码未注册,请重新发送'), + title: Text('接收者号码未注册,请重新发送'.tr), actions: [ CupertinoDialogAction( child: Text('取消'.tr), diff --git a/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_page.dart b/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_page.dart index 9dc930e0..c9cdb870 100755 --- a/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -13,7 +14,6 @@ import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/submitBtn.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../../../../tools/NativeInteractionTool.dart'; import '../../../../tools/dateTool.dart'; @@ -54,9 +54,6 @@ class _AddAuthorizedAdministratorPageState //永久 Widget _permanentAdministrator() { - if (state.isSendSuccess.value == true) { - return sendElectronicKeySucceed(); - } else { return Column( children: [ keyInfoWidget(), @@ -109,14 +106,10 @@ class _AddAuthorizedAdministratorPageState _buildSureBtn() ], ); - } } //限时管理员 Widget _timeLimitAdministrator() { - if (state.isSendSuccess.value == true) { - return sendElectronicKeySucceed(); - } else { return Column( children: [ keyInfoWidget(), @@ -169,7 +162,6 @@ class _AddAuthorizedAdministratorPageState _buildSureBtn() ], ); - } } // 顶部钥匙信息widget @@ -177,7 +169,7 @@ class _AddAuthorizedAdministratorPageState return Column( children: [ CommonItem( - leftTitel: TranslationLoader.lanKeys!.accountNumber!.tr, + leftTitel: '账号'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -186,7 +178,7 @@ class _AddAuthorizedAdministratorPageState '请输入手机号或者邮箱'.tr, state.emailOrPhoneController)), CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, @@ -402,7 +394,7 @@ class _AddAuthorizedAdministratorPageState context, Routers.volumeAuthorizationLockManagePage); }, child: Text( - TranslationLoader.lanKeys!.volumeAuthorizationLock!.tr, + '批量授权锁'.tr, style: TextStyle( color: AppColors.mainColor, fontWeight: FontWeight.w500), @@ -477,7 +469,6 @@ class _AddAuthorizedAdministratorPageState SubmitBtn( btnName: '完成'.tr, onClick: () { - state.isSendSuccess.value = false; Navigator.pop(context, true); }), SizedBox( @@ -485,7 +476,7 @@ class _AddAuthorizedAdministratorPageState ), OutLineBtn( btnName: - state.emailOrPhoneController.text.contains('@') ? '邮件通知' : '短信通知', + state.emailOrPhoneController.text.contains('@') ? '邮件通知'.tr : '短信通知'.tr, onClick: () { Get.toNamed(Routers.sendEmailNotificationPage, arguments: { @@ -501,7 +492,7 @@ class _AddAuthorizedAdministratorPageState height: 10.h, ), OutLineBtn( - btnName: '微信通知', + btnName: '微信通知'.tr, onClick: () { // _openModalBottomSheet(); NativeInteractionTool() diff --git a/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_state.dart b/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_state.dart index 081859bb..ca0a6f41 100755 --- a/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_state.dart +++ b/lib/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministrator_state.dart @@ -25,14 +25,14 @@ class AddAuthorizedAdministratorState { .dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()) .obs; // - RxString countryName = '中国'.obs; + RxString countryName = '中国'.tr.obs; RxString countryCode = '86'.obs; - RxBool isSendSuccess = false.obs; + // RxBool isSendSuccess = false.obs; final RxBool isRemoteUnlock = false.obs; //是否允许远程开锁 final RxBool isAuthentication = false.obs; //是否允许实名认证 final RxBool onlyManageYouCreatesUser = false.obs; //只能管理您创建的用户 final Rx keyInfo = LockListInfoItemEntity().obs; - String pwdShareStr = '您好,您的授权管理员生成成功'; + String pwdShareStr = '您好,您的授权管理员生成成功'.tr; RxInt getKeyId = 0.obs; } diff --git a/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_logic.dart b/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_logic.dart index 063af209..129549d6 100644 --- a/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_logic.dart +++ b/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_logic.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_entity.dart'; diff --git a/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_page.dart b/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_page.dart index 3ea55476..9a803af5 100644 --- a/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_page.dart @@ -1,5 +1,5 @@ + import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupCell.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; diff --git a/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_logic.dart b/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_logic.dart index dd5c076b..4d58d2e4 100644 --- a/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_logic.dart +++ b/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_logic.dart @@ -18,12 +18,12 @@ class AdminDetailChangeDateLogic extends BaseGetXController { DateTool().dateToTimestamp(state.endTime.value, 1); if (beginTimeTimestamp > endTimeTimestamp || beginTimeTimestamp == endTimeTimestamp) { - showToast('失效时间需大于生效时间'.tr); + showToast('失效时间需晚于生效时间'.tr); return; } if (endTimeTimestamp < DateTime.now().millisecondsSinceEpoch) { - showToast('生效时间需大于当前时间'.tr); + showToast('生效时间需晚于当前时间'.tr); return; } diff --git a/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_page.dart b/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_page.dart index a0bbf288..c1ee8749 100755 --- a/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/administratorChangeDate/adminDetailChangeDate_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -11,7 +12,6 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/dateTool.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; class AdminDetailChangeDatePage extends StatefulWidget { const AdminDetailChangeDatePage({Key? key}) : super(key: key); diff --git a/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_logic.dart b/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_logic.dart index 5b9c293d..170f8d89 100755 --- a/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_logic.dart +++ b/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_logic.dart @@ -81,7 +81,7 @@ class AdministratorDetailsLogic extends BaseGetXController { } } - //取消冻结 + //解除冻结 Future cancelFreeze(int includeUnderlings) async { final ElectronicKeyListEntity entity = await ApiRepository.to.cancelFreeze( keyId: state.itemData.value.keyId.toString(), @@ -111,7 +111,7 @@ class AdministratorDetailsLogic extends BaseGetXController { Future openModalBottomSheet() async { final List textList = [ - if (state.itemData.value.keyStatus == 110405) '取消冻结'.tr else '冻结'.tr, + if (state.itemData.value.keyStatus == 110405) '解除冻结'.tr else '冻结'.tr, '取消授权'.tr ]; @@ -123,18 +123,18 @@ class AdministratorDetailsLogic extends BaseGetXController { return AlertBottomWidget( topTitle: '', items: textList, - chooseCallback: (value) { + chooseCallback: (int value) { final int index = value; if (index == 0) { if (state.itemData.value.keyStatus == 110405) { - // 取消冻结 + // 解除冻结 ShowTipView().showDeleteAdministratorIsHaveAllDataDialog( - '同时解冻其发送的钥匙'.tr, (isAllData) { + '同时解冻其发送的钥匙'.tr + '?', (bool isAllData) { cancelFreeze(isAllData ? 1 : 0); }); } else { ShowTipView().showDeleteAdministratorIsHaveAllDataDialog( - '同时冻结其发送的钥匙'.tr, (isAllData) { + '同时冻结其发送的钥匙'.tr, (bool isAllData) { freezeKey(isAllData ? 1 : 0); }); } diff --git a/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart b/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart index 99ba5a74..60cff75a 100755 --- a/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart @@ -12,7 +12,6 @@ import '../../../../../tools/commonItem.dart'; import '../../../../../tools/showTFView.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/showTipView.dart'; import 'administratorDetails_logic.dart'; @@ -96,13 +95,13 @@ class _AdministratorDetailsPageState extends State { }), Container(height: 10.h), CommonItem( - leftTitel: '仅管理自己创建的用户', + leftTitel: '仅管理自己创建的用户'.tr, rightTitle: '', isHaveRightWidget: true, isTipsImg: true, tipsImgAction: () { ShowTipView() - .showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'); + .showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr); }, rightWidget: SizedBox( width: 60.w, diff --git a/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart b/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart index 31540aa5..f885fa3a 100755 --- a/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart @@ -1,4 +1,6 @@ + import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; @@ -11,7 +13,6 @@ import 'package:star_lock/tools/submitBtn.dart'; import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../../../tools/EasyRefreshTool.dart'; import '../../../../tools/customNetworkImage.dart'; @@ -55,7 +56,7 @@ class _AuthorizedAdministratorListPageState return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.authorizedAdmin!.tr, + barTitle: '授权管理员'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -190,6 +191,7 @@ class _AuthorizedAdministratorListPageState }, child: Container( height: 100.h, + width: 1.sw, color: Colors.white, child: Row( children: [ @@ -210,33 +212,29 @@ class _AuthorizedAdministratorListPageState ), ), SizedBox(width: 20.w), - Expanded( + SizedBox( + width: 1.sw - 110.w, + // color: Colors.blue, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - SizedBox( - width: 1.sw - 110.w - 100.w, - child: Row( - children: [ - Flexible( - child: Text(itemData.name ?? '', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor)), - ), - ], - ), + Expanded( + child: Text(itemData.name ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 24.sp, + color: AppColors.blackColor)), ), SizedBox(width: 10.w), Text( XSConstantMacro.getKeyStatusStr(itemData.keyStatus!), style: TextStyle(fontSize: 18.sp, color: Colors.red), ), + SizedBox(width: 20.w) ], ), SizedBox(height: 5.h), @@ -255,7 +253,7 @@ class _AuthorizedAdministratorListPageState ], ), ), - SizedBox(width: 20.h), + // SizedBox(width: 20.h), ], ), ), diff --git a/lib/mine/mineSet/hideInvalidUnlockPermissions/hideInvalidUnlockPermissions_page.dart b/lib/mine/mineSet/hideInvalidUnlockPermissions/hideInvalidUnlockPermissions_page.dart index d80e2c0e..715a8f63 100755 --- a/lib/mine/mineSet/hideInvalidUnlockPermissions/hideInvalidUnlockPermissions_page.dart +++ b/lib/mine/mineSet/hideInvalidUnlockPermissions/hideInvalidUnlockPermissions_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -9,7 +10,6 @@ import 'package:star_lock/tools/baseGetXController.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class HideInvalidUnlockPermissionsPage extends StatefulWidget { const HideInvalidUnlockPermissionsPage({Key? key}) : super(key: key); @@ -34,9 +34,9 @@ class _HideInvalidUnlockPermissionsPageState @override Widget build(BuildContext context) { if (_isFirst) { - dynamic obj = ModalRoute.of(context)?.settings.arguments; - if (obj != null && (obj["isOn"] != null)) { - int getValue = obj["isOn"]; + final dynamic obj = ModalRoute.of(context)?.settings.arguments; + if (obj != null && (obj['isOn'] != null)) { + final int getValue = obj['isOn']; if (getValue == 1) { _isOn = true; } else { @@ -48,8 +48,7 @@ class _HideInvalidUnlockPermissionsPageState return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: - TranslationLoader.lanKeys!.hideInvalidUnlockPermissions!.tr, + barTitle:'隐藏无效开锁权限'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( @@ -61,8 +60,7 @@ class _HideInvalidUnlockPermissionsPageState children: [ Expanded( child: Text( - TranslationLoader - .lanKeys!.hideInvalidUnlockPermissionsTip!.tr, + '功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 22.sp), )), @@ -76,7 +74,7 @@ class _HideInvalidUnlockPermissionsPageState children: [ Expanded( child: Text( - "${TranslationLoader.lanKeys!.currentMode!.tr} : ${_isOn == true ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr}", + '${"当前模式".tr} : ${_isOn == true ? '已开启'.tr : "已关闭".tr}', style: TextStyle(fontWeight: FontWeight.w600, fontSize: 22.sp), )), @@ -87,8 +85,8 @@ class _HideInvalidUnlockPermissionsPageState ), SubmitBtn( btnName: _isOn == true - ? TranslationLoader.lanKeys!.close!.tr - : TranslationLoader.lanKeys!.open!.tr, + ? '关闭'.tr + : '开启'.tr, borderRadius: 20.w, fontSize: 32.sp, // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), @@ -105,11 +103,11 @@ class _HideInvalidUnlockPermissionsPageState //锁屏/隐藏无效开锁权限 1:锁屏 2:隐藏无效开锁权限 Future changeSettingsRequest() async { - ExpireLockListEntity entity = + final ExpireLockListEntity entity = await ApiRepository.to.changeSettings(_isOn == true ? '1' : '2', '2'); if (entity.errorCode!.codeIsSuccessful) { setState(() {}); - EasyLoading.showToast("操作成功",duration: 2000.milliseconds); + EasyLoading.showToast('操作成功'.tr, duration: 2000.milliseconds); } } } diff --git a/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_logic.dart b/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_logic.dart index c46e87d1..f6223eda 100755 --- a/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_logic.dart +++ b/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_logic.dart @@ -18,7 +18,7 @@ class GroupEditLockLogic extends BaseGetXController { var entity = await ApiRepository.to.lockGroupAddLock( lockIds: lockIds, groupId: state.selectGroupListItem.keyGroupId!); if (entity.errorCode!.codeIsSuccessful) { - showToast('添加成功', something: () { + showToast('添加成功'.tr, something: () { eventBus.fire(LockGroupEditGroupLockRefreshEvent()); eventBus.fire(RefreshLockListInfoDataEvent()); Get.close(2); @@ -34,7 +34,7 @@ class GroupEditLockLogic extends BaseGetXController { } var entity = await ApiRepository.to.lockGroupDeletLock(lockIds: lockIds); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功', something: () { + showToast('删除成功'.tr, something: () { eventBus.fire(LockGroupEditGroupLockRefreshEvent()); eventBus.fire(RefreshLockListInfoDataEvent()); Get.close(2); @@ -48,8 +48,4 @@ class GroupEditLockLogic extends BaseGetXController { state.isVip.refresh(); } - @override - onReady() async { - super.onReady(); - } } diff --git a/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart b/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart index a7f60c98..17c507a8 100755 --- a/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart +++ b/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart @@ -1,14 +1,14 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; import 'package:star_lock/mine/mineSet/lockGroup/groupEditLock/groupEditLock_state.dart'; -import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/noData.dart'; +import 'package:star_lock/tools/showCupertinoAlertView.dart'; import '../../../../../../app_settings/app_colors.dart'; import '../../../../../../tools/titleAppBar.dart'; -import '../../../../../../translations/trans_lib.dart'; import '../../../../tools/submitBtn.dart'; import 'groupEditLock_logic.dart'; @@ -51,8 +51,7 @@ class _GroupEditLockPageState extends State { child: Row( children: [ Text( - TranslationLoader - .lanKeys!.selectTheLockToJoinTheGroup!.tr, + '选择要加入分组的锁'.tr, style: TextStyle(fontSize: 25.sp)), ], ), diff --git a/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_state.dart b/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_state.dart index fecdd772..4a58f145 100755 --- a/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_state.dart +++ b/lib/mine/mineSet/lockGroup/groupEditLock/groupEditLock_state.dart @@ -2,17 +2,12 @@ import 'package:get/get.dart'; import '../../../../main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; class GroupEditLockState { - var lockList = []; - var type = 0; // 0添加 1删除 - var selectGroupListItem = GroupListItem(); - var ungrouped = GroupListItem(); - var isVip = false.obs; GroupEditLockState() { - Map map = Get.arguments; - type = map["type"]; - selectGroupListItem = map["groupListItem"]; - ungrouped = map["ungrouped"]; + final Map map = Get.arguments; + type = map['type']; + selectGroupListItem = map['groupListItem']; + ungrouped = map['ungrouped']; if (type == 0) { lockList = ungrouped.lockList!; } else { @@ -20,8 +15,13 @@ class GroupEditLockState { } for (int i = 0; i < lockList.length; i++) { - LockListItem lockListItem = lockList[i]; + final LockListItem lockListItem = lockList[i]; lockListItem.isChecked = false; } } + List lockList = []; + int type = 0; // 0添加 1删除 + GroupListItem selectGroupListItem = GroupListItem(); + GroupListItem ungrouped = GroupListItem(); + RxBool isVip = false.obs; } diff --git a/lib/mine/mineSet/lockGroup/lockGroupDetailList/lockItemList_page.dart b/lib/mine/mineSet/lockGroup/lockGroupDetailList/lockItemList_page.dart index f6c28e84..424943b5 100755 --- a/lib/mine/mineSet/lockGroup/lockGroupDetailList/lockItemList_page.dart +++ b/lib/mine/mineSet/lockGroup/lockGroupDetailList/lockItemList_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -7,7 +8,6 @@ import 'package:star_lock/tools/submitBtn.dart'; import '../../../../../../app_settings/app_colors.dart'; import '../../../../../../tools/titleAppBar.dart'; -import '../../../../../../translations/trans_lib.dart'; import '../../../../appRouters.dart'; import '../../../../tools/custom_bottom_sheet.dart'; @@ -24,8 +24,8 @@ class _LockItemListPageState extends State { @override Widget build(BuildContext context) { - Map map = Get.arguments; - GroupListItem groupListItem = map['groupListItem']; + final Map map = Get.arguments; + final GroupListItem groupListItem = map['groupListItem']; lockList = groupListItem.lockList!; ungrouped = map['ungrouped']; @@ -64,7 +64,7 @@ class _LockItemListPageState extends State { body: lockList.isNotEmpty ? ListView.separated( itemBuilder: (context, index) { - LockListItem itemData = lockList[index]; + final LockListItem itemData = lockList[index]; return _listItemView(itemData); }, itemCount: lockList.length, @@ -141,7 +141,7 @@ class _LockItemListPageState extends State { topTitle: '', items: ['添加'.tr, '删除'.tr], chooseCallback: (value) { - int getSelectIndex = value; + final int getSelectIndex = value; if (getSelectIndex == 0) { Get.toNamed(Routers.groupEditLockPage, arguments: {'groupListItem': groupListItem, 'ungrouped': ungrouped, 'type': 0}); } else if (getSelectIndex == 1) { diff --git a/lib/mine/mineSet/lockGroup/lockGroupList/lockGroupList_page.dart b/lib/mine/mineSet/lockGroup/lockGroupList/lockGroupList_page.dart index 7704bb5c..1aa02f9b 100755 --- a/lib/mine/mineSet/lockGroup/lockGroupList/lockGroupList_page.dart +++ b/lib/mine/mineSet/lockGroup/lockGroupList/lockGroupList_page.dart @@ -1,6 +1,8 @@ + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; import 'package:star_lock/mine/mineSet/lockGroup/lockGroupList/lockGroupList_state.dart'; @@ -9,10 +11,7 @@ import 'package:star_lock/tools/showTipView.dart'; import '../../../../../../appRouters.dart'; import '../../../../../../app_settings/app_colors.dart'; -import '../../../../../../tools/commonItem.dart'; import '../../../../../../tools/titleAppBar.dart'; -import '../../../../../../translations/trans_lib.dart'; -import '../../../../tools/left_slide/left_slide_actions.dart'; import '../../../../tools/noData.dart'; import 'lockGroupList_logic.dart'; @@ -32,7 +31,7 @@ class _LockGroupListPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockGroup!.tr, + barTitle: '锁分组'.tr, haveBack: true, actionsList: [ IconButton( @@ -47,15 +46,14 @@ class _LockGroupListPageState extends State { // showCupertinoAlertDialog(context, true, 0); ShowTipView().showTFViewAlertDialog( state.changeNameController, - TranslationLoader.lanKeys!.createNewGroup!.tr, - '请输入'.tr, () { + '创建新分组'.tr, + '请输入姓名'.tr, () { //发送编辑钥匙名称请求 if (state.changeNameController.text.isNotEmpty) { Navigator.of(context).pop(); logic.addLockGroupRequest(); } else { - logic.showToast( - TranslationLoader.lanKeys!.pleaseEnterAGroupName!.tr); + logic.showToast('请输入分组名称'.tr); } }, isShowSuffixIcon: true, @@ -81,66 +79,89 @@ class _LockGroupListPageState extends State { final GroupListItem itemData = state.itemDataList[i]; state.lockNum += itemData.lockList!.length; } - return ListView.separated( - itemCount: state.itemDataList.length + 1, - itemBuilder: (BuildContext c, int index) { - if (index == state.itemDataList.length) { - return Center( - child: Column( - children: [ - SizedBox( - height: 20.h, - ), - SizedBox( - height: 40.h, - child: Text( - '${TranslationLoader.lanKeys!.lockTrCount!.tr}:${state.lockNum.toString()}', - style: TextStyle( - color: AppColors.darkGrayTextColor, fontSize: 20.sp), + return SlidableAutoCloseBehavior( + child: ListView.separated( + itemCount: state.itemDataList.length + 1, + itemBuilder: (BuildContext c, int index) { + if (index == state.itemDataList.length) { + return Center( + child: Column( + children: [ + SizedBox( + height: 20.h, ), - ) - ], - ), - ); - } else { - final GroupListItem itemData = state.itemDataList[index]; - if (itemData.groupType == 0) { - state.ungrouped = itemData; - } - if (index < state.itemDataList.length) { - return LeftSlideActions( - tag: itemData.keyGroupId!.toString(), - key: Key(itemData.keyGroupId!.toString()), - actionsWidth: itemData.groupType != 0 ? 200.w : 0, - actions: itemData.groupType != 0 - ? [ - _buildEditBtn(itemData), - _buildDeleteBtn(itemData), - ] - : [], - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(1)), + SizedBox( + height: 40.h, + child: Text( + '${'锁数量'.tr}:${state.lockNum.toString()}', + style: TextStyle( + color: AppColors.darkGrayTextColor, fontSize: 20.sp), + ), + ) + ], ), - child: lockDataListItem( - '${itemData.keyGroupName}(${itemData.lockList?.length})', - () { - Get.toNamed(Routers.lockItemListPage, - arguments: { - 'groupListItem': itemData, - 'ungrouped': state.ungrouped - }); - }), ); + } else { + final GroupListItem itemData = state.itemDataList[index]; + if (itemData.groupType == 0) { + state.ungrouped = itemData; + } + if (index < state.itemDataList.length) { + return Slidable( + key: ValueKey(itemData.keyGroupId), + endActionPane: ActionPane( + extentRatio: 0.4, + motion: const ScrollMotion(), + children: [ + _buildEditBtn(itemData), + _buildDeleteBtn(itemData), + ], + ), + child: lockDataListItem( + '${itemData.keyGroupName}(${itemData.lockList?.length})', + () { + Get.toNamed(Routers.lockItemListPage, + arguments: { + 'groupListItem': itemData, + 'ungrouped': state.ungrouped + }); + }), + ); + + // return LeftSlideActions( + // tag: itemData.keyGroupId!.toString(), + // key: Key(itemData.keyGroupId!.toString()), + // actionsWidth: itemData.groupType != 0 ? 200.w : 0, + // actions: itemData.groupType != 0 + // ? [ + // _buildEditBtn(itemData), + // _buildDeleteBtn(itemData), + // ] + // : [], + // decoration: const BoxDecoration( + // borderRadius: BorderRadius.all(Radius.circular(1)), + // ), + // child: lockDataListItem( + // '${itemData.keyGroupName}(${itemData.lockList?.length})', + // () { + // Get.toNamed(Routers.lockItemListPage, + // arguments: { + // 'groupListItem': itemData, + // 'ungrouped': state.ungrouped + // }); + // }), + // ); + } + return const SizedBox.shrink(); } - return const SizedBox.shrink(); - } - }, - separatorBuilder: (BuildContext context, int index) { - return const Divider( - height: 1, - color: AppColors.greyLineColor, - ); - }); + }, + separatorBuilder: (BuildContext context, int index) { + return const Divider( + height: 1, + color: AppColors.greyLineColor, + ); + }), + ); } Widget _buildDeleteBtn(GroupListItem groupListItem) { @@ -153,7 +174,7 @@ class _LockGroupListPageState extends State { }); }, child: Container( - width: 100.w, + width: 1.sw*0.2, color: const Color(0xFFF20101), alignment: Alignment.center, child: Text( @@ -177,7 +198,7 @@ class _LockGroupListPageState extends State { // showCupertinoAlertDialog(context, false, groupListItem.keyGroupId!); ShowTipView().showTFViewAlertDialog(state.changeNameController, - '修改名称'.tr, '请输入'.tr, () { + '修改名称'.tr, '请输入姓名'.tr, () { if (state.changeNameController.text.isNotEmpty) { Get.back(); logic.editLockGroupRequest(groupListItem.keyGroupId!); @@ -186,13 +207,12 @@ class _LockGroupListPageState extends State { Get.find(tag: keyGroupId).hide(); } } else { - logic.showToast( - TranslationLoader.lanKeys!.pleaseEnterAGroupName!.tr); + logic.showToast('请输入分组名称'.tr); } }, isShowSuffixIcon: true); }, child: Container( - width: 100.w, + width: 1.sw*0.2, color: AppColors.mainColor, alignment: Alignment.center, child: Text( @@ -212,7 +232,7 @@ class _LockGroupListPageState extends State { return GestureDetector( onTap: action, child: Container( - // height: 70.h, + height: 70.h, padding: EdgeInsets.only(left: 20.w, right: 10.w, top: 15.h, bottom: 15.h), decoration: BoxDecoration( diff --git a/lib/mine/mineSet/lockScreen/lockScreen_page.dart b/lib/mine/mineSet/lockScreen/lockScreen_page.dart index b7822d9e..20791b46 100755 --- a/lib/mine/mineSet/lockScreen/lockScreen_page.dart +++ b/lib/mine/mineSet/lockScreen/lockScreen_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -9,7 +10,6 @@ import 'package:star_lock/tools/baseGetXController.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class LockScreenPage extends StatefulWidget { const LockScreenPage({Key? key}) : super(key: key); @@ -32,9 +32,9 @@ class _LockScreenPageState extends State { @override Widget build(BuildContext context) { if (_isFirst) { - dynamic obj = ModalRoute.of(context)?.settings.arguments; - if (obj != null && (obj["isOn"] != null)) { - int getValue = obj["isOn"]; + final dynamic obj = ModalRoute.of(context)?.settings.arguments; + if (obj != null && (obj['isOn'] != null)) { + final int getValue = obj['isOn']; if (getValue == 1) { _isOn = true; } else { @@ -46,7 +46,7 @@ class _LockScreenPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockScreen!.tr, + barTitle: '锁屏'.tr, // backAction: () { // Navigator.pop(context, true); // }, @@ -66,7 +66,7 @@ class _LockScreenPageState extends State { children: [ Expanded( child: Text( - TranslationLoader.lanKeys!.lockSoundTip!.tr, + '功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), )), @@ -80,7 +80,7 @@ class _LockScreenPageState extends State { children: [ Expanded( child: Text( - "${TranslationLoader.lanKeys!.currentMode!.tr} : ${_isOn == true ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr}", + '${"当前模式".tr} : ${_isOn == true ? '已开启'.tr : '已关闭'.tr}', style: TextStyle(fontWeight: FontWeight.w600, fontSize: 22.sp), )), @@ -91,8 +91,8 @@ class _LockScreenPageState extends State { ), SubmitBtn( btnName: _isOn == true - ? TranslationLoader.lanKeys!.close!.tr - : TranslationLoader.lanKeys!.open!.tr, + ? '关闭'.tr + : '开启'.tr, onClick: () { _isFirst = false; setState(() { @@ -107,10 +107,10 @@ class _LockScreenPageState extends State { //锁屏/隐藏无效开锁权限 1:锁屏 2:隐藏无效开锁权限 Future changeSettingsRequest() async { - ExpireLockListEntity entity = + final ExpireLockListEntity entity = await ApiRepository.to.changeSettings(_isOn == true ? '1' : '2', '1'); if (entity.errorCode!.codeIsSuccessful) { - EasyLoading.showToast('操作成功',duration: 2000.milliseconds); + EasyLoading.showToast('操作成功'.tr, duration: 2000.milliseconds); } } } diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_logic.dart index 577a1460..8c296c50 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/io_reply.dart'; import 'package:star_lock/blue/io_tool/io_tool.dart'; @@ -170,7 +171,7 @@ class ExpireCardLogic extends BaseGetXController { deleteType:'1' ); if(entity.errorCode!.codeIsSuccessful){ - showToast('删除成功', something: (){ + showToast('删除成功'.tr, something: (){ BlueManage().disconnect(); pageNo = 1; expirCardListRequest(isRefresh: true, isRefreshLockUserManageList: true); @@ -182,7 +183,7 @@ class ExpireCardLogic extends BaseGetXController { String getExpireDateStr(ExpireCardItemEntity itemData) { String useDateStr = ''; if(itemData.cardType == 4){ - useDateStr = '循环'; + useDateStr = '循环'.tr; }else{ useDateStr = '${DateTool().dateToYMDString(itemData.startDate.toString())}-${DateTool().dateToYMDString(itemData.endDate.toString())}'; } @@ -196,12 +197,6 @@ class ExpireCardLogic extends BaseGetXController { _initReplySubscription(); } - @override - void onInit() { - super.onInit(); - - } - @override void onClose() { super.onClose(); diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_page.dart index 2ba20edc..7a1d72c8 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_page.dart @@ -71,14 +71,14 @@ class _ExpireCardPageState extends State with RouteAware { children: [ SlidableAction( onPressed: (BuildContext context){ - ShowTipView().showIosTipWithContentDialog('确定删除卡吗?', (){ + ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, (){ state.deletExpireCardItemEntity = indexEntity; logic.senderAddICCard(); }); }, backgroundColor: Colors.red, foregroundColor: Colors.white, - label: '删除', + label: '删除'.tr, padding: EdgeInsets.only(left: 5.w, right: 5.w), ), ], @@ -229,7 +229,7 @@ class _ExpireCardPageState extends State with RouteAware { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '余${itemData.expireDate.toString()}天', + '${'余'.tr}${itemData.expireDate.toString()}${'天'.tr}', style: TextStyle( color: Colors.white, fontSize: 13.sp), ), @@ -242,7 +242,7 @@ class _ExpireCardPageState extends State with RouteAware { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '已过期', + '已过期'.tr, style: TextStyle( color: Colors.white, fontSize: 13.sp), ), diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_logic.dart index 7ab34cda..518818d6 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_logic.dart @@ -1,5 +1,5 @@ - +import 'package:get/get.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; @@ -41,7 +41,7 @@ class ExpireLockListLogic extends BaseGetXController{ includeUnderlings: includeUnderlings ); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功', something: () { + showToast('删除成功'.tr, something: () { expireLockListRequest(isRefresh: true, isRefreshLockUserManageList: true); }); } @@ -51,7 +51,7 @@ class ExpireLockListLogic extends BaseGetXController{ String getExpireDateStr(ExpireLockItem itemData) { String useDateStr = ''; if(itemData.keyType == 4){ - useDateStr = '循环'; + useDateStr = '循环'.tr; }else{ useDateStr = '${DateTool().dateToYMDString(itemData.startDate.toString())}-${DateTool().dateToYMDString(itemData.endDate.toString())}'; } @@ -61,12 +61,12 @@ class ExpireLockListLogic extends BaseGetXController{ deletKeyLogic(ExpireLockItem expireLockItem){ if(expireLockItem.keyRight == 1){ // 授权管理员 - ShowTipView().showDeleteAdministratorIsHaveAllDataDialog('同时删除其发送的所有钥匙,钥匙删除后不能恢复', (isAllData) { + ShowTipView().showDeleteAdministratorIsHaveAllDataDialog('同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (isAllData) { deleteKeyRequest(isAllData ? 1 : 0, expireLockItem); }); }else{ // 普通用户 - ShowTipView().showIosTipWithContentDialog('删除钥匙会在用户APP连网后生效', (){ + ShowTipView().showIosTipWithContentDialog('删除钥匙会在用户APP连网后生效'.tr, (){ deleteKeyRequest(0, expireLockItem); }); } diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_page.dart index 84f9f90e..adeedfc8 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_page.dart @@ -70,7 +70,7 @@ class _ExpireLockListPageState extends State { }, backgroundColor: Colors.red, foregroundColor: Colors.white, - label: '删除', + label: '删除'.tr, padding: EdgeInsets.only(left: 5.w, right: 5.w), ), ], @@ -207,7 +207,7 @@ class _ExpireLockListPageState extends State { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '未生效', + '未生效'.tr, style: TextStyle( color: Colors.white, fontSize: 13.sp), ), @@ -221,7 +221,7 @@ class _ExpireLockListPageState extends State { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '余${itemData.expireDate.toString()}天', + '${'余'.tr}${itemData.expireDate.toString()}${'天'.tr}', style: TextStyle( color: Colors.white, fontSize: 13.sp), ), @@ -234,7 +234,7 @@ class _ExpireLockListPageState extends State { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '已过期', + '已过期'.tr, style: TextStyle( color: Colors.white, fontSize: 13.sp), ), diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_logic.dart index 895f1eec..172dd8f1 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/dateTool.dart'; @@ -135,7 +136,7 @@ class ExpireFaceLogic extends BaseGetXController { lockId: state.seletExpireFaceListItemEntity.lockId!, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功', something: (){ + showToast('删除成功'.tr, something: (){ expireFaceList(isRefresh: true, isRefreshLockUserManageList: true); }); } @@ -177,7 +178,7 @@ class ExpireFaceLogic extends BaseGetXController { String getExpireDateStr(ExpireFaceListItemEntity itemData) { String useDateStr = ''; if(itemData.faceType == 4){ - useDateStr = '循环'; + useDateStr = '循环'.tr; }else{ useDateStr = '${DateTool().dateToYMDString(itemData.startDate.toString())}-${DateTool().dateToYMDString(itemData.endDate.toString())}'; } diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_page.dart index effde440..d705694c 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireFace/expireFace_page.dart @@ -71,14 +71,14 @@ class _ExpireFacePageState extends State with RouteAware { children: [ SlidableAction( onPressed: (BuildContext context){ - ShowTipView().showIosTipWithContentDialog('确定删除人脸吗?', (){ + ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, (){ state.seletExpireFaceListItemEntity = indexEntity; logic.senderAddFace(); }); }, backgroundColor: Colors.red, foregroundColor: Colors.white, - label: '删除', + label: '删除'.tr, padding: EdgeInsets.only(left: 5.w, right: 5.w), ), ], @@ -213,7 +213,7 @@ class _ExpireFacePageState extends State with RouteAware { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '余${itemData.expireDate.toString()}天', + '${'余'.tr}${itemData.expireDate.toString()}${'天'.tr}', style: TextStyle( color: Colors.white, fontSize: 13.sp), ), @@ -226,7 +226,7 @@ class _ExpireFacePageState extends State with RouteAware { borderRadius: BorderRadius.circular(2.0), ), child: Text( - '已过期', + '已过期'.tr, style: TextStyle( color: Colors.white, fontSize: 13.sp), ), diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_logic.dart index 58e08f4e..7dba76fd 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; import 'package:star_lock/blue/io_tool/io_tool.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -143,7 +144,7 @@ class ExpireFingerprintLogic extends BaseGetXController { deleteType:'1' ); if(entity.errorCode!.codeIsSuccessful){ - showToast('删除成功',something: (){ + showToast('删除成功'.tr, something: (){ BlueManage().disconnect(); expirFingerprintListRequest(isRefresh: true, isRefreshLockUserManageList: true); }); @@ -174,7 +175,7 @@ class ExpireFingerprintLogic extends BaseGetXController { String getExpireDateStr(ExpireFingerprintItemEntity itemData) { String useDateStr = ''; if(itemData.fingerprintType == 4){ - useDateStr = '循环'; + useDateStr = '循环'.tr; }else{ useDateStr = '${DateTool().dateToYMDString(itemData.startDate.toString())}-${DateTool().dateToYMDString(itemData.endDate.toString())}'; } diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_page.dart index 209586ec..60b1ca10 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -68,14 +69,14 @@ class _ExpireFingerprintPageState extends State with Rout children: [ SlidableAction( onPressed: (BuildContext context) { - ShowTipView().showIosTipWithContentDialog('确定删除指纹吗?', () { + ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, () { state.deletExpireFingerprintItemEntity = indexEntity; logic.senderAddFingerprint(); }); }, backgroundColor: Colors.red, foregroundColor: Colors.white, - label: '删除', + label: '删除'.tr, padding: EdgeInsets.only(left: 5.w, right: 5.w), ), ], @@ -218,7 +219,7 @@ class _ExpireFingerprintPageState extends State with Rout borderRadius: BorderRadius.circular(2.0), ), child: Text( - '余${itemData.expireDate.toString()}天', + '${'余'.tr}${itemData.expireDate.toString()}${'天'.tr}', style: TextStyle(color: Colors.white, fontSize: 13.sp), ), ); @@ -230,7 +231,7 @@ class _ExpireFingerprintPageState extends State with Rout borderRadius: BorderRadius.circular(2.0), ), child: Text( - '已过期', + '已过期'.tr, style: TextStyle(color: Colors.white, fontSize: 13.sp), ), ); diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_logic.dart index 45512c91..381a48e8 100644 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_logic.dart @@ -428,7 +428,7 @@ class ExpireKeyChangeDateLogic extends BaseGetXController { faceRight: state.isAdmin ); if (entity.errorCode!.codeIsSuccessful) { - showToast('修改成功', something: () { + showToast('修改成功'.tr, something: () { Get.back(result: { 'beginTimeTimestamp':state.beginTimeTimestamp.value.toString(), 'endTimeTimestamp':state.endTimeTimestamp.value.toString(), diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_page.dart index 30c543a8..6cf44c01 100644 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeDate/expireKeyChangeDate_page.dart @@ -12,7 +12,6 @@ import '../../../../../tools/pickers/pickers.dart'; import '../../../../../tools/pickers/time_picker/model/date_mode.dart'; import '../../../../../tools/pickers/time_picker/model/pduration.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'expireKeyChangeDate_logic.dart'; import 'expireKeyChangeDate_state.dart'; @@ -50,13 +49,13 @@ class _ExpireKeyChangeDatePageState extends State with state.endTimeTimestamp.value || state.beginTimeTimestamp.value == state.endTimeTimestamp.value) { - logic.showToast('失效时间需大于生效时间'.tr); + logic.showToast('失效时间需晚于生效时间'.tr); return; } if (state.endTimeTimestamp.value < DateTime.now().millisecondsSinceEpoch) { - logic.showToast('生效时间需大于当前时间'.tr); + logic.showToast('生效时间需晚于当前时间'.tr); return; } switch (state.pushType.value) { diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_logic.dart index 65542841..21d7d3e1 100644 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_logic.dart @@ -439,7 +439,7 @@ class ExpireKeyChangeValidityDateLogic extends BaseGetXController { faceRight: state.isAdmin, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('修改成功', something: () { + showToast('修改成功'.tr, something: () { eventBus.fire(OtherTypeRefreshListEvent()); Get.back(result: { 'starDate':state.starDateTimestamp.value.toString(), @@ -459,12 +459,6 @@ class ExpireKeyChangeValidityDateLogic extends BaseGetXController { _initReplySubscription(); } - @override - void onInit() { - super.onInit(); - - } - @override void onClose() { super.onClose(); diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_page.dart index 30127ec6..be78d129 100644 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireKeyChangeValidityDate/expireKeyChangeValidityDate_page.dart @@ -12,7 +12,6 @@ import '../../../../../tools/pickers/time_picker/model/date_mode.dart'; import '../../../../../tools/pickers/time_picker/model/pduration.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import 'expireKeyChangeValidityDate_logic.dart'; import 'expireKeyChangeValidityDate_state.dart'; @@ -45,7 +44,7 @@ class _ExpireKeyChangeValidityDatePageState extends State state.endDateTimestamp.value) { - logic.showToast('失效日期要大于生效日期'.tr); + logic.showToast('失效日期需晚于生效日期'.tr); return; } @@ -69,7 +68,7 @@ class _ExpireKeyChangeValidityDatePageState extends State= state.endTimeTimestamp.value) { - logic.showToast('失效时间要大于生效时间'.tr); + logic.showToast('失效时间需晚于生效时间'.tr); return; } @@ -153,7 +152,7 @@ class _ExpireKeyChangeValidityDatePageState extends State[ Obx(() => CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.begin!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel: '开始时间'.tr, rightTitle: state.starTime.value, isHaveDirection: true, isHaveLine: true, @@ -261,8 +259,7 @@ class _ExpireKeyChangeValidityDatePageState extends State CommonItem( - leftTitel: - "${TranslationLoader.lanKeys!.end!.tr}${TranslationLoader.lanKeys!.time!.tr}", + leftTitel:'结束时间'.tr, rightTitle: state.endTime.value, isHaveDirection: true, action: () { diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_page.dart index 1c8008a2..b05e1432 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:star_lock/tools/titleAppBar.dart'; import '../../../../app_settings/app_colors.dart'; @@ -20,7 +21,7 @@ class _ExpireLockManagePageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '即将到期', + barTitle: '即将到期'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: const Column( diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_tabbar.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_tabbar.dart index 73b2f8fe..2cf946f3 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_tabbar.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expireLockManage_tabbar.dart @@ -4,7 +4,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/tools/CustomUnderlineTabIndicator.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import 'expireCard/expireCard_page.dart'; import 'expireElectronicKey/expireLockList_page.dart'; diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_logic.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_logic.dart index e413bf38..236bcfb9 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_logic.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_logic.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:get/get.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/dateTool.dart'; @@ -149,7 +150,7 @@ class ExpirePasswordLogic extends BaseGetXController { keyboardPwdId: state.seletIndexEntity.pwdId.toString(), deleteType: 1); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功', something: () { + showToast('删除成功'.tr, something: () { expirePasswordListRequest(isRefresh: true, isRefreshLockUserManageList: true); }); } @@ -160,7 +161,7 @@ class ExpirePasswordLogic extends BaseGetXController { String useDateStr = ''; //* getKeyType 单次1 永久2 限期3 删除4 周未循环5 每日循环6 工作日循环7 周一循环8 周二循环9 周三循环10 周四循环11 周五循环12 周六循环13 周天循环14 if (itemData.keyboardPwdType! > 4) { - useDateStr = '循环'; + useDateStr = '循环'.tr; } else { useDateStr = '${DateTool().dateToYMDString(itemData.startDate.toString())}-${DateTool().dateToYMDString(itemData.endDate.toString())}'; diff --git a/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_page.dart b/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_page.dart index bfeea527..45a988ab 100755 --- a/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_page.dart +++ b/lib/mine/mineSet/lockUserManage/expireLockList/expirePassword/expirePassword_page.dart @@ -75,14 +75,14 @@ class _ExpirePasswordPageState extends State with RouteAware children: [ SlidableAction( onPressed: (BuildContext context) { - ShowTipView().showIosTipWithContentDialog('确定删除该密码吗?', () { + ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, () { state.seletIndexEntity = indexEntity; logic.senderCustomPasswords(); }); }, backgroundColor: Colors.red, foregroundColor: Colors.white, - label: '删除', + label: '删除'.tr, padding: EdgeInsets.only(left: 5.w, right: 5.w), ), ], @@ -113,7 +113,7 @@ class _ExpirePasswordPageState extends State with RouteAware getHttpData(isRefresh: true); } }else { - logic.showToast('该密码不是自定义密码,无法修改'); + logic.showToast('该密码不是自定义密码,无法修改'.tr); } }, child: Container( @@ -195,7 +195,7 @@ class _ExpirePasswordPageState extends State with RouteAware borderRadius: BorderRadius.circular(2.0), ), child: Text( - '余${itemData.expireDate.toString()}天', + '${'余'.tr}${itemData.expireDate.toString()}${'天'.tr}', style: TextStyle(color: Colors.white, fontSize: 13.sp), ), )), diff --git a/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_logic.dart b/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_logic.dart index 994f9f54..bd57ef73 100755 --- a/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_logic.dart +++ b/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_logic.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import '../../../../main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.dart'; import '../../../../network/api_repository.dart'; @@ -34,10 +35,9 @@ class LockUserManageListLogic extends BaseGetXController { //删除锁用户管理 Future deletelockUserRequest(int uid) async { - final entity = await ApiRepository.to.deletLockUser(uid); + final LoginEntity entity = await ApiRepository.to.deletLockUser(uid); if (entity.errorCode!.codeIsSuccessful) { - EasyLoading.showToast('删除成功',duration: 2000.milliseconds); - showToast('删除成功', something: (){ + showToast('删除成功'.tr, something: (){ pageNo = 1; lockUserListRequest(); }); diff --git a/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_page.dart b/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_page.dart index 56bca6d3..174a938f 100755 --- a/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_page.dart +++ b/lib/mine/mineSet/lockUserManage/lockUserManageList/lockUserManageList_page.dart @@ -1,4 +1,4 @@ - +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -10,7 +10,6 @@ import 'package:star_lock/tools/noData.dart'; import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/EasyRefreshTool.dart'; import '../../../../tools/customNetworkImage.dart'; import '../../../../tools/keySearchWidget.dart'; @@ -26,7 +25,8 @@ class LockUserManageListPage extends StatefulWidget { class _LockUserManageListPageState extends State { final LockUserManageListLogic logic = Get.put(LockUserManageListLogic()); - final LockUserManageListState state = Get.find().state; + final LockUserManageListState state = + Get.find().state; Future getHttpData() async { logic.lockUserListRequest().then((LockUserListEntity value) { @@ -47,13 +47,13 @@ class _LockUserManageListPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.lockUserManagement!.tr, + barTitle: '锁用户管理'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ TextButton( child: Text( - TranslationLoader.lanKeys!.aboutToExpire!.tr, + '即将到期'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { @@ -168,8 +168,9 @@ class _LockUserManageListPageState extends State { arguments: {'uid': itemData.uid}); }, child: Container( - height: 90.h, + // height: 90.h, color: Colors.white, + padding: EdgeInsets.only(top: 15.h, bottom: 15.h), // decoration: BoxDecoration( // color: Colors.white, // borderRadius: BorderRadius.circular(10.w), @@ -193,17 +194,20 @@ class _LockUserManageListPageState extends State { SizedBox( width: 20.w, ), - Expanded( + SizedBox( + width: 1.sw - 30.w - 60.w - 20.w - 20.w - 20.w - 12.w, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text( - itemData.nickname ?? '', - style: TextStyle( - fontSize: 24.sp, color: AppColors.blackColor), + Expanded( + child: Text( + itemData.nickname ?? '', + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor), + ), ), ], ), @@ -235,13 +239,14 @@ class _LockUserManageListPageState extends State { ); } - void showIosTipViewDialog(BuildContext context, LockUserItemData lockUserData) { + void showIosTipViewDialog( + BuildContext context, LockUserItemData lockUserData) { showDialog( context: context, builder: (BuildContext context) { return ShowIosTipView( - title: '提示', - tipTitle: '删除用户时,会将用户拥有的钥匙一起删除。', + title: '提示'.tr, + tipTitle: '删除用户时,会将用户拥有的钥匙一起删除。'.tr, sureClick: () { Get.back(); logic.deletelockUserRequest(lockUserData.uid!); diff --git a/lib/mine/mineSet/lockUserManage/ownedKeyList/ownedKeyList_page.dart b/lib/mine/mineSet/lockUserManage/ownedKeyList/ownedKeyList_page.dart index 4e8ec6a0..384ce2f1 100755 --- a/lib/mine/mineSet/lockUserManage/ownedKeyList/ownedKeyList_page.dart +++ b/lib/mine/mineSet/lockUserManage/ownedKeyList/ownedKeyList_page.dart @@ -8,7 +8,6 @@ import 'package:star_lock/mine/mineSet/lockUserManage/lockUserManageList/keyList import 'package:star_lock/mine/mineSet/lockUserManage/ownedKeyList/ownedKeyList_state.dart'; import 'package:star_lock/tools/noData.dart'; import 'package:star_lock/tools/showIosTipView.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; @@ -47,7 +46,7 @@ class _OwnedKeyListPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.ownedKey!.tr, + barTitle: '拥有的钥匙'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -76,7 +75,7 @@ class _OwnedKeyListPageState extends State { padding: EdgeInsets.only(left: 30.w, top: 20.w, right: 20.w, bottom: 10.w), child: Text( - TranslationLoader.lanKeys!.ownedKey!.tr, + '拥有的钥匙'.tr, style: TextStyle(fontSize: 24.sp), ), ), diff --git a/lib/mine/mineSet/mineSet/mineSet_logic.dart b/lib/mine/mineSet/mineSet/mineSet_logic.dart index d5da7a22..40dbc7be 100755 --- a/lib/mine/mineSet/mineSet/mineSet_logic.dart +++ b/lib/mine/mineSet/mineSet/mineSet_logic.dart @@ -13,18 +13,18 @@ import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/versionUndate/versionUndate_entity.dart'; +import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; -import '../../../app_settings/app_settings.dart'; import '../../../blue/blue_manage.dart'; import '../../../talk/udp/udp_help.dart'; -import '../../../tools/eventBusEventManage.dart'; +import '../../../tools/dateTool.dart'; import '../../../tools/store_service.dart'; -import '../../../translations/app_dept.dart'; class MineSetLogic extends BaseGetXController { final MineSetState state = MineSetState(); + //用户信息 Future userSettingsInfoRequest() async { final UserSettingInfoEntity entity = @@ -127,8 +127,18 @@ class MineSetLogic extends BaseGetXController { getPushDeviceID = value; } }); - final LoginEntity entity = await ApiRepository.to.userLogout(deviceld: getPushDeviceID); + final LoginEntity entity = + await ApiRepository.to.userLogout(deviceld: getPushDeviceID); + final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { + UmengCommonSdk.onEvent('logout', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'logout_result': '成功', + }); + UdpHelp().closeUDP(); logOut(); @@ -138,6 +148,14 @@ class MineSetLogic extends BaseGetXController { BlueManage().disconnect(); XSJPushProvider().initLocalNotification(isCancelLocalPush: true); Get.offNamedUntil(Routers.starLockLoginPage, (Route route) => false); + } else { + UmengCommonSdk.onEvent('logout', { + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'logout_result': '${entity.errorCode}--${entity.errorMsg}', + }); } } @@ -156,37 +174,14 @@ class MineSetLogic extends BaseGetXController { } } - // 下级界面修改成功后传递数据 - StreamSubscription? _getNumberEvent; - void _initLoadDataAction() { - // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _getNumberEvent = eventBus.on().listen((ChangeLanguageBlockLastLanguageEvent event) { - state.currentLanguage.value = _getCurrentLanguage(); - }); - } - - String _getCurrentLanguage() { - String? languageCode = StoreService.to.getLanguageCode(); - if(languageCode!.isEmpty){ - languageCode = Get.deviceLocale!.languageCode; - } - final String currentLanguage = ExtensionLanguageType.fromLocale(appDept.deptSupportedLocales.where((Locale element) => element.languageCode == languageCode).first).lanTitle; - return currentLanguage; - } - - @override - void onReady() { - super.onReady(); - - state.currentLanguage.value = _getCurrentLanguage(); - _initLoadDataAction(); - getUserInfoRequest(); - } - - @override - void onClose() { - super.onClose(); - - _getNumberEvent!.cancel(); - } + // // 下级界面修改成功后传递数据 + // StreamSubscription? _getNumberEvent; + // void _initLoadDataAction() { + // // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + // _getNumberEvent = eventBus + // .on() + // .listen((ChangeLanguageBlockLastLanguageEvent event) { + // state.currentLanguage.value = CurrentLocaleTool.getCurrentLocaleString(); + // }); + // } } diff --git a/lib/mine/mineSet/mineSet/mineSet_page.dart b/lib/mine/mineSet/mineSet/mineSet_page.dart index 8e6b7988..3cb15f4e 100755 --- a/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -2,13 +2,17 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get/get_state_manager/get_state_manager.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/mineSet/mineSet/mineSet_logic.dart'; import 'package:star_lock/mine/mineSet/mineSet/mineSet_state.dart'; +import 'package:star_lock/tools/langue/langue_tool.dart'; import 'package:star_lock/tools/wechat/customer_tool.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; @@ -17,6 +21,7 @@ import '../../../tools/showTipView.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/titleAppBar.dart'; import '../../../tools/wechat/wechatManageTool.dart'; +import '../../../tools/wechat/wx_push_miniProgram/wx_push_miniProgram.dart'; import '../../../translations/trans_lib.dart'; class MineSetPage extends StatefulWidget { @@ -58,26 +63,43 @@ class _MineSetPageState extends State _checkNotificationPermission(); return Scaffold( - backgroundColor: AppColors.mainBackgroundColor, - appBar: widget.showAppBar - ? F.sw( - skyCall: () => TitleAppBar( - barTitle: '更多设置'.tr, - haveBack: true, - backgroundColor: AppColors.mainColor, + backgroundColor: AppColors.mainBackgroundColor, + appBar: widget.showAppBar + ? F.sw( + skyCall: () => TitleAppBar( + barTitle: '更多设置'.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: '更多设置'.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + )) + : null, + body: SingleChildScrollView( + child: styleHierarchy(), + ), + floatingActionButton: widget.showAppBar + ? null + : GestureDetector( + onTap: () { + WechatManageTool.getAppInfo(() { + WxPushWeChatMiniProgramTool.pushWeChatMiniProgram( + 'wxbe340095d2b8fd51'); + }); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(40.r), + child: Image.asset( + 'images/mine/icon_mine_wan_wanshifu.png', + width: 80.w, + height: 80.w, ), - xhjCall: () => TitleAppBar( - barTitle: '更多设置'.tr, - haveBack: true, - backgroundColor: Colors.white, - iconColor: AppColors.blackColor, - titleColor: AppColors.blackColor, - )) - : null, - body: SingleChildScrollView( - child: styleHierarchy(), - ), - ); + ), + )); } //样式层级 @@ -149,6 +171,7 @@ class _MineSetPageState extends State } Widget getListDataView() { + // 检测系统语言是否为中文 return Column( children: [ /* 2024-01-12 会议确定去掉“提示音、触摸开锁” by DaisyWu @@ -192,17 +215,20 @@ class _MineSetPageState extends State height: 50.h, child: Obx(_isPushNotificationSwitch))), // if (F.appFlavor == Flavor.sky) - CommonItem( + Visibility( + visible: state.currentLanguageName == '简体中文'.tr, + child: CommonItem( leftTitel: '微信公众号推送'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, rightWidget: SizedBox( - width: 60.w, - height: 50.h, - child: Obx(_isWechatPublicAccountPushSwitch))), - // else - // Container(), + width: 60.w, + height: 50.h, + child: Obx(_isWechatPublicAccountPushSwitch), + ), + ), + ), SizedBox(height: 10.h), CommonItem( leftTitel: '锁用户管理'.tr, @@ -267,19 +293,22 @@ class _MineSetPageState extends State SizedBox( height: 10.h, ), - Obx(() => CommonItem( - leftTitel: '多语言'.tr, - rightTitle: state.currentLanguage.value, - isHaveLine: true, - isHaveDirection: true, - action: () async { - // Get.toNamed(Routers.mineMultiLanguagePage); - var result = await Get.toNamed(Routers.mineMultiLanguagePage); - if (result != null) { - result as Map; - state.currentLanguage.value = result['currentLanguage']; - } - })), + Obx(() { + AppLog.log( + 'state.currentLanguageName: ${state.currentLanguageName} state.currentLanguage.value: ${state.currentLanguage.value}'); + return CommonItem( + leftTitel: '多语言'.tr, + rightTitle: state.currentLanguageName, + isHaveLine: true, + isHaveDirection: true, + action: () async { + // Get.toNamed(Routers.mineMultiLanguagePage); + await Get.toNamed(Routers.mineMultiLanguagePage)!.then( + (value) => { + state.currentLanguage.value = value['currentLanguage'] + }); + }); + }), /* 2024-01-12 会议确定去掉“锁屏” by DaisyWu Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.lockScreen!.tr, @@ -310,12 +339,9 @@ class _MineSetPageState extends State logic.userSettingsInfoRequest(); }); })), - CommonItem( - leftTitel: 'APP开锁时需手机连网的锁'.tr, - rightTitle: '', - // allHeight: 100.h, + otherItem( + leftTitle: 'APP开锁时需手机连网的锁'.tr, isHaveLine: true, - isHaveDirection: true, action: () { Navigator.pushNamed( context, Routers.aPPUnlockNeedMobileNetworkingLockPage); @@ -463,6 +489,45 @@ class _MineSetPageState extends State ); } + Widget otherItem( + {String? leftTitle, + bool? isHaveLine, + Function()? action, + double? allHeight}) { + return GestureDetector( + onTap: action, + child: Container( + width: 1.sw, + padding: + EdgeInsets.only(left: 20.w, top: 15.h, bottom: 15.h, right: 10.w), + decoration: BoxDecoration( + color: Colors.white, + border: isHaveLine! + ? Border( + bottom: BorderSide( + color: AppColors.greyLineColor, // 设置边框颜色 + width: 2.0.h, // 设置边框宽度 + ), + ) + : null, + ), + child: Row( + children: [ + Expanded( + child: Text(leftTitle!, style: TextStyle(fontSize: 22.sp))), + SizedBox(width: 10.w), + Image.asset( + 'images/icon_right_grey.png', + width: 12.w, + height: 21.w, + ), + SizedBox(width: 5.w), + ], + ), + ), + ); + } + //确认弹窗 // void _showDialog(widgetContext) { // showCupertinoDialog( diff --git a/lib/mine/mineSet/mineSet/mineSet_state.dart b/lib/mine/mineSet/mineSet/mineSet_state.dart index f00fac17..cae4519d 100755 --- a/lib/mine/mineSet/mineSet/mineSet_state.dart +++ b/lib/mine/mineSet/mineSet/mineSet_state.dart @@ -3,20 +3,33 @@ import 'package:get/get.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart'; +import '../../../translations/app_dept.dart'; +import '../../../translations/current_locale_tool.dart'; + class MineSetState { - final userInfoData = UserSettingInfoData().obs; - final userSetting = UserSettings().obs; + final Rx userInfoData = UserSettingInfoData().obs; + final Rx userSetting = UserSettings().obs; - var isPrompTone = false.obs; //提示音 - var isTouchUnlock = false.obs; //触摸开锁 - var isPushNotification = false.obs; //消息推送 - var isWechatPublicAccountPush = false.obs; //微信公众号推送 - var qrCodeUrl = ''.obs; //二维码地址 - var qrCodeText = ''.obs; //二维码提示语 + RxBool isPrompTone = false.obs; //提示音 + RxBool isTouchUnlock = false.obs; //触摸开锁 + RxBool isPushNotification = false.obs; //消息推送 + RxBool isWechatPublicAccountPush = false.obs; //微信公众号推送 + RxString qrCodeUrl = ''.obs; //二维码地址 + RxString qrCodeText = ''.obs; //二维码提示语 + + RxInt lockScreen = 2.obs; //锁屏 + RxInt hideExpiredAccessFlag = 2.obs; //隐藏无效开锁 + RxString currentLanguage = + CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言 + + /// 获取翻译后的国家名称 + String get currentLanguageName { + return ExtensionLanguageType.fromLocale( + CurrentLocaleTool.getCurrentLocaleWithLanguageCode( + currentLanguage.value)) + .lanTitle; + } - var lockScreen = 2.obs; //锁屏 - var hideExpiredAccessFlag = 2.obs; //隐藏无效开锁 - var currentLanguage = "".obs; //隐藏无效开锁 RxBool isAmazonAlexa = false.obs; //亚马逊Alexa RxBool isGoogleHome = false.obs; //谷歌Home Rx amazonAlexaData = AmazonAlexa().obs; diff --git a/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart b/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart index bfd91dec..e115265a 100755 --- a/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart +++ b/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart @@ -1,8 +1,4 @@ class GetewayDataEntity { - int? errorCode; - String? description; - String? errorMsg; - GetewayListData? data; GetewayDataEntity( {this.errorCode, this.description, this.errorMsg, this.data}); @@ -13,6 +9,10 @@ class GetewayDataEntity { errorMsg = json['errorMsg']; data = json['data'] != null ? GetewayListData.fromJson(json['data']) : null; } + int? errorCode; + String? description; + String? errorMsg; + GetewayListData? data; Map toJson() { final Map data = {}; @@ -27,11 +27,6 @@ class GetewayDataEntity { } class GetewayListData { - List? list; - int? pageNo; - int? pageSize; - int? pages; - int? total; GetewayListData({this.list, this.pageNo, this.pageSize, this.pages, this.total}); @@ -47,6 +42,11 @@ class GetewayListData { pages = json['pages']; total = json['total']; } + List? list; + int? pageNo; + int? pageSize; + int? pages; + int? total; Map toJson() { final Map data = {}; @@ -62,50 +62,71 @@ class GetewayListData { } class GetewayItemData { - String? serialNumber; - int? plugId; - String? plugName; - String? networkName; - int? lockNum; - String? plugMac; - String? networkMac; - int? isOnline; - String? plugVersion; - int? select = 0; + GetewayItemData( {this.serialNumber, - this.plugId, - this.plugName, + this.gatewayMac, + this.gatewayName, + this.gatewayType, this.networkName, - this.lockNum, - this.plugMac, this.networkMac, + this.lockNum, this.isOnline, - this.plugVersion}); + this.firmwareInfo, + this.needUpgrade, + this.version, + this.gatewayId}); GetewayItemData.fromJson(Map json) { serialNumber = json['serialNumber']; - plugId = json['plugId']; - plugName = json['plugName']; + gatewayMac = json['gatewayMac']; + gatewayName = json['gatewayName']; + gatewayType = json['gatewayType']; networkName = json['networkName']; - lockNum = json['lockNum']; - plugMac = json['plugMac']; networkMac = json['networkMac']; + lockNum = json['lockNum']; isOnline = json['isOnline']; - plugVersion = json['plugVersion']; + if (json['firmwareInfo'] != null) { + firmwareInfo = []; + json['firmwareInfo'].forEach((v) { + firmwareInfo!.add(v); + }); + } + needUpgrade = json['needUpgrade']; + version = json['version']; + gatewayId = json['gatewayId']; } + String? serialNumber; + String? gatewayMac; + String? gatewayName; + int? gatewayType; + String? networkName; + String? networkMac; + int? lockNum; + int? isOnline; + List? firmwareInfo; + int? needUpgrade; + String? version; + int? gatewayId; + int? select = 0; Map toJson() { final Map data = {}; data['serialNumber'] = serialNumber; - data['plugId'] = plugId; - data['plugName'] = plugName; + data['gatewayMac'] = gatewayMac; + data['gatewayName'] = gatewayName; + data['gatewayType'] = gatewayType; data['networkName'] = networkName; - data['lockNum'] = lockNum; - data['plugMac'] = plugMac; data['networkMac'] = networkMac; + data['lockNum'] = lockNum; data['isOnline'] = isOnline; - data['plugVersion'] = plugVersion; + if (firmwareInfo != null) { + data['firmwareInfo'] = firmwareInfo!.map((v) => v.toJson()).toList(); + } + data['needUpgrade'] = needUpgrade; + data['version'] = version; + data['gatewayId'] = gatewayId; return data; } } + diff --git a/lib/mine/mineSet/transferGateway/selectGetewayList_logic.dart b/lib/mine/mineSet/transferGateway/selectGetewayList_logic.dart index 4e24aa4e..26333cdd 100755 --- a/lib/mine/mineSet/transferGateway/selectGetewayList_logic.dart +++ b/lib/mine/mineSet/transferGateway/selectGetewayList_logic.dart @@ -1,4 +1,5 @@ +import 'package:star_lock/mine/mineSet/transferGateway/selectGetewayList_entity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../network/api_repository.dart'; @@ -9,7 +10,7 @@ class SelectGetewayListLogic extends BaseGetXController{ // 获取锁列表 Future getGetewayListData() async{ - var entity = await ApiRepository.to.getGatewayListData( + final GetewayDataEntity entity = await ApiRepository.to.getGatewayListData( pageNo: '1', pageSize: '20' ); @@ -20,23 +21,9 @@ class SelectGetewayListLogic extends BaseGetXController{ @override void onReady() { - // TODO: implement onReady super.onReady(); getGetewayListData(); } - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - - } - } \ No newline at end of file diff --git a/lib/mine/mineSet/transferGateway/selectGetewayList_page.dart b/lib/mine/mineSet/transferGateway/selectGetewayList_page.dart index 57cc2e9b..fb2946cc 100755 --- a/lib/mine/mineSet/transferGateway/selectGetewayList_page.dart +++ b/lib/mine/mineSet/transferGateway/selectGetewayList_page.dart @@ -1,11 +1,12 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/mineSet/transferGateway/selectGetewayList_state.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; import '../../../tools/noData.dart'; import 'selectGetewayList_entity.dart'; import 'selectGetewayList_logic.dart'; @@ -18,22 +19,22 @@ class SelectGetewayListPage extends StatefulWidget { } class _SelectGetewayListPageState extends State { - final logic = Get.put(SelectGetewayListLogic()); - final state = Get.find().state; + final SelectGetewayListLogic logic = Get.put(SelectGetewayListLogic()); + final SelectGetewayListState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectGateway!.tr, + barTitle: '选择网关'.tr, haveBack: true, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ TextButton( onPressed: () { setState(() { - for (var element in state.getewayListData.value) { + for (GetewayItemData element in state.getewayListData.value) { if(state.isSelectAll == true){ state.isSelectAll = false; element.select = 0; @@ -45,13 +46,13 @@ class _SelectGetewayListPageState extends State { }); }, child: Text( - '全选', + '全选'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), )) ], ), body: Column( - children: [ + children: [ Expanded(child: _buildMainUI()), SizedBox( height: 20.h, @@ -68,7 +69,7 @@ class _SelectGetewayListPageState extends State { Widget _buildMainUI() { return Obx(() => state.getewayListData.value.isNotEmpty ? ListView.separated( itemCount: state.getewayListData.value.length, - separatorBuilder: (context, index) { + separatorBuilder: (BuildContext context, int index) { return Divider( height: 1, indent: 20.w, @@ -76,7 +77,7 @@ class _SelectGetewayListPageState extends State { color: AppColors.greyLineColor, ); }, - itemBuilder: (c, index) { + itemBuilder: (BuildContext c, int index) { GetewayItemData getewayItemData = state.getewayListData.value[index]; return _electronicKeyItem(getewayItemData, () { setState(() { @@ -99,7 +100,7 @@ class _SelectGetewayListPageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ SizedBox( width: 20.w, ), @@ -122,7 +123,7 @@ class _SelectGetewayListPageState extends State { SizedBox( width: 16.w, ), - Text(getewayItemData.plugName!, style: TextStyle(fontSize: 24.sp),) + Text(getewayItemData.gatewayName!, style: TextStyle(fontSize: 24.sp),) ], ), ), @@ -138,27 +139,27 @@ class _SelectGetewayListPageState extends State { child: TextButton( onPressed: () async { bool isCanNext = false; - var idList = []; - for (var element in state.getewayListData.value) { + List idList = []; + for (final GetewayItemData element in state.getewayListData.value) { if(element.select == 1){ isCanNext = true; - idList.add(element.plugId); + idList.add(element.gatewayId); } } if(isCanNext == false){ - logic.showToast("请选择锁".tr); + logic.showToast('请选择锁'.tr); return; } - var data = await Get.toNamed(Routers.recipientInformationPage, arguments: { - "idList":idList, - "isFromType":2, + final data = await Get.toNamed(Routers.recipientInformationPage, arguments: { + 'idList':idList, + 'isFromType':2, }); if(data != null) { logic.getGetewayListData(); } }, child: Text( - '下一步', + '下一步'.tr, style: TextStyle(fontSize: 24.sp, color: Colors.white), )), ), diff --git a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart index c3e29c97..c176b00e 100755 --- a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart +++ b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart @@ -4,8 +4,6 @@ import 'package:get/get.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../main/lockMian/entity/lockListInfo_entity.dart'; import '../../../../network/api_repository.dart'; -import '../../../../tools/eventBusEventManage.dart'; -import '../../../../translations/trans_lib.dart'; import 'recipientInformation_entity.dart'; import 'recipientInformation_state.dart'; @@ -101,8 +99,8 @@ class RecipientInformationLogic extends BaseGetXController{ context: Get.context!, builder: (BuildContext context) { return CupertinoAlertDialog( - title: const Text('提示'), - content: const Text('确定要移除所选中的坏锁吗?'), + title: Text('提示'.tr), + content: Text('确定要移除所选中的坏锁吗?'.tr), actions: [ CupertinoDialogAction( child: Text('取消'.tr), diff --git a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart index 218e5bbf..38862cb7 100755 --- a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart +++ b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart @@ -10,7 +10,6 @@ import 'package:star_lock/tools/submitBtn.dart'; import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/customNetworkImage.dart'; import '../../../../tools/showTipView.dart'; @@ -34,7 +33,7 @@ class _RecipientInformationPageState extends State { resizeToAvoidBottomInset: false, backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.recipientInformation!.tr, + barTitle: '接收人信息'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -173,7 +172,7 @@ class _RecipientInformationPageState extends State { height: 1, ), CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + leftTitel: '国家/地区'.tr, rightTitle: '', isHaveLine: true, isHaveRightWidget: true, diff --git a/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart b/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart index 89930069..52dab0dd 100755 --- a/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart +++ b/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart @@ -6,7 +6,6 @@ import 'package:star_lock/mine/mineSet/transferSmartLock/selectBranch/selectBran import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../recipientInformation/recipientInformation_entity.dart'; import 'selectBranch_logic.dart'; @@ -26,7 +25,7 @@ class _SelectBranchPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.recipientInformation!.tr, + barTitle: '接收人信息'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), @@ -80,7 +79,7 @@ class _SelectBranchPageState extends State { ); }, itemBuilder: (BuildContext c, int index) { - return _electronicKeyItem('images/normal_circle.png', '分组一', () {}); + return _electronicKeyItem('images/normal_circle.png', '', () {}); }); } @@ -159,7 +158,7 @@ class _SelectBranchPageState extends State { child: Column( children: [ SizedBox(height: 20.h), - Text('转移确认', style: TextStyle(fontSize: 24.sp)), + Text('转移确认'.tr, style: TextStyle(fontSize: 24.sp)), SizedBox(height: 20.h), Image.asset('images/icon_lockGroup_item.png', width: 70.h, height: 70.h, fit: BoxFit.fill), SizedBox(height: 15.h), diff --git a/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_state.dart b/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_state.dart index ab92bb77..2e5213e5 100755 --- a/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_state.dart +++ b/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_state.dart @@ -2,16 +2,16 @@ import 'package:get/get.dart'; class SelectBranchState{ - var type = 1.obs;// 1、个人用户 2、星寓用户 - - final receiverNumber = "".obs; - final countryName = "中国".obs; - final countryCode = "86".obs; - final idList = [].obs; SelectBranchState() { Map map = Get.arguments; - idList.value = map["idList"]; - countryCode.value = map["countryCode"]; - receiverNumber.value = map["number"]; + idList.value = map['idList']; + countryCode.value = map['countryCode']; + receiverNumber.value = map['number']; } + RxInt type = 1.obs;// 1、个人用户 2、星寓用户 + + final RxString receiverNumber = ''.obs; + final RxString countryName = '中国'.obs; + final RxString countryCode = '86'.obs; + final RxList idList = [].obs; } \ No newline at end of file diff --git a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart index fc4aca6e..a6074fe5 100755 --- a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart +++ b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart @@ -7,7 +7,6 @@ import 'package:star_lock/mine/mineSet/transferSmartLock/transferSmartLockList/t import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; -import '../../../../../translations/trans_lib.dart'; import '../../../../tools/EasyRefreshTool.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/eventBusEventManage.dart'; @@ -45,7 +44,7 @@ class _TransferSmartLockPageState extends State with Rout return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.selectiveLock!.tr, + barTitle: '选择锁'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ @@ -65,7 +64,7 @@ class _TransferSmartLockPageState extends State with Rout } }); }, - child: Text(state.isSelectAll == true ? '取消'.tr : TranslationLoader.lanKeys!.checkAll!.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp))) + child: Text(state.isSelectAll == true ? '取消'.tr : '全选'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp))) ], ), body: EasyRefreshTool( diff --git a/lib/mine/supportStaff/supportStaff_page.dart b/lib/mine/supportStaff/supportStaff_page.dart index 9163fffd..cbfcb983 100755 --- a/lib/mine/supportStaff/supportStaff_page.dart +++ b/lib/mine/supportStaff/supportStaff_page.dart @@ -1,12 +1,11 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../app_settings/app_colors.dart'; -import '../../tools/commonItem.dart'; import '../../tools/titleAppBar.dart'; -import '../../translations/trans_lib.dart'; class SupportStaffPage extends StatefulWidget { const SupportStaffPage({Key? key}) : super(key: key); @@ -21,14 +20,14 @@ class _SupportStaffPageState extends State { return Scaffold( backgroundColor: const Color(0xFFFFFFFF), appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.supportStaff!.tr, + barTitle: '客服'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ + children: [ supportStaffItem( - TranslationLoader.lanKeys!.email!.tr, - "786612630@qq.com", + '邮箱'.tr, + '786612630@qq.com', true, true, 'images/mine/icon_mine_supportStaff_openEmail.png', () async { @@ -37,34 +36,41 @@ class _SupportStaffPageState extends State { _pushUrl(url); }), supportStaffItem( - TranslationLoader.lanKeys!.businessCooperation!.tr, - "www.starLock.com", + '商务合作'.tr, + 'www.starLock.com', true, true, 'images/mine/icon_mine_supportStaff_openEmail.png', () async { - const url = 'tel:15080825640'; + const String url = 'tel:15080825640'; _pushUrl(url); }), supportStaffItem( - TranslationLoader.lanKeys!.officialWebsite!.tr, - "www.starLock.com", + '电脑网页版'.tr, + 'www.starLock.com', true, true, 'images/mine/icon_mine_supportStaff_jump.png', () async { - const url = 'https://blog.csdn.net/shulianghan'; + const String url = 'https://blog.csdn.net/shulianghan'; _pushUrl(url); }), - supportStaffItem(TranslationLoader.lanKeys!.computerWebVersion!.tr, - "www.starLock.com", false, true, '', () {}), - supportStaffItem(TranslationLoader.lanKeys!.hotelSystem!.tr, - "www.starLock.com", false, true, '', () {}), supportStaffItem( - TranslationLoader.lanKeys!.manualWebVersion!.tr, - "www.starLock.com", + '电脑网页版'.tr, + 'www.starLock.com', + false, + true, + '', () {}), + supportStaffItem( + '酒店系统'.tr, + 'www.starLock.com', + false, + true, + '', () {}), + supportStaffItem( + '说明书网页版'.tr, + 'www.starLock.com', true, true, - 'images/mine/icon_mine_supportStaff_jump.png', - () {}), + 'images/mine/icon_mine_supportStaff_jump.png', () {}), ], ), ); @@ -90,44 +96,40 @@ class _SupportStaffPageState extends State { onTap: action, child: Column( // mainAxisAlignment: MainAxisAlignment.center, - children: [ + children: [ Container( height: 80.h, color: Colors.white, padding: EdgeInsets.only( left: 20.w, right: 10.w), // , top: 20.w, bottom: 20.w child: Row( - children: [ + children: [ SizedBox(width: 20.w), Expanded( child: Text(leftTitel!, style: TextStyle(fontSize: 24.sp))), SizedBox(width: 20.w), Row( mainAxisAlignment: MainAxisAlignment.end, - children: [ + children: [ Text(rightTitle!, textAlign: TextAlign.end, style: TextStyle(fontSize: 22.sp)) ], ), SizedBox(width: 5.w), - isHaveRightImg! - ? Image.asset( + if (isHaveRightImg!) Image.asset( rightImg!, width: 36.w, height: 36.w, - ) - : SizedBox(width: 10.w), + ) else SizedBox(width: 10.w), // SizedBox(width:10.w), ], ), ), - isHaveLine! - ? Container( + if (isHaveLine!) Container( height: 0.5.h, color: AppColors.greyLineColor, - ) - : Container() + ) else Container() ], ), ); diff --git a/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_logic.dart b/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_logic.dart index 156a4d61..ab7d83f8 100755 --- a/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_logic.dart +++ b/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_logic.dart @@ -125,7 +125,7 @@ class AdvancedFeaturesWebLogic extends BaseGetXController { const Duration(seconds: 2)) { // 如果两次返回键时间间隔大于 2 秒,则提示再次按下返回键退出 _lastPressedAt = DateTime.now(); - showToast('再返回一次退出${F.title}'); + showToast('${'再返回一次退出'.tr}${F.title}'); return false; } SystemNavigator.pop(); diff --git a/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_state.dart b/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_state.dart index 39a8b2bf..c478181a 100755 --- a/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_state.dart +++ b/lib/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_state.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; diff --git a/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart b/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart index 0135735d..695f63be 100755 --- a/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart +++ b/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart @@ -15,7 +15,7 @@ class AdvancedFunctionRecordLogic extends BaseGetXController { @override void onInit() { super.onInit(); - dynamic data = Get.arguments; + final dynamic data = Get.arguments; if (data is! Map || data['type'] is! String) { Get.back(); return; @@ -28,7 +28,7 @@ class AdvancedFunctionRecordLogic extends BaseGetXController { if (!load) { buyPageNo = 1; } - UseRecordListEntity entity = await ApiRepository.to.getBuyRecordList( + final UseRecordListEntity entity = await ApiRepository.to.getBuyRecordList( type: type, recordType: 10, pageNo: buyPageNo, diff --git a/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart b/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart index 6da02664..b75dbf4f 100755 --- a/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart +++ b/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_record_list_entity.dart'; import 'package:star_lock/tools/noData.dart'; @@ -16,17 +17,16 @@ class AdvancedFunctionRecordPage extends StatefulWidget { _AdvancedFunctionRecordPageState(); } -class _AdvancedFunctionRecordPageState - extends State { - final logic = Get.put(AdvancedFunctionRecordLogic()); - final state = Get.find().state; +class _AdvancedFunctionRecordPageState extends State { + final AdvancedFunctionRecordLogic logic = Get.put(AdvancedFunctionRecordLogic()); + final AdvancedFunctionRecordState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "记录".tr, + barTitle: '记录'.tr, haveBack: true, iconColor: Colors.black, titleColor: Colors.black, @@ -37,7 +37,7 @@ class _AdvancedFunctionRecordPageState ? NoData() : ListView.builder( itemCount: state.buyRecordList.length, - itemBuilder: (context, index) { + itemBuilder: (BuildContext context, int index) { return _recordKeyItem(state.buyRecordList[index]); }, )), @@ -51,9 +51,9 @@ class _AdvancedFunctionRecordPageState padding: EdgeInsets.only(left: 20.w, right: 20.w, top: 16.h, bottom: 16.h), child: Column( - children: [ + children: [ Row( - children: [ + children: [ Text( itemData.createdAt!.length > 10 ? itemData.createdAt!.substring(0, 10) @@ -76,8 +76,8 @@ class _AdvancedFunctionRecordPageState ), Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('${itemData.vipLockCount}把锁/${itemData.vipYear}年', + children: [ + Text('${itemData.vipLockCount}${'把锁'.tr}/${itemData.vipYear}${'年'.tr}', textAlign: TextAlign.left, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor)) diff --git a/lib/mine/valueAddedServices/valueAddedServicesBuy/valueAddedServicesBuy_page.dart b/lib/mine/valueAddedServices/valueAddedServicesBuy/valueAddedServicesBuy_page.dart index b95a0db0..e57569fe 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesBuy/valueAddedServicesBuy_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesBuy/valueAddedServicesBuy_page.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesBuy/valueAddedServicesBuy_logic.dart'; +import 'package:star_lock/mine/valueAddedServices/valueAddedServicesBuy/valueAddedServicesBuy_state.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class ValueAddedServicesBuyPage extends StatefulWidget { const ValueAddedServicesBuyPage({Key? key}) : super(key: key); @@ -16,12 +16,13 @@ class ValueAddedServicesBuyPage extends StatefulWidget { } class _ValueAddedServicesBuyPageState extends State { + @override Widget build(BuildContext context) { - var type = ModalRoute.of(context)?.settings.arguments as int; + final int type = ModalRoute.of(context)!.settings.arguments! as int; - final logic = Get.put(ValueAddedServicesBuyLogic()); - final state = Get.find().state; + final ValueAddedServicesBuyLogic logic = Get.put(ValueAddedServicesBuyLogic()); + final ValueAddedServicesBuyState state = Get.find().state; return Scaffold( backgroundColor: AppColors.greyBackgroundColor, @@ -30,7 +31,7 @@ class _ValueAddedServicesBuyPageState extends State { haveBack: true, backgroundColor: AppColors.mainColor), body: Column( - children: [ + children: [ Container( width: 1.sw, // height: 400.h, @@ -39,9 +40,9 @@ class _ValueAddedServicesBuyPageState extends State { left: 25.h, right: 25.h, top: 25.h, bottom: 10.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Text( - TranslationLoader.lanKeys!.chooseAPackage!.tr, + '选择套餐'.tr, style: TextStyle(fontSize: 24.sp), ), ], @@ -56,7 +57,7 @@ class _ValueAddedServicesBuyPageState extends State { crossAxisSpacing: 10.w, childAspectRatio: 1 / 0.5, children: state.topData.value - .map((title) => _buildItem(title)) + .map(_buildItem) .toList(), ), ), @@ -67,9 +68,9 @@ class _ValueAddedServicesBuyPageState extends State { left: 25.h, right: 25.h, top: 25.h, bottom: 10.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Text( - TranslationLoader.lanKeys!.modeOfPayment!.tr, + '支付方式'.tr, style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor, @@ -79,7 +80,7 @@ class _ValueAddedServicesBuyPageState extends State { height: 20.h, ), Row( - children: [ + children: [ Image.asset( 'images/mine/icon_mine_valueAddedServices_zfb.png', width: 30.w, @@ -87,7 +88,7 @@ class _ValueAddedServicesBuyPageState extends State { ), SizedBox(width: 20.w), Expanded( - child: Text(TranslationLoader.lanKeys!.alipay!.tr, + child: Text('支付宝'.tr, style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor))), SizedBox(width: 5.w), @@ -112,10 +113,10 @@ class _ValueAddedServicesBuyPageState extends State { height: 80.h, color: Colors.white, child: Row( - children: [ + children: [ SizedBox(width: 20.w), Expanded( - child: Text("¥50", + child: Text('¥50', style: TextStyle( fontSize: 24.sp, color: AppColors.mainColor, @@ -123,14 +124,14 @@ class _ValueAddedServicesBuyPageState extends State { SizedBox(width: 5.w), GestureDetector( onTap: () { - logic.showToast("支付成功"); + logic.showToast('支付成功'.tr); }, child: Container( width: 180.w, height: 100.h, color: AppColors.mainColor, child: Center( - child: Text(TranslationLoader.lanKeys!.goToPay!.tr, + child: Text('去支付'.tr, style: TextStyle( fontSize: 24.sp, color: Colors.white, @@ -152,19 +153,19 @@ class _ValueAddedServicesBuyPageState extends State { margin: EdgeInsets.all(10.w), padding: EdgeInsets.only(left: 30.w, top: 20.h, bottom: 20.h), decoration: BoxDecoration( - color: title == "1" ? const Color(0xFFEDF1FD) : Colors.white, + color: title == '1' ? const Color(0xFFEDF1FD) : Colors.white, borderRadius: BorderRadius.all(Radius.circular(20.h)), border: Border.all(width: 0.5.w, color: Colors.black)), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Text( - "500条", + '500${'条'.tr}', style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), ), SizedBox(height: 10.h), Text( - "¥50 (¥0.08/条)", + '¥50 (¥0.08/${'条'.tr})', style: TextStyle( fontSize: 20.sp, color: AppColors.placeholderTextColor), ), @@ -174,20 +175,19 @@ class _ValueAddedServicesBuyPageState extends State { } String _getNavTitle(int type) { - String topTitle = ""; + String topTitle = ''; switch (type) { case 1: - topTitle = TranslationLoader.lanKeys!.buySMS!.tr; + topTitle = '购买短信'.tr; break; case 2: - topTitle = TranslationLoader.lanKeys!.buyMail!.tr; + topTitle = '购买邮件'.tr; break; case 3: - topTitle = - TranslationLoader.lanKeys!.buyRealNameAuthenticationTimes!.tr; + topTitle = '购买实名认证次数'.tr; break; case 4: - topTitle = TranslationLoader.lanKeys!.enablingAdvancedFeatures!.tr; + topTitle = '开通高级功能'.tr; break; } return topTitle; diff --git a/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart b/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart index cfa191cb..cb1bbd72 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -9,7 +10,6 @@ import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_r import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class ValueAddedServicesHighFunctionPage extends StatefulWidget { const ValueAddedServicesHighFunctionPage({Key? key}) : super(key: key); @@ -82,11 +82,12 @@ class _ValueAddedServicesHighFunctionPageState // crossAxisAlignment: CrossAxisAlignment.center, children: [ Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox(height: 20.h), Text( - '当前状态:已开通'.tr, + '${'当前状态'.tr}:${"已开通".tr}', style: TextStyle( fontSize: 24.sp, fontWeight: FontWeight.w600), ), @@ -114,15 +115,16 @@ class _ValueAddedServicesHighFunctionPageState }); }, child: Container( - width: 110.w, - height: 50.h, + // width: 110.w, + // height: 50.h, + padding: EdgeInsets.only(left: 20.w, right: 20.w, top: 8.h, bottom: 8.h), decoration: BoxDecoration( color: const Color(0xFFBDCDDF), borderRadius: BorderRadius.all(Radius.circular(30.h)), ), child: Center( child: Text( - TranslationLoader.lanKeys!.buy!.tr, + '购买'.tr, style: TextStyle(fontSize: 22.sp), )), ), @@ -136,8 +138,9 @@ class _ValueAddedServicesHighFunctionPageState arguments: UseRecordListArg.vip); }, child: Container( - width: 90.w, - height: 50.h, + // width: 90.w, + // height: 50.h, + padding: EdgeInsets.only(left: 15.w, right: 10.w, top: 8.h, bottom: 8.h), decoration: BoxDecoration( color: const Color(0xFFBDCDDF), borderRadius: BorderRadius.only( @@ -147,7 +150,7 @@ class _ValueAddedServicesHighFunctionPageState ), child: Center( child: Text( - TranslationLoader.lanKeys!.record!.tr, + '记录'.tr, style: TextStyle(fontSize: 22.sp), )), ), @@ -176,8 +179,7 @@ class _ValueAddedServicesHighFunctionPageState height: 30.w), Expanded( child: Text( - TranslationLoader - .lanKeys!.advancedFeaturesAndBenefitsContent!.tr, + '高级功能权益内容'.tr, textAlign: TextAlign.center, style: TextStyle( fontSize: 24.sp, fontWeight: FontWeight.w600)), @@ -209,7 +211,7 @@ class _ValueAddedServicesHighFunctionPageState padding: EdgeInsets.only( left: 20.w, top: 10.h, right: 20.w, bottom: 10.h), child: Text( - '查看详情 >', + '${'查看详情'.tr} >', style: TextStyle(fontSize: 20.sp), )), ), @@ -225,13 +227,13 @@ class _ValueAddedServicesHighFunctionPageState physics: const NeverScrollableScrollPhysics(), children: [ _buildItem('images/mine/icon_mine_highFunctionContent_dxmb.png', - TranslationLoader.lanKeys!.smsTemplate!.tr), + '短信模板'.tr), _buildItem('images/mine/icon_mine_highFunctionContent_yjmb.png', - TranslationLoader.lanKeys!.emailTemplate!.tr), + '邮件模板'.tr), _buildItem('images/mine/icon_mine_highFunctionContent_sqgly.png', - TranslationLoader.lanKeys!.authorizedAdmin!.tr), + '授权管理员'.tr), _buildItem('images/mine/icon_mine_highFunctionContent_sfz.png', - TranslationLoader.lanKeys!.lockGroup!.tr), + '锁分组'.tr), _buildItem('images/mine/icon_mine_highFunctionContent_bjft.png', '群发钥匙'.tr), // _buildItem("images/mine/icon_mine_highFunctionContent_bjft.png", @@ -275,14 +277,15 @@ class _ValueAddedServicesHighFunctionPageState SizedBox( height: 10.h, ), - Column( - children: [ - Text( - title, - style: TextStyle(fontSize: 22.sp), - textAlign: TextAlign.center, - ), - ], + Expanded( + child: Text( + title, + // '啊上级领导发哈老师讲课代发哈金卡拉萨代发户籍卡三打哈发卡机啊哈受打击开发', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 22.sp), + textAlign: TextAlign.center, + ), ), ], ), @@ -308,8 +311,7 @@ class _ValueAddedServicesHighFunctionPageState ), Expanded( child: Text( - TranslationLoader - .lanKeys!.titleForBuyingAdvancedFeatures!.tr, + '购买高级功能须知'.tr, textAlign: TextAlign.center, style: TextStyle( fontSize: 24.sp, fontWeight: FontWeight.w600))), @@ -333,7 +335,7 @@ class _ValueAddedServicesHighFunctionPageState padding: EdgeInsets.only( left: 30.w, top: 30.h, right: 30.w, bottom: 30.h), child: Text( - TranslationLoader.lanKeys!.tipsForBuyingAdvancedFeatures!.tr, + '购买高级功能提示'.tr, style: TextStyle(fontSize: 20.sp), )), ), @@ -359,7 +361,7 @@ class _ValueAddedServicesHighFunctionPageState ), child: Center( child: Text( - TranslationLoader.lanKeys!.freeTrial!.tr, + '免费体验'.tr, style: TextStyle(fontSize: 24.sp), )), ), @@ -381,7 +383,7 @@ class _ValueAddedServicesHighFunctionPageState ), child: Center( child: Text( - TranslationLoader.lanKeys!.openNow!.tr, + '立即开通'.tr, style: TextStyle(fontSize: 24.sp, color: const Color(0xFFF9CEAC)), )), diff --git a/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart b/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart index 6251b107..760a0993 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart @@ -12,7 +12,6 @@ import 'package:star_lock/tools/storage.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class ValueAddedServicesListPage extends StatefulWidget { const ValueAddedServicesListPage({Key? key}) : super(key: key); @@ -41,20 +40,20 @@ class _ValueAddedServicesPageListState return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.valueAddedServices!.tr, + barTitle: '增值服务'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( children: [ _valueAddedServicesItem( Image.asset('images/mine/icon_mine_valueAddedServices_note.png'), - TranslationLoader.lanKeys!.note!.tr, () { + '短信'.tr, () { Get.toNamed(Routers.valueAddedServicesNoteAndEmailDetailPage, arguments: {'type': 1}); }), _valueAddedServicesItem( Image.asset('images/mine/icon_mine_valueAddedServices_email.png'), - TranslationLoader.lanKeys!.mail!.tr, () { + '邮件'.tr, () { Get.toNamed(Routers.valueAddedServicesNoteAndEmailDetailPage, arguments: {'type': 2}); }), @@ -66,11 +65,11 @@ class _ValueAddedServicesPageListState }), _valueAddedServicesItem( Image.asset('images/mine/icon_mine_valueAddedServices_vip.png'), - TranslationLoader.lanKeys!.advancedFunction!.tr, () async { + '高级功能'.tr, () async { final bool? isVip = await Storage.getBool(saveIsVip); if (isVip == null || !isVip) { if (CommonDataManage().currentKeyInfo.isLockOwner != 1) { - logic.showToast('请先添加锁'); + logic.showToast('请先添加锁'.tr); } else { //刷新购买状态 Get.toNamed(Routers.advancedFeaturesWebPage, @@ -103,8 +102,8 @@ class _ValueAddedServicesPageListState if (!F.isProductionEnv) _valueAddedServicesItem( Image.asset('images/mine/icon_mine_valueAddedServices_vip.png'), - '可视对讲', () { - EasyLoading.showToast('功能暂未开放', duration: 2000.milliseconds); + '可视对讲'.tr, () { + EasyLoading.showToast('功能暂未开放'.tr, duration: 2000.milliseconds); }), if (!F.isProductionEnv) _valueAddedServicesItem( @@ -139,18 +138,18 @@ class _ValueAddedServicesPageListState logic.userSettingsInfoRequest(); }); }), - if (!F.isProductionEnv) - _valueAddedServicesItem( - Text( - 'M', - style: TextStyle( - color: Colors.white, - fontSize: 38.sp, - fontWeight: FontWeight.w600), - ), - '小米IOT平台', () { - EasyLoading.showToast('功能暂未开放', duration: 2000.milliseconds); - }), + // if (!F.isProductionEnv) + // _valueAddedServicesItem( + // Text( + // 'M', + // style: TextStyle( + // color: Colors.white, + // fontSize: 38.sp, + // fontWeight: FontWeight.w600), + // ), + // '小米IOT平台', () { + // EasyLoading.showToast('功能暂未开放'.tr, duration: 2000.milliseconds); + // }), ], ), ); diff --git a/lib/mine/valueAddedServices/valueAddedServicesNoteAndEmailDetail/valueAddedServicesNoteAndEmailDetail_page.dart b/lib/mine/valueAddedServices/valueAddedServicesNoteAndEmailDetail/valueAddedServicesNoteAndEmailDetail_page.dart index 0cfea926..7d38b590 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesNoteAndEmailDetail/valueAddedServicesNoteAndEmailDetail_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesNoteAndEmailDetail/valueAddedServicesNoteAndEmailDetail_page.dart @@ -9,7 +9,6 @@ import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_r import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class ValueAddedServicesNoteAndEmailDetailPage extends StatefulWidget { const ValueAddedServicesNoteAndEmailDetailPage({Key? key}) : super(key: key); @@ -39,8 +38,8 @@ class _ValueAddedServicesNoteAndEmailDetailPageState backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( barTitle: state.selectType.value == 1 - ? TranslationLoader.lanKeys!.note!.tr - : TranslationLoader.lanKeys!.mail!.tr, + ? '短信'.tr + : '邮件'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Column( @@ -51,8 +50,8 @@ class _ValueAddedServicesNoteAndEmailDetailPageState left: 25.h, right: 25.h, top: 25.h, bottom: 10.h), child: Text( state.selectType.value == 1 - ? TranslationLoader.lanKeys!.smsBuyTip!.tr - : TranslationLoader.lanKeys!.emailBuyTip!.tr, + ? '您可通过短信将密码、电子钥匙信息发给接收人。'.tr + : '您可通过邮件将密码、电子钥匙信息发给接收人。'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 18.sp), )), @@ -79,7 +78,7 @@ class _ValueAddedServicesNoteAndEmailDetailPageState children: [ Expanded( child: Obx(() => Text( - '${TranslationLoader.lanKeys!.currentRemainingQuantity!.tr}:${state.remainCount.value}', + '${'当前剩余数量'.tr}:${state.remainCount.value}', style: TextStyle(fontSize: 24.sp), ))), GestureDetector( @@ -98,7 +97,7 @@ class _ValueAddedServicesNoteAndEmailDetailPageState color: AppColors.mainColor, borderRadius: BorderRadius.circular(25)), child: Center( - child: Text(TranslationLoader.lanKeys!.buy!.tr, + child: Text('购买'.tr, style: TextStyle( color: Colors.white, fontSize: 24.sp)))), ), @@ -151,7 +150,7 @@ class _ValueAddedServicesNoteAndEmailDetailPageState top: 5, bottom: 5, left: 5, right: 5), // color: Colors.red, child: Center( - child: Text(TranslationLoader.lanKeys!.record!.tr, + child: Text('记录'.tr, style: TextStyle( color: Colors.black, fontSize: 24.sp)))), ), diff --git a/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_logic.dart b/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_logic.dart index 0428ff38..48cce872 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_logic.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_logic.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:get/utils.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_entity.dart'; +import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRealName/face_authentication_entity.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -12,8 +14,7 @@ class ValueAddedServicesRealNameLogic extends BaseGetXController { //实名认证频次设置 Future setFaceAuthentication(int faceAuthFrequence) async { - FaceAuthenticationEntity entity = - await ApiRepository.to.setFaceAuthentication( + final FaceAuthenticationEntity entity = await ApiRepository.to.setFaceAuthentication( faceAuthFrequence: faceAuthFrequence, ); return entity.errorCode!.codeIsSuccessful; @@ -21,7 +22,7 @@ class ValueAddedServicesRealNameLogic extends BaseGetXController { //获取增值服务用户余量包 Future getServiceUserPackage() async { - var entity = await ApiRepository.to.getServiceUserPackage(); + final ValueAddedServicesHighFunctionEntity entity = await ApiRepository.to.getServiceUserPackage(); if (entity.errorCode!.codeIsSuccessful) { state.realNameRemainCount.value = entity.data!.cloudauthCount!; state.checkIndex.value = entity.data!.faceAuthFrequence ?? 1; @@ -32,7 +33,7 @@ class ValueAddedServicesRealNameLogic extends BaseGetXController { //增值服务套餐购包链接 Future getServicePackageBuyUrl() async { - var entity = await ApiRepository.to.getServicePackageBuyUrl(); + final AdvancedFeaturesWebEntity entity = await ApiRepository.to.getServicePackageBuyUrl(); if (entity.errorCode!.codeIsSuccessful) { state.realNameBuyUrl.value = entity.data!.cloudauthBuyUrl!; state.realNameBuyUrl.refresh(); @@ -40,7 +41,7 @@ class ValueAddedServicesRealNameLogic extends BaseGetXController { } Future check(int clickIndex) async { - bool isSuccessful = await setFaceAuthentication(clickIndex); + final bool isSuccessful = await setFaceAuthentication(clickIndex); if (isSuccessful) { showToast('修改成功'.tr); state.checkIndex.value = clickIndex; diff --git a/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_page.dart b/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_page.dart index 5ceead34..d5e1fdfc 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_page.dart @@ -9,7 +9,6 @@ import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_r import '../../../app_settings/app_colors.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; class ValueAddedServicesRealNamePage extends StatefulWidget { const ValueAddedServicesRealNamePage({Key? key}) : super(key: key); @@ -41,7 +40,7 @@ class _ValueAddedServicesRealNamePageState padding: EdgeInsets.only( left: 25.h, right: 25.h, top: 25.h, bottom: 10.h), child: Text( - TranslationLoader.lanKeys!.buyRealNameTip!.tr, + '购买实名认证提示'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 20.sp), )), @@ -126,18 +125,17 @@ class _ValueAddedServicesRealNamePageState Container( padding: EdgeInsets.only(top: 20.h, bottom: 20.h, left: 30.w), child: Text( - TranslationLoader - .lanKeys!.buyRealNameSelectYouWantBuyTip!.tr, + '请选择你希望的实名认证频次'.tr, style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), )), ], ), checkCommonItem( - logic, TranslationLoader.lanKeys!.forTheFirstTime!.tr, 1), - checkCommonItem(logic, TranslationLoader.lanKeys!.onceDay!.tr, 2), - checkCommonItem(logic, TranslationLoader.lanKeys!.weekOnce!.tr, 3), - checkCommonItem(logic, TranslationLoader.lanKeys!.monthOnce!.tr, 4, + logic, '仅首次'.tr, 1), + checkCommonItem(logic, '每日一次'.tr, 2), + checkCommonItem(logic, '每周一次'.tr, 3), + checkCommonItem(logic, '每月一次'.tr, 4, isHaveLine: false, isHaveRightWidget: true), ], ), diff --git a/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_state.dart b/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_state.dart index 9c2ec403..899211de 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_state.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_state.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; class ValueAddedServicesRealNameState { - var checkIndex = 1.obs; - var realNameRemainCount = 0.obs; //当前剩余数量 - var realNameBuyUrl = ''.obs; //购买链接 + RxInt checkIndex = 1.obs; + RxInt realNameRemainCount = 0.obs; //当前剩余数量 + RxString realNameBuyUrl = ''.obs; //购买链接 } diff --git a/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_logic.dart b/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_logic.dart index 6577c025..14bb572c 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_logic.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_logic.dart @@ -79,17 +79,17 @@ class ValueAddedServicesRecordLogic extends BaseGetXController { void getBuyAndUserInfoStr(UseItemData itemData) { if (itemData.type == UseRecordListArg.sms['type']) { - state.buyCountStr.value = '${itemData.smsCount}条'; + state.buyCountStr.value = '${itemData.smsCount}${'条'.tr}'; state.useCountStr.value = - '${itemData.receiverAccount ?? ""} ${itemData.consCount}条'; + '${itemData.receiverAccount ?? ""} ${itemData.consCount}${'条'.tr}'; state.buyAmountStr.value = '¥${itemData.amount}'; } else if (itemData.type == UseRecordListArg.email['type']) { - state.buyCountStr.value = '${itemData.emailCount}封'; + state.buyCountStr.value = '${itemData.emailCount}${'封'.tr}'; state.useCountStr.value = - '${itemData.receiverAccount ?? ""} ${itemData.consCount}封'; + '${itemData.receiverAccount ?? ""} ${itemData.consCount}${'封'.tr}'; state.buyAmountStr.value = '¥${itemData.amount}'; } else if (itemData.type == UseRecordListArg.cloudauth['type']) { - state.buyCountStr.value = '实名认证/${itemData.cloudauthCount}次'; + state.buyCountStr.value = '${'实名认证'.tr}/${itemData.cloudauthCount}${'次'.tr}'; state.useCountStr.value = '${itemData.lockName ?? ""} ${itemData.realName ?? ""}'; state.buyAmountStr.value = '¥${itemData.amount}'; diff --git a/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart b/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart index f8fd16ca..3366fca2 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart @@ -184,7 +184,7 @@ class _UseRecordsTable extends StatelessWidget { borderRadius: BorderRadius.circular(5.w), color: AppColors.toBeReceiveBgColor, ), - child: Text('失败', + child: Text('失败'.tr, style: TextStyle(fontSize: 16.sp, color: Colors.red)), ), ], diff --git a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_logic.dart b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_logic.dart index 55f7a3d1..c240ed18 100644 --- a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_logic.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_logic.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -48,7 +49,7 @@ class NewSMSTemplateLogic extends BaseGetXController { templateType: state.currentTemplate.value.templateType ?? 0, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('添加成功'); + showToast('添加成功'.tr); Get.back(result: true); } } @@ -60,7 +61,7 @@ class NewSMSTemplateLogic extends BaseGetXController { regards: state.templateOneTf.text, tips: state.templateTwoTf.text); if (entity.errorCode!.codeIsSuccessful) { - showToast('修改成功'); + showToast('修改成功'.tr); Get.back(result: true); } } diff --git a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart index c609d0db..09f3b20a 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart @@ -11,7 +11,6 @@ import '../../../../tools/commonItem.dart'; import '../../../../tools/showBottomSheetTool.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class NewSMSTemplatePage extends StatefulWidget { const NewSMSTemplatePage({Key? key}) : super(key: key); @@ -57,7 +56,7 @@ class _NewSMSTemplatePageState extends State { Container( margin: EdgeInsets.symmetric(horizontal: 20.w), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.save!.tr, + btnName: '保存'.tr, onClick: () { if (state.currentTemplate.value.isUpdate == true) { logic.updateTemplateInfo(); @@ -88,7 +87,7 @@ class _NewSMSTemplatePageState extends State { ), Obx(() => state.isUpdate.value == false ? CommonItem( - leftTitel: TranslationLoader.lanKeys!.type!.tr, + leftTitel: '类型'.tr, rightTitle: state.currentTemplate.value.templateName ?? '', isHaveLine: true, isHaveDirection: true, @@ -97,7 +96,7 @@ class _NewSMSTemplatePageState extends State { : Container()), Obx(() => state.isUpdate.value == false ? CommonItem( - leftTitel: '模版类型', + leftTitel: '模版类型'.tr, rightTitle: state.currentTemplate.value.langName ?? '', isHaveLine: false, isHaveDirection: true, @@ -118,7 +117,7 @@ class _NewSMSTemplatePageState extends State { Padding( padding: EdgeInsets.all(25.w), child: Text( - TranslationLoader.lanKeys!.templateContent!.tr, + '模版内容'.tr, style: TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600), ), @@ -163,7 +162,7 @@ class _NewSMSTemplatePageState extends State { child: Align( alignment: Alignment.centerLeft, child: Text( - TranslationLoader.lanKeys!.preview!.tr, + '预览'.tr, style: TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600), textAlign: TextAlign.left, ), @@ -187,7 +186,7 @@ class _NewSMSTemplatePageState extends State { bottom: 25.h, ), child: Text( - '预计产生短信条数:${logic.calculateSmsCost()}', + '${'预计产生短信条数'.tr}:${logic.calculateSmsCost()}', style: TextStyle( color: Colors.grey, fontSize: 20.sp, @@ -211,7 +210,7 @@ class _NewSMSTemplatePageState extends State { } else { return RichText( text: TextSpan( - children: state.currentTemplate.value.templateName == '电子钥匙' + children: state.currentTemplate.value.templateName == '电子钥匙'.tr ? logic.buildElectronicKeySpan(isPreview: isPreview) : logic.buildPasswordSpan(isPreview: isPreview), ), @@ -282,7 +281,7 @@ class _NewSMSTemplatePageState extends State { ShowBottomSheetTool().showSingleRowPicker( context, normalIndex: 0, - title: TranslationLoader.lanKeys!.type!.tr, + title: '类型'.tr, cancelTitle: '取消'.tr, sureTitle: '确定'.tr, data: titleList, @@ -305,7 +304,7 @@ class _NewSMSTemplatePageState extends State { ShowBottomSheetTool().showSingleRowPicker( context, normalIndex: 0, - title: TranslationLoader.lanKeys!.type!.tr, + title: '类型'.tr, cancelTitle: '取消'.tr, sureTitle: '确定'.tr, data: langNames, diff --git a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart index bc85004b..143de483 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart @@ -14,7 +14,6 @@ import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; -import '../../../../translations/trans_lib.dart'; class CustomSMSTemplateListPage extends StatefulWidget { const CustomSMSTemplateListPage({Key? key}) : super(key: key); @@ -60,7 +59,7 @@ class _CustomSMSTemplateListPageState extends State { )), Expanded(child: Obx(buildMainUI)), SubmitBtn( - btnName: TranslationLoader.lanKeys!.creatingANewTemplate!.tr, + btnName: '新建模板'.tr, borderRadius: 20.w, margin: EdgeInsets.only( left: 30.w, right: 30.w, top: 30.w, bottom: 30.w), @@ -70,7 +69,7 @@ class _CustomSMSTemplateListPageState extends State { templateData.channelType = state.channelType.value; templateData.isUpdate = false; templateData.templateName = - templateData.templateType == 1 ? '电子钥匙' : '密码'; + templateData.templateType == 1 ? '电子钥匙'.tr : '密码'.tr; final result = await Get.toNamed(Routers.newSMSTemplatePage, arguments: { 'currentTemplate': templateData, @@ -99,7 +98,7 @@ class _CustomSMSTemplateListPageState extends State { child: Column( children: [ Text( - TranslationLoader.lanKeys!.customTemplatesTip!.tr, + '你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.blackColor, @@ -123,11 +122,11 @@ class _CustomSMSTemplateListPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '${TranslationLoader.lanKeys!.currentState!.tr}:${TranslationLoader.lanKeys!.onTrial!.tr}', + '${'当前状态'.tr}:${'试用中'.tr}', style: TextStyle( fontSize: 20.sp, fontWeight: FontWeight.w600), ), - Text(TranslationLoader.lanKeys!.unHaveOpenedTip2!.tr, + Text('高级功能仅能用于你自己的锁'.tr, style: TextStyle( fontSize: 20.sp, fontWeight: FontWeight.w600)) ], @@ -146,7 +145,7 @@ class _CustomSMSTemplateListPageState extends State { borderRadius: BorderRadius.circular(35.h)), child: Center( child: Text( - TranslationLoader.lanKeys!.goToTheOpen!.tr, + '去开通'.tr, textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 20.sp)))), @@ -204,8 +203,7 @@ class _CustomSMSTemplateListPageState extends State { templateData.id = itemData.id; templateData.template = itemData.template; templateData.templateType = itemData.templateType; - templateData.templateName = - templateData.templateName == 1 ? '电子钥匙' : '密码'; + templateData.templateName = templateData.templateName == 1 ? '电子钥匙'.tr : '密码'.tr; templateData.channelType = itemData.channelType; templateData.isUpdate = true; final result = await Get.toNamed(Routers.newSMSTemplatePage, diff --git a/lib/network/api.dart b/lib/network/api.dart index 3f36dc8a..09ec5b51 100755 --- a/lib/network/api.dart +++ b/lib/network/api.dart @@ -41,7 +41,7 @@ abstract class Api { final String checkPasswordURL = '/user/checkPassword'; // 检查账户密码 final String setAuthorizeURL = '/key/authorize'; //设置授权管理员 final String cancelAuthorizeURL = '/key/unauthorize'; //取消授权管理员 - final String cancelFreezeURL = '/key/unfreeze'; //取消冻结 + final String cancelFreezeURL = '/key/unfreeze'; //解除冻结 final String freezeKeyURL = '/key/freeze'; //冻结 final String passwordKeyGetURL = '/keyboardPwd/get'; //获取密码 @@ -124,8 +124,10 @@ abstract class Api { final String addICCardURL = '/identityCard/add'; // 添加IC卡 final String editICCardURL = '/identityCard/update'; // 编辑IC卡 final String deleteICCardURL = '/identityCard/delete'; // 删除IC卡 - final String updateICCardUserNoURL = '/identityCard/updateCardUserNo'; // 更新ic卡用户序号 - final String checkCardNameURL = '/identityCard/checkIdentityCardName'; // 校验卡名字是否存在 + final String updateICCardUserNoURL = + '/identityCard/updateCardUserNo'; // 更新ic卡用户序号 + final String checkCardNameURL = + '/identityCard/checkIdentityCardName'; // 校验卡名字是否存在 final String getRemoteControlListURL = '/remote/list'; // 遥控列表 final String addRemoteControlURL = '/remote/add'; // 添加遥控 @@ -133,11 +135,13 @@ abstract class Api { final String editRemoteControlURL = '/remote/update'; // 编辑遥控 final String deleteRemoteControlURL = '/remote/delete'; // 删除遥控 final String clearRemoteControlURL = '/remote/clear'; // 清空遥控 - final String checkRemoteControlNameURL = '/remote/checkRemoteName'; // 校验遥控名字是否存在 + final String checkRemoteControlNameURL = + '/remote/checkRemoteName'; // 校验遥控名字是否存在 final String getPalmListURL = '/palmVein/list'; // 掌静脉列表 final String addPalmURL = '/palmVein/add'; // 添加掌静脉 - final String updatePalmUserNoURL = '/palmVein/updatePalmVeinUserNo'; // 更新掌静脉用户序号 + final String updatePalmUserNoURL = + '/palmVein/updatePalmVeinUserNo'; // 更新掌静脉用户序号 final String editPalmURL = '/palmVein/update'; // 编辑掌静脉 final String deletePalmURL = '/palmVein/delete'; // 删除掌静脉 final String clearPalmURL = '/palmVein/clear'; // 清空掌静脉 @@ -148,10 +152,17 @@ abstract class Api { final String transferLockURL = '/room/transfer'; // 转移智能锁 final String removeBadLockURL = '/lock/removeBadLock'; // 移除坏锁 - final String gatewaykListURL = '/plug/list'; // 转网关列表 + final String gatewaykListURL = '/gateway/list'; // 网关列表 + final String addGatewayURL = '/gateway/add'; // 添加网关 + final String deletGatewayURL = '/gateway/delete'; // 删除网关 final String transferGatewayConfirmURL = '/plug/transferPlugConfirm'; // 转移网关确认 final String transferGatewayURL = '/plug/transfer'; // 转移网关 + final String updateGatewayURL = '/gateway/update'; // 更新网关 + final String gatewayListByLockURL = '/gateway/listByLock'; // 网关-附近的锁 + final String getGatewayConfigURL = '/gateway/getGatewayConfig'; // 获取网关配置 + final String remoteOpenLockURL = '/gateway/unlock'; // 远程开锁 + final String gatewayScanDeviceURL = '/gateway/scanDevice'; // 网关-扫描设备 final String getKeyDetailURL = '/key/get'; //获取单把钥匙详情信息 final String lockUserListURL = '/keyUser/listKeyUser'; //锁用户列表 @@ -271,5 +282,6 @@ abstract class Api { final String lockUpdateLockInfo = '/lock/updateLockInfo'; //更新锁固件版本 final String exportLockRecordsURL = '/lockRecords/export'; //导出锁操作记录 - final String updateZoneOffsetsAndLanguagesURL = '/cloudUser/updateSettings'; //更新云用户时区偏移与语言 + final String updateZoneOffsetsAndLanguagesURL = + '/cloudUser/updateSettings'; //更新云用户时区偏移与语言 } diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index 10e8fed7..76677fa1 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -686,7 +686,7 @@ class ApiProvider extends BaseProvider { 'includeUnderlings': includeUnderlings, })); - // 取消冻结 + // 解除冻结 Future cancelFreeze(String keyId, int includeUnderlings) => post( cancelFreezeURL.toUrl, jsonEncode({ @@ -800,6 +800,14 @@ class ApiProvider extends BaseProvider { 'openDirectionValue': openDirectionValue, })); + // 电机扭力设置 + Future setMotorPowerData(int lockId, int motorTorsion) => post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'motorTorsion': motorTorsion, + })); + // 远程开锁 Future remoteUnlockingOpenOrCloseLoadData( int lockId, int remoteUnlock) => @@ -1723,6 +1731,60 @@ class ApiProvider extends BaseProvider { gatewaykListURL.toUrl, jsonEncode({'pageNo': pageNo, 'pageSize': pageSize})); + // 添加网关 + Future addGatewayNetwork( + String gatewayName, + String gatewayMac, + String serialNumber, + int gatewayType, + String networkName, + String networkMac, + String version, + Map gatewayJson, + ) => + post( + addGatewayURL.toUrl, + jsonEncode({ + 'gatewayName': gatewayName, + 'gatewayMac': gatewayMac, + 'serialNumber': serialNumber, + 'gatewayType': gatewayType, + 'networkName': networkName, + 'networkMac': networkMac, + 'version': version, + 'gatewayJson': gatewayJson, + })); + + // 删除网关 + Future deletGateway(int gatewayId, int isForce) => post( + deletGatewayURL.toUrl, + jsonEncode({ + 'gatewayId': gatewayId, + 'isForce': isForce, + })); + + // 网关更新 + Future gatewayUpdate( + int gatewayId, + String gatewayName, + ) => + post( + updateGatewayURL.toUrl, + jsonEncode({ + 'gatewayId': gatewayId, + 'gatewayName': gatewayName, + })); + + // 远程开锁 + Future remoteOpenLock( + String lockId, + ) => + post( + remoteOpenLockURL.toUrl, + jsonEncode({ + 'lockId': lockId, + })); + // 转移网关确认 Future transferGatewayConfirmInfoData( String receiverUsername, String type, String countryCode) => @@ -1745,6 +1807,16 @@ class ApiProvider extends BaseProvider { 'countryCode': countryCode })); + // 获取网关配置 + Future getGatewayConfiguration() => + post(getGatewayConfigURL.toUrl, jsonEncode({})); + + Future gatewayConnectionLockListLoadData(int gatewayId) => + post(gatewayListByLockURL.toUrl, jsonEncode({'gatewayId': gatewayId})); + + Future gatewayScanDevice(int gatewayId) => + post(gatewayScanDeviceURL.toUrl, jsonEncode({'gatewayId': gatewayId})); + // 移除坏锁 Future removeBrokenLockData(List lockIdList) => post(removeBadLockURL.toUrl, jsonEncode({'lockIds': lockIdList})); @@ -1935,6 +2007,13 @@ class ApiProvider extends BaseProvider { 'headUrl': headUrl, })); + //更新个人信息-国际化 + Future updateUserLangInfo(String lang) => post( + updateUserInfoURL.toUrl, + jsonEncode({ + 'lang': lang, + })); + //更新个人信息-是否打开amazon alexa 0否 1是 Future updateUserInfoWithAlexa(int isAlexa) => post( updateUserInfoURL.toUrl, diff --git a/lib/network/api_provider_base.dart b/lib/network/api_provider_base.dart index 83b9ae9e..e6563cdb 100755 --- a/lib/network/api_provider_base.dart +++ b/lib/network/api_provider_base.dart @@ -102,11 +102,11 @@ class BaseProvider extends GetConnect with Api { // Toast.show(msg: "用户不存在"); // break; case 10001: - EasyLoading.showToast('数据不存在', duration: 2000.milliseconds); + EasyLoading.showToast('数据不存在'.tr, duration: 2000.milliseconds); break; case 434: //与后台约定弹出确认框提示 ShowTipView() - .showSureBtnTipsAlert(tipsText: T['errorMsg'], sureText: '确定'); + .showSureBtnTipsAlert(tipsText: T['errorMsg'], sureText: ''); break; } } diff --git a/lib/network/api_repository.dart b/lib/network/api_repository.dart index fe9c5913..1f793ff0 100755 --- a/lib/network/api_repository.dart +++ b/lib/network/api_repository.dart @@ -73,6 +73,8 @@ import '../main/lockDetail/palm/addPalm/addPalm_entity.dart'; import '../main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_entity.dart'; import '../main/lockMian/entity/lockListInfo_entity.dart'; import '../mine/addLock/saveLock/entity/SaveLockEntity.dart'; +import '../mine/gateway/addGateway/gatewayConfigurationWifi/getGatewayConfiguration_entity.dart'; +import '../mine/gateway/gatewayConnectionLock/gatewayConnectionLockList_entity.dart'; import '../mine/message/messageList/messageList_entity.dart'; import '../mine/minePersonInfo/minePersonInfoPage/minePersonGetUploadFileInfo_entity.dart'; import '../mine/mineSet/lockUserManage/expireLockList/expireCard/expireCard_entity.dart'; @@ -710,7 +712,7 @@ class ApiRepository { return ElectronicKeyListEntity.fromJson(res.body); } - //取消冻结 + //解除冻结 Future cancelFreeze({ required String keyId, required int includeUnderlings, @@ -872,6 +874,15 @@ class ApiRepository { return LoginEntity.fromJson(res.body); } + // 电机扭力 + Future setMotorTorqueData({ + required int lockId, + required int motorTorsion, + }) async { + final res = await apiProvider.setMotorPowerData(lockId, motorTorsion); + return LoginEntity.fromJson(res.body); + } + // 设置房态 Future setRoomStatusData({ required int lockId, @@ -1906,6 +1917,47 @@ class ApiRepository { return GetewayDataEntity.fromJson(res.body); } + // 添加网关 + Future gatewayDistributionNetwork({ + required String gatewayName, + required String gatewayMac, + required String serialNumber, + required int gatewayType, + required String networkName, + required String networkMac, + required String version, + required Map gatewayJson, + }) async { + final res = await apiProvider.addGatewayNetwork( + gatewayName, + gatewayMac, + serialNumber, + gatewayType, + networkName, + networkMac, + version, + gatewayJson); + return LoginEntity.fromJson(res.body); + } + + // 删除网关 + Future gatewayDelet({ + required int gatewayId, + required int isForce, + }) async { + final res = await apiProvider.deletGateway(gatewayId, isForce); + return LoginEntity.fromJson(res.body); + } + + // 网关更新 + Future gatewayUpdate({ + required int gatewayId, + required String gatewayName, + }) async { + final res = await apiProvider.gatewayUpdate(gatewayId, gatewayName); + return LoginEntity.fromJson(res.body); + } + // 转移网关确认 Future transferGatewayConfirmInfoData( {required String receiverUsername, @@ -1916,6 +1968,27 @@ class ApiRepository { return RecipientInformationEntity.fromJson(res.body); } + // 网关-附近的锁 + Future gatewayConnectionLockLoadData( + {required int gatewayId}) async { + final res = await apiProvider.gatewayConnectionLockListLoadData(gatewayId); + return GatewayConnectionLockListEntity.fromJson(res.body); + } + + // 网关-扫描设备 + Future gatewayScanDevice({ + required int gatewayId, + }) async { + final res = await apiProvider.gatewayScanDevice(gatewayId); + return LoginEntity.fromJson(res.body); + } + + // 远程开锁 + Future remoteOpenLock({required String lockId}) async { + final res = await apiProvider.remoteOpenLock(lockId); + return LoginEntity.fromJson(res.body); + } + // 转移智能锁 Future transferGatewayInfoData( {required String receiverUsername, @@ -1926,6 +1999,12 @@ class ApiRepository { return RecipientInformationEntity.fromJson(res.body); } + // 获取网关配置 + Future getGatewayConfiguration() async { + final res = await apiProvider.getGatewayConfiguration(); + return GetGatewayConfigurationEntity.fromJson(res.body); + } + // 移除坏锁 Future removeBrokenLockData( {required List lockIdList}) async { @@ -1942,7 +2021,7 @@ class ApiRepository { //获取个人信息 Future getUserInfo() async { - final res = await apiProvider.getUserInfo(""); + final res = await apiProvider.getUserInfo(''); return MinePersonInfoEntity.fromJson(res.body); } @@ -1996,6 +2075,13 @@ class ApiRepository { return PasswordKeyListEntity.fromJson(res.body); } + //更新个人信息-国际化 + Future updateUserLangInfo( + {required String lang}) async { + final res = await apiProvider.updateUserLangInfo(lang); + return PasswordKeyListEntity.fromJson(res.body); + } + //修改绑定手机号 Future bindPhone(String countryCode, String account, String verificationCode, String unbindToken) async { diff --git a/lib/network/request_interceptor.dart b/lib/network/request_interceptor.dart index eee3dc3d..46f43aea 100755 --- a/lib/network/request_interceptor.dart +++ b/lib/network/request_interceptor.dart @@ -6,18 +6,20 @@ import 'package:star_lock/login/login/entity/LoginData.dart'; import '../tools/platform_info_services.dart'; import '../tools/storage.dart'; +import '../translations/current_locale_tool.dart'; //公共获取UA String getUserAgent() { //赋值变量方便调试 - String ua = + final String ua = 'StarLock/${PlatformInfoService.to?.info.version}/${PlatformInfoService.to?.info.buildNumber}/${GetPlatform.isAndroid ? 'Android' : 'iOS'}'; return ua; } FutureOr requestInterceptor(Request request) async { request.headers['User-Agent'] = getUserAgent(); - request.headers['Accept-Language'] = 'zh-CN'; + request.headers['Accept-Language'] = CurrentLocaleTool + .getCurrentLocaleString(); // StoreService.to.getLanguageCode() // request.headers['Content-Type'] = 'application/json'; // request.headers['token'] = StoreService.to.userToken!; String? xToken = ''; diff --git a/lib/network/response_interceptor.dart b/lib/network/response_interceptor.dart index 15986185..78e0e3a8 100755 --- a/lib/network/response_interceptor.dart +++ b/lib/network/response_interceptor.dart @@ -1,5 +1,7 @@ -import 'package:get/get.dart'; + import 'dart:async'; + +import 'package:get/get.dart'; import 'package:get/get_connect/http/src/request/request.dart'; import '../tools/manager/client_manager.dart'; diff --git a/lib/talk/call/callTalk.dart b/lib/talk/call/callTalk.dart index 8e1670db..1404c30f 100755 --- a/lib/talk/call/callTalk.dart +++ b/lib/talk/call/callTalk.dart @@ -1,11 +1,13 @@ + import 'dart:typed_data'; + import 'package:flutter/foundation.dart'; -import 'package:get/get.dart'; +import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; import 'package:star_lock/talk/call/g711.dart'; import 'package:star_lock/talk/call/iFrameInfo.dart'; + import '../../app_settings/app_settings.dart'; import '../../tools/eventBusEventManage.dart'; -import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; class CallTalk { static CallTalk? _manager; @@ -40,7 +42,7 @@ class CallTalk { // 音频数据 if (bb[61] == 1) { // AppLog.log('音频数据来了'); - Uint8List g711Data = bb.sublist(77, bb.length); + final Uint8List g711Data = bb.sublist(77, bb.length); List pcmBytes; try { @@ -63,26 +65,26 @@ class CallTalk { else { // AppLog.log('********视频数据来了'); // 音视频数据开始下标 - var bagLen = bb[POS_blen + 2] + bb[POS_blen + 3] * 256; + final int bagLen = bb[POS_blen + 2] + bb[POS_blen + 3] * 256; // AppLog.log('音视频数据开始下标 bagLen:$bagLen'); // 获取帧序号 63 - int getIframeIndex = + final int getIframeIndex = bb[POS_iframe_index] + bb[POS_iframe_index + 1] * 256; // AppLog.log('获取帧序号 getIframeIndex:$getIframeIndex'); // 获取帧长度 65 - int alen = bb[POS_alen] + bb[POS_alen + 1] * 256; + final int alen = bb[POS_alen] + bb[POS_alen + 1] * 256; // AppLog.log('获取帧长度 alen:$alen'); // 当前包号 71 - int getBagIndex = bb[POS_bag_index] & 0xff; + final int getBagIndex = bb[POS_bag_index] & 0xff; // AppLog.log('当前包号 getBagIndex:$getBagIndex'); // 总包数 69 - int getBagNum = bb[POS_bag_num] & 0xff; + final int getBagNum = bb[POS_bag_num] & 0xff; // AppLog.log('总包数 getBagNum:$getBagNum'); // 数据长度 73 - int blen = bb[POS_blen] + bb[POS_blen + 1] * 256; + final int blen = bb[POS_blen] + bb[POS_blen + 1] * 256; // AppLog.log('数据长度 blen:$blen'); // 这里判断是否是同一帧,如果不是同一帧就重新创建一个 IframeInfo @@ -91,7 +93,7 @@ class CallTalk { iframe!.iframeIndex = getIframeIndex; iframe!.bagNum = getBagNum; iframe!.cur_len = alen; - iframe!.bb = []; + iframe!.bb = []; // growableList = iframe!.bb!.toList(growable: true); } @@ -99,7 +101,7 @@ class CallTalk { // 如果是同一帧就添加起来 if (getIframeIndex == iframe!.iframeIndex) { - var getList = bb.sublist(POS_data, bb.length); + final Uint8List getList = bb.sublist(POS_data, bb.length); iframe!.bb!.addAll(getList); } // AppLog.log( @@ -124,7 +126,7 @@ class CallTalk { Future _initializeAudioPlayer(List audioData) async { // AppLog.log('_initializeAudioPlayer audioData:$audioData'); - PcmArrayInt16 fromList = PcmArrayInt16.fromList(audioData); + final PcmArrayInt16 fromList = PcmArrayInt16.fromList(audioData); await FlutterPcmSound.feed(fromList); FlutterPcmSound.play(); } @@ -151,6 +153,6 @@ class CallTalk { iframe!.iframeIndex = 0; iframe!.bagNum = 0; iframe!.bagReceive = 0; - iframe!.bb = []; + iframe!.bb = []; } } diff --git a/lib/talk/call/g711.dart b/lib/talk/call/g711.dart index aaf3afcc..d848bede 100755 --- a/lib/talk/call/g711.dart +++ b/lib/talk/call/g711.dart @@ -3,8 +3,8 @@ import 'package:flutter/services.dart'; class G711 { Future> readAssetFile(String assetPath) async { - ByteData data = await rootBundle.load(assetPath); - List bytes = data.buffer.asUint8List(); + final ByteData data = await rootBundle.load(assetPath); + final List bytes = data.buffer.asUint8List(); return bytes; } @@ -23,13 +23,13 @@ class G711 { //711解码为pcm数据 List convertList(List aLawList) { // 将 ALawToLinear 函数应用于 List - List linearList = aLawList.map(ALawToLinear).toList(); + final List linearList = aLawList.map(ALawToLinear).toList(); return linearList; } //List转为Uint8List Uint8List convertToInt8ListLittleEndian(List intList) { - List int8List = []; + final List int8List = []; for (int intValue in intList) { intValue = intValue * 2; diff --git a/lib/talk/udp/io_protocol/udp_heart.dart b/lib/talk/udp/io_protocol/udp_heart.dart index 3ed4e84c..763ff321 100755 --- a/lib/talk/udp/io_protocol/udp_heart.dart +++ b/lib/talk/udp/io_protocol/udp_heart.dart @@ -20,7 +20,7 @@ class UDPSendHeartCommand extends UDPSenderProtocol { @override List messageDetail() { - List data = []; + List data = []; // 命令 data.add(4); @@ -39,10 +39,10 @@ class UDPSendHeartCommand extends UDPSenderProtocol { // var macAddress = "02:00:00:00:00:00"; // data.addAll(utf8.encode(macAddress)); // data = getFixedLengthList(data, 6 - utf8.encode(macAddress).length); - data.addAll([0, 0, 0, 0, 0, 0]); + data.addAll([0, 0, 0, 0, 0, 0]); // 预留4个字节 - data.addAll([0, 0, 0, 0]); + data.addAll([0, 0, 0, 0]); // ip地址 // var ipStr = "192.168.9.7"; @@ -51,22 +51,21 @@ class UDPSendHeartCommand extends UDPSenderProtocol { data.addAll(ipList!); // 预留8个字节 - data.addAll([0, 0, 0, 0, 0, 0, 0, 0]); + data.addAll([0, 0, 0, 0, 0, 0, 0, 0]); // token - var token = "token"; + const String token = 'token'; data.addAll(gbk.encode(token)); data = getFixedLengthList(data, 10 - gbk.encode(token).length); // AppLog.log("gbk.encode(token):${gbk.encode(token)}"); - // tokenStr // var tokenStr = "b989fa15f75c2ac02718b7c9bb64f80e"; data.addAll(gbk.encode(tokenStr!)); // AppLog.log("gbk.encode(tokenStr):${gbk.encode(tokenStr!)}"); - var tokenStrLength = gbk.encode(tokenStr!).length; - List tokenStrLengthArr = []; - tokenStrLengthArr.add((tokenStrLength & 0xff)); + final int tokenStrLength = gbk.encode(tokenStr!).length; + final List tokenStrLengthArr = []; + tokenStrLengthArr.add(tokenStrLength & 0xff); tokenStrLengthArr.add((tokenStrLength & 0xff00) >> 8); tokenStrLengthArr.add((tokenStrLength & 0xff0000) >> 16); tokenStrLengthArr.add((tokenStrLength & 0xff000000) >> 24); diff --git a/lib/talk/udp/io_udpSender.dart b/lib/talk/udp/io_udpSender.dart index 1ab32970..1e01e14b 100755 --- a/lib/talk/udp/io_udpSender.dart +++ b/lib/talk/udp/io_udpSender.dart @@ -21,7 +21,7 @@ abstract class UDPSenderProtocol extends IOData { } - //TODO:拼装数据 + // 拼装数据 List packageData() { commandData = messageDetail(); List commandList = []; diff --git a/lib/talk/udp/io_udpType.dart b/lib/talk/udp/io_udpType.dart index af2fa485..b6c1ef92 100755 --- a/lib/talk/udp/io_udpType.dart +++ b/lib/talk/udp/io_udpType.dart @@ -1,5 +1,5 @@ -//TODO:发送指令类型 +// 发送指令类型 enum CommandUDPType { heart, //心跳 = 4 mainProtocol, // 150 diff --git a/lib/talk/udp/udp_help.dart b/lib/talk/udp/udp_help.dart index 35b000b4..dbb4f8c1 100755 --- a/lib/talk/udp/udp_help.dart +++ b/lib/talk/udp/udp_help.dart @@ -2,7 +2,9 @@ import 'dart:async'; import 'dart:io'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart'; +import '../../app_settings/app_settings.dart'; import '../../network/api_repository.dart'; import '../../tools/storage.dart'; import 'udp_manage.dart'; @@ -13,41 +15,42 @@ class UdpHelp { openUDP() async { // 从服务器获取ip跟端口 - var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); + final ConfiguringWifiEntity entity = + await ApiRepository.to.getWifiLockServiceIpAndPort(); if (entity.errorCode! == 0) { UDPManage(); // UDPManage().initUdp(); UDPManage().port = int.parse(entity.data!.serviceList![0].port!); - var serversList = []; + final List serversList = []; for (int i = 0; i < entity.data!.serviceList!.length; i++) { - var item = entity.data!.serviceList![i]; - if (item.serviceIp!.contains("192")) { + final ServiceList item = entity.data!.serviceList![i]; + if (item.serviceIp!.contains('192')) { UDPManage().host = entity.data!.serviceList![0].serviceIp!; - var itemList = item.serviceIp!.split("."); - for (var element in itemList) { + final List itemList = item.serviceIp!.split('.'); + for (String element in itemList) { serversList.add(int.parse(element)); } } else { - List addresses = + final List addresses = await InternetAddress.lookup(item.serviceIp!); UDPManage().host = addresses.first.address; - var itemList = addresses.first.address.split("."); - for (var element in itemList) { + final List itemList = addresses.first.address.split('.'); + for (String element in itemList) { serversList.add(int.parse(element)); } // AppLog.log('Resolved google.com to address: ${addresses.first.address} serversList:$serversList'); } } - var uid = await Storage.getUid(); - udpHeartTimer = Timer.periodic(1.seconds, (timer) async { - getLoginStatus().then((value) { + final String? uid = await Storage.getUid(); + udpHeartTimer = Timer.periodic(1.seconds, (Timer timer) async { + getLoginStatus().then((bool value) { if (value) { UDPSenderManage.sendHeart( userName: uid, ipList: serversList, - tokenStr: "b989fa15f75c2ac02718b7c9bb64f80e", + tokenStr: 'b989fa15f75c2ac02718b7c9bb64f80e', ); // AppLog.log('发送心跳了'); } else { @@ -59,7 +62,7 @@ class UdpHelp { } Future getLoginStatus() async { - final data = await Storage.getString(saveUserLoginData); + final String? data = await Storage.getString(saveUserLoginData); if (data != null && data.isNotEmpty) { return true; } @@ -116,13 +119,6 @@ class UdpData { // } // } - - - - - - - // import 'dart:async'; // // class UdpSendCondition { @@ -168,4 +164,4 @@ class UdpData { // await Future.delayed(Duration(seconds: 1)); // } // sendPort.send('done'); -// } \ No newline at end of file +// } diff --git a/lib/talk/udp/udp_manage.dart b/lib/talk/udp/udp_manage.dart index b5231292..c8857bcf 100755 --- a/lib/talk/udp/udp_manage.dart +++ b/lib/talk/udp/udp_manage.dart @@ -62,16 +62,16 @@ class UDPManage { // AppLog.log('Udp ----> host:$host port:$port'); var addressIListenFrom = InternetAddress.anyIPv4; int portIListenOn = 62288; - if(addressIListenFrom.address != '0.0.0.0'){ - RawDatagramSocket.bind(addressIListenFrom, portIListenOn) - .then((RawDatagramSocket socket) { - _udpSocket = socket; + // if(addressIListenFrom.address != '0.0.0.0'){ + RawDatagramSocket.bind(addressIListenFrom, portIListenOn) + .then((RawDatagramSocket socket) { + _udpSocket = socket; - ///广播功能 - _udpSocket!.broadcastEnabled = true; - _onReceiveData(socket); - }); - } + ///广播功能 + _udpSocket!.broadcastEnabled = true; + _onReceiveData(socket); + }); + // } } void _onReceiveData(RawDatagramSocket socket) { @@ -79,7 +79,8 @@ class UDPManage { if (event == RawSocketEvent.read) { Datagram? dg = socket.receive(); try { - // AppLog.log('Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}'); + // AppLog.log( + // 'Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}'); // EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp)); CommandUDPReciverManager.appDataReceive(dg!.data); } catch (e) { diff --git a/lib/talk/udp/udp_reciverData.dart b/lib/talk/udp/udp_reciverData.dart index c5f70481..7dc129d3 100755 --- a/lib/talk/udp/udp_reciverData.dart +++ b/lib/talk/udp/udp_reciverData.dart @@ -3,7 +3,6 @@ import 'dart:typed_data'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/talk/udp/udp_manage.dart'; -import 'package:star_lock/tools/storage.dart'; import '../../app_settings/app_settings.dart'; import '../../blue/io_tool/io_tool.dart'; @@ -17,16 +16,16 @@ class CommandUDPReciverManager { if (data.isEmpty) { return; } - int dataSize = data.length; + final int dataSize = data.length; if (dataSize < 4) { return; } - // AppLog.log("appReceiveUDPData:$data"); + // AppLog.log('appReceiveUDPData:$data'); - Uint8List data1 = Uint8List.fromList(data); + final Uint8List data1 = Uint8List.fromList(data); if (data1.length == 1) { if (data[0] == 0x30 || data[0] == 0x31) { - AppLog.log("p2p打洞"); + AppLog.log('p2p打洞'); } } @@ -35,7 +34,8 @@ class CommandUDPReciverManager { // AppLog.log("心跳包反馈 在线状态"); } else if (data[7] == 3) { // [Toast.show(msg: "您已在其他设备登录")]; - EasyLoading.showToast("您已在其他设备登录", duration: 2000.milliseconds); + EasyLoading.showToast('您的账号在异地登录,如非本人,请尽快修改密码'.tr, + duration: 2000.milliseconds); } } else if (data[6] == 150) { // if( [Pub getApp].isBack){ @@ -44,15 +44,15 @@ class CommandUDPReciverManager { // } // 对讲命令 - var beiCallType = data[8] & 0xff; - // AppLog.log("被呼叫类型$beiCallType"); + final int beiCallType = data[8] & 0xff; + AppLog.log('被呼叫类型$beiCallType'); switch (beiCallType) { case 1: { //被叫 // lockId - var lockId = data.sublist(9, 29); - var lockIdStr = utf8String(lockId); + final List lockId = data.sublist(9, 29); + final String lockIdStr = utf8String(lockId); UDPManage().lockId = lockIdStr; UDPTalkClass().status = 0; UDPTalkClass().beCallW(data: data); @@ -63,7 +63,7 @@ class CommandUDPReciverManager { //接听 if ((data[7] & 0x3) == 2) { //被叫 接听反馈 - AppLog.log("接听反馈"); + AppLog.log('接听反馈'); UDPTalkClass().status = 8; // 停止声音 UDPTalkClass().stopLocalAudio(); @@ -77,7 +77,7 @@ class CommandUDPReciverManager { { //音视频数据 // AppLog.log("音视频数据"); - CallTalk cllTalk = CallTalk(); + final CallTalk cllTalk = CallTalk(); cllTalk.getAVData(data1, data1.length); } break; @@ -95,13 +95,13 @@ class CommandUDPReciverManager { case 10: { //开门反馈 - AppLog.log("appReceiveUDPData:$data"); + // AppLog.log('appReceiveUDPData:$data'); if ((data[7] & 0x3) == 2) { - AppLog.log("开门成功"); - EasyLoading.showToast("开门成功", duration: 2000.milliseconds); + AppLog.log('开门成功'); + EasyLoading.showToast('开门成功'.tr, duration: 2000.milliseconds); } else { - AppLog.log("开门失败"); - EasyLoading.showToast("开门失败", duration: 2000.milliseconds); + AppLog.log('开门失败'); + EasyLoading.showToast('开门失败'.tr, duration: 2000.milliseconds); } } break; @@ -111,10 +111,10 @@ class CommandUDPReciverManager { // 挂断 if ((data[7] & 0x3) == 1) { // 对方结束对讲 - AppLog.log("对方结束对讲"); + AppLog.log('对方结束对讲'); } else { //结束对讲反馈 - AppLog.log("结束对讲反馈"); + AppLog.log('结束对讲反馈'); } // UDPTalkClass().status = 0; // UDPTalkClass().isBeCall = false; @@ -145,7 +145,7 @@ class CommandUDPReciverManager { case 143: { //p2p测试 NSAsk - AppLog.log("p2pNSAskNSAsk"); + AppLog.log('p2pNSAskNSAsk'); } break; default: @@ -157,13 +157,13 @@ class CommandUDPReciverManager { case 2: { //被叫 - AppLog.log("对方忙"); + AppLog.log('对方忙'); } break; case 4: { //监视成功 - AppLog.log("监视成功"); + AppLog.log('监视成功'); UDPTalkClass().status = 8; eventBus.fire(GetUDPStatusMonitorUI(UDPTalkClass().status)); } @@ -173,7 +173,7 @@ class CommandUDPReciverManager { { //音视频数据 // AppLog.log("音视频数据"); - CallTalk cllTalk = CallTalk(); + final CallTalk cllTalk = CallTalk(); cllTalk.getAVData(data1, data1.length); } break; @@ -193,12 +193,12 @@ class CommandUDPReciverManager { { //开门反馈 if ((data[7] & 0x3) == 2) { - AppLog.log("开门成功"); + AppLog.log('开门成功'); // Toast.show(msg: "开门成功"); - EasyLoading.showToast("开门成功", duration: 2000.milliseconds); + EasyLoading.showToast('开门成功'.tr, duration: 2000.milliseconds); } else { - AppLog.log("开门失败"); - EasyLoading.showToast("开门失败", duration: 2000.milliseconds); + AppLog.log('开门失败'); + EasyLoading.showToast('开门失败'.tr, duration: 2000.milliseconds); } } break; @@ -209,10 +209,10 @@ class CommandUDPReciverManager { // 监视结束 if ((data[7] & 0x3) == 1) { // 对方结束监视 - AppLog.log("对方结束监视"); + AppLog.log('对方结束监视'); } else { //结束监视反馈 - AppLog.log("结束监视反馈"); + AppLog.log('结束监视反馈'); } // Toast.show(msg: "对方已结束监视"); diff --git a/lib/talk/udp/udp_senderData.dart b/lib/talk/udp/udp_senderData.dart index afbfdfdd..5c4281cf 100755 --- a/lib/talk/udp/udp_senderData.dart +++ b/lib/talk/udp/udp_senderData.dart @@ -19,7 +19,7 @@ class CommandUDPSenderManager { } - //TODO:发送常规数据 + // 发送常规数据 Future managerSendData ({required UDPSenderProtocol command, CommandUDPSendCallBack? callBack}) async { if (callBack != null) { // if (!BluetoothManager().connected) { diff --git a/lib/talk/udp/udp_senderManage.dart b/lib/talk/udp/udp_senderManage.dart index 5899a888..d36d80eb 100755 --- a/lib/talk/udp/udp_senderManage.dart +++ b/lib/talk/udp/udp_senderManage.dart @@ -6,7 +6,7 @@ import 'udp_senderData.dart'; class UDPSenderManage { - //todo:UDP心跳 + // UDP心跳 static void sendHeart({String? userName, List? ipList, String? tokenStr, CommandUDPSendCallBack? callBack}) { CommandUDPSenderManager().managerSendData(command: UDPSendHeartCommand( userName: userName, @@ -15,7 +15,7 @@ class UDPSenderManage { ), callBack: callBack); } - //todo:主通讯协议 + // 主通讯协议 static void sendMainProtocol({ int? command, int? commandTypeIsCalling, diff --git a/lib/talk/udp/udp_talkClass.dart b/lib/talk/udp/udp_talkClass.dart index 4df516ee..e69476b2 100755 --- a/lib/talk/udp/udp_talkClass.dart +++ b/lib/talk/udp/udp_talkClass.dart @@ -4,6 +4,7 @@ import 'package:fast_gbk/fast_gbk.dart'; import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginData.dart'; import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart'; import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; @@ -13,31 +14,31 @@ import '../../tools/storage.dart'; import 'udp_manage.dart'; class UDPTalkClass { + + factory UDPTalkClass() => _share(); + + UDPTalkClass._init(); static UDPTalkClass? _manager; static UDPTalkClass _share() { _manager ??= UDPTalkClass._init(); return _manager!; } - - factory UDPTalkClass() => _share(); UDPTalkClass get manager => _share(); - UDPTalkClass._init(); - // var status = 0; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 int status = 0; var remoteEquid; // 手机号 late Timer talkTimer; // 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态 - var isBeCall = false; - var isEndCall = false; //是否已经调用结束对讲 - final audioPlayer = AudioPlayer(); - var playLocalAudioSecond = 0; + bool isBeCall = false; + bool isEndCall = false; //是否已经调用结束对讲 + final AudioPlayer audioPlayer = AudioPlayer(); + int playLocalAudioSecond = 0; late Timer playLocalAudioTimer; beCallW({List? data, String? ip, int? port}) async { - AppLog.log("beCall status:$status"); + AppLog.log('beCall status:$status'); // if (await isCallMe(data)) { // return; // } @@ -69,13 +70,13 @@ class UDPTalkClass { if (isBeCall == false) { isBeCall = true; // 保持连接 - talkTimer = Timer.periodic(1.seconds, (timer) { + talkTimer = Timer.periodic(1.seconds, (Timer timer) { data[7] = 1; data[8] = 9; UDPManage().sendData(data); }); - Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"}); + Get.toNamed(Routers.lockMonitoringPage, arguments: {'lockId': '111'}); } final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = @@ -87,7 +88,7 @@ class UDPTalkClass { AppLog.log('已经结束对讲1'); return; } - playLocalAudioTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + playLocalAudioTimer = Timer.periodic(const Duration(seconds: 1), (Timer timer) { playLocalAudioSecond++; // AppLog.log('还在工作么这个定时器$playLocalAudioSecond'); // 检查条件,如果达到60秒且未得到应答,则认为失败 @@ -114,16 +115,16 @@ class UDPTalkClass { ticker: 'ticker'); const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics); - var getLockName = await Storage.getString(saveLockAlias); + String? getLockName = await Storage.getString(saveLockAlias); await flutterLocalNotificationsPlugin.show( - 0, '呼叫提醒', '收到来自($getLockName)锁的呼叫。', platformChannelSpecifics, + 0, '呼叫提醒'.tr, '${'收到来自'.tr}($getLockName)${'锁的呼叫'.tr}。', platformChannelSpecifics, payload: 'item x'); } // 判断是否是call的本人 Future isCallMe(List? data) async { - final loginData = await Storage.getLoginData(); - AppLog.log("getEquidFrombb(data, 1000):${getEquidFrombb(data, 12)}"); + final LoginData? loginData = await Storage.getLoginData(); + AppLog.log('getEquidFrombb(data, 1000):${getEquidFrombb(data, 12)}'); if (loginData!.mobile == getEquidFrombb(data, 12)) { return true; } @@ -131,7 +132,7 @@ class UDPTalkClass { } String getEquidFrombb(List? bb, int pos) { - var equid = ""; + String equid = ''; int equlen = 8; if (bb![pos] == 77) { diff --git a/lib/tools/CustomUnderlineTabIndicator.dart b/lib/tools/CustomUnderlineTabIndicator.dart index 396698e3..4e56f8da 100755 --- a/lib/tools/CustomUnderlineTabIndicator.dart +++ b/lib/tools/CustomUnderlineTabIndicator.dart @@ -7,11 +7,7 @@ import 'package:flutter/material.dart'; // CSDN :https://blog.csdn.net/qq_42351033 // ------------------------------------------------------ -class CustomUnderlineTabIndicator extends Decoration { - final BorderSide? borderSide; - final EdgeInsetsGeometry? insets; - final StrokeCap? strokeCap; // 控制器的边角形状 - final double? width; // 控制器的宽度 +class CustomUnderlineTabIndicator extends Decoration { // 控制器的宽度 const CustomUnderlineTabIndicator({ this.borderSide = const BorderSide(width: 2, color: Colors.white), @@ -20,6 +16,10 @@ class CustomUnderlineTabIndicator extends Decoration { this.width: 20, }) : assert(borderSide != null), assert(insets != null); + final BorderSide? borderSide; + final EdgeInsetsGeometry? insets; + final StrokeCap? strokeCap; // 控制器的边角形状 + final double? width; @override Decoration? lerpFrom(Decoration? a, double t) { diff --git a/lib/tools/ExpandedListView.dart b/lib/tools/ExpandedListView.dart index 31bca4cf..b97127cf 100755 --- a/lib/tools/ExpandedListView.dart +++ b/lib/tools/ExpandedListView.dart @@ -1,9 +1,10 @@ + import 'dart:core'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:star_lock/app_settings/app_colors.dart'; -import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; class ExpandedListTile extends StatefulWidget { @@ -52,6 +53,7 @@ class _ExpandedListTileState extends State { Container( color: Colors.white, height: 80.h, + width: 1.sw, child: Row( children: _buildExpandRowList(), ), @@ -110,7 +112,7 @@ class _ExpandedListTileState extends State { widgetList.add(GestureDetector( child: Container( - width: ScreenUtil().screenWidth - (widget.isShowBtn ? 80.w : 0), + width: 1.sw - (widget.isShowBtn ? 80.w : 0), color: Colors.white, child: Row( children: [ @@ -122,14 +124,14 @@ class _ExpandedListTileState extends State { SizedBox( width: widget.isShowBtn ? 10.w :30.w, ), - Text( - widget.groupItem.keyGroupName ?? '', - style: TextStyle(color: AppColors.blackColor, fontSize: 22.sp), - ), Expanded( - child: SizedBox( - width: 10.w, - )), + child: Text( + widget.groupItem.keyGroupName ?? '', + style: TextStyle(color: AppColors.blackColor, fontSize: 22.sp), + overflow: TextOverflow.ellipsis, + ), + ), + SizedBox(width: 10.w), AnimatedRotation( turns: _isExpanded ? -0.5 : 0, duration: _animationDuration, diff --git a/lib/tools/NativeInteractionTool.dart b/lib/tools/NativeInteractionTool.dart index e8b0f338..d7c0b943 100755 --- a/lib/tools/NativeInteractionTool.dart +++ b/lib/tools/NativeInteractionTool.dart @@ -39,14 +39,13 @@ class NativeInteractionTool { ///获取设备蓝牙是否打开 void receiveChannelBlueIsOnEvent(BlockBlueStatus blockBlueStatus) { receiveChannel.setMethodCallHandler((MethodCall call) async { - AppLog.log( - '收到原生发送的信息call.method: ${call.method} call.arguments:${call.arguments}'); + // AppLog.log('收到原生发送的信息call.method: ${call.method} call.arguments:${call.arguments}'); switch (call.method) { case 'getBlueStatus': // 获取设备蓝牙开启/关闭状态 final String message = call.arguments; blockBlueStatus(message); - AppLog.log('收到原生发送的信息getBlueStatus: $message'); + // AppLog.log('收到原生发送的信息getBlueStatus: $message'); break; default: throw MissingPluginException(); diff --git a/lib/tools/advancedCalendar/src/header.dart b/lib/tools/advancedCalendar/src/header.dart index 026da55b..2b8bc331 100755 --- a/lib/tools/advancedCalendar/src/header.dart +++ b/lib/tools/advancedCalendar/src/header.dart @@ -47,7 +47,7 @@ class Header extends StatelessWidget { vertical: 4.0, ), child: Text( - '今天', + '今天'.tr, style: TextStyle( color: Colors.black, fontSize: 24.sp, diff --git a/lib/tools/advancedCalendar/src/widget.dart b/lib/tools/advancedCalendar/src/widget.dart index 468f8fe8..62dac000 100755 --- a/lib/tools/advancedCalendar/src/widget.dart +++ b/lib/tools/advancedCalendar/src/widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; @@ -103,7 +104,7 @@ class _AdvancedCalendarState extends State void initState() { super.initState(); - final monthPageIndex = widget.preloadMonthViewAmount ~/ 2; + final int monthPageIndex = widget.preloadMonthViewAmount ~/ 2; _monthViewCurrentPage = ValueNotifier(monthPageIndex); @@ -111,7 +112,7 @@ class _AdvancedCalendarState extends State initialPage: monthPageIndex, ); - final weekPageIndex = widget.preloadWeekViewAmount ~/ 2; + final int weekPageIndex = widget.preloadWeekViewAmount ~/ 2; _weekPageController = PageController( initialPage: weekPageIndex, @@ -130,7 +131,7 @@ class _AdvancedCalendarState extends State _monthRangeList = List.generate( widget.preloadMonthViewAmount, - (index) => ViewRange.generateDates( + (int index) => ViewRange.generateDates( _todayDate!, _todayDate!.month + (index - _monthPageController!.initialPage), widget.weeksInMonthViewAmount, @@ -150,19 +151,19 @@ class _AdvancedCalendarState extends State _weekPageController!.jumpToPage(widget.preloadWeekViewAmount ~/ 2); }); if (widget.startWeekDay != null && widget.startWeekDay! < 7) { - final time = _controller.value.subtract( + final DateTime time = _controller.value.subtract( Duration(days: _controller.value.weekday - widget.startWeekDay!), ); - final list = List.generate( + final List list = List.generate( 8, - (index) => time.add(Duration(days: index * 1)), + (int index) => time.add(Duration(days: index * 1)), ).toList(); // _weekNames = List.generate(7, (index) { // return DateFormat("EEEE").format(list[index]).split('').first; // } // ); //by DaisyWu 修改源文件为中文环境下 周一到周日 - _weekNames = List.generate(7, (index) { + _weekNames = List.generate(7, (int index) { String fullWeekName = DateFormat.E('zh_CN').format(list[index]); // 获取星期的完整形式 return fullWeekName @@ -173,23 +174,23 @@ class _AdvancedCalendarState extends State @override Widget build(BuildContext context) { - final theme = Theme.of(context); + final ThemeData theme = Theme.of(context); return Material( color: Colors.transparent, child: DefaultTextStyle.merge( style: theme.textTheme.bodyMedium, child: GestureDetector( - onVerticalDragStart: (details) { + onVerticalDragStart: (DragStartDetails details) { _captureOffset = details.globalPosition; }, - onVerticalDragUpdate: (details) { - final moveOffset = details.globalPosition; - final diffY = moveOffset.dy - _captureOffset!.dy; + onVerticalDragUpdate: (DragUpdateDetails details) { + final Offset moveOffset = details.globalPosition; + final double diffY = moveOffset.dy - _captureOffset!.dy; _animationController.value = _animationValue + diffY / (widget.weekLineHeight * 5); }, - onVerticalDragEnd: (details) => _handleFinishDrag(), + onVerticalDragEnd: (DragEndDetails details) => _handleFinishDrag(), onVerticalDragCancel: _handleFinishDrag, child: Container( color: Colors.transparent, @@ -197,10 +198,10 @@ class _AdvancedCalendarState extends State mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ ValueListenableBuilder( valueListenable: _monthViewCurrentPage, - builder: (_, value, __) { + builder: (_, int value, __) { return Header( monthDate: _monthRangeList[_monthViewCurrentPage.value].firstDay, @@ -217,12 +218,20 @@ class _AdvancedCalendarState extends State keepLineSize: widget.keepLineSize, weekNames: _weekNames != null ? _weekNames! - : const ['日', '一', '二', '三', '四', '五', '六'], + : [ + '简写周日'.tr, + '简写周一'.tr, + '简写周二'.tr, + '简写周三'.tr, + '简写周四'.tr, + '简写周五'.tr, + '简写周六'.tr + ], ), AnimatedBuilder( animation: _animationController, builder: (_, __) { - final height = Tween( + final double height = Tween( begin: widget.weekLineHeight, end: widget.weekLineHeight * widget.weeksInMonthViewAmount, @@ -232,11 +241,10 @@ class _AdvancedCalendarState extends State child: ValueListenableBuilder( valueListenable: _controller, builder: (_, selectedDate, __) { - AppLog.log('****selectedDate: $selectedDate'); - eventBus.fire(DoorLockLogListRefreshUI(selectedDate)); + // AppLog.log('****selectedDate: $selectedDate'); return Stack( alignment: Alignment.center, - children: [ + children: [ IgnorePointer( ignoring: _animationController.value == 0.0, child: Opacity( @@ -245,20 +253,21 @@ class _AdvancedCalendarState extends State end: 1.0, ).evaluate(_animationController), child: PageView.builder( - onPageChanged: (pageIndex) { + onPageChanged: (int pageIndex) { if (widget.onHorizontalDrag != null) { widget.onHorizontalDrag!( _monthRangeList[pageIndex].firstDay, ); } _monthViewCurrentPage.value = pageIndex; + AppLog.log('调用onPageChanged'); }, controller: _monthPageController, physics: _animationController.value == 1.0 ? const AlwaysScrollableScrollPhysics() : const NeverScrollableScrollPhysics(), itemCount: _monthRangeList.length, - itemBuilder: (_, pageIndex) { + itemBuilder: (_, int pageIndex) { return MonthView( innerDot: widget.innerDot, monthView: _monthRangeList[pageIndex], @@ -278,12 +287,12 @@ class _AdvancedCalendarState extends State ), ValueListenableBuilder( valueListenable: _monthViewCurrentPage, - builder: (_, pageIndex, __) { - final index = selectedDate.findWeekIndex( + builder: (_, int pageIndex, __) { + final int index = selectedDate.findWeekIndex( _monthRangeList[_monthViewCurrentPage.value] .dates, ); - final offset = index / + final double offset = index / (widget.weeksInMonthViewAmount - 1) * 2 - 1.0; @@ -300,10 +309,10 @@ class _AdvancedCalendarState extends State child: SizedBox( height: widget.weekLineHeight, child: PageView.builder( - onPageChanged: (indexPage) { - final pageIndex = + onPageChanged: (int indexPage) { + final int pageIndex = _monthRangeList.indexWhere( - (index) => + (ViewRange index) => index.firstDay.month == _weekRangeList[indexPage] .first @@ -323,7 +332,8 @@ class _AdvancedCalendarState extends State controller: _weekPageController, itemCount: _weekRangeList.length, physics: _closeMonthScroll(), - itemBuilder: (context, index) { + itemBuilder: (BuildContext context, + int index) { return WeekView( innerDot: widget.innerDot, dates: _weekRangeList[index], @@ -383,12 +393,14 @@ class _AdvancedCalendarState extends State void _handleWeekDateChanged(DateTime date) { _handleDateChanged(date); - _monthViewCurrentPage.value = _monthRangeList - .lastIndexWhere((monthRange) => monthRange.dates.contains(date)); + _monthViewCurrentPage.value = _monthRangeList.lastIndexWhere( + (ViewRange monthRange) => monthRange.dates.contains(date)); } void _handleDateChanged(DateTime date) { _controller.value = date; + AppLog.log('点击日期了'); + eventBus.fire(DoorLockLogListRefreshUI(date)); } void _handleFinishDrag() async { @@ -411,10 +423,10 @@ class _AdvancedCalendarState extends State } ScrollPhysics _closeMonthScroll() { - if ((_monthViewCurrentPage.value == + if (_monthViewCurrentPage.value == (widget.preloadMonthViewAmount ~/ 2) + 3 || _monthViewCurrentPage.value == - (widget.preloadMonthViewAmount ~/ 2) - 3)) { + (widget.preloadMonthViewAmount ~/ 2) - 3) { return const NeverScrollableScrollPhysics(); } else { return const AlwaysScrollableScrollPhysics(); diff --git a/lib/tools/appRouteObserver.dart b/lib/tools/appRouteObserver.dart index 061c6378..b80001da 100755 --- a/lib/tools/appRouteObserver.dart +++ b/lib/tools/appRouteObserver.dart @@ -2,20 +2,20 @@ import 'package:flutter/material.dart'; class AppRouteObserver { + + factory AppRouteObserver() { + return _appRouteObserver; + } + + AppRouteObserver._internal() {} //这是实际上的路由监听器 static final RouteObserver> _routeObserver = RouteObserver>(); //这是个单例 static final AppRouteObserver _appRouteObserver = AppRouteObserver._internal(); - - AppRouteObserver._internal() {} //通过单例的get方法轻松获取路由监听器 RouteObserver> get routeObserver { return _routeObserver; } - - factory AppRouteObserver() { - return _appRouteObserver; - } } \ No newline at end of file diff --git a/lib/tools/baseGetXController.dart b/lib/tools/baseGetXController.dart index 226e281d..9393acfc 100755 --- a/lib/tools/baseGetXController.dart +++ b/lib/tools/baseGetXController.dart @@ -13,6 +13,7 @@ import 'package:url_launcher/url_launcher.dart'; import '../common/XSConstantMacro/XSConstantMacro.dart'; import '../main/lockMian/lockMain/lockMain_logic.dart'; import 'NativeInteractionTool.dart'; +import 'commonDataManage.dart'; import 'dateTool.dart'; import 'manager/client_manager.dart'; import 'showIosTipView.dart'; @@ -21,8 +22,8 @@ class BaseGetXController extends GetxController { int currentTimeSeconds = 0; bool currentPage = true; - var pageNo = 1; - var pageSize = '20'; + int pageNo = 1; + String pageSize = '20'; @override void onReady() { @@ -31,22 +32,18 @@ class BaseGetXController extends GetxController { } @override - // TODO: implement onDelete InternalFinalCallback get onDelete => super.onDelete; @override - // TODO: implement onStart InternalFinalCallback get onStart => super.onStart; @override void onInit() { - // TODO: implement onInit super.onInit(); } @override void onClose() { - // TODO: implement onClose super.onClose(); currentPage = false; } @@ -76,7 +73,7 @@ class BaseGetXController extends GetxController { _timer!.cancel(); _timer = null; } - _timer = Timer.periodic(outTimer.seconds, (timer) { + _timer = Timer.periodic(outTimer.seconds, (Timer timer) { if (action != null) { action(); } @@ -96,9 +93,8 @@ class BaseGetXController extends GetxController { } void showBlueConnetctToast() { - bool isContains = BlueManage().connectDeviceName.contains('T9A'); showToast( - "${'操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。'.tr}${isContains == true ? "如果是全自动锁,请使屏幕变亮" : ""}"); + "${'操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。'.tr}${CommonDataManage().currentKeyInfo.lockFeature?.isNoSupportedBlueBroadcast == 1 ? "如果是全自动锁,请使屏幕变亮".tr : ""}"); } void showToast(String status, @@ -126,44 +122,44 @@ class BaseGetXController extends GetxController { } void showOperationSuccessful({String? status, Function? something}) => - showSuccess(status ?? '成功', something: something); + showSuccess(status ?? '成功'.tr, something: something); void showOperationFailed({String? status, Function? something}) => - showError(status ?? '失败', something: something); + showError(status ?? '失败'.tr, something: something); void logOff() async { await ClientManager().logOff(); Get.offAllNamed(Routers.starLockLoginPage); } - void checkBlueIsOpen(void Function() action) { - NativeInteractionTool().sendGetBlueStatus(); - NativeInteractionTool().receiveChannelBlueIsOnEvent((String status) { - if (status == '1') { - // 蓝牙已打开 - AppLog.log('蓝牙已打开'); - action(); - } else if (status == '0') { - // 蓝牙未打开 - AppLog.log('蓝牙未打开'); - showIosTipViewDialog(); - return; - } else { - // 蓝牙未打开 - AppLog.log('设备不支持蓝牙'); - showToast('设备不支持蓝牙'); - return; - } - }); - } + // void checkBlueIsOpen(void Function() action) { + // NativeInteractionTool().sendGetBlueStatus(); + // NativeInteractionTool().receiveChannelBlueIsOnEvent((String status) { + // if (status == '1') { + // // 蓝牙已打开 + // // AppLog.log('蓝牙已打开'); + // action(); + // } else if (status == '0') { + // // 蓝牙未打开 + // // AppLog.log('蓝牙未打开'); + // showIosTipViewDialog(); + // return; + // } else { + // // 蓝牙未打开 + // // AppLog.log('设备不支持蓝牙'); + // showToast('设备不支持蓝牙'); + // return; + // } + // }); + // } void showIosTipViewDialog() { showDialog( context: Get.context!, builder: (BuildContext context) { return ShowIosTipView( - title: '提示', - tipTitle: '蓝牙未打开,请到设置里面打开蓝牙', + title: '提示'.tr, + tipTitle: '蓝牙未打开,请到设置里面打开蓝牙'.tr, sureClick: () { Get.back(); if (Platform.isIOS) { diff --git a/lib/tools/bugly/bugly_tool.dart b/lib/tools/bugly/bugly_tool.dart index fb50076c..f87f74d4 100644 --- a/lib/tools/bugly/bugly_tool.dart +++ b/lib/tools/bugly/bugly_tool.dart @@ -1,8 +1,7 @@ import 'dart:async'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart'; +import 'package:flutter_bugly/flutter_bugly.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/login/login/entity/LoginData.dart'; @@ -13,18 +12,20 @@ import 'package:star_lock/tools/storage.dart'; /// /// class BuglyTool { + static int time = 0; + static Future init() async { if (F.isProductionEnv) { //生产 - await FlutterBuglyPlugin.init( - appIdAndroid: '73c99cca00', - appIdiOS: 'b25632a54f', + await FlutterBugly.init( + androidAppId: '5729fb97dc', + iOSAppId: '33c4430cce', ); } else { //测试 - await FlutterBuglyPlugin.init( - appIdAndroid: '02fb541c1c', - appIdiOS: '618ab9feeb', + await FlutterBugly.init( + androidAppId: '5729fb97dc', + iOSAppId: '33c4430cce', ); } @@ -33,28 +34,60 @@ class BuglyTool { setUserId(loginData?.userid); //错误日志监控 - FlutterError.onError = (FlutterErrorDetails details) async { - AppLog.log('error:${details.exception.toString()}', - stackTrace: details.stack, error: true); - FlutterBuglyPlugin.reportException( - exceptionName: details.exception.toString(), - reason: details.stack.toString()); - Zone.current.handleUncaughtError( - details.exception, details.stack ?? StackTrace.empty); - }; + // FlutterError.onError = (FlutterErrorDetails details) async { + // AppLog.log('error:${details.exception.toString()}', + // stackTrace: details.stack, error: true); + // FlutterBugly.uploadException( + // message: details.exception.toString(), + // detail: details.stack.toString()); + // Zone.current.handleUncaughtError( + // details.exception, details.stack ?? StackTrace.empty); + // }; //错误日志监控 PlatformDispatcher.instance.onError = (Object error, StackTrace stack) { AppLog.log('error:$error', stackTrace: stack, error: true); - FlutterBuglyPlugin.reportException( - exceptionName: error.toString(), reason: stack.toString()); + FlutterBugly.uploadException( + message: error.toString(), detail: stack.toString()); return true; }; } //关联 userid static void setUserId(int? userId) { - FlutterBuglyPlugin.setUserIdentifier( - userIdentifier: (userId ?? 0).toString()); + FlutterBugly.setUserId(userId?.toString() ?? ''); + } + + static String uploadStr = ''; + static Future uploadException({ + required String message, + required String detail, + required bool upload, + String eventStr = '开门事件', + bool begin = false, + Map? data, + }) async { + String getMessage = + '${(await Storage.getMobile())!.isNotEmpty ? (await Storage.getMobile()) : (await Storage.getEmail())}+$time --- message:$message detail:$detail'; + if (begin == true) { + // 开始 + uploadStr = ''; + } else { + uploadStr = '$uploadStr \n<----------->\n $getMessage'; + } + + if (upload) { + // AppLog.log('message:${(await Storage.getMobile())!.isNotEmpty ? (await Storage.getMobile()) : (await Storage.getEmail())}+$time --- 开门事件 detail:$uploadStr'); + // FlutterBugly.uploadException(message: '${(await Storage.getMobile())!.isNotEmpty ? (await Storage.getMobile()) : (await Storage.getEmail())}+$time --- 开门事件', detail: uploadStr, data: data); + + BuglyTool.uploadExceptionWithEvent(eventStr: eventStr, detail: uploadStr); + } + } + + static Future uploadExceptionWithEvent({ + required String eventStr, + required String detail, + }) async { + // FlutterBugly.uploadException(message: '${(await Storage.getMobile())!.isNotEmpty ? (await Storage.getMobile()) : (await Storage.getEmail())}+${time == 0 ? DateTime.now().millisecondsSinceEpoch : 0}--- $eventStr', detail: detail); } } diff --git a/lib/tools/commonItem.dart b/lib/tools/commonItem.dart index d6776391..30e36dd9 100755 --- a/lib/tools/commonItem.dart +++ b/lib/tools/commonItem.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; +import '../translations/app_dept.dart'; +import '../translations/current_locale_tool.dart'; + class CommonItem extends StatelessWidget { CommonItem( {required this.leftTitel, @@ -86,11 +90,27 @@ class CommonItem extends StatelessWidget { ), if (isHaveDirection!) SizedBox(width: 15.w) else Container(), if (isHaveDirection!) - Image.asset( - 'images/icon_right_grey.png', - width: 12.w, - height: 21.w, - ) + if (CurrentLocaleTool.getCurrentLocaleString() == + ExtensionLanguageType.fromLanguageType( + LanguageType.hebrew) + .toLanguageTag() || + CurrentLocaleTool.getCurrentLocaleString() == + ExtensionLanguageType.fromLanguageType( + LanguageType.arabic) + .toLanguageTag() || + rightTitle == '希伯来语'.tr || + rightTitle == '阿拉伯语'.tr) + Image.asset( + 'images/icon_left_grey.png', + width: 21.w, + height: 21.w, + ) + else + Image.asset( + 'images/icon_right_grey.png', + width: 12.w, + height: 21.w, + ) else SizedBox(width: 10.w), if (isHaveDirection!) SizedBox(width: 5.w) else Container(), diff --git a/lib/tools/customNetworkImage.dart b/lib/tools/customNetworkImage.dart index 2456059f..0fe9d74a 100755 --- a/lib/tools/customNetworkImage.dart +++ b/lib/tools/customNetworkImage.dart @@ -7,21 +7,17 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; * */ class CustomNetworkImage extends StatelessWidget { + + const CustomNetworkImage( + {required this.url, required this.defaultUrl, required this.width, required this.height, Key? key, + this.boxFit = BoxFit.cover}) + : super(key: key); final String url; final String defaultUrl; final double width; final double height; final BoxFit boxFit; - const CustomNetworkImage( - {Key? key, - required this.url, - required this.defaultUrl, - required this.width, - required this.height, - this.boxFit = BoxFit.cover}) - : super(key: key); - @override Widget build(BuildContext context) { return url.isNotEmpty @@ -30,7 +26,7 @@ class CustomNetworkImage extends StatelessWidget { height: height, fit: boxFit, imageUrl: url, - imageBuilder: (context, imageProvider) => Container( + imageBuilder: (BuildContext context, ImageProvider imageProvider) => Container( decoration: BoxDecoration( image: DecorationImage( image: imageProvider, @@ -39,7 +35,7 @@ class CustomNetworkImage extends StatelessWidget { Colors.transparent, BlendMode.colorBurn)), ), ), - errorWidget: (context, url, error) => Image.asset( + errorWidget: (BuildContext context, String url, Object error) => Image.asset( defaultUrl, width: width, height: height, diff --git a/lib/tools/custom_bottom_sheet.dart b/lib/tools/custom_bottom_sheet.dart index bb47dff0..95183150 100755 --- a/lib/tools/custom_bottom_sheet.dart +++ b/lib/tools/custom_bottom_sheet.dart @@ -3,8 +3,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; -import '../translations/trans_lib.dart'; - class AlertBottomWidget extends StatelessWidget { AlertBottomWidget( diff --git a/lib/tools/dateTool.dart b/lib/tools/dateTool.dart index cb7b476b..2764b3aa 100755 --- a/lib/tools/dateTool.dart +++ b/lib/tools/dateTool.dart @@ -128,23 +128,23 @@ class DateTool { String dateStr = ''; switch (type) { case 1: - // 年月日时分(2023-01-01 12:48) + // 年月日时分(2023-01-01 12:48) dateStr = - '$year-${month!.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')} ${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; + '$year-${month!.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')} ${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; break; case 2: - // 年月日(2023-01-01) + // 年月日(2023-01-01) dateStr = - '$year-${month!.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')}'; + '$year-${month!.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')}'; break; case 3: - // 时分(12:05) + // 时分(12:05) dateStr = - '${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; + '${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; break; default: dateStr = - '$year-${month!.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')} ${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; + '$year-${month!.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')} ${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}'; break; } return dateStr; diff --git a/lib/tools/dateUtils.dart b/lib/tools/dateUtils.dart deleted file mode 100755 index 5330ef90..00000000 --- a/lib/tools/dateUtils.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:intl/intl.dart'; - -class XSDateUtils { - // 将DateTime对象格式化为指定格式的字符串 - static String formatDateTime(DateTime dateTime, String format) { - DateFormat dateFormat = DateFormat(format); - return dateFormat.format(dateTime); - } - - // 将指定格式的日期时间字符串解析为DateTime对象 - static DateTime parseDateTime(String dateString, String format) { - DateFormat dateFormat = DateFormat(format); - return dateFormat.parse(dateString); - } -} - -// 使用示例 -// void main() { -// // 格式化日期时间 -// DateTime now = DateTime.now(); -// String formattedDateTime = DateUtils.formatDateTime(now, 'HH:mm'); - -// // 解析日期时间字符串 -// String dateString = '08:30'; -// DateTime parsedDateTime = DateUtils.parseDateTime(dateString, 'HH:mm'); -// } diff --git a/lib/tools/device_info_service.dart b/lib/tools/device_info_service.dart index 955cef4d..92ef5a3e 100755 --- a/lib/tools/device_info_service.dart +++ b/lib/tools/device_info_service.dart @@ -19,7 +19,6 @@ class DeviceInfoService extends GetxService { String dId = ""; if(dId.isNotEmpty){ dId = const Uuid().v1(); - AppLog.log('初始化设备ID:$dId'); // StoreService.to.saveDeviceId(dId); } _deviceID = dId; diff --git a/lib/tools/emailNotifyTypeSelectAlert.dart b/lib/tools/emailNotifyTypeSelectAlert.dart index 70a202e3..ee99c30b 100644 --- a/lib/tools/emailNotifyTypeSelectAlert.dart +++ b/lib/tools/emailNotifyTypeSelectAlert.dart @@ -22,7 +22,7 @@ class EmailNotifyTypeSelectAlert extends StatelessWidget { return StatefulBuilder( builder: (BuildContext context, StateSetter setState) { return CupertinoAlertDialog( - title: const Text('类型选择'), + title: Text('类型选择'.tr), content: Column( children: [ Padding( @@ -31,7 +31,7 @@ class EmailNotifyTypeSelectAlert extends StatelessWidget { child: Align( alignment: Alignment.centerLeft, child: - Text('请选择要使用哪种类型', style: TextStyle(fontSize: 20.sp)), + Text('请选择要使用哪种类型'.tr, style: TextStyle(fontSize: 20.sp)), ), ), GestureDetector( @@ -54,7 +54,7 @@ class EmailNotifyTypeSelectAlert extends StatelessWidget { Padding( padding: EdgeInsets.only(left: 10.w), child: Text( - isEmail ? '系统邮件(推荐)' : '系统短信(推荐)', + isEmail ? '系统邮件(推荐)'.tr : '系统短信(推荐)'.tr, style: TextStyle( fontSize: 22.sp, fontWeight: FontWeight.bold), ), @@ -68,8 +68,8 @@ class EmailNotifyTypeSelectAlert extends StatelessWidget { alignment: Alignment.centerLeft, child: Text( isEmail - ? '邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。' - : '短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。', + ? '邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。'.tr + : '短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。'.tr, style: TextStyle(fontSize: 18.sp), textAlign: TextAlign.left, ), @@ -95,7 +95,7 @@ class EmailNotifyTypeSelectAlert extends StatelessWidget { Padding( padding: EdgeInsets.only(left: 10.w), child: Text( - isEmail ? '个人邮件' : '个人短信', + isEmail ? '个人邮件'.tr : '个人短信'.tr, style: TextStyle( fontSize: 22.sp, fontWeight: FontWeight.bold), ), @@ -109,8 +109,8 @@ class EmailNotifyTypeSelectAlert extends StatelessWidget { alignment: Alignment.centerLeft, child: Text( isEmail - ? '邮件将从你的个人邮箱发给用户' - : '短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除', + ? '邮件将从你的个人邮箱发给用户'.tr + : '短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除'.tr, style: TextStyle(fontSize: 18.sp), textAlign: TextAlign.left, ), diff --git a/lib/tools/eventBusEventManage.dart b/lib/tools/eventBusEventManage.dart index 10214d51..93fb2883 100755 --- a/lib/tools/eventBusEventManage.dart +++ b/lib/tools/eventBusEventManage.dart @@ -69,9 +69,7 @@ class ChickInAddStaffCardAndFingerprintBlockNumberEvent { /// 多语言 切换之后传值到上一级界面 class ChangeLanguageBlockLastLanguageEvent { - ChangeLanguageBlockLastLanguageEvent(this.languageTitle); - - String languageTitle; + ChangeLanguageBlockLastLanguageEvent(); } /// 锁分组添加或者删除锁之后刷新首页数据 diff --git a/lib/tools/jh_pop_menus.dart b/lib/tools/jh_pop_menus.dart index 74f51050..d383e8a6 100755 --- a/lib/tools/jh_pop_menus.dart +++ b/lib/tools/jh_pop_menus.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'screen_utils.dart'; // List _listData = [ -// {'text': '读取记录'}, -// {'text': '清空记录'}, -// {'text': '导出记录'}, +// {'text': '读取记录'.tr}, +// {'text': '清空记录'.tr}, +// {'text': '导出记录'.tr}, // ]; const Color _bgColor = Color(0xFF2D2D2D); @@ -14,7 +15,7 @@ const double _cellHeight = 50.0; const double _imgWH = 22.0; class JhPopMenus { - /// 显示pop + // 显示pop static void show( BuildContext context, { required List listData, @@ -37,10 +38,10 @@ class JhPopMenus { }, child: Row( children: [ - SizedBox(width: 25), + const SizedBox(width: 25), // Image.asset(dataArr[index]['icon'], width: _imgWH, height: _imgWH, color: Colors.white), // const SizedBox(width: 15), - Text("你好", + Text('你好'.tr, style: TextStyle( color: Colors.white, fontSize: _fontSize.sp)), ], @@ -53,7 +54,7 @@ class JhPopMenus { Widget menusView(dataArr) { var cellH = dataArr.length * _cellHeight.h; - var navH = JhScreenUtils.navigationBarHeight; + double navH = JhScreenUtils.navigationBarHeight; return Positioned( right: 10, top: navH - 10, @@ -78,11 +79,10 @@ class JhPopMenus { .push(DialogRouter(_BasePopMenus(child: menusView(listData)))); } - /// 显示带线带背景 pop + // 显示带线带背景 pop static void showLinePop( BuildContext context, { - bool isShowBg = false, - required List listData, + required List listData, bool isShowBg = false, Function(int selectIndex, String selectText)? clickCallback, }) { // 带线 @@ -119,17 +119,17 @@ class JhPopMenus { ), ); }, - separatorBuilder: (context, index) => Divider( + separatorBuilder: (BuildContext context, int index) => Divider( height: .1, indent: 20.w, endIndent: 20.w, - color: Color(0xFFE6E6E6)), + color: const Color(0xFFE6E6E6)), ); } Widget menusView(dataArr) { - var cellH = dataArr.length * _cellHeight.h; - var navH = JhScreenUtils.navigationBarHeight; + final cellH = dataArr.length * _cellHeight.h; + double navH = JhScreenUtils.navigationBarHeight; if (isShowBg == true) { navH = navH - JhScreenUtils.topSafeHeight; } else { @@ -159,7 +159,7 @@ class JhPopMenus { showDialog( context: context, barrierDismissible: false, - builder: (context) { + builder: (BuildContext context) { return _BasePopMenus(child: menusView(listData)); }, ); @@ -171,12 +171,12 @@ class JhPopMenus { } class _BasePopMenus extends Dialog { - final child; const _BasePopMenus({ Key? key, this.child, }) : super(key: key); + final child; @override Widget build(BuildContext context) { @@ -195,7 +195,6 @@ class _BasePopMenus extends Dialog { } class DialogRouter extends PageRouteBuilder { - final Widget page; DialogRouter(this.page) : super( @@ -203,21 +202,22 @@ class DialogRouter extends PageRouteBuilder { // 自定义遮罩颜色 barrierColor: Colors.white10.withAlpha(1), transitionDuration: const Duration(milliseconds: 150), - pageBuilder: (context, animation, secondaryAnimation) => page, - transitionsBuilder: (context, animation, secondaryAnimation, child) => + pageBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation) => page, + transitionsBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) => child, ); + final Widget page; } class CustomDialog extends Dialog { - final bool clickBgHidden; - final child; const CustomDialog({ Key? key, this.child, this.clickBgHidden = false, // 点击背景隐藏,默认不隐藏 }) : super(key: key); + final bool clickBgHidden; + final child; @override Widget build(BuildContext context) { diff --git a/lib/tools/keySearchWidget.dart b/lib/tools/keySearchWidget.dart index 27255aa9..783b5ce7 100755 --- a/lib/tools/keySearchWidget.dart +++ b/lib/tools/keySearchWidget.dart @@ -8,17 +8,15 @@ import '../app_settings/app_colors.dart'; import '../app_settings/app_settings.dart'; class KeySearchWidget extends StatelessWidget { + + KeySearchWidget( + {required this.editingController, required this.onSubmittedAction, Key? key, + this.backgroundColor}) + : super(key: key); TextEditingController editingController; Function() onSubmittedAction; Color? backgroundColor; - KeySearchWidget( - {Key? key, - required this.editingController, - required this.onSubmittedAction, - this.backgroundColor}) - : super(key: key); - @override Widget build(BuildContext context) { return Container( @@ -30,7 +28,7 @@ class KeySearchWidget extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ Padding( padding: EdgeInsets.only(top: 15.h, bottom: 15.h, right: 5.w, left: 10.w), child: Image.asset( @@ -55,18 +53,18 @@ class KeySearchWidget extends StatelessWidget { controller: editingController, autofocus: false, textAlign: TextAlign.start, - onChanged: (value) { - AppLog.log("onChanged:$value"); + onChanged: (String value) { + AppLog.log('onChanged:$value'); }, onEditingComplete: () { - AppLog.log("onEditingComplete:"); + AppLog.log('onEditingComplete:'); }, - onSubmitted: (value) { + onSubmitted: (String value) { onSubmittedAction!(); }, decoration: InputDecoration( //输入里面输入文字内边距设置 - hintText:"搜索".tr, + hintText:'搜索'.tr, hintStyle: TextStyle(fontSize: 22.sp), focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)), diff --git a/lib/tools/key_name_item.dart b/lib/tools/key_name_item.dart new file mode 100644 index 00000000..2dd8b660 --- /dev/null +++ b/lib/tools/key_name_item.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import '../app_settings/app_colors.dart'; + +class KeyNameItem extends StatelessWidget { + KeyNameItem( + {required this.leftTitel, Key? key, this.rightTitle, this.controller}) + : super(key: key); + String? leftTitel; + String? rightTitle; + TextEditingController? controller; + + @override + Widget build(BuildContext context) { + return Container( + height: 65.h, + padding: EdgeInsets.only(left: 20.w, right: 20.w), + // color: Colors.white, + decoration: BoxDecoration( + color: Colors.white, + border: Border( + bottom: BorderSide( + color: AppColors.greyLineColor, // 设置边框颜色 + width: 2.0.h, // 设置边框宽度 + ), + ), + ), + child: Row( + children: [ + Text(leftTitel ?? '', style: TextStyle(fontSize: 22.sp)), + SizedBox(width: 6.w), + Expanded( + child: TextField( + //输入框一行 + maxLines: 1, + inputFormatters: [ + FilteringTextInputFormatter.deny('\n'), + LengthLimitingTextInputFormatter(50), + ], + keyboardType: TextInputType.text, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + controller: controller, + autofocus: false, + textAlign: TextAlign.end, + // decoration: InputDecoration( + // //输入里面输入文字内边距设置 + // contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h), + // hintText: tfStr, + // hintStyle: TextStyle(fontSize: 22.sp), + // //不需要输入框下划线 + // border: InputBorder.none, + // ), + decoration: InputDecoration( + //输入里面输入文字内边距设置 + // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), + hintText: rightTitle, + hintStyle: TextStyle(fontSize: 22.sp), + focusedBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + disabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + enabledBorder: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + border: const OutlineInputBorder( + borderSide: + BorderSide(width: 0, color: Colors.transparent)), + contentPadding: const EdgeInsets.symmetric(vertical: 0), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/tools/langue/langue_tool.dart b/lib/tools/langue/langue_tool.dart new file mode 100644 index 00000000..36715085 --- /dev/null +++ b/lib/tools/langue/langue_tool.dart @@ -0,0 +1,16 @@ +import 'package:get/get.dart'; + +class LanguageTool { + LanguageTool._(); + + static LanguageTool? _instance; + + static LanguageTool get instance => _instance ??= LanguageTool._(); + + String get currentLanguage => Get.locale?.languageCode ?? 'zh'; + + bool get isChinese => currentLanguage == 'zh'; + + bool get isArabic => currentLanguage == 'ar'; + bool get isHebrew => currentLanguage == 'he'; +} diff --git a/lib/tools/menuItem/dropDownItem.dart b/lib/tools/menuItem/dropDownItem.dart index b08b44c3..7ea1f0ac 100755 --- a/lib/tools/menuItem/dropDownItem.dart +++ b/lib/tools/menuItem/dropDownItem.dart @@ -1,14 +1,15 @@ + /// 通用菜单项 class DropDownItem { + + DropDownItem( + {required this.itemTitle, + required this.itemValue, + required this.isCheked}); // 显示的文本 String itemTitle = ''; // 选中的值 dynamic itemValue; // 是否选中 bool isCheked = false; - - DropDownItem( - {required this.itemTitle, - required this.itemValue, - required this.isCheked}); } diff --git a/lib/tools/menuItem/xsDropDownWidget.dart b/lib/tools/menuItem/xsDropDownWidget.dart index 5fcc61d2..554473d4 100755 --- a/lib/tools/menuItem/xsDropDownWidget.dart +++ b/lib/tools/menuItem/xsDropDownWidget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/tools/menuItem/dropDownItem.dart'; @@ -7,6 +8,14 @@ import 'package:star_lock/tools/menuItem/dropDownItem.dart'; /// @创建时间:2024/4/11 /// 下拉菜单按钮组件 class XSDropDownWidget extends StatefulWidget { + XSDropDownWidget( + {Key? key, + required this.items, + this.value, + this.valueChanged, + this.title, + this.tooltip = '点击选择'}) + : super(key: key); // 显示的菜单项 List items = []; // 当前选中的值 @@ -14,17 +23,9 @@ class XSDropDownWidget extends StatefulWidget { // 选择框前的标题 final String? title; // 提示语 - final String tooltip; + String tooltip = '点击选择'.tr; // 选中数据的回调事件 final ValueChanged? valueChanged; - XSDropDownWidget( - {Key? key, - required this.items, - this.value, - this.valueChanged, - this.title, - this.tooltip = "点击选择"}) - : super(key: key); @override State createState() => _XSDropDownWidgetState(); diff --git a/lib/tools/noData.dart b/lib/tools/noData.dart index 4251d19a..edbf8c4a 100755 --- a/lib/tools/noData.dart +++ b/lib/tools/noData.dart @@ -5,8 +5,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; -import '../translations/trans_lib.dart'; - class NoData extends StatelessWidget { double? noDataHeight; NoData({Key? key, this.noDataHeight}) : super(key: key); @@ -25,8 +23,7 @@ class NoData extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset('images/icon_noData.png', width: 160.w, height: 180.h,), - Text( - TranslationLoader.lanKeys!.noData!.tr, + Text('暂无数据'.tr, style: TextStyle(color: AppColors.darkGrayTextColor, fontSize: 22.sp), ) ], diff --git a/lib/tools/permissionUtil.dart b/lib/tools/permissionUtil.dart index 06a88acf..a336ebe0 100755 --- a/lib/tools/permissionUtil.dart +++ b/lib/tools/permissionUtil.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; +import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import '../app_settings/app_settings.dart'; @@ -16,29 +17,29 @@ class PermissionUtil { PermissionUtil(this._context); final List _list = [ - "为了更好地应用体验,请确定权限", - "您第一次拒绝权限,请确定权限", - "您第二次拒绝权限,请去应用设置开启权限" + '为了更好地应用体验,请确定权限'.tr, + '您第一次拒绝权限,请确定权限'.tr, + '您第二次拒绝权限,请去应用设置开启权限'.tr ]; final BuildContext _context ; - void checkPermission({PermissionStatus? status, BlockScuessStatus? blockScuessStatus}) async { + Future checkPermission({PermissionStatus? status, BlockScuessStatus? blockScuessStatus}) async { //申请权限 permission_handler: ^5.0.1+1 //位置权限 Permission permission = Permission.location; status ??= await permission.status; - AppLog.log("statusstatusstatus:$status"); + // AppLog.log('statusstatusstatus:$status'); if (status.isDenied) { //第一次申请 - showPermissionDialog(_list[0], "同意", permission); + showPermissionDialog(_list[0], '同意'.tr, permission); } else if (status.isDenied) { //第一次申请拒绝 - showPermissionDialog(_list[1], "重试", permission); + showPermissionDialog(_list[1], '重试'.tr, permission); } else if (status.isPermanentlyDenied) { //第二次申请 - showPermissionDialog(_list[2], "去应用市场", permission,isUndetermined: true); + showPermissionDialog(_list[2], '去应用市场'.tr, permission,isUndetermined: true); } else if (status.isGranted) { // 通过 blockScuessStatus!(); @@ -61,18 +62,15 @@ class PermissionUtil { showCupertinoDialog( builder: (BuildContext context) { return CupertinoAlertDialog( - title: Text("温馨提示"), + title: Text('温馨提示'.tr), content: Container( child: Text(msg), ), actions: [ //左边按钮 CupertinoDialogAction( - child: Text("关闭应用"), - onPressed: (){ - //关闭引用 - closeAPP(); - }, + child: Text('关闭应用'.tr), + onPressed: closeAPP, ), //右边 CupertinoDialogAction( @@ -111,7 +109,7 @@ class PermissionUtil { } //关闭应用 void closeAPP() { - SystemChannels.platform.invokeMethod("SystemNavigator.pop"); + SystemChannels.platform.invokeMethod('SystemNavigator.pop'); } diff --git a/lib/tools/pickers/address_picker/locations_data.dart b/lib/tools/pickers/address_picker/locations_data.dart index e9ae7959..b7215c1f 100755 --- a/lib/tools/pickers/address_picker/locations_data.dart +++ b/lib/tools/pickers/address_picker/locations_data.dart @@ -2,4128 +2,4128 @@ import '../utils/check.dart'; /// 数据地址:https://github.com/airyland/china-area-data/blob/master/data.json const locations = { - "86": { - "110000": "北京市", - "120000": "天津市", - "130000": "河北省", - "140000": "山西省", - "150000": "内蒙古自治区", - "210000": "辽宁省", - "220000": "吉林省", - "230000": "黑龙江省", - "310000": "上海市", - "320000": "江苏省", - "330000": "浙江省", - "340000": "安徽省", - "350000": "福建省", - "360000": "江西省", - "370000": "山东省", - "410000": "河南省", - "420000": "湖北省", - "430000": "湖南省", - "440000": "广东省", - "450000": "广西壮族自治区", - "460000": "海南省", - "500000": "重庆市", - "510000": "四川省", - "520000": "贵州省", - "530000": "云南省", - "540000": "西藏自治区", - "610000": "陕西省", - "620000": "甘肃省", - "630000": "青海省", - "640000": "宁夏回族自治区", - "650000": "新疆维吾尔自治区", - "710000": "台湾省", - "810000": "香港特别行政区", - "820000": "澳门特别行政区" - }, - "110000": {"110100": "市辖区"}, - "110100": { - "110101": "东城区", - "110102": "西城区", - "110105": "朝阳区", - "110106": "丰台区", - "110107": "石景山区", - "110108": "海淀区", - "110109": "门头沟区", - "110111": "房山区", - "110112": "通州区", - "110113": "顺义区", - "110114": "昌平区", - "110115": "大兴区", - "110116": "怀柔区", - "110117": "平谷区", - "110118": "密云区", - "110119": "延庆区" - }, - "120000": {"120100": "市辖区"}, - "120100": { - "120101": "和平区", - "120102": "河东区", - "120103": "河西区", - "120104": "南开区", - "120105": "河北区", - "120106": "红桥区", - "120110": "东丽区", - "120111": "西青区", - "120112": "津南区", - "120113": "北辰区", - "120114": "武清区", - "120115": "宝坻区", - "120116": "滨海新区", - "120117": "宁河区", - "120118": "静海区", - "120119": "蓟州区" - }, - "130000": { - "130100": "石家庄市", - "130200": "唐山市", - "130300": "秦皇岛市", - "130400": "邯郸市", - "130500": "邢台市", - "130600": "保定市", - "130700": "张家口市", - "130800": "承德市", - "130900": "沧州市", - "131000": "廊坊市", - "131100": "衡水市" - }, - "130100": { - "130101": "市辖区", - "130102": "长安区", - "130104": "桥西区", - "130105": "新华区", - "130107": "井陉矿区", - "130108": "裕华区", - "130109": "藁城区", - "130110": "鹿泉区", - "130111": "栾城区", - "130121": "井陉县", - "130123": "正定县", - "130125": "行唐县", - "130126": "灵寿县", - "130127": "高邑县", - "130128": "深泽县", - "130129": "赞皇县", - "130130": "无极县", - "130131": "平山县", - "130132": "元氏县", - "130133": "赵县", - "130171": "石家庄高新技术产业开发区", - "130172": "石家庄循环化工园区", - "130181": "辛集市", - "130183": "晋州市", - "130184": "新乐市" - }, - "130200": { - "130201": "市辖区", - "130202": "路南区", - "130203": "路北区", - "130204": "古冶区", - "130205": "开平区", - "130207": "丰南区", - "130208": "丰润区", - "130209": "曹妃甸区", - "130224": "滦南县", - "130225": "乐亭县", - "130227": "迁西县", - "130229": "玉田县", - "130271": "河北唐山芦台经济开发区", - "130272": "唐山市汉沽管理区", - "130273": "唐山高新技术产业开发区", - "130274": "河北唐山海港经济开发区", - "130281": "遵化市", - "130283": "迁安市", - "130284": "滦州市" - }, - "130300": { - "130301": "市辖区", - "130302": "海港区", - "130303": "山海关区", - "130304": "北戴河区", - "130306": "抚宁区", - "130321": "青龙满族自治县", - "130322": "昌黎县", - "130324": "卢龙县", - "130371": "秦皇岛市经济技术开发区", - "130372": "北戴河新区" - }, - "130400": { - "130401": "市辖区", - "130402": "邯山区", - "130403": "丛台区", - "130404": "复兴区", - "130406": "峰峰矿区", - "130407": "肥乡区", - "130408": "永年区", - "130423": "临漳县", - "130424": "成安县", - "130425": "大名县", - "130426": "涉县", - "130427": "磁县", - "130430": "邱县", - "130431": "鸡泽县", - "130432": "广平县", - "130433": "馆陶县", - "130434": "魏县", - "130435": "曲周县", - "130471": "邯郸经济技术开发区", - "130473": "邯郸冀南新区", - "130481": "武安市" - }, - "130500": { - "130501": "市辖区", - "130502": "桥东区", - "130503": "桥西区", - "130521": "邢台县", - "130522": "临城县", - "130523": "内丘县", - "130524": "柏乡县", - "130525": "隆尧县", - "130526": "任县", - "130527": "南和县", - "130528": "宁晋县", - "130529": "巨鹿县", - "130530": "新河县", - "130531": "广宗县", - "130532": "平乡县", - "130533": "威县", - "130534": "清河县", - "130535": "临西县", - "130571": "河北邢台经济开发区", - "130581": "南宫市", - "130582": "沙河市" - }, - "130600": { - "130601": "市辖区", - "130602": "竞秀区", - "130606": "莲池区", - "130607": "满城区", - "130608": "清苑区", - "130609": "徐水区", - "130623": "涞水县", - "130624": "阜平县", - "130626": "定兴县", - "130627": "唐县", - "130628": "高阳县", - "130629": "容城县", - "130630": "涞源县", - "130631": "望都县", - "130632": "安新县", - "130633": "易县", - "130634": "曲阳县", - "130635": "蠡县", - "130636": "顺平县", - "130637": "博野县", - "130638": "雄县", - "130671": "保定高新技术产业开发区", - "130672": "保定白沟新城", - "130681": "涿州市", - "130682": "定州市", - "130683": "安国市", - "130684": "高碑店市" - }, - "130700": { - "130701": "市辖区", - "130702": "桥东区", - "130703": "桥西区", - "130705": "宣化区", - "130706": "下花园区", - "130708": "万全区", - "130709": "崇礼区", - "130722": "张北县", - "130723": "康保县", - "130724": "沽源县", - "130725": "尚义县", - "130726": "蔚县", - "130727": "阳原县", - "130728": "怀安县", - "130730": "怀来县", - "130731": "涿鹿县", - "130732": "赤城县", - "130771": "张家口经济开发区", - "130772": "张家口市察北管理区", - "130773": "张家口市塞北管理区" - }, - "130800": { - "130801": "市辖区", - "130802": "双桥区", - "130803": "双滦区", - "130804": "鹰手营子矿区", - "130821": "承德县", - "130822": "兴隆县", - "130824": "滦平县", - "130825": "隆化县", - "130826": "丰宁满族自治县", - "130827": "宽城满族自治县", - "130828": "围场满族蒙古族自治县", - "130871": "承德高新技术产业开发区", - "130881": "平泉市" - }, - "130900": { - "130901": "市辖区", - "130902": "新华区", - "130903": "运河区", - "130921": "沧县", - "130922": "青县", - "130923": "东光县", - "130924": "海兴县", - "130925": "盐山县", - "130926": "肃宁县", - "130927": "南皮县", - "130928": "吴桥县", - "130929": "献县", - "130930": "孟村回族自治县", - "130971": "河北沧州经济开发区", - "130972": "沧州高新技术产业开发区", - "130973": "沧州渤海新区", - "130981": "泊头市", - "130982": "任丘市", - "130983": "黄骅市", - "130984": "河间市" - }, - "131000": { - "131001": "市辖区", - "131002": "安次区", - "131003": "广阳区", - "131022": "固安县", - "131023": "永清县", - "131024": "香河县", - "131025": "大城县", - "131026": "文安县", - "131028": "大厂回族自治县", - "131071": "廊坊经济技术开发区", - "131081": "霸州市", - "131082": "三河市" - }, - "131100": { - "131101": "市辖区", - "131102": "桃城区", - "131103": "冀州区", - "131121": "枣强县", - "131122": "武邑县", - "131123": "武强县", - "131124": "饶阳县", - "131125": "安平县", - "131126": "故城县", - "131127": "景县", - "131128": "阜城县", - "131171": "河北衡水高新技术产业开发区", - "131172": "衡水滨湖新区", - "131182": "深州市" - }, - "140000": { - "140100": "太原市", - "140200": "大同市", - "140300": "阳泉市", - "140400": "长治市", - "140500": "晋城市", - "140600": "朔州市", - "140700": "晋中市", - "140800": "运城市", - "140900": "忻州市", - "141000": "临汾市", - "141100": "吕梁市" - }, - "140100": { - "140101": "市辖区", - "140105": "小店区", - "140106": "迎泽区", - "140107": "杏花岭区", - "140108": "尖草坪区", - "140109": "万柏林区", - "140110": "晋源区", - "140121": "清徐县", - "140122": "阳曲县", - "140123": "娄烦县", - "140171": "山西转型综合改革示范区", - "140181": "古交市" - }, - "140200": { - "140201": "市辖区", - "140212": "新荣区", - "140213": "平城区", - "140214": "云冈区", - "140215": "云州区", - "140221": "阳高县", - "140222": "天镇县", - "140223": "广灵县", - "140224": "灵丘县", - "140225": "浑源县", - "140226": "左云县", - "140271": "山西大同经济开发区" - }, - "140300": {"140301": "市辖区", "140302": "城区", "140303": "矿区", "140311": "郊区", "140321": "平定县", "140322": "盂县"}, - "140400": { - "140401": "市辖区", - "140403": "潞州区", - "140404": "上党区", - "140405": "屯留区", - "140406": "潞城区", - "140423": "襄垣县", - "140425": "平顺县", - "140426": "黎城县", - "140427": "壶关县", - "140428": "长子县", - "140429": "武乡县", - "140430": "沁县", - "140431": "沁源县", - "140471": "山西长治高新技术产业园区" - }, - "140500": { - "140501": "市辖区", - "140502": "城区", - "140521": "沁水县", - "140522": "阳城县", - "140524": "陵川县", - "140525": "泽州县", - "140581": "高平市" - }, - "140600": { - "140601": "市辖区", - "140602": "朔城区", - "140603": "平鲁区", - "140621": "山阴县", - "140622": "应县", - "140623": "右玉县", - "140671": "山西朔州经济开发区", - "140681": "怀仁市" - }, - "140700": { - "140701": "市辖区", - "140702": "榆次区", - "140721": "榆社县", - "140722": "左权县", - "140723": "和顺县", - "140724": "昔阳县", - "140725": "寿阳县", - "140726": "太谷县", - "140727": "祁县", - "140728": "平遥县", - "140729": "灵石县", - "140781": "介休市" - }, - "140800": { - "140801": "市辖区", - "140802": "盐湖区", - "140821": "临猗县", - "140822": "万荣县", - "140823": "闻喜县", - "140824": "稷山县", - "140825": "新绛县", - "140826": "绛县", - "140827": "垣曲县", - "140828": "夏县", - "140829": "平陆县", - "140830": "芮城县", - "140881": "永济市", - "140882": "河津市" - }, - "140900": { - "140901": "市辖区", - "140902": "忻府区", - "140921": "定襄县", - "140922": "五台县", - "140923": "代县", - "140924": "繁峙县", - "140925": "宁武县", - "140926": "静乐县", - "140927": "神池县", - "140928": "五寨县", - "140929": "岢岚县", - "140930": "河曲县", - "140931": "保德县", - "140932": "偏关县", - "140971": "五台山风景名胜区", - "140981": "原平市" - }, - "141000": { - "141001": "市辖区", - "141002": "尧都区", - "141021": "曲沃县", - "141022": "翼城县", - "141023": "襄汾县", - "141024": "洪洞县", - "141025": "古县", - "141026": "安泽县", - "141027": "浮山县", - "141028": "吉县", - "141029": "乡宁县", - "141030": "大宁县", - "141031": "隰县", - "141032": "永和县", - "141033": "蒲县", - "141034": "汾西县", - "141081": "侯马市", - "141082": "霍州市" - }, - "141100": { - "141101": "市辖区", - "141102": "离石区", - "141121": "文水县", - "141122": "交城县", - "141123": "兴县", - "141124": "临县", - "141125": "柳林县", - "141126": "石楼县", - "141127": "岚县", - "141128": "方山县", - "141129": "中阳县", - "141130": "交口县", - "141181": "孝义市", - "141182": "汾阳市" - }, - "150000": { - "150100": "呼和浩特市", - "150200": "包头市", - "150300": "乌海市", - "150400": "赤峰市", - "150500": "通辽市", - "150600": "鄂尔多斯市", - "150700": "呼伦贝尔市", - "150800": "巴彦淖尔市", - "150900": "乌兰察布市", - "152200": "兴安盟", - "152500": "锡林郭勒盟", - "152900": "阿拉善盟" - }, - "150100": { - "150101": "市辖区", - "150102": "新城区", - "150103": "回民区", - "150104": "玉泉区", - "150105": "赛罕区", - "150121": "土默特左旗", - "150122": "托克托县", - "150123": "和林格尔县", - "150124": "清水河县", - "150125": "武川县", - "150171": "呼和浩特金海工业园区", - "150172": "呼和浩特经济技术开发区" - }, - "150200": { - "150201": "市辖区", - "150202": "东河区", - "150203": "昆都仑区", - "150204": "青山区", - "150205": "石拐区", - "150206": "白云鄂博矿区", - "150207": "九原区", - "150221": "土默特右旗", - "150222": "固阳县", - "150223": "达尔罕茂明安联合旗", - "150271": "包头稀土高新技术产业开发区" - }, - "150300": {"150301": "市辖区", "150302": "海勃湾区", "150303": "海南区", "150304": "乌达区"}, - "150400": { - "150401": "市辖区", - "150402": "红山区", - "150403": "元宝山区", - "150404": "松山区", - "150421": "阿鲁科尔沁旗", - "150422": "巴林左旗", - "150423": "巴林右旗", - "150424": "林西县", - "150425": "克什克腾旗", - "150426": "翁牛特旗", - "150428": "喀喇沁旗", - "150429": "宁城县", - "150430": "敖汉旗" - }, - "150500": { - "150501": "市辖区", - "150502": "科尔沁区", - "150521": "科尔沁左翼中旗", - "150522": "科尔沁左翼后旗", - "150523": "开鲁县", - "150524": "库伦旗", - "150525": "奈曼旗", - "150526": "扎鲁特旗", - "150571": "通辽经济技术开发区", - "150581": "霍林郭勒市" - }, - "150600": { - "150601": "市辖区", - "150602": "东胜区", - "150603": "康巴什区", - "150621": "达拉特旗", - "150622": "准格尔旗", - "150623": "鄂托克前旗", - "150624": "鄂托克旗", - "150625": "杭锦旗", - "150626": "乌审旗", - "150627": "伊金霍洛旗" - }, - "150700": { - "150701": "市辖区", - "150702": "海拉尔区", - "150703": "扎赉诺尔区", - "150721": "阿荣旗", - "150722": "莫力达瓦达斡尔族自治旗", - "150723": "鄂伦春自治旗", - "150724": "鄂温克族自治旗", - "150725": "陈巴尔虎旗", - "150726": "新巴尔虎左旗", - "150727": "新巴尔虎右旗", - "150781": "满洲里市", - "150782": "牙克石市", - "150783": "扎兰屯市", - "150784": "额尔古纳市", - "150785": "根河市" - }, - "150800": { - "150801": "市辖区", - "150802": "临河区", - "150821": "五原县", - "150822": "磴口县", - "150823": "乌拉特前旗", - "150824": "乌拉特中旗", - "150825": "乌拉特后旗", - "150826": "杭锦后旗" - }, - "150900": { - "150901": "市辖区", - "150902": "集宁区", - "150921": "卓资县", - "150922": "化德县", - "150923": "商都县", - "150924": "兴和县", - "150925": "凉城县", - "150926": "察哈尔右翼前旗", - "150927": "察哈尔右翼中旗", - "150928": "察哈尔右翼后旗", - "150929": "四子王旗", - "150981": "丰镇市" - }, - "152200": { - "152201": "乌兰浩特市", - "152202": "阿尔山市", - "152221": "科尔沁右翼前旗", - "152222": "科尔沁右翼中旗", - "152223": "扎赉特旗", - "152224": "突泉县" - }, - "152500": { - "152501": "二连浩特市", - "152502": "锡林浩特市", - "152522": "阿巴嘎旗", - "152523": "苏尼特左旗", - "152524": "苏尼特右旗", - "152525": "东乌珠穆沁旗", - "152526": "西乌珠穆沁旗", - "152527": "太仆寺旗", - "152528": "镶黄旗", - "152529": "正镶白旗", - "152530": "正蓝旗", - "152531": "多伦县", - "152571": "乌拉盖管委会" - }, - "152900": {"152921": "阿拉善左旗", "152922": "阿拉善右旗", "152923": "额济纳旗", "152971": "内蒙古阿拉善经济开发区"}, - "210000": { - "210100": "沈阳市", - "210200": "大连市", - "210300": "鞍山市", - "210400": "抚顺市", - "210500": "本溪市", - "210600": "丹东市", - "210700": "锦州市", - "210800": "营口市", - "210900": "阜新市", - "211000": "辽阳市", - "211100": "盘锦市", - "211200": "铁岭市", - "211300": "朝阳市", - "211400": "葫芦岛市" - }, - "210100": { - "210101": "市辖区", - "210102": "和平区", - "210103": "沈河区", - "210104": "大东区", - "210105": "皇姑区", - "210106": "铁西区", - "210111": "苏家屯区", - "210112": "浑南区", - "210113": "沈北新区", - "210114": "于洪区", - "210115": "辽中区", - "210123": "康平县", - "210124": "法库县", - "210181": "新民市" - }, - "210200": { - "210201": "市辖区", - "210202": "中山区", - "210203": "西岗区", - "210204": "沙河口区", - "210211": "甘井子区", - "210212": "旅顺口区", - "210213": "金州区", - "210214": "普兰店区", - "210224": "长海县", - "210281": "瓦房店市", - "210283": "庄河市" - }, - "210300": { - "210301": "市辖区", - "210302": "铁东区", - "210303": "铁西区", - "210304": "立山区", - "210311": "千山区", - "210321": "台安县", - "210323": "岫岩满族自治县", - "210381": "海城市" - }, - "210400": { - "210401": "市辖区", - "210402": "新抚区", - "210403": "东洲区", - "210404": "望花区", - "210411": "顺城区", - "210421": "抚顺县", - "210422": "新宾满族自治县", - "210423": "清原满族自治县" - }, - "210500": { - "210501": "市辖区", - "210502": "平山区", - "210503": "溪湖区", - "210504": "明山区", - "210505": "南芬区", - "210521": "本溪满族自治县", - "210522": "桓仁满族自治县" - }, - "210600": { - "210601": "市辖区", - "210602": "元宝区", - "210603": "振兴区", - "210604": "振安区", - "210624": "宽甸满族自治县", - "210681": "东港市", - "210682": "凤城市" - }, - "210700": { - "210701": "市辖区", - "210702": "古塔区", - "210703": "凌河区", - "210711": "太和区", - "210726": "黑山县", - "210727": "义县", - "210781": "凌海市", - "210782": "北镇市" - }, - "210800": { - "210801": "市辖区", - "210802": "站前区", - "210803": "西市区", - "210804": "鲅鱼圈区", - "210811": "老边区", - "210881": "盖州市", - "210882": "大石桥市" - }, - "210900": { - "210901": "市辖区", - "210902": "海州区", - "210903": "新邱区", - "210904": "太平区", - "210905": "清河门区", - "210911": "细河区", - "210921": "阜新蒙古族自治县", - "210922": "彰武县" - }, - "211000": { - "211001": "市辖区", - "211002": "白塔区", - "211003": "文圣区", - "211004": "宏伟区", - "211005": "弓长岭区", - "211011": "太子河区", - "211021": "辽阳县", - "211081": "灯塔市" - }, - "211100": {"211101": "市辖区", "211102": "双台子区", "211103": "兴隆台区", "211104": "大洼区", "211122": "盘山县"}, - "211200": { - "211201": "市辖区", - "211202": "银州区", - "211204": "清河区", - "211221": "铁岭县", - "211223": "西丰县", - "211224": "昌图县", - "211281": "调兵山市", - "211282": "开原市" - }, - "211300": { - "211301": "市辖区", - "211302": "双塔区", - "211303": "龙城区", - "211321": "朝阳县", - "211322": "建平县", - "211324": "喀喇沁左翼蒙古族自治县", - "211381": "北票市", - "211382": "凌源市" - }, - "211400": { - "211401": "市辖区", - "211402": "连山区", - "211403": "龙港区", - "211404": "南票区", - "211421": "绥中县", - "211422": "建昌县", - "211481": "兴城市" - }, - "220000": { - "220100": "长春市", - "220200": "吉林市", - "220300": "四平市", - "220400": "辽源市", - "220500": "通化市", - "220600": "白山市", - "220700": "松原市", - "220800": "白城市", - "222400": "延边朝鲜族自治州" - }, - "220100": { - "220101": "市辖区", - "220102": "南关区", - "220103": "宽城区", - "220104": "朝阳区", - "220105": "二道区", - "220106": "绿园区", - "220112": "双阳区", - "220113": "九台区", - "220122": "农安县", - "220171": "长春经济技术开发区", - "220172": "长春净月高新技术产业开发区", - "220173": "长春高新技术产业开发区", - "220174": "长春汽车经济技术开发区", - "220182": "榆树市", - "220183": "德惠市" - }, - "220200": { - "220201": "市辖区", - "220202": "昌邑区", - "220203": "龙潭区", - "220204": "船营区", - "220211": "丰满区", - "220221": "永吉县", - "220271": "吉林经济开发区", - "220272": "吉林高新技术产业开发区", - "220273": "吉林中国新加坡食品区", - "220281": "蛟河市", - "220282": "桦甸市", - "220283": "舒兰市", - "220284": "磐石市" - }, - "220300": { - "220301": "市辖区", - "220302": "铁西区", - "220303": "铁东区", - "220322": "梨树县", - "220323": "伊通满族自治县", - "220381": "公主岭市", - "220382": "双辽市" - }, - "220400": {"220401": "市辖区", "220402": "龙山区", "220403": "西安区", "220421": "东丰县", "220422": "东辽县"}, - "220500": { - "220501": "市辖区", - "220502": "东昌区", - "220503": "二道江区", - "220521": "通化县", - "220523": "辉南县", - "220524": "柳河县", - "220581": "梅河口市", - "220582": "集安市" - }, - "220600": { - "220601": "市辖区", - "220602": "浑江区", - "220605": "江源区", - "220621": "抚松县", - "220622": "靖宇县", - "220623": "长白朝鲜族自治县", - "220681": "临江市" - }, - "220700": { - "220701": "市辖区", - "220702": "宁江区", - "220721": "前郭尔罗斯蒙古族自治县", - "220722": "长岭县", - "220723": "乾安县", - "220771": "吉林松原经济开发区", - "220781": "扶余市" - }, - "220800": { - "220801": "市辖区", - "220802": "洮北区", - "220821": "镇赉县", - "220822": "通榆县", - "220871": "吉林白城经济开发区", - "220881": "洮南市", - "220882": "大安市" - }, - "222400": { - "222401": "延吉市", - "222402": "图们市", - "222403": "敦化市", - "222404": "珲春市", - "222405": "龙井市", - "222406": "和龙市", - "222424": "汪清县", - "222426": "安图县" - }, - "230000": { - "230100": "哈尔滨市", - "230200": "齐齐哈尔市", - "230300": "鸡西市", - "230400": "鹤岗市", - "230500": "双鸭山市", - "230600": "大庆市", - "230700": "伊春市", - "230800": "佳木斯市", - "230900": "七台河市", - "231000": "牡丹江市", - "231100": "黑河市", - "231200": "绥化市", - "232700": "大兴安岭地区" - }, - "230100": { - "230101": "市辖区", - "230102": "道里区", - "230103": "南岗区", - "230104": "道外区", - "230108": "平房区", - "230109": "松北区", - "230110": "香坊区", - "230111": "呼兰区", - "230112": "阿城区", - "230113": "双城区", - "230123": "依兰县", - "230124": "方正县", - "230125": "宾县", - "230126": "巴彦县", - "230127": "木兰县", - "230128": "通河县", - "230129": "延寿县", - "230183": "尚志市", - "230184": "五常市" - }, - "230200": { - "230201": "市辖区", - "230202": "龙沙区", - "230203": "建华区", - "230204": "铁锋区", - "230205": "昂昂溪区", - "230206": "富拉尔基区", - "230207": "碾子山区", - "230208": "梅里斯达斡尔族区", - "230221": "龙江县", - "230223": "依安县", - "230224": "泰来县", - "230225": "甘南县", - "230227": "富裕县", - "230229": "克山县", - "230230": "克东县", - "230231": "拜泉县", - "230281": "讷河市" - }, - "230300": { - "230301": "市辖区", - "230302": "鸡冠区", - "230303": "恒山区", - "230304": "滴道区", - "230305": "梨树区", - "230306": "城子河区", - "230307": "麻山区", - "230321": "鸡东县", - "230381": "虎林市", - "230382": "密山市" - }, - "230400": { - "230401": "市辖区", - "230402": "向阳区", - "230403": "工农区", - "230404": "南山区", - "230405": "兴安区", - "230406": "东山区", - "230407": "兴山区", - "230421": "萝北县", - "230422": "绥滨县" - }, - "230500": { - "230501": "市辖区", - "230502": "尖山区", - "230503": "岭东区", - "230505": "四方台区", - "230506": "宝山区", - "230521": "集贤县", - "230522": "友谊县", - "230523": "宝清县", - "230524": "饶河县" - }, - "230600": { - "230601": "市辖区", - "230602": "萨尔图区", - "230603": "龙凤区", - "230604": "让胡路区", - "230605": "红岗区", - "230606": "大同区", - "230621": "肇州县", - "230622": "肇源县", - "230623": "林甸县", - "230624": "杜尔伯特蒙古族自治县", - "230671": "大庆高新技术产业开发区" - }, - "230700": { - "230701": "市辖区", - "230717": "伊美区", - "230718": "乌翠区", - "230719": "友好区", - "230722": "嘉荫县", - "230723": "汤旺县", - "230724": "丰林县", - "230725": "大箐山县", - "230726": "南岔县", - "230751": "金林区", - "230781": "铁力市" - }, - "230800": { - "230801": "市辖区", - "230803": "向阳区", - "230804": "前进区", - "230805": "东风区", - "230811": "郊区", - "230822": "桦南县", - "230826": "桦川县", - "230828": "汤原县", - "230881": "同江市", - "230882": "富锦市", - "230883": "抚远市" - }, - "230900": {"230901": "市辖区", "230902": "新兴区", "230903": "桃山区", "230904": "茄子河区", "230921": "勃利县"}, - "231000": { - "231001": "市辖区", - "231002": "东安区", - "231003": "阳明区", - "231004": "爱民区", - "231005": "西安区", - "231025": "林口县", - "231071": "牡丹江经济技术开发区", - "231081": "绥芬河市", - "231083": "海林市", - "231084": "宁安市", - "231085": "穆棱市", - "231086": "东宁市" - }, - "231100": { - "231101": "市辖区", - "231102": "爱辉区", - "231123": "逊克县", - "231124": "孙吴县", - "231181": "北安市", - "231182": "五大连池市", - "231183": "嫩江市" - }, - "231200": { - "231201": "市辖区", - "231202": "北林区", - "231221": "望奎县", - "231222": "兰西县", - "231223": "青冈县", - "231224": "庆安县", - "231225": "明水县", - "231226": "绥棱县", - "231281": "安达市", - "231282": "肇东市", - "231283": "海伦市" - }, - "232700": { - "232701": "漠河市", - "232721": "呼玛县", - "232722": "塔河县", - "232761": "加格达奇区", - "232762": "松岭区", - "232763": "新林区", - "232764": "呼中区" - }, - "310000": {"310100": "市辖区"}, - "310100": { - "310101": "黄浦区", - "310104": "徐汇区", - "310105": "长宁区", - "310106": "静安区", - "310107": "普陀区", - "310109": "虹口区", - "310110": "杨浦区", - "310112": "闵行区", - "310113": "宝山区", - "310114": "嘉定区", - "310115": "浦东新区", - "310116": "金山区", - "310117": "松江区", - "310118": "青浦区", - "310120": "奉贤区", - "310151": "崇明区" - }, - "320000": { - "320100": "南京市", - "320200": "无锡市", - "320300": "徐州市", - "320400": "常州市", - "320500": "苏州市", - "320600": "南通市", - "320700": "连云港市", - "320800": "淮安市", - "320900": "盐城市", - "321000": "扬州市", - "321100": "镇江市", - "321200": "泰州市", - "321300": "宿迁市" - }, - "320100": { - "320101": "市辖区", - "320102": "玄武区", - "320104": "秦淮区", - "320105": "建邺区", - "320106": "鼓楼区", - "320111": "浦口区", - "320113": "栖霞区", - "320114": "雨花台区", - "320115": "江宁区", - "320116": "六合区", - "320117": "溧水区", - "320118": "高淳区" - }, - "320200": { - "320201": "市辖区", - "320205": "锡山区", - "320206": "惠山区", - "320211": "滨湖区", - "320213": "梁溪区", - "320214": "新吴区", - "320281": "江阴市", - "320282": "宜兴市" - }, - "320300": { - "320301": "市辖区", - "320302": "鼓楼区", - "320303": "云龙区", - "320305": "贾汪区", - "320311": "泉山区", - "320312": "铜山区", - "320321": "丰县", - "320322": "沛县", - "320324": "睢宁县", - "320371": "徐州经济技术开发区", - "320381": "新沂市", - "320382": "邳州市" - }, - "320400": { - "320401": "市辖区", - "320402": "天宁区", - "320404": "钟楼区", - "320411": "新北区", - "320412": "武进区", - "320413": "金坛区", - "320481": "溧阳市" - }, - "320500": { - "320501": "市辖区", - "320505": "虎丘区", - "320506": "吴中区", - "320507": "相城区", - "320508": "姑苏区", - "320509": "吴江区", - "320571": "苏州工业园区", - "320581": "常熟市", - "320582": "张家港市", - "320583": "昆山市", - "320585": "太仓市" - }, - "320600": { - "320601": "市辖区", - "320602": "崇川区", - "320611": "港闸区", - "320612": "通州区", - "320623": "如东县", - "320671": "南通经济技术开发区", - "320681": "启东市", - "320682": "如皋市", - "320684": "海门市", - "320685": "海安市" - }, - "320700": { - "320701": "市辖区", - "320703": "连云区", - "320706": "海州区", - "320707": "赣榆区", - "320722": "东海县", - "320723": "灌云县", - "320724": "灌南县", - "320771": "连云港经济技术开发区", - "320772": "连云港高新技术产业开发区" - }, - "320800": { - "320801": "市辖区", - "320803": "淮安区", - "320804": "淮阴区", - "320812": "清江浦区", - "320813": "洪泽区", - "320826": "涟水县", - "320830": "盱眙县", - "320831": "金湖县", - "320871": "淮安经济技术开发区" - }, - "320900": { - "320901": "市辖区", - "320902": "亭湖区", - "320903": "盐都区", - "320904": "大丰区", - "320921": "响水县", - "320922": "滨海县", - "320923": "阜宁县", - "320924": "射阳县", - "320925": "建湖县", - "320971": "盐城经济技术开发区", - "320981": "东台市" - }, - "321000": { - "321001": "市辖区", - "321002": "广陵区", - "321003": "邗江区", - "321012": "江都区", - "321023": "宝应县", - "321071": "扬州经济技术开发区", - "321081": "仪征市", - "321084": "高邮市" - }, - "321100": { - "321101": "市辖区", - "321102": "京口区", - "321111": "润州区", - "321112": "丹徒区", - "321171": "镇江新区", - "321181": "丹阳市", - "321182": "扬中市", - "321183": "句容市" - }, - "321200": { - "321201": "市辖区", - "321202": "海陵区", - "321203": "高港区", - "321204": "姜堰区", - "321271": "泰州医药高新技术产业开发区", - "321281": "兴化市", - "321282": "靖江市", - "321283": "泰兴市" - }, - "321300": { - "321301": "市辖区", - "321302": "宿城区", - "321311": "宿豫区", - "321322": "沭阳县", - "321323": "泗阳县", - "321324": "泗洪县", - "321371": "宿迁经济技术开发区" - }, - "330000": { - "330100": "杭州市", - "330200": "宁波市", - "330300": "温州市", - "330400": "嘉兴市", - "330500": "湖州市", - "330600": "绍兴市", - "330700": "金华市", - "330800": "衢州市", - "330900": "舟山市", - "331000": "台州市", - "331100": "丽水市" - }, - "330100": { - "330101": "市辖区", - "330102": "上城区", - "330103": "下城区", - "330104": "江干区", - "330105": "拱墅区", - "330106": "西湖区", - "330108": "滨江区", - "330109": "萧山区", - "330110": "余杭区", - "330111": "富阳区", - "330112": "临安区", - "330122": "桐庐县", - "330127": "淳安县", - "330182": "建德市" - }, - "330200": { - "330201": "市辖区", - "330203": "海曙区", - "330205": "江北区", - "330206": "北仑区", - "330211": "镇海区", - "330212": "鄞州区", - "330213": "奉化区", - "330225": "象山县", - "330226": "宁海县", - "330281": "余姚市", - "330282": "慈溪市" - }, - "330300": { - "330301": "市辖区", - "330302": "鹿城区", - "330303": "龙湾区", - "330304": "瓯海区", - "330305": "洞头区", - "330324": "永嘉县", - "330326": "平阳县", - "330327": "苍南县", - "330328": "文成县", - "330329": "泰顺县", - "330371": "温州经济技术开发区", - "330381": "瑞安市", - "330382": "乐清市", - "330383": "龙港市" - }, - "330400": { - "330401": "市辖区", - "330402": "南湖区", - "330411": "秀洲区", - "330421": "嘉善县", - "330424": "海盐县", - "330481": "海宁市", - "330482": "平湖市", - "330483": "桐乡市" - }, - "330500": {"330501": "市辖区", "330502": "吴兴区", "330503": "南浔区", "330521": "德清县", "330522": "长兴县", "330523": "安吉县"}, - "330600": { - "330601": "市辖区", - "330602": "越城区", - "330603": "柯桥区", - "330604": "上虞区", - "330624": "新昌县", - "330681": "诸暨市", - "330683": "嵊州市" - }, - "330700": { - "330701": "市辖区", - "330702": "婺城区", - "330703": "金东区", - "330723": "武义县", - "330726": "浦江县", - "330727": "磐安县", - "330781": "兰溪市", - "330782": "义乌市", - "330783": "东阳市", - "330784": "永康市" - }, - "330800": { - "330801": "市辖区", - "330802": "柯城区", - "330803": "衢江区", - "330822": "常山县", - "330824": "开化县", - "330825": "龙游县", - "330881": "江山市" - }, - "330900": {"330901": "市辖区", "330902": "定海区", "330903": "普陀区", "330921": "岱山县", "330922": "嵊泗县"}, - "331000": { - "331001": "市辖区", - "331002": "椒江区", - "331003": "黄岩区", - "331004": "路桥区", - "331022": "三门县", - "331023": "天台县", - "331024": "仙居县", - "331081": "温岭市", - "331082": "临海市", - "331083": "玉环市" - }, - "331100": { - "331101": "市辖区", - "331102": "莲都区", - "331121": "青田县", - "331122": "缙云县", - "331123": "遂昌县", - "331124": "松阳县", - "331125": "云和县", - "331126": "庆元县", - "331127": "景宁畲族自治县", - "331181": "龙泉市" - }, - "340000": { - "340100": "合肥市", - "340200": "芜湖市", - "340300": "蚌埠市", - "340400": "淮南市", - "340500": "马鞍山市", - "340600": "淮北市", - "340700": "铜陵市", - "340800": "安庆市", - "341000": "黄山市", - "341100": "滁州市", - "341200": "阜阳市", - "341300": "宿州市", - "341500": "六安市", - "341600": "亳州市", - "341700": "池州市", - "341800": "宣城市" - }, - "340100": { - "340101": "市辖区", - "340102": "瑶海区", - "340103": "庐阳区", - "340104": "蜀山区", - "340111": "包河区", - "340121": "长丰县", - "340122": "肥东县", - "340123": "肥西县", - "340124": "庐江县", - "340171": "合肥高新技术产业开发区", - "340172": "合肥经济技术开发区", - "340173": "合肥新站高新技术产业开发区", - "340181": "巢湖市" - }, - "340200": { - "340201": "市辖区", - "340202": "镜湖区", - "340203": "弋江区", - "340207": "鸠江区", - "340208": "三山区", - "340221": "芜湖县", - "340222": "繁昌县", - "340223": "南陵县", - "340225": "无为县", - "340271": "芜湖经济技术开发区", - "340272": "安徽芜湖长江大桥经济开发区" - }, - "340300": { - "340301": "市辖区", - "340302": "龙子湖区", - "340303": "蚌山区", - "340304": "禹会区", - "340311": "淮上区", - "340321": "怀远县", - "340322": "五河县", - "340323": "固镇县", - "340371": "蚌埠市高新技术开发区", - "340372": "蚌埠市经济开发区" - }, - "340400": { - "340401": "市辖区", - "340402": "大通区", - "340403": "田家庵区", - "340404": "谢家集区", - "340405": "八公山区", - "340406": "潘集区", - "340421": "凤台县", - "340422": "寿县" - }, - "340500": { - "340501": "市辖区", - "340503": "花山区", - "340504": "雨山区", - "340506": "博望区", - "340521": "当涂县", - "340522": "含山县", - "340523": "和县" - }, - "340600": {"340601": "市辖区", "340602": "杜集区", "340603": "相山区", "340604": "烈山区", "340621": "濉溪县"}, - "340700": {"340701": "市辖区", "340705": "铜官区", "340706": "义安区", "340711": "郊区", "340722": "枞阳县"}, - "340800": { - "340801": "市辖区", - "340802": "迎江区", - "340803": "大观区", - "340811": "宜秀区", - "340822": "怀宁县", - "340825": "太湖县", - "340826": "宿松县", - "340827": "望江县", - "340828": "岳西县", - "340871": "安徽安庆经济开发区", - "340881": "桐城市", - "340882": "潜山市" - }, - "341000": { - "341001": "市辖区", - "341002": "屯溪区", - "341003": "黄山区", - "341004": "徽州区", - "341021": "歙县", - "341022": "休宁县", - "341023": "黟县", - "341024": "祁门县" - }, - "341100": { - "341101": "市辖区", - "341102": "琅琊区", - "341103": "南谯区", - "341122": "来安县", - "341124": "全椒县", - "341125": "定远县", - "341126": "凤阳县", - "341171": "苏滁现代产业园", - "341172": "滁州经济技术开发区", - "341181": "天长市", - "341182": "明光市" - }, - "341200": { - "341201": "市辖区", - "341202": "颍州区", - "341203": "颍东区", - "341204": "颍泉区", - "341221": "临泉县", - "341222": "太和县", - "341225": "阜南县", - "341226": "颍上县", - "341271": "阜阳合肥现代产业园区", - "341272": "阜阳经济技术开发区", - "341282": "界首市" - }, - "341300": { - "341301": "市辖区", - "341302": "埇桥区", - "341321": "砀山县", - "341322": "萧县", - "341323": "灵璧县", - "341324": "泗县", - "341371": "宿州马鞍山现代产业园区", - "341372": "宿州经济技术开发区" - }, - "341500": { - "341501": "市辖区", - "341502": "金安区", - "341503": "裕安区", - "341504": "叶集区", - "341522": "霍邱县", - "341523": "舒城县", - "341524": "金寨县", - "341525": "霍山县" - }, - "341600": {"341601": "市辖区", "341602": "谯城区", "341621": "涡阳县", "341622": "蒙城县", "341623": "利辛县"}, - "341700": {"341701": "市辖区", "341702": "贵池区", "341721": "东至县", "341722": "石台县", "341723": "青阳县"}, - "341800": { - "341801": "市辖区", - "341802": "宣州区", - "341821": "郎溪县", - "341823": "泾县", - "341824": "绩溪县", - "341825": "旌德县", - "341871": "宣城市经济开发区", - "341881": "宁国市", - "341882": "广德市" - }, - "350000": { - "350100": "福州市", - "350200": "厦门市", - "350300": "莆田市", - "350400": "三明市", - "350500": "泉州市", - "350600": "漳州市", - "350700": "南平市", - "350800": "龙岩市", - "350900": "宁德市" - }, - "350100": { - "350101": "市辖区", - "350102": "鼓楼区", - "350103": "台江区", - "350104": "仓山区", - "350105": "马尾区", - "350111": "晋安区", - "350112": "长乐区", - "350121": "闽侯县", - "350122": "连江县", - "350123": "罗源县", - "350124": "闽清县", - "350125": "永泰县", - "350128": "平潭县", - "350181": "福清市" - }, - "350200": { - "350201": "市辖区", - "350203": "思明区", - "350205": "海沧区", - "350206": "湖里区", - "350211": "集美区", - "350212": "同安区", - "350213": "翔安区" - }, - "350300": {"350301": "市辖区", "350302": "城厢区", "350303": "涵江区", "350304": "荔城区", "350305": "秀屿区", "350322": "仙游县"}, - "350400": { - "350401": "市辖区", - "350402": "梅列区", - "350403": "三元区", - "350421": "明溪县", - "350423": "清流县", - "350424": "宁化县", - "350425": "大田县", - "350426": "尤溪县", - "350427": "沙县", - "350428": "将乐县", - "350429": "泰宁县", - "350430": "建宁县", - "350481": "永安市" - }, - "350500": { - "350501": "市辖区", - "350502": "鲤城区", - "350503": "丰泽区", - "350504": "洛江区", - "350505": "泉港区", - "350521": "惠安县", - "350524": "安溪县", - "350525": "永春县", - "350526": "德化县", - "350527": "金门县", - "350581": "石狮市", - "350582": "晋江市", - "350583": "南安市" - }, - "350600": { - "350601": "市辖区", - "350602": "芗城区", - "350603": "龙文区", - "350622": "云霄县", - "350623": "漳浦县", - "350624": "诏安县", - "350625": "长泰县", - "350626": "东山县", - "350627": "南靖县", - "350628": "平和县", - "350629": "华安县", - "350681": "龙海市" - }, - "350700": { - "350701": "市辖区", - "350702": "延平区", - "350703": "建阳区", - "350721": "顺昌县", - "350722": "浦城县", - "350723": "光泽县", - "350724": "松溪县", - "350725": "政和县", - "350781": "邵武市", - "350782": "武夷山市", - "350783": "建瓯市" - }, - "350800": { - "350801": "市辖区", - "350802": "新罗区", - "350803": "永定区", - "350821": "长汀县", - "350823": "上杭县", - "350824": "武平县", - "350825": "连城县", - "350881": "漳平市" - }, - "350900": { - "350901": "市辖区", - "350902": "蕉城区", - "350921": "霞浦县", - "350922": "古田县", - "350923": "屏南县", - "350924": "寿宁县", - "350925": "周宁县", - "350926": "柘荣县", - "350981": "福安市", - "350982": "福鼎市" - }, - "360000": { - "360100": "南昌市", - "360200": "景德镇市", - "360300": "萍乡市", - "360400": "九江市", - "360500": "新余市", - "360600": "鹰潭市", - "360700": "赣州市", - "360800": "吉安市", - "360900": "宜春市", - "361000": "抚州市", - "361100": "上饶市" - }, - "360100": { - "360101": "市辖区", - "360102": "东湖区", - "360103": "西湖区", - "360104": "青云谱区", - "360105": "湾里区", - "360111": "青山湖区", - "360112": "新建区", - "360121": "南昌县", - "360123": "安义县", - "360124": "进贤县" - }, - "360200": {"360201": "市辖区", "360202": "昌江区", "360203": "珠山区", "360222": "浮梁县", "360281": "乐平市"}, - "360300": {"360301": "市辖区", "360302": "安源区", "360313": "湘东区", "360321": "莲花县", "360322": "上栗县", "360323": "芦溪县"}, - "360400": { - "360401": "市辖区", - "360402": "濂溪区", - "360403": "浔阳区", - "360404": "柴桑区", - "360423": "武宁县", - "360424": "修水县", - "360425": "永修县", - "360426": "德安县", - "360428": "都昌县", - "360429": "湖口县", - "360430": "彭泽县", - "360481": "瑞昌市", - "360482": "共青城市", - "360483": "庐山市" - }, - "360500": {"360501": "市辖区", "360502": "渝水区", "360521": "分宜县"}, - "360600": {"360601": "市辖区", "360602": "月湖区", "360603": "余江区", "360681": "贵溪市"}, - "360700": { - "360701": "市辖区", - "360702": "章贡区", - "360703": "南康区", - "360704": "赣县区", - "360722": "信丰县", - "360723": "大余县", - "360724": "上犹县", - "360725": "崇义县", - "360726": "安远县", - "360727": "龙南县", - "360728": "定南县", - "360729": "全南县", - "360730": "宁都县", - "360731": "于都县", - "360732": "兴国县", - "360733": "会昌县", - "360734": "寻乌县", - "360735": "石城县", - "360781": "瑞金市" - }, - "360800": { - "360801": "市辖区", - "360802": "吉州区", - "360803": "青原区", - "360821": "吉安县", - "360822": "吉水县", - "360823": "峡江县", - "360824": "新干县", - "360825": "永丰县", - "360826": "泰和县", - "360827": "遂川县", - "360828": "万安县", - "360829": "安福县", - "360830": "永新县", - "360881": "井冈山市" - }, - "360900": { - "360901": "市辖区", - "360902": "袁州区", - "360921": "奉新县", - "360922": "万载县", - "360923": "上高县", - "360924": "宜丰县", - "360925": "靖安县", - "360926": "铜鼓县", - "360981": "丰城市", - "360982": "樟树市", - "360983": "高安市" - }, - "361000": { - "361001": "市辖区", - "361002": "临川区", - "361003": "东乡区", - "361021": "南城县", - "361022": "黎川县", - "361023": "南丰县", - "361024": "崇仁县", - "361025": "乐安县", - "361026": "宜黄县", - "361027": "金溪县", - "361028": "资溪县", - "361030": "广昌县" - }, - "361100": { - "361101": "市辖区", - "361102": "信州区", - "361103": "广丰区", - "361104": "广信区", - "361123": "玉山县", - "361124": "铅山县", - "361125": "横峰县", - "361126": "弋阳县", - "361127": "余干县", - "361128": "鄱阳县", - "361129": "万年县", - "361130": "婺源县", - "361181": "德兴市" - }, - "370000": { - "370100": "济南市", - "370200": "青岛市", - "370300": "淄博市", - "370400": "枣庄市", - "370500": "东营市", - "370600": "烟台市", - "370700": "潍坊市", - "370800": "济宁市", - "370900": "泰安市", - "371000": "威海市", - "371100": "日照市", - "371300": "临沂市", - "371400": "德州市", - "371500": "聊城市", - "371600": "滨州市", - "371700": "菏泽市" - }, - "370100": { - "370101": "市辖区", - "370102": "历下区", - "370103": "市中区", - "370104": "槐荫区", - "370105": "天桥区", - "370112": "历城区", - "370113": "长清区", - "370114": "章丘区", - "370115": "济阳区", - "370116": "莱芜区", - "370117": "钢城区", - "370124": "平阴县", - "370126": "商河县", - "370171": "济南高新技术产业开发区" - }, - "370200": { - "370201": "市辖区", - "370202": "市南区", - "370203": "市北区", - "370211": "黄岛区", - "370212": "崂山区", - "370213": "李沧区", - "370214": "城阳区", - "370215": "即墨区", - "370271": "青岛高新技术产业开发区", - "370281": "胶州市", - "370283": "平度市", - "370285": "莱西市" - }, - "370300": { - "370301": "市辖区", - "370302": "淄川区", - "370303": "张店区", - "370304": "博山区", - "370305": "临淄区", - "370306": "周村区", - "370321": "桓台县", - "370322": "高青县", - "370323": "沂源县" - }, - "370400": { - "370401": "市辖区", - "370402": "市中区", - "370403": "薛城区", - "370404": "峄城区", - "370405": "台儿庄区", - "370406": "山亭区", - "370481": "滕州市" - }, - "370500": { - "370501": "市辖区", - "370502": "东营区", - "370503": "河口区", - "370505": "垦利区", - "370522": "利津县", - "370523": "广饶县", - "370571": "东营经济技术开发区", - "370572": "东营港经济开发区" - }, - "370600": { - "370601": "市辖区", - "370602": "芝罘区", - "370611": "福山区", - "370612": "牟平区", - "370613": "莱山区", - "370634": "长岛县", - "370671": "烟台高新技术产业开发区", - "370672": "烟台经济技术开发区", - "370681": "龙口市", - "370682": "莱阳市", - "370683": "莱州市", - "370684": "蓬莱市", - "370685": "招远市", - "370686": "栖霞市", - "370687": "海阳市" - }, - "370700": { - "370701": "市辖区", - "370702": "潍城区", - "370703": "寒亭区", - "370704": "坊子区", - "370705": "奎文区", - "370724": "临朐县", - "370725": "昌乐县", - "370772": "潍坊滨海经济技术开发区", - "370781": "青州市", - "370782": "诸城市", - "370783": "寿光市", - "370784": "安丘市", - "370785": "高密市", - "370786": "昌邑市" - }, - "370800": { - "370801": "市辖区", - "370811": "任城区", - "370812": "兖州区", - "370826": "微山县", - "370827": "鱼台县", - "370828": "金乡县", - "370829": "嘉祥县", - "370830": "汶上县", - "370831": "泗水县", - "370832": "梁山县", - "370871": "济宁高新技术产业开发区", - "370881": "曲阜市", - "370883": "邹城市" - }, - "370900": { - "370901": "市辖区", - "370902": "泰山区", - "370911": "岱岳区", - "370921": "宁阳县", - "370923": "东平县", - "370982": "新泰市", - "370983": "肥城市" - }, - "371000": { - "371001": "市辖区", - "371002": "环翠区", - "371003": "文登区", - "371071": "威海火炬高技术产业开发区", - "371072": "威海经济技术开发区", - "371073": "威海临港经济技术开发区", - "371082": "荣成市", - "371083": "乳山市" - }, - "371100": {"371101": "市辖区", "371102": "东港区", "371103": "岚山区", "371121": "五莲县", "371122": "莒县", "371171": "日照经济技术开发区"}, - "371300": { - "371301": "市辖区", - "371302": "兰山区", - "371311": "罗庄区", - "371312": "河东区", - "371321": "沂南县", - "371322": "郯城县", - "371323": "沂水县", - "371324": "兰陵县", - "371325": "费县", - "371326": "平邑县", - "371327": "莒南县", - "371328": "蒙阴县", - "371329": "临沭县", - "371371": "临沂高新技术产业开发区", - "371372": "临沂经济技术开发区", - "371373": "临沂临港经济开发区" - }, - "371400": { - "371401": "市辖区", - "371402": "德城区", - "371403": "陵城区", - "371422": "宁津县", - "371423": "庆云县", - "371424": "临邑县", - "371425": "齐河县", - "371426": "平原县", - "371427": "夏津县", - "371428": "武城县", - "371471": "德州经济技术开发区", - "371472": "德州运河经济开发区", - "371481": "乐陵市", - "371482": "禹城市" - }, - "371500": { - "371501": "市辖区", - "371502": "东昌府区", - "371503": "茌平区", - "371521": "阳谷县", - "371522": "莘县", - "371524": "东阿县", - "371525": "冠县", - "371526": "高唐县", - "371581": "临清市" - }, - "371600": { - "371601": "市辖区", - "371602": "滨城区", - "371603": "沾化区", - "371621": "惠民县", - "371622": "阳信县", - "371623": "无棣县", - "371625": "博兴县", - "371681": "邹平市" - }, - "371700": { - "371701": "市辖区", - "371702": "牡丹区", - "371703": "定陶区", - "371721": "曹县", - "371722": "单县", - "371723": "成武县", - "371724": "巨野县", - "371725": "郓城县", - "371726": "鄄城县", - "371728": "东明县", - "371771": "菏泽经济技术开发区", - "371772": "菏泽高新技术开发区" - }, - "410000": { - "410100": "郑州市", - "410200": "开封市", - "410300": "洛阳市", - "410400": "平顶山市", - "410500": "安阳市", - "410600": "鹤壁市", - "410700": "新乡市", - "410800": "焦作市", - "410900": "濮阳市", - "411000": "许昌市", - "411100": "漯河市", - "411200": "三门峡市", - "411300": "南阳市", - "411400": "商丘市", - "411500": "信阳市", - "411600": "周口市", - "411700": "驻马店市", - "419000": "省直辖县级行政区划" - }, - "410100": { - "410101": "市辖区", - "410102": "中原区", - "410103": "二七区", - "410104": "管城回族区", - "410105": "金水区", - "410106": "上街区", - "410108": "惠济区", - "410122": "中牟县", - "410171": "郑州经济技术开发区", - "410172": "郑州高新技术产业开发区", - "410173": "郑州航空港经济综合实验区", - "410181": "巩义市", - "410182": "荥阳市", - "410183": "新密市", - "410184": "新郑市", - "410185": "登封市" - }, - "410200": { - "410201": "市辖区", - "410202": "龙亭区", - "410203": "顺河回族区", - "410204": "鼓楼区", - "410205": "禹王台区", - "410212": "祥符区", - "410221": "杞县", - "410222": "通许县", - "410223": "尉氏县", - "410225": "兰考县" - }, - "410300": { - "410301": "市辖区", - "410302": "老城区", - "410303": "西工区", - "410304": "瀍河回族区", - "410305": "涧西区", - "410306": "吉利区", - "410311": "洛龙区", - "410322": "孟津县", - "410323": "新安县", - "410324": "栾川县", - "410325": "嵩县", - "410326": "汝阳县", - "410327": "宜阳县", - "410328": "洛宁县", - "410329": "伊川县", - "410371": "洛阳高新技术产业开发区", - "410381": "偃师市" - }, - "410400": { - "410401": "市辖区", - "410402": "新华区", - "410403": "卫东区", - "410404": "石龙区", - "410411": "湛河区", - "410421": "宝丰县", - "410422": "叶县", - "410423": "鲁山县", - "410425": "郏县", - "410471": "平顶山高新技术产业开发区", - "410472": "平顶山市城乡一体化示范区", - "410481": "舞钢市", - "410482": "汝州市" - }, - "410500": { - "410501": "市辖区", - "410502": "文峰区", - "410503": "北关区", - "410505": "殷都区", - "410506": "龙安区", - "410522": "安阳县", - "410523": "汤阴县", - "410526": "滑县", - "410527": "内黄县", - "410571": "安阳高新技术产业开发区", - "410581": "林州市" - }, - "410600": { - "410601": "市辖区", - "410602": "鹤山区", - "410603": "山城区", - "410611": "淇滨区", - "410621": "浚县", - "410622": "淇县", - "410671": "鹤壁经济技术开发区" - }, - "410700": { - "410701": "市辖区", - "410702": "红旗区", - "410703": "卫滨区", - "410704": "凤泉区", - "410711": "牧野区", - "410721": "新乡县", - "410724": "获嘉县", - "410725": "原阳县", - "410726": "延津县", - "410727": "封丘县", - "410771": "新乡高新技术产业开发区", - "410772": "新乡经济技术开发区", - "410773": "新乡市平原城乡一体化示范区", - "410781": "卫辉市", - "410782": "辉县市", - "410783": "长垣市" - }, - "410800": { - "410801": "市辖区", - "410802": "解放区", - "410803": "中站区", - "410804": "马村区", - "410811": "山阳区", - "410821": "修武县", - "410822": "博爱县", - "410823": "武陟县", - "410825": "温县", - "410871": "焦作城乡一体化示范区", - "410882": "沁阳市", - "410883": "孟州市" - }, - "410900": { - "410901": "市辖区", - "410902": "华龙区", - "410922": "清丰县", - "410923": "南乐县", - "410926": "范县", - "410927": "台前县", - "410928": "濮阳县", - "410971": "河南濮阳工业园区", - "410972": "濮阳经济技术开发区" - }, - "411000": { - "411001": "市辖区", - "411002": "魏都区", - "411003": "建安区", - "411024": "鄢陵县", - "411025": "襄城县", - "411071": "许昌经济技术开发区", - "411081": "禹州市", - "411082": "长葛市" - }, - "411100": { - "411101": "市辖区", - "411102": "源汇区", - "411103": "郾城区", - "411104": "召陵区", - "411121": "舞阳县", - "411122": "临颍县", - "411171": "漯河经济技术开发区" - }, - "411200": { - "411201": "市辖区", - "411202": "湖滨区", - "411203": "陕州区", - "411221": "渑池县", - "411224": "卢氏县", - "411271": "河南三门峡经济开发区", - "411281": "义马市", - "411282": "灵宝市" - }, - "411300": { - "411301": "市辖区", - "411302": "宛城区", - "411303": "卧龙区", - "411321": "南召县", - "411322": "方城县", - "411323": "西峡县", - "411324": "镇平县", - "411325": "内乡县", - "411326": "淅川县", - "411327": "社旗县", - "411328": "唐河县", - "411329": "新野县", - "411330": "桐柏县", - "411371": "南阳高新技术产业开发区", - "411372": "南阳市城乡一体化示范区", - "411381": "邓州市" - }, - "411400": { - "411401": "市辖区", - "411402": "梁园区", - "411403": "睢阳区", - "411421": "民权县", - "411422": "睢县", - "411423": "宁陵县", - "411424": "柘城县", - "411425": "虞城县", - "411426": "夏邑县", - "411471": "豫东综合物流产业聚集区", - "411472": "河南商丘经济开发区", - "411481": "永城市" - }, - "411500": { - "411501": "市辖区", - "411502": "浉河区", - "411503": "平桥区", - "411521": "罗山县", - "411522": "光山县", - "411523": "新县", - "411524": "商城县", - "411525": "固始县", - "411526": "潢川县", - "411527": "淮滨县", - "411528": "息县", - "411571": "信阳高新技术产业开发区" - }, - "411600": { - "411601": "市辖区", - "411602": "川汇区", - "411603": "淮阳区", - "411621": "扶沟县", - "411622": "西华县", - "411623": "商水县", - "411624": "沈丘县", - "411625": "郸城县", - "411627": "太康县", - "411628": "鹿邑县", - "411671": "河南周口经济开发区", - "411681": "项城市" - }, - "411700": { - "411701": "市辖区", - "411702": "驿城区", - "411721": "西平县", - "411722": "上蔡县", - "411723": "平舆县", - "411724": "正阳县", - "411725": "确山县", - "411726": "泌阳县", - "411727": "汝南县", - "411728": "遂平县", - "411729": "新蔡县", - "411771": "河南驻马店经济开发区" - }, - "419000": {"419001": "济源市"}, - "420000": { - "420100": "武汉市", - "420200": "黄石市", - "420300": "十堰市", - "420500": "宜昌市", - "420600": "襄阳市", - "420700": "鄂州市", - "420800": "荆门市", - "420900": "孝感市", - "421000": "荆州市", - "421100": "黄冈市", - "421200": "咸宁市", - "421300": "随州市", - "422800": "恩施土家族苗族自治州", - "429000": "省直辖县级行政区划" - }, - "420100": { - "420101": "市辖区", - "420102": "江岸区", - "420103": "江汉区", - "420104": "硚口区", - "420105": "汉阳区", - "420106": "武昌区", - "420107": "青山区", - "420111": "洪山区", - "420112": "东西湖区", - "420113": "汉南区", - "420114": "蔡甸区", - "420115": "江夏区", - "420116": "黄陂区", - "420117": "新洲区" - }, - "420200": { - "420201": "市辖区", - "420202": "黄石港区", - "420203": "西塞山区", - "420204": "下陆区", - "420205": "铁山区", - "420222": "阳新县", - "420281": "大冶市" - }, - "420300": { - "420301": "市辖区", - "420302": "茅箭区", - "420303": "张湾区", - "420304": "郧阳区", - "420322": "郧西县", - "420323": "竹山县", - "420324": "竹溪县", - "420325": "房县", - "420381": "丹江口市" - }, - "420500": { - "420501": "市辖区", - "420502": "西陵区", - "420503": "伍家岗区", - "420504": "点军区", - "420505": "猇亭区", - "420506": "夷陵区", - "420525": "远安县", - "420526": "兴山县", - "420527": "秭归县", - "420528": "长阳土家族自治县", - "420529": "五峰土家族自治县", - "420581": "宜都市", - "420582": "当阳市", - "420583": "枝江市" - }, - "420600": { - "420601": "市辖区", - "420602": "襄城区", - "420606": "樊城区", - "420607": "襄州区", - "420624": "南漳县", - "420625": "谷城县", - "420626": "保康县", - "420682": "老河口市", - "420683": "枣阳市", - "420684": "宜城市" - }, - "420700": {"420701": "市辖区", "420702": "梁子湖区", "420703": "华容区", "420704": "鄂城区"}, - "420800": {"420801": "市辖区", "420802": "东宝区", "420804": "掇刀区", "420822": "沙洋县", "420881": "钟祥市", "420882": "京山市"}, - "420900": { - "420901": "市辖区", - "420902": "孝南区", - "420921": "孝昌县", - "420922": "大悟县", - "420923": "云梦县", - "420981": "应城市", - "420982": "安陆市", - "420984": "汉川市" - }, - "421000": { - "421001": "市辖区", - "421002": "沙市区", - "421003": "荆州区", - "421022": "公安县", - "421023": "监利县", - "421024": "江陵县", - "421071": "荆州经济技术开发区", - "421081": "石首市", - "421083": "洪湖市", - "421087": "松滋市" - }, - "421100": { - "421101": "市辖区", - "421102": "黄州区", - "421121": "团风县", - "421122": "红安县", - "421123": "罗田县", - "421124": "英山县", - "421125": "浠水县", - "421126": "蕲春县", - "421127": "黄梅县", - "421171": "龙感湖管理区", - "421181": "麻城市", - "421182": "武穴市" - }, - "421200": { - "421201": "市辖区", - "421202": "咸安区", - "421221": "嘉鱼县", - "421222": "通城县", - "421223": "崇阳县", - "421224": "通山县", - "421281": "赤壁市" - }, - "421300": {"421301": "市辖区", "421303": "曾都区", "421321": "随县", "421381": "广水市"}, - "422800": { - "422801": "恩施市", - "422802": "利川市", - "422822": "建始县", - "422823": "巴东县", - "422825": "宣恩县", - "422826": "咸丰县", - "422827": "来凤县", - "422828": "鹤峰县" - }, - "429000": {"429004": "仙桃市", "429005": "潜江市", "429006": "天门市", "429021": "神农架林区"}, - "430000": { - "430100": "长沙市", - "430200": "株洲市", - "430300": "湘潭市", - "430400": "衡阳市", - "430500": "邵阳市", - "430600": "岳阳市", - "430700": "常德市", - "430800": "张家界市", - "430900": "益阳市", - "431000": "郴州市", - "431100": "永州市", - "431200": "怀化市", - "431300": "娄底市", - "433100": "湘西土家族苗族自治州" - }, - "430100": { - "430101": "市辖区", - "430102": "芙蓉区", - "430103": "天心区", - "430104": "岳麓区", - "430105": "开福区", - "430111": "雨花区", - "430112": "望城区", - "430121": "长沙县", - "430181": "浏阳市", - "430182": "宁乡市" - }, - "430200": { - "430201": "市辖区", - "430202": "荷塘区", - "430203": "芦淞区", - "430204": "石峰区", - "430211": "天元区", - "430212": "渌口区", - "430223": "攸县", - "430224": "茶陵县", - "430225": "炎陵县", - "430271": "云龙示范区", - "430281": "醴陵市" - }, - "430300": { - "430301": "市辖区", - "430302": "雨湖区", - "430304": "岳塘区", - "430321": "湘潭县", - "430371": "湖南湘潭高新技术产业园区", - "430372": "湘潭昭山示范区", - "430373": "湘潭九华示范区", - "430381": "湘乡市", - "430382": "韶山市" - }, - "430400": { - "430401": "市辖区", - "430405": "珠晖区", - "430406": "雁峰区", - "430407": "石鼓区", - "430408": "蒸湘区", - "430412": "南岳区", - "430421": "衡阳县", - "430422": "衡南县", - "430423": "衡山县", - "430424": "衡东县", - "430426": "祁东县", - "430471": "衡阳综合保税区", - "430472": "湖南衡阳高新技术产业园区", - "430473": "湖南衡阳松木经济开发区", - "430481": "耒阳市", - "430482": "常宁市" - }, - "430500": { - "430501": "市辖区", - "430502": "双清区", - "430503": "大祥区", - "430511": "北塔区", - "430522": "新邵县", - "430523": "邵阳县", - "430524": "隆回县", - "430525": "洞口县", - "430527": "绥宁县", - "430528": "新宁县", - "430529": "城步苗族自治县", - "430581": "武冈市", - "430582": "邵东市" - }, - "430600": { - "430601": "市辖区", - "430602": "岳阳楼区", - "430603": "云溪区", - "430611": "君山区", - "430621": "岳阳县", - "430623": "华容县", - "430624": "湘阴县", - "430626": "平江县", - "430671": "岳阳市屈原管理区", - "430681": "汨罗市", - "430682": "临湘市" - }, - "430700": { - "430701": "市辖区", - "430702": "武陵区", - "430703": "鼎城区", - "430721": "安乡县", - "430722": "汉寿县", - "430723": "澧县", - "430724": "临澧县", - "430725": "桃源县", - "430726": "石门县", - "430771": "常德市西洞庭管理区", - "430781": "津市市" - }, - "430800": {"430801": "市辖区", "430802": "永定区", "430811": "武陵源区", "430821": "慈利县", "430822": "桑植县"}, - "430900": { - "430901": "市辖区", - "430902": "资阳区", - "430903": "赫山区", - "430921": "南县", - "430922": "桃江县", - "430923": "安化县", - "430971": "益阳市大通湖管理区", - "430972": "湖南益阳高新技术产业园区", - "430981": "沅江市" - }, - "431000": { - "431001": "市辖区", - "431002": "北湖区", - "431003": "苏仙区", - "431021": "桂阳县", - "431022": "宜章县", - "431023": "永兴县", - "431024": "嘉禾县", - "431025": "临武县", - "431026": "汝城县", - "431027": "桂东县", - "431028": "安仁县", - "431081": "资兴市" - }, - "431100": { - "431101": "市辖区", - "431102": "零陵区", - "431103": "冷水滩区", - "431121": "祁阳县", - "431122": "东安县", - "431123": "双牌县", - "431124": "道县", - "431125": "江永县", - "431126": "宁远县", - "431127": "蓝山县", - "431128": "新田县", - "431129": "江华瑶族自治县", - "431171": "永州经济技术开发区", - "431172": "永州市金洞管理区", - "431173": "永州市回龙圩管理区" - }, - "431200": { - "431201": "市辖区", - "431202": "鹤城区", - "431221": "中方县", - "431222": "沅陵县", - "431223": "辰溪县", - "431224": "溆浦县", - "431225": "会同县", - "431226": "麻阳苗族自治县", - "431227": "新晃侗族自治县", - "431228": "芷江侗族自治县", - "431229": "靖州苗族侗族自治县", - "431230": "通道侗族自治县", - "431271": "怀化市洪江管理区", - "431281": "洪江市" - }, - "431300": {"431301": "市辖区", "431302": "娄星区", "431321": "双峰县", "431322": "新化县", "431381": "冷水江市", "431382": "涟源市"}, - "433100": { - "433101": "吉首市", - "433122": "泸溪县", - "433123": "凤凰县", - "433124": "花垣县", - "433125": "保靖县", - "433126": "古丈县", - "433127": "永顺县", - "433130": "龙山县", - "433173": "湖南永顺经济开发区" - }, - "440000": { - "440100": "广州市", - "440200": "韶关市", - "440300": "深圳市", - "440400": "珠海市", - "440500": "汕头市", - "440600": "佛山市", - "440700": "江门市", - "440800": "湛江市", - "440900": "茂名市", - "441200": "肇庆市", - "441300": "惠州市", - "441400": "梅州市", - "441500": "汕尾市", - "441600": "河源市", - "441700": "阳江市", - "441800": "清远市", - "441900": "东莞市", - "442000": "中山市", - "445100": "潮州市", - "445200": "揭阳市", - "445300": "云浮市" - }, - "440100": { - "440101": "市辖区", - "440103": "荔湾区", - "440104": "越秀区", - "440105": "海珠区", - "440106": "天河区", - "440111": "白云区", - "440112": "黄埔区", - "440113": "番禺区", - "440114": "花都区", - "440115": "南沙区", - "440117": "从化区", - "440118": "增城区" - }, - "440200": { - "440201": "市辖区", - "440203": "武江区", - "440204": "浈江区", - "440205": "曲江区", - "440222": "始兴县", - "440224": "仁化县", - "440229": "翁源县", - "440232": "乳源瑶族自治县", - "440233": "新丰县", - "440281": "乐昌市", - "440282": "南雄市" - }, - "440300": { - "440301": "市辖区", - "440303": "罗湖区", - "440304": "福田区", - "440305": "南山区", - "440306": "宝安区", - "440307": "龙岗区", - "440308": "盐田区", - "440309": "龙华区", - "440310": "坪山区", - "440311": "光明区" - }, - "440400": {"440401": "市辖区", "440402": "香洲区", "440403": "斗门区", "440404": "金湾区"}, - "440500": { - "440501": "市辖区", - "440507": "龙湖区", - "440511": "金平区", - "440512": "濠江区", - "440513": "潮阳区", - "440514": "潮南区", - "440515": "澄海区", - "440523": "南澳县" - }, - "440600": {"440601": "市辖区", "440604": "禅城区", "440605": "南海区", "440606": "顺德区", "440607": "三水区", "440608": "高明区"}, - "440700": { - "440701": "市辖区", - "440703": "蓬江区", - "440704": "江海区", - "440705": "新会区", - "440781": "台山市", - "440783": "开平市", - "440784": "鹤山市", - "440785": "恩平市" - }, - "440800": { - "440801": "市辖区", - "440802": "赤坎区", - "440803": "霞山区", - "440804": "坡头区", - "440811": "麻章区", - "440823": "遂溪县", - "440825": "徐闻县", - "440881": "廉江市", - "440882": "雷州市", - "440883": "吴川市" - }, - "440900": {"440901": "市辖区", "440902": "茂南区", "440904": "电白区", "440981": "高州市", "440982": "化州市", "440983": "信宜市"}, - "441200": { - "441201": "市辖区", - "441202": "端州区", - "441203": "鼎湖区", - "441204": "高要区", - "441223": "广宁县", - "441224": "怀集县", - "441225": "封开县", - "441226": "德庆县", - "441284": "四会市" - }, - "441300": {"441301": "市辖区", "441302": "惠城区", "441303": "惠阳区", "441322": "博罗县", "441323": "惠东县", "441324": "龙门县"}, - "441400": { - "441401": "市辖区", - "441402": "梅江区", - "441403": "梅县区", - "441422": "大埔县", - "441423": "丰顺县", - "441424": "五华县", - "441426": "平远县", - "441427": "蕉岭县", - "441481": "兴宁市" - }, - "441500": {"441501": "市辖区", "441502": "城区", "441521": "海丰县", "441523": "陆河县", "441581": "陆丰市"}, - "441600": { - "441601": "市辖区", - "441602": "源城区", - "441621": "紫金县", - "441622": "龙川县", - "441623": "连平县", - "441624": "和平县", - "441625": "东源县" - }, - "441700": {"441701": "市辖区", "441702": "江城区", "441704": "阳东区", "441721": "阳西县", "441781": "阳春市"}, - "441800": { - "441801": "市辖区", - "441802": "清城区", - "441803": "清新区", - "441821": "佛冈县", - "441823": "阳山县", - "441825": "连山壮族瑶族自治县", - "441826": "连南瑶族自治县", - "441881": "英德市", - "441882": "连州市" - }, - "441900": { - "441900003": "东城街道", - "441900004": "南城街道", - "441900005": "万江街道", - "441900006": "莞城街道", - "441900101": "石碣镇", - "441900102": "石龙镇", - "441900103": "茶山镇", - "441900104": "石排镇", - "441900105": "企石镇", - "441900106": "横沥镇", - "441900107": "桥头镇", - "441900108": "谢岗镇", - "441900109": "东坑镇", - "441900110": "常平镇", - "441900111": "寮步镇", - "441900112": "樟木头镇", - "441900113": "大朗镇", - "441900114": "黄江镇", - "441900115": "清溪镇", - "441900116": "塘厦镇", - "441900117": "凤岗镇", - "441900118": "大岭山镇", - "441900119": "长安镇", - "441900121": "虎门镇", - "441900122": "厚街镇", - "441900123": "沙田镇", - "441900124": "道滘镇", - "441900125": "洪梅镇", - "441900126": "麻涌镇", - "441900127": "望牛墩镇", - "441900128": "中堂镇", - "441900129": "高埗镇", - "441900401": "松山湖", - "441900402": "东莞港", - "441900403": "东莞生态园" - }, - "442000": { - "442000001": "石岐街道", - "442000002": "东区街道", - "442000003": "中山港街道", - "442000004": "西区街道", - "442000005": "南区街道", - "442000006": "五桂山街道", - "442000100": "小榄镇", - "442000101": "黄圃镇", - "442000102": "民众镇", - "442000103": "东凤镇", - "442000104": "东升镇", - "442000105": "古镇镇", - "442000106": "沙溪镇", - "442000107": "坦洲镇", - "442000108": "港口镇", - "442000109": "三角镇", - "442000110": "横栏镇", - "442000111": "南头镇", - "442000112": "阜沙镇", - "442000113": "南朗镇", - "442000114": "三乡镇", - "442000115": "板芙镇", - "442000116": "大涌镇", - "442000117": "神湾镇" - }, - "445100": {"445101": "市辖区", "445102": "湘桥区", "445103": "潮安区", "445122": "饶平县"}, - "445200": {"445201": "市辖区", "445202": "榕城区", "445203": "揭东区", "445222": "揭西县", "445224": "惠来县", "445281": "普宁市"}, - "445300": {"445301": "市辖区", "445302": "云城区", "445303": "云安区", "445321": "新兴县", "445322": "郁南县", "445381": "罗定市"}, - "450000": { - "450100": "南宁市", - "450200": "柳州市", - "450300": "桂林市", - "450400": "梧州市", - "450500": "北海市", - "450600": "防城港市", - "450700": "钦州市", - "450800": "贵港市", - "450900": "玉林市", - "451000": "百色市", - "451100": "贺州市", - "451200": "河池市", - "451300": "来宾市", - "451400": "崇左市" - }, - "450100": { - "450101": "市辖区", - "450102": "兴宁区", - "450103": "青秀区", - "450105": "江南区", - "450107": "西乡塘区", - "450108": "良庆区", - "450109": "邕宁区", - "450110": "武鸣区", - "450123": "隆安县", - "450124": "马山县", - "450125": "上林县", - "450126": "宾阳县", - "450127": "横县" - }, - "450200": { - "450201": "市辖区", - "450202": "城中区", - "450203": "鱼峰区", - "450204": "柳南区", - "450205": "柳北区", - "450206": "柳江区", - "450222": "柳城县", - "450223": "鹿寨县", - "450224": "融安县", - "450225": "融水苗族自治县", - "450226": "三江侗族自治县" - }, - "450300": { - "450301": "市辖区", - "450302": "秀峰区", - "450303": "叠彩区", - "450304": "象山区", - "450305": "七星区", - "450311": "雁山区", - "450312": "临桂区", - "450321": "阳朔县", - "450323": "灵川县", - "450324": "全州县", - "450325": "兴安县", - "450326": "永福县", - "450327": "灌阳县", - "450328": "龙胜各族自治县", - "450329": "资源县", - "450330": "平乐县", - "450332": "恭城瑶族自治县", - "450381": "荔浦市" - }, - "450400": { - "450401": "市辖区", - "450403": "万秀区", - "450405": "长洲区", - "450406": "龙圩区", - "450421": "苍梧县", - "450422": "藤县", - "450423": "蒙山县", - "450481": "岑溪市" - }, - "450500": {"450501": "市辖区", "450502": "海城区", "450503": "银海区", "450512": "铁山港区", "450521": "合浦县"}, - "450600": {"450601": "市辖区", "450602": "港口区", "450603": "防城区", "450621": "上思县", "450681": "东兴市"}, - "450700": {"450701": "市辖区", "450702": "钦南区", "450703": "钦北区", "450721": "灵山县", "450722": "浦北县"}, - "450800": {"450801": "市辖区", "450802": "港北区", "450803": "港南区", "450804": "覃塘区", "450821": "平南县", "450881": "桂平市"}, - "450900": { - "450901": "市辖区", - "450902": "玉州区", - "450903": "福绵区", - "450921": "容县", - "450922": "陆川县", - "450923": "博白县", - "450924": "兴业县", - "450981": "北流市" - }, - "451000": { - "451001": "市辖区", - "451002": "右江区", - "451003": "田阳区", - "451022": "田东县", - "451023": "平果县", - "451024": "德保县", - "451026": "那坡县", - "451027": "凌云县", - "451028": "乐业县", - "451029": "田林县", - "451030": "西林县", - "451031": "隆林各族自治县", - "451081": "靖西市" - }, - "451100": {"451101": "市辖区", "451102": "八步区", "451103": "平桂区", "451121": "昭平县", "451122": "钟山县", "451123": "富川瑶族自治县"}, - "451200": { - "451201": "市辖区", - "451202": "金城江区", - "451203": "宜州区", - "451221": "南丹县", - "451222": "天峨县", - "451223": "凤山县", - "451224": "东兰县", - "451225": "罗城仫佬族自治县", - "451226": "环江毛南族自治县", - "451227": "巴马瑶族自治县", - "451228": "都安瑶族自治县", - "451229": "大化瑶族自治县" - }, - "451300": { - "451301": "市辖区", - "451302": "兴宾区", - "451321": "忻城县", - "451322": "象州县", - "451323": "武宣县", - "451324": "金秀瑶族自治县", - "451381": "合山市" - }, - "451400": { - "451401": "市辖区", - "451402": "江州区", - "451421": "扶绥县", - "451422": "宁明县", - "451423": "龙州县", - "451424": "大新县", - "451425": "天等县", - "451481": "凭祥市" - }, - "460000": {"460100": "海口市", "460200": "三亚市", "460300": "三沙市", "460400": "儋州市", "469000": "省直辖县级行政区划"}, - "460100": {"460101": "市辖区", "460105": "秀英区", "460106": "龙华区", "460107": "琼山区", "460108": "美兰区"}, - "460200": {"460201": "市辖区", "460202": "海棠区", "460203": "吉阳区", "460204": "天涯区", "460205": "崖州区"}, - "460300": {"460321": "西沙群岛", "460322": "南沙群岛", "460323": "中沙群岛的岛礁及其海域"}, - "460400": { - "460400100": "那大镇", - "460400101": "和庆镇", - "460400102": "南丰镇", - "460400103": "大成镇", - "460400104": "雅星镇", - "460400105": "兰洋镇", - "460400106": "光村镇", - "460400107": "木棠镇", - "460400108": "海头镇", - "460400109": "峨蔓镇", - "460400111": "王五镇", - "460400112": "白马井镇", - "460400113": "中和镇", - "460400114": "排浦镇", - "460400115": "东成镇", - "460400116": "新州镇", - "460400499": "洋浦经济开发区", - "460400500": "华南热作学院" - }, - "469000": { - "469001": "五指山市", - "469002": "琼海市", - "469005": "文昌市", - "469006": "万宁市", - "469007": "东方市", - "469021": "定安县", - "469022": "屯昌县", - "469023": "澄迈县", - "469024": "临高县", - "469025": "白沙黎族自治县", - "469026": "昌江黎族自治县", - "469027": "乐东黎族自治县", - "469028": "陵水黎族自治县", - "469029": "保亭黎族苗族自治县", - "469030": "琼中黎族苗族自治县" - }, - "500000": {"500100": "市辖区", "500200": "县"}, - "500100": { - "500101": "万州区", - "500102": "涪陵区", - "500103": "渝中区", - "500104": "大渡口区", - "500105": "江北区", - "500106": "沙坪坝区", - "500107": "九龙坡区", - "500108": "南岸区", - "500109": "北碚区", - "500110": "綦江区", - "500111": "大足区", - "500112": "渝北区", - "500113": "巴南区", - "500114": "黔江区", - "500115": "长寿区", - "500116": "江津区", - "500117": "合川区", - "500118": "永川区", - "500119": "南川区", - "500120": "璧山区", - "500151": "铜梁区", - "500152": "潼南区", - "500153": "荣昌区", - "500154": "开州区", - "500155": "梁平区", - "500156": "武隆区" - }, - "500200": { - "500229": "城口县", - "500230": "丰都县", - "500231": "垫江县", - "500233": "忠县", - "500235": "云阳县", - "500236": "奉节县", - "500237": "巫山县", - "500238": "巫溪县", - "500240": "石柱土家族自治县", - "500241": "秀山土家族苗族自治县", - "500242": "酉阳土家族苗族自治县", - "500243": "彭水苗族土家族自治县" - }, - "510000": { - "510100": "成都市", - "510300": "自贡市", - "510400": "攀枝花市", - "510500": "泸州市", - "510600": "德阳市", - "510700": "绵阳市", - "510800": "广元市", - "510900": "遂宁市", - "511000": "内江市", - "511100": "乐山市", - "511300": "南充市", - "511400": "眉山市", - "511500": "宜宾市", - "511600": "广安市", - "511700": "达州市", - "511800": "雅安市", - "511900": "巴中市", - "512000": "资阳市", - "513200": "阿坝藏族羌族自治州", - "513300": "甘孜藏族自治州", - "513400": "凉山彝族自治州" - }, - "510100": { - "510101": "市辖区", - "510104": "锦江区", - "510105": "青羊区", - "510106": "金牛区", - "510107": "武侯区", - "510108": "成华区", - "510112": "龙泉驿区", - "510113": "青白江区", - "510114": "新都区", - "510115": "温江区", - "510116": "双流区", - "510117": "郫都区", - "510121": "金堂县", - "510129": "大邑县", - "510131": "蒲江县", - "510132": "新津县", - "510181": "都江堰市", - "510182": "彭州市", - "510183": "邛崃市", - "510184": "崇州市", - "510185": "简阳市" - }, - "510300": { - "510301": "市辖区", - "510302": "自流井区", - "510303": "贡井区", - "510304": "大安区", - "510311": "沿滩区", - "510321": "荣县", - "510322": "富顺县" - }, - "510400": {"510401": "市辖区", "510402": "东区", "510403": "西区", "510411": "仁和区", "510421": "米易县", "510422": "盐边县"}, - "510500": { - "510501": "市辖区", - "510502": "江阳区", - "510503": "纳溪区", - "510504": "龙马潭区", - "510521": "泸县", - "510522": "合江县", - "510524": "叙永县", - "510525": "古蔺县" - }, - "510600": { - "510601": "市辖区", - "510603": "旌阳区", - "510604": "罗江区", - "510623": "中江县", - "510681": "广汉市", - "510682": "什邡市", - "510683": "绵竹市" - }, - "510700": { - "510701": "市辖区", - "510703": "涪城区", - "510704": "游仙区", - "510705": "安州区", - "510722": "三台县", - "510723": "盐亭县", - "510725": "梓潼县", - "510726": "北川羌族自治县", - "510727": "平武县", - "510781": "江油市" - }, - "510800": { - "510801": "市辖区", - "510802": "利州区", - "510811": "昭化区", - "510812": "朝天区", - "510821": "旺苍县", - "510822": "青川县", - "510823": "剑阁县", - "510824": "苍溪县" - }, - "510900": {"510901": "市辖区", "510903": "船山区", "510904": "安居区", "510921": "蓬溪县", "510923": "大英县", "510981": "射洪市"}, - "511000": { - "511001": "市辖区", - "511002": "市中区", - "511011": "东兴区", - "511024": "威远县", - "511025": "资中县", - "511071": "内江经济开发区", - "511083": "隆昌市" - }, - "511100": { - "511101": "市辖区", - "511102": "市中区", - "511111": "沙湾区", - "511112": "五通桥区", - "511113": "金口河区", - "511123": "犍为县", - "511124": "井研县", - "511126": "夹江县", - "511129": "沐川县", - "511132": "峨边彝族自治县", - "511133": "马边彝族自治县", - "511181": "峨眉山市" - }, - "511300": { - "511301": "市辖区", - "511302": "顺庆区", - "511303": "高坪区", - "511304": "嘉陵区", - "511321": "南部县", - "511322": "营山县", - "511323": "蓬安县", - "511324": "仪陇县", - "511325": "西充县", - "511381": "阆中市" - }, - "511400": { - "511401": "市辖区", - "511402": "东坡区", - "511403": "彭山区", - "511421": "仁寿县", - "511423": "洪雅县", - "511424": "丹棱县", - "511425": "青神县" - }, - "511500": { - "511501": "市辖区", - "511502": "翠屏区", - "511503": "南溪区", - "511504": "叙州区", - "511523": "江安县", - "511524": "长宁县", - "511525": "高县", - "511526": "珙县", - "511527": "筠连县", - "511528": "兴文县", - "511529": "屏山县" - }, - "511600": { - "511601": "市辖区", - "511602": "广安区", - "511603": "前锋区", - "511621": "岳池县", - "511622": "武胜县", - "511623": "邻水县", - "511681": "华蓥市" - }, - "511700": { - "511701": "市辖区", - "511702": "通川区", - "511703": "达川区", - "511722": "宣汉县", - "511723": "开江县", - "511724": "大竹县", - "511725": "渠县", - "511771": "达州经济开发区", - "511781": "万源市" - }, - "511800": { - "511801": "市辖区", - "511802": "雨城区", - "511803": "名山区", - "511822": "荥经县", - "511823": "汉源县", - "511824": "石棉县", - "511825": "天全县", - "511826": "芦山县", - "511827": "宝兴县" - }, - "511900": { - "511901": "市辖区", - "511902": "巴州区", - "511903": "恩阳区", - "511921": "通江县", - "511922": "南江县", - "511923": "平昌县", - "511971": "巴中经济开发区" - }, - "512000": {"512001": "市辖区", "512002": "雁江区", "512021": "安岳县", "512022": "乐至县"}, - "513200": { - "513201": "马尔康市", - "513221": "汶川县", - "513222": "理县", - "513223": "茂县", - "513224": "松潘县", - "513225": "九寨沟县", - "513226": "金川县", - "513227": "小金县", - "513228": "黑水县", - "513230": "壤塘县", - "513231": "阿坝县", - "513232": "若尔盖县", - "513233": "红原县" - }, - "513300": { - "513301": "康定市", - "513322": "泸定县", - "513323": "丹巴县", - "513324": "九龙县", - "513325": "雅江县", - "513326": "道孚县", - "513327": "炉霍县", - "513328": "甘孜县", - "513329": "新龙县", - "513330": "德格县", - "513331": "白玉县", - "513332": "石渠县", - "513333": "色达县", - "513334": "理塘县", - "513335": "巴塘县", - "513336": "乡城县", - "513337": "稻城县", - "513338": "得荣县" - }, - "513400": { - "513401": "西昌市", - "513422": "木里藏族自治县", - "513423": "盐源县", - "513424": "德昌县", - "513425": "会理县", - "513426": "会东县", - "513427": "宁南县", - "513428": "普格县", - "513429": "布拖县", - "513430": "金阳县", - "513431": "昭觉县", - "513432": "喜德县", - "513433": "冕宁县", - "513434": "越西县", - "513435": "甘洛县", - "513436": "美姑县", - "513437": "雷波县" - }, - "520000": { - "520100": "贵阳市", - "520200": "六盘水市", - "520300": "遵义市", - "520400": "安顺市", - "520500": "毕节市", - "520600": "铜仁市", - "522300": "黔西南布依族苗族自治州", - "522600": "黔东南苗族侗族自治州", - "522700": "黔南布依族苗族自治州" - }, - "520100": { - "520101": "市辖区", - "520102": "南明区", - "520103": "云岩区", - "520111": "花溪区", - "520112": "乌当区", - "520113": "白云区", - "520115": "观山湖区", - "520121": "开阳县", - "520122": "息烽县", - "520123": "修文县", - "520181": "清镇市" - }, - "520200": {"520201": "钟山区", "520203": "六枝特区", "520221": "水城县", "520281": "盘州市"}, - "520300": { - "520301": "市辖区", - "520302": "红花岗区", - "520303": "汇川区", - "520304": "播州区", - "520322": "桐梓县", - "520323": "绥阳县", - "520324": "正安县", - "520325": "道真仡佬族苗族自治县", - "520326": "务川仡佬族苗族自治县", - "520327": "凤冈县", - "520328": "湄潭县", - "520329": "余庆县", - "520330": "习水县", - "520381": "赤水市", - "520382": "仁怀市" - }, - "520400": { - "520401": "市辖区", - "520402": "西秀区", - "520403": "平坝区", - "520422": "普定县", - "520423": "镇宁布依族苗族自治县", - "520424": "关岭布依族苗族自治县", - "520425": "紫云苗族布依族自治县" - }, - "520500": { - "520501": "市辖区", - "520502": "七星关区", - "520521": "大方县", - "520522": "黔西县", - "520523": "金沙县", - "520524": "织金县", - "520525": "纳雍县", - "520526": "威宁彝族回族苗族自治县", - "520527": "赫章县" - }, - "520600": { - "520601": "市辖区", - "520602": "碧江区", - "520603": "万山区", - "520621": "江口县", - "520622": "玉屏侗族自治县", - "520623": "石阡县", - "520624": "思南县", - "520625": "印江土家族苗族自治县", - "520626": "德江县", - "520627": "沿河土家族自治县", - "520628": "松桃苗族自治县" - }, - "522300": { - "522301": "兴义市", - "522302": "兴仁市", - "522323": "普安县", - "522324": "晴隆县", - "522325": "贞丰县", - "522326": "望谟县", - "522327": "册亨县", - "522328": "安龙县" - }, - "522600": { - "522601": "凯里市", - "522622": "黄平县", - "522623": "施秉县", - "522624": "三穗县", - "522625": "镇远县", - "522626": "岑巩县", - "522627": "天柱县", - "522628": "锦屏县", - "522629": "剑河县", - "522630": "台江县", - "522631": "黎平县", - "522632": "榕江县", - "522633": "从江县", - "522634": "雷山县", - "522635": "麻江县", - "522636": "丹寨县" - }, - "522700": { - "522701": "都匀市", - "522702": "福泉市", - "522722": "荔波县", - "522723": "贵定县", - "522725": "瓮安县", - "522726": "独山县", - "522727": "平塘县", - "522728": "罗甸县", - "522729": "长顺县", - "522730": "龙里县", - "522731": "惠水县", - "522732": "三都水族自治县" - }, - "530000": { - "530100": "昆明市", - "530300": "曲靖市", - "530400": "玉溪市", - "530500": "保山市", - "530600": "昭通市", - "530700": "丽江市", - "530800": "普洱市", - "530900": "临沧市", - "532300": "楚雄彝族自治州", - "532500": "红河哈尼族彝族自治州", - "532600": "文山壮族苗族自治州", - "532800": "西双版纳傣族自治州", - "532900": "大理白族自治州", - "533100": "德宏傣族景颇族自治州", - "533300": "怒江傈僳族自治州", - "533400": "迪庆藏族自治州" - }, - "530100": { - "530101": "市辖区", - "530102": "五华区", - "530103": "盘龙区", - "530111": "官渡区", - "530112": "西山区", - "530113": "东川区", - "530114": "呈贡区", - "530115": "晋宁区", - "530124": "富民县", - "530125": "宜良县", - "530126": "石林彝族自治县", - "530127": "嵩明县", - "530128": "禄劝彝族苗族自治县", - "530129": "寻甸回族彝族自治县", - "530181": "安宁市" - }, - "530300": { - "530301": "市辖区", - "530302": "麒麟区", - "530303": "沾益区", - "530304": "马龙区", - "530322": "陆良县", - "530323": "师宗县", - "530324": "罗平县", - "530325": "富源县", - "530326": "会泽县", - "530381": "宣威市" - }, - "530400": { - "530401": "市辖区", - "530402": "红塔区", - "530403": "江川区", - "530422": "澄江县", - "530423": "通海县", - "530424": "华宁县", - "530425": "易门县", - "530426": "峨山彝族自治县", - "530427": "新平彝族傣族自治县", - "530428": "元江哈尼族彝族傣族自治县" - }, - "530500": {"530501": "市辖区", "530502": "隆阳区", "530521": "施甸县", "530523": "龙陵县", "530524": "昌宁县", "530581": "腾冲市"}, - "530600": { - "530601": "市辖区", - "530602": "昭阳区", - "530621": "鲁甸县", - "530622": "巧家县", - "530623": "盐津县", - "530624": "大关县", - "530625": "永善县", - "530626": "绥江县", - "530627": "镇雄县", - "530628": "彝良县", - "530629": "威信县", - "530681": "水富市" - }, - "530700": { - "530701": "市辖区", - "530702": "古城区", - "530721": "玉龙纳西族自治县", - "530722": "永胜县", - "530723": "华坪县", - "530724": "宁蒗彝族自治县" - }, - "530800": { - "530801": "市辖区", - "530802": "思茅区", - "530821": "宁洱哈尼族彝族自治县", - "530822": "墨江哈尼族自治县", - "530823": "景东彝族自治县", - "530824": "景谷傣族彝族自治县", - "530825": "镇沅彝族哈尼族拉祜族自治县", - "530826": "江城哈尼族彝族自治县", - "530827": "孟连傣族拉祜族佤族自治县", - "530828": "澜沧拉祜族自治县", - "530829": "西盟佤族自治县" - }, - "530900": { - "530901": "市辖区", - "530902": "临翔区", - "530921": "凤庆县", - "530922": "云县", - "530923": "永德县", - "530924": "镇康县", - "530925": "双江拉祜族佤族布朗族傣族自治县", - "530926": "耿马傣族佤族自治县", - "530927": "沧源佤族自治县" - }, - "532300": { - "532301": "楚雄市", - "532322": "双柏县", - "532323": "牟定县", - "532324": "南华县", - "532325": "姚安县", - "532326": "大姚县", - "532327": "永仁县", - "532328": "元谋县", - "532329": "武定县", - "532331": "禄丰县" - }, - "532500": { - "532501": "个旧市", - "532502": "开远市", - "532503": "蒙自市", - "532504": "弥勒市", - "532523": "屏边苗族自治县", - "532524": "建水县", - "532525": "石屏县", - "532527": "泸西县", - "532528": "元阳县", - "532529": "红河县", - "532530": "金平苗族瑶族傣族自治县", - "532531": "绿春县", - "532532": "河口瑶族自治县" - }, - "532600": { - "532601": "文山市", - "532622": "砚山县", - "532623": "西畴县", - "532624": "麻栗坡县", - "532625": "马关县", - "532626": "丘北县", - "532627": "广南县", - "532628": "富宁县" - }, - "532800": {"532801": "景洪市", "532822": "勐海县", "532823": "勐腊县"}, - "532900": { - "532901": "大理市", - "532922": "漾濞彝族自治县", - "532923": "祥云县", - "532924": "宾川县", - "532925": "弥渡县", - "532926": "南涧彝族自治县", - "532927": "巍山彝族回族自治县", - "532928": "永平县", - "532929": "云龙县", - "532930": "洱源县", - "532931": "剑川县", - "532932": "鹤庆县" - }, - "533100": {"533102": "瑞丽市", "533103": "芒市", "533122": "梁河县", "533123": "盈江县", "533124": "陇川县"}, - "533300": {"533301": "泸水市", "533323": "福贡县", "533324": "贡山独龙族怒族自治县", "533325": "兰坪白族普米族自治县"}, - "533400": {"533401": "香格里拉市", "533422": "德钦县", "533423": "维西傈僳族自治县"}, - "540000": { - "540100": "拉萨市", - "540200": "日喀则市", - "540300": "昌都市", - "540400": "林芝市", - "540500": "山南市", - "540600": "那曲市", - "542500": "阿里地区" - }, - "540100": { - "540101": "市辖区", - "540102": "城关区", - "540103": "堆龙德庆区", - "540104": "达孜区", - "540121": "林周县", - "540122": "当雄县", - "540123": "尼木县", - "540124": "曲水县", - "540127": "墨竹工卡县", - "540171": "格尔木藏青工业园区", - "540172": "拉萨经济技术开发区", - "540173": "西藏文化旅游创意园区", - "540174": "达孜工业园区" - }, - "540200": { - "540202": "桑珠孜区", - "540221": "南木林县", - "540222": "江孜县", - "540223": "定日县", - "540224": "萨迦县", - "540225": "拉孜县", - "540226": "昂仁县", - "540227": "谢通门县", - "540228": "白朗县", - "540229": "仁布县", - "540230": "康马县", - "540231": "定结县", - "540232": "仲巴县", - "540233": "亚东县", - "540234": "吉隆县", - "540235": "聂拉木县", - "540236": "萨嘎县", - "540237": "岗巴县" - }, - "540300": { - "540302": "卡若区", - "540321": "江达县", - "540322": "贡觉县", - "540323": "类乌齐县", - "540324": "丁青县", - "540325": "察雅县", - "540326": "八宿县", - "540327": "左贡县", - "540328": "芒康县", - "540329": "洛隆县", - "540330": "边坝县" - }, - "540400": { - "540402": "巴宜区", - "540421": "工布江达县", - "540422": "米林县", - "540423": "墨脱县", - "540424": "波密县", - "540425": "察隅县", - "540426": "朗县" - }, - "540500": { - "540501": "市辖区", - "540502": "乃东区", - "540521": "扎囊县", - "540522": "贡嘎县", - "540523": "桑日县", - "540524": "琼结县", - "540525": "曲松县", - "540526": "措美县", - "540527": "洛扎县", - "540528": "加查县", - "540529": "隆子县", - "540530": "错那县", - "540531": "浪卡子县" - }, - "540600": { - "540602": "色尼区", - "540621": "嘉黎县", - "540622": "比如县", - "540623": "聂荣县", - "540624": "安多县", - "540625": "申扎县", - "540626": "索县", - "540627": "班戈县", - "540628": "巴青县", - "540629": "尼玛县", - "540630": "双湖县" - }, - "542500": { - "542521": "普兰县", - "542522": "札达县", - "542523": "噶尔县", - "542524": "日土县", - "542525": "革吉县", - "542526": "改则县", - "542527": "措勤县" - }, - "610000": { - "610100": "西安市", - "610200": "铜川市", - "610300": "宝鸡市", - "610400": "咸阳市", - "610500": "渭南市", - "610600": "延安市", - "610700": "汉中市", - "610800": "榆林市", - "610900": "安康市", - "611000": "商洛市" - }, - "610100": { - "610101": "市辖区", - "610102": "新城区", - "610103": "碑林区", - "610104": "莲湖区", - "610111": "灞桥区", - "610112": "未央区", - "610113": "雁塔区", - "610114": "阎良区", - "610115": "临潼区", - "610116": "长安区", - "610117": "高陵区", - "610118": "鄠邑区", - "610122": "蓝田县", - "610124": "周至县" - }, - "610200": {"610201": "市辖区", "610202": "王益区", "610203": "印台区", "610204": "耀州区", "610222": "宜君县"}, - "610300": { - "610301": "市辖区", - "610302": "渭滨区", - "610303": "金台区", - "610304": "陈仓区", - "610322": "凤翔县", - "610323": "岐山县", - "610324": "扶风县", - "610326": "眉县", - "610327": "陇县", - "610328": "千阳县", - "610329": "麟游县", - "610330": "凤县", - "610331": "太白县" - }, - "610400": { - "610401": "市辖区", - "610402": "秦都区", - "610403": "杨陵区", - "610404": "渭城区", - "610422": "三原县", - "610423": "泾阳县", - "610424": "乾县", - "610425": "礼泉县", - "610426": "永寿县", - "610428": "长武县", - "610429": "旬邑县", - "610430": "淳化县", - "610431": "武功县", - "610481": "兴平市", - "610482": "彬州市" - }, - "610500": { - "610501": "市辖区", - "610502": "临渭区", - "610503": "华州区", - "610522": "潼关县", - "610523": "大荔县", - "610524": "合阳县", - "610525": "澄城县", - "610526": "蒲城县", - "610527": "白水县", - "610528": "富平县", - "610581": "韩城市", - "610582": "华阴市" - }, - "610600": { - "610601": "市辖区", - "610602": "宝塔区", - "610603": "安塞区", - "610621": "延长县", - "610622": "延川县", - "610625": "志丹县", - "610626": "吴起县", - "610627": "甘泉县", - "610628": "富县", - "610629": "洛川县", - "610630": "宜川县", - "610631": "黄龙县", - "610632": "黄陵县", - "610681": "子长市" - }, - "610700": { - "610701": "市辖区", - "610702": "汉台区", - "610703": "南郑区", - "610722": "城固县", - "610723": "洋县", - "610724": "西乡县", - "610725": "勉县", - "610726": "宁强县", - "610727": "略阳县", - "610728": "镇巴县", - "610729": "留坝县", - "610730": "佛坪县" - }, - "610800": { - "610801": "市辖区", - "610802": "榆阳区", - "610803": "横山区", - "610822": "府谷县", - "610824": "靖边县", - "610825": "定边县", - "610826": "绥德县", - "610827": "米脂县", - "610828": "佳县", - "610829": "吴堡县", - "610830": "清涧县", - "610831": "子洲县", - "610881": "神木市" - }, - "610900": { - "610901": "市辖区", - "610902": "汉滨区", - "610921": "汉阴县", - "610922": "石泉县", - "610923": "宁陕县", - "610924": "紫阳县", - "610925": "岚皋县", - "610926": "平利县", - "610927": "镇坪县", - "610928": "旬阳县", - "610929": "白河县" - }, - "611000": { - "611001": "市辖区", - "611002": "商州区", - "611021": "洛南县", - "611022": "丹凤县", - "611023": "商南县", - "611024": "山阳县", - "611025": "镇安县", - "611026": "柞水县" - }, - "620000": { - "620100": "兰州市", - "620200": "嘉峪关市", - "620300": "金昌市", - "620400": "白银市", - "620500": "天水市", - "620600": "武威市", - "620700": "张掖市", - "620800": "平凉市", - "620900": "酒泉市", - "621000": "庆阳市", - "621100": "定西市", - "621200": "陇南市", - "622900": "临夏回族自治州", - "623000": "甘南藏族自治州" - }, - "620100": { - "620101": "市辖区", - "620102": "城关区", - "620103": "七里河区", - "620104": "西固区", - "620105": "安宁区", - "620111": "红古区", - "620121": "永登县", - "620122": "皋兰县", - "620123": "榆中县", - "620171": "兰州新区" - }, - "620200": {"620201": "市辖区"}, - "620300": {"620301": "市辖区", "620302": "金川区", "620321": "永昌县"}, - "620400": {"620401": "市辖区", "620402": "白银区", "620403": "平川区", "620421": "靖远县", "620422": "会宁县", "620423": "景泰县"}, - "620500": { - "620501": "市辖区", - "620502": "秦州区", - "620503": "麦积区", - "620521": "清水县", - "620522": "秦安县", - "620523": "甘谷县", - "620524": "武山县", - "620525": "张家川回族自治县" - }, - "620600": {"620601": "市辖区", "620602": "凉州区", "620621": "民勤县", "620622": "古浪县", "620623": "天祝藏族自治县"}, - "620700": { - "620701": "市辖区", - "620702": "甘州区", - "620721": "肃南裕固族自治县", - "620722": "民乐县", - "620723": "临泽县", - "620724": "高台县", - "620725": "山丹县" - }, - "620800": { - "620801": "市辖区", - "620802": "崆峒区", - "620821": "泾川县", - "620822": "灵台县", - "620823": "崇信县", - "620825": "庄浪县", - "620826": "静宁县", - "620881": "华亭市" - }, - "620900": { - "620901": "市辖区", - "620902": "肃州区", - "620921": "金塔县", - "620922": "瓜州县", - "620923": "肃北蒙古族自治县", - "620924": "阿克塞哈萨克族自治县", - "620981": "玉门市", - "620982": "敦煌市" - }, - "621000": { - "621001": "市辖区", - "621002": "西峰区", - "621021": "庆城县", - "621022": "环县", - "621023": "华池县", - "621024": "合水县", - "621025": "正宁县", - "621026": "宁县", - "621027": "镇原县" - }, - "621100": { - "621101": "市辖区", - "621102": "安定区", - "621121": "通渭县", - "621122": "陇西县", - "621123": "渭源县", - "621124": "临洮县", - "621125": "漳县", - "621126": "岷县" - }, - "621200": { - "621201": "市辖区", - "621202": "武都区", - "621221": "成县", - "621222": "文县", - "621223": "宕昌县", - "621224": "康县", - "621225": "西和县", - "621226": "礼县", - "621227": "徽县", - "621228": "两当县" - }, - "622900": { - "622901": "临夏市", - "622921": "临夏县", - "622922": "康乐县", - "622923": "永靖县", - "622924": "广河县", - "622925": "和政县", - "622926": "东乡族自治县", - "622927": "积石山保安族东乡族撒拉族自治县" - }, - "623000": { - "623001": "合作市", - "623021": "临潭县", - "623022": "卓尼县", - "623023": "舟曲县", - "623024": "迭部县", - "623025": "玛曲县", - "623026": "碌曲县", - "623027": "夏河县" - }, - "630000": { - "630100": "西宁市", - "630200": "海东市", - "632200": "海北藏族自治州", - "632300": "黄南藏族自治州", - "632500": "海南藏族自治州", - "632600": "果洛藏族自治州", - "632700": "玉树藏族自治州", - "632800": "海西蒙古族藏族自治州" - }, - "630100": { - "630101": "市辖区", - "630102": "城东区", - "630103": "城中区", - "630104": "城西区", - "630105": "城北区", - "630121": "大通回族土族自治县", - "630122": "湟中县", - "630123": "湟源县" - }, - "630200": { - "630202": "乐都区", - "630203": "平安区", - "630222": "民和回族土族自治县", - "630223": "互助土族自治县", - "630224": "化隆回族自治县", - "630225": "循化撒拉族自治县" - }, - "632200": {"632221": "门源回族自治县", "632222": "祁连县", "632223": "海晏县", "632224": "刚察县"}, - "632300": {"632321": "同仁县", "632322": "尖扎县", "632323": "泽库县", "632324": "河南蒙古族自治县"}, - "632500": {"632521": "共和县", "632522": "同德县", "632523": "贵德县", "632524": "兴海县", "632525": "贵南县"}, - "632600": {"632621": "玛沁县", "632622": "班玛县", "632623": "甘德县", "632624": "达日县", "632625": "久治县", "632626": "玛多县"}, - "632700": {"632701": "玉树市", "632722": "杂多县", "632723": "称多县", "632724": "治多县", "632725": "囊谦县", "632726": "曲麻莱县"}, - "632800": { - "632801": "格尔木市", - "632802": "德令哈市", - "632803": "茫崖市", - "632821": "乌兰县", - "632822": "都兰县", - "632823": "天峻县", - "632857": "大柴旦行政委员会" - }, - "640000": {"640100": "银川市", "640200": "石嘴山市", "640300": "吴忠市", "640400": "固原市", "640500": "中卫市"}, - "640100": { - "640101": "市辖区", - "640104": "兴庆区", - "640105": "西夏区", - "640106": "金凤区", - "640121": "永宁县", - "640122": "贺兰县", - "640181": "灵武市" - }, - "640200": {"640201": "市辖区", "640202": "大武口区", "640205": "惠农区", "640221": "平罗县"}, - "640300": {"640301": "市辖区", "640302": "利通区", "640303": "红寺堡区", "640323": "盐池县", "640324": "同心县", "640381": "青铜峡市"}, - "640400": {"640401": "市辖区", "640402": "原州区", "640422": "西吉县", "640423": "隆德县", "640424": "泾源县", "640425": "彭阳县"}, - "640500": {"640501": "市辖区", "640502": "沙坡头区", "640521": "中宁县", "640522": "海原县"}, - "650000": { - "650100": "乌鲁木齐市", - "650200": "克拉玛依市", - "650400": "吐鲁番市", - "650500": "哈密市", - "652300": "昌吉回族自治州", - "652700": "博尔塔拉蒙古自治州", - "652800": "巴音郭楞蒙古自治州", - "652900": "阿克苏地区", - "653000": "克孜勒苏柯尔克孜自治州", - "653100": "喀什地区", - "653200": "和田地区", - "654000": "伊犁哈萨克自治州", - "654200": "塔城地区", - "654300": "阿勒泰地区", - "659000": "自治区直辖县级行政区划" - }, - "650100": { - "650101": "市辖区", - "650102": "天山区", - "650103": "沙依巴克区", - "650104": "新市区", - "650105": "水磨沟区", - "650106": "头屯河区", - "650107": "达坂城区", - "650109": "米东区", - "650121": "乌鲁木齐县" - }, - "650200": {"650201": "市辖区", "650202": "独山子区", "650203": "克拉玛依区", "650204": "白碱滩区", "650205": "乌尔禾区"}, - "650400": {"650402": "高昌区", "650421": "鄯善县", "650422": "托克逊县"}, - "650500": {"650502": "伊州区", "650521": "巴里坤哈萨克自治县", "650522": "伊吾县"}, - "652300": { - "652301": "昌吉市", - "652302": "阜康市", - "652323": "呼图壁县", - "652324": "玛纳斯县", - "652325": "奇台县", - "652327": "吉木萨尔县", - "652328": "木垒哈萨克自治县" - }, - "652700": {"652701": "博乐市", "652702": "阿拉山口市", "652722": "精河县", "652723": "温泉县"}, - "652800": { - "652801": "库尔勒市", - "652822": "轮台县", - "652823": "尉犁县", - "652824": "若羌县", - "652825": "且末县", - "652826": "焉耆回族自治县", - "652827": "和静县", - "652828": "和硕县", - "652829": "博湖县", - "652871": "库尔勒经济技术开发区" - }, - "652900": { - "652901": "阿克苏市", - "652922": "温宿县", - "652923": "库车县", - "652924": "沙雅县", - "652925": "新和县", - "652926": "拜城县", - "652927": "乌什县", - "652928": "阿瓦提县", - "652929": "柯坪县" - }, - "653000": {"653001": "阿图什市", "653022": "阿克陶县", "653023": "阿合奇县", "653024": "乌恰县"}, - "653100": { - "653101": "喀什市", - "653121": "疏附县", - "653122": "疏勒县", - "653123": "英吉沙县", - "653124": "泽普县", - "653125": "莎车县", - "653126": "叶城县", - "653127": "麦盖提县", - "653128": "岳普湖县", - "653129": "伽师县", - "653130": "巴楚县", - "653131": "塔什库尔干塔吉克自治县" - }, - "653200": { - "653201": "和田市", - "653221": "和田县", - "653222": "墨玉县", - "653223": "皮山县", - "653224": "洛浦县", - "653225": "策勒县", - "653226": "于田县", - "653227": "民丰县" - }, - "654000": { - "654002": "伊宁市", - "654003": "奎屯市", - "654004": "霍尔果斯市", - "654021": "伊宁县", - "654022": "察布查尔锡伯自治县", - "654023": "霍城县", - "654024": "巩留县", - "654025": "新源县", - "654026": "昭苏县", - "654027": "特克斯县", - "654028": "尼勒克县" - }, - "654200": { - "654201": "塔城市", - "654202": "乌苏市", - "654221": "额敏县", - "654223": "沙湾县", - "654224": "托里县", - "654225": "裕民县", - "654226": "和布克赛尔蒙古自治县" - }, - "654300": { - "654301": "阿勒泰市", - "654321": "布尔津县", - "654322": "富蕴县", - "654323": "福海县", - "654324": "哈巴河县", - "654325": "青河县", - "654326": "吉木乃县" - }, - "659000": {"659001": "石河子市", "659002": "阿拉尔市", "659003": "图木舒克市", "659004": "五家渠市", "659006": "铁门关市"}, - "710000": { - "710100": "台北市", - "710200": "高雄市", - "710300": "基隆市", - "710400": "台中市", - "710500": "台南市", - "710600": "新竹市", - "710700": "嘉义市" - }, - "710100": { - "710101": "内湖区", - "710102": "南港区", - "710103": "中正区", - "710104": "松山区", - "710105": "信义区", - "710106": "大安区", - "710107": "中山区", - "710108": "文山区", - "710109": "大同区", - "710110": "万华区", - "710111": "士林区", - "710112": "北投区" - }, - "710200": { - "710201": "新兴区", - "710202": "前金区", - "710203": "芩雅区", - "710204": "盐埕区", - "710205": "鼓山区", - "710206": "旗津区", - "710207": "前镇区", - "710208": "三民区", - "710209": "左营区", - "710210": "楠梓区", - "710211": "小港区" - }, - "710300": {"710301": "仁爱区", "710302": "信义区", "710303": "中正区", "710304": "暖暖区", "710305": "安乐区", "710307": "七堵区"}, - "710400": { - "710301": "中区", - "710302": "东区", - "710303": "南区", - "710304": "西区", - "710305": "北区", - "710306": "北屯区", - "710307": "西屯区", - "710308": "南屯区" - }, - "710500": {"710501": "中西区", "710502": "东区", "710503": "南区", "710504": "北区", "710505": "安平区", "710506": "安南区"}, - "710600": {"710601": "东区", "710602": "北区", "710603": "香山区"}, - "710700": {"710701": "东区", "710702": "西区"}, - "810000": { - "810001": "中西區", - "810002": "灣仔區", - "810003": "東區", - "810004": "南區", - "810005": "油尖旺區", - "810006": "深水埗區", - "810007": "九龍城區", - "810008": "黃大仙區", - "810009": "觀塘區", - "810010": "荃灣區", - "810011": "屯門區", - "810012": "元朗區", - "810013": "北區", - "810014": "大埔區", - "810015": "西貢區", - "810016": "沙田區", - "810017": "葵青區", - "810018": "離島區" - }, - "820000": { - "820001": "花地瑪堂區", - "820002": "花王堂區", - "820003": "望德堂區", - "820004": "大堂區", - "820005": "風順堂區", - "820006": "嘉模堂區", - "820007": "路氹填海區", - "820008": "聖方濟各堂區" + '86': { + '110000': '北京市', + '120000': '天津市', + '130000': '河北省', + '140000': '山西省', + '150000': '内蒙古自治区', + '210000': '辽宁省', + '220000': '吉林省', + '230000': '黑龙江省', + '310000': '上海市', + '320000': '江苏省', + '330000': '浙江省', + '340000': '安徽省', + '350000': '福建省', + '360000': '江西省', + '370000': '山东省', + '410000': '河南省', + '420000': '湖北省', + '430000': '湖南省', + '440000': '广东省', + '450000': '广西壮族自治区', + '460000': '海南省', + '500000': '重庆市', + '510000': '四川省', + '520000': '贵州省', + '530000': '云南省', + '540000': '西藏自治区', + '610000': '陕西省', + '620000': '甘肃省', + '630000': '青海省', + '640000': '宁夏回族自治区', + '650000': '新疆维吾尔自治区', + '710000': '台湾省', + '810000': '香港特别行政区', + '820000': '澳门特别行政区' + }, + '110000': {'110100': '市辖区'}, + '110100': { + '110101': '东城区', + '110102': '西城区', + '110105': '朝阳区', + '110106': '丰台区', + '110107': '石景山区', + '110108': '海淀区', + '110109': '门头沟区', + '110111': '房山区', + '110112': '通州区', + '110113': '顺义区', + '110114': '昌平区', + '110115': '大兴区', + '110116': '怀柔区', + '110117': '平谷区', + '110118': '密云区', + '110119': '延庆区' + }, + '120000': {'120100': '市辖区'}, + '120100': { + '120101': '和平区', + '120102': '河东区', + '120103': '河西区', + '120104': '南开区', + '120105': '河北区', + '120106': '红桥区', + '120110': '东丽区', + '120111': '西青区', + '120112': '津南区', + '120113': '北辰区', + '120114': '武清区', + '120115': '宝坻区', + '120116': '滨海新区', + '120117': '宁河区', + '120118': '静海区', + '120119': '蓟州区' + }, + '130000': { + '130100': '石家庄市', + '130200': '唐山市', + '130300': '秦皇岛市', + '130400': '邯郸市', + '130500': '邢台市', + '130600': '保定市', + '130700': '张家口市', + '130800': '承德市', + '130900': '沧州市', + '131000': '廊坊市', + '131100': '衡水市' + }, + '130100': { + '130101': '市辖区', + '130102': '长安区', + '130104': '桥西区', + '130105': '新华区', + '130107': '井陉矿区', + '130108': '裕华区', + '130109': '藁城区', + '130110': '鹿泉区', + '130111': '栾城区', + '130121': '井陉县', + '130123': '正定县', + '130125': '行唐县', + '130126': '灵寿县', + '130127': '高邑县', + '130128': '深泽县', + '130129': '赞皇县', + '130130': '无极县', + '130131': '平山县', + '130132': '元氏县', + '130133': '赵县', + '130171': '石家庄高新技术产业开发区', + '130172': '石家庄循环化工园区', + '130181': '辛集市', + '130183': '晋州市', + '130184': '新乐市' + }, + '130200': { + '130201': '市辖区', + '130202': '路南区', + '130203': '路北区', + '130204': '古冶区', + '130205': '开平区', + '130207': '丰南区', + '130208': '丰润区', + '130209': '曹妃甸区', + '130224': '滦南县', + '130225': '乐亭县', + '130227': '迁西县', + '130229': '玉田县', + '130271': '河北唐山芦台经济开发区', + '130272': '唐山市汉沽管理区', + '130273': '唐山高新技术产业开发区', + '130274': '河北唐山海港经济开发区', + '130281': '遵化市', + '130283': '迁安市', + '130284': '滦州市' + }, + '130300': { + '130301': '市辖区', + '130302': '海港区', + '130303': '山海关区', + '130304': '北戴河区', + '130306': '抚宁区', + '130321': '青龙满族自治县', + '130322': '昌黎县', + '130324': '卢龙县', + '130371': '秦皇岛市经济技术开发区', + '130372': '北戴河新区' + }, + '130400': { + '130401': '市辖区', + '130402': '邯山区', + '130403': '丛台区', + '130404': '复兴区', + '130406': '峰峰矿区', + '130407': '肥乡区', + '130408': '永年区', + '130423': '临漳县', + '130424': '成安县', + '130425': '大名县', + '130426': '涉县', + '130427': '磁县', + '130430': '邱县', + '130431': '鸡泽县', + '130432': '广平县', + '130433': '馆陶县', + '130434': '魏县', + '130435': '曲周县', + '130471': '邯郸经济技术开发区', + '130473': '邯郸冀南新区', + '130481': '武安市' + }, + '130500': { + '130501': '市辖区', + '130502': '桥东区', + '130503': '桥西区', + '130521': '邢台县', + '130522': '临城县', + '130523': '内丘县', + '130524': '柏乡县', + '130525': '隆尧县', + '130526': '任县', + '130527': '南和县', + '130528': '宁晋县', + '130529': '巨鹿县', + '130530': '新河县', + '130531': '广宗县', + '130532': '平乡县', + '130533': '威县', + '130534': '清河县', + '130535': '临西县', + '130571': '河北邢台经济开发区', + '130581': '南宫市', + '130582': '沙河市' + }, + '130600': { + '130601': '市辖区', + '130602': '竞秀区', + '130606': '莲池区', + '130607': '满城区', + '130608': '清苑区', + '130609': '徐水区', + '130623': '涞水县', + '130624': '阜平县', + '130626': '定兴县', + '130627': '唐县', + '130628': '高阳县', + '130629': '容城县', + '130630': '涞源县', + '130631': '望都县', + '130632': '安新县', + '130633': '易县', + '130634': '曲阳县', + '130635': '蠡县', + '130636': '顺平县', + '130637': '博野县', + '130638': '雄县', + '130671': '保定高新技术产业开发区', + '130672': '保定白沟新城', + '130681': '涿州市', + '130682': '定州市', + '130683': '安国市', + '130684': '高碑店市' + }, + '130700': { + '130701': '市辖区', + '130702': '桥东区', + '130703': '桥西区', + '130705': '宣化区', + '130706': '下花园区', + '130708': '万全区', + '130709': '崇礼区', + '130722': '张北县', + '130723': '康保县', + '130724': '沽源县', + '130725': '尚义县', + '130726': '蔚县', + '130727': '阳原县', + '130728': '怀安县', + '130730': '怀来县', + '130731': '涿鹿县', + '130732': '赤城县', + '130771': '张家口经济开发区', + '130772': '张家口市察北管理区', + '130773': '张家口市塞北管理区' + }, + '130800': { + '130801': '市辖区', + '130802': '双桥区', + '130803': '双滦区', + '130804': '鹰手营子矿区', + '130821': '承德县', + '130822': '兴隆县', + '130824': '滦平县', + '130825': '隆化县', + '130826': '丰宁满族自治县', + '130827': '宽城满族自治县', + '130828': '围场满族蒙古族自治县', + '130871': '承德高新技术产业开发区', + '130881': '平泉市' + }, + '130900': { + '130901': '市辖区', + '130902': '新华区', + '130903': '运河区', + '130921': '沧县', + '130922': '青县', + '130923': '东光县', + '130924': '海兴县', + '130925': '盐山县', + '130926': '肃宁县', + '130927': '南皮县', + '130928': '吴桥县', + '130929': '献县', + '130930': '孟村回族自治县', + '130971': '河北沧州经济开发区', + '130972': '沧州高新技术产业开发区', + '130973': '沧州渤海新区', + '130981': '泊头市', + '130982': '任丘市', + '130983': '黄骅市', + '130984': '河间市' + }, + '131000': { + '131001': '市辖区', + '131002': '安次区', + '131003': '广阳区', + '131022': '固安县', + '131023': '永清县', + '131024': '香河县', + '131025': '大城县', + '131026': '文安县', + '131028': '大厂回族自治县', + '131071': '廊坊经济技术开发区', + '131081': '霸州市', + '131082': '三河市' + }, + '131100': { + '131101': '市辖区', + '131102': '桃城区', + '131103': '冀州区', + '131121': '枣强县', + '131122': '武邑县', + '131123': '武强县', + '131124': '饶阳县', + '131125': '安平县', + '131126': '故城县', + '131127': '景县', + '131128': '阜城县', + '131171': '河北衡水高新技术产业开发区', + '131172': '衡水滨湖新区', + '131182': '深州市' + }, + '140000': { + '140100': '太原市', + '140200': '大同市', + '140300': '阳泉市', + '140400': '长治市', + '140500': '晋城市', + '140600': '朔州市', + '140700': '晋中市', + '140800': '运城市', + '140900': '忻州市', + '141000': '临汾市', + '141100': '吕梁市' + }, + '140100': { + '140101': '市辖区', + '140105': '小店区', + '140106': '迎泽区', + '140107': '杏花岭区', + '140108': '尖草坪区', + '140109': '万柏林区', + '140110': '晋源区', + '140121': '清徐县', + '140122': '阳曲县', + '140123': '娄烦县', + '140171': '山西转型综合改革示范区', + '140181': '古交市' + }, + '140200': { + '140201': '市辖区', + '140212': '新荣区', + '140213': '平城区', + '140214': '云冈区', + '140215': '云州区', + '140221': '阳高县', + '140222': '天镇县', + '140223': '广灵县', + '140224': '灵丘县', + '140225': '浑源县', + '140226': '左云县', + '140271': '山西大同经济开发区' + }, + '140300': {'140301': '市辖区', '140302': '城区', '140303': '矿区', '140311': '郊区', '140321': '平定县', '140322': '盂县'}, + '140400': { + '140401': '市辖区', + '140403': '潞州区', + '140404': '上党区', + '140405': '屯留区', + '140406': '潞城区', + '140423': '襄垣县', + '140425': '平顺县', + '140426': '黎城县', + '140427': '壶关县', + '140428': '长子县', + '140429': '武乡县', + '140430': '沁县', + '140431': '沁源县', + '140471': '山西长治高新技术产业园区' + }, + '140500': { + '140501': '市辖区', + '140502': '城区', + '140521': '沁水县', + '140522': '阳城县', + '140524': '陵川县', + '140525': '泽州县', + '140581': '高平市' + }, + '140600': { + '140601': '市辖区', + '140602': '朔城区', + '140603': '平鲁区', + '140621': '山阴县', + '140622': '应县', + '140623': '右玉县', + '140671': '山西朔州经济开发区', + '140681': '怀仁市' + }, + '140700': { + '140701': '市辖区', + '140702': '榆次区', + '140721': '榆社县', + '140722': '左权县', + '140723': '和顺县', + '140724': '昔阳县', + '140725': '寿阳县', + '140726': '太谷县', + '140727': '祁县', + '140728': '平遥县', + '140729': '灵石县', + '140781': '介休市' + }, + '140800': { + '140801': '市辖区', + '140802': '盐湖区', + '140821': '临猗县', + '140822': '万荣县', + '140823': '闻喜县', + '140824': '稷山县', + '140825': '新绛县', + '140826': '绛县', + '140827': '垣曲县', + '140828': '夏县', + '140829': '平陆县', + '140830': '芮城县', + '140881': '永济市', + '140882': '河津市' + }, + '140900': { + '140901': '市辖区', + '140902': '忻府区', + '140921': '定襄县', + '140922': '五台县', + '140923': '代县', + '140924': '繁峙县', + '140925': '宁武县', + '140926': '静乐县', + '140927': '神池县', + '140928': '五寨县', + '140929': '岢岚县', + '140930': '河曲县', + '140931': '保德县', + '140932': '偏关县', + '140971': '五台山风景名胜区', + '140981': '原平市' + }, + '141000': { + '141001': '市辖区', + '141002': '尧都区', + '141021': '曲沃县', + '141022': '翼城县', + '141023': '襄汾县', + '141024': '洪洞县', + '141025': '古县', + '141026': '安泽县', + '141027': '浮山县', + '141028': '吉县', + '141029': '乡宁县', + '141030': '大宁县', + '141031': '隰县', + '141032': '永和县', + '141033': '蒲县', + '141034': '汾西县', + '141081': '侯马市', + '141082': '霍州市' + }, + '141100': { + '141101': '市辖区', + '141102': '离石区', + '141121': '文水县', + '141122': '交城县', + '141123': '兴县', + '141124': '临县', + '141125': '柳林县', + '141126': '石楼县', + '141127': '岚县', + '141128': '方山县', + '141129': '中阳县', + '141130': '交口县', + '141181': '孝义市', + '141182': '汾阳市' + }, + '150000': { + '150100': '呼和浩特市', + '150200': '包头市', + '150300': '乌海市', + '150400': '赤峰市', + '150500': '通辽市', + '150600': '鄂尔多斯市', + '150700': '呼伦贝尔市', + '150800': '巴彦淖尔市', + '150900': '乌兰察布市', + '152200': '兴安盟', + '152500': '锡林郭勒盟', + '152900': '阿拉善盟' + }, + '150100': { + '150101': '市辖区', + '150102': '新城区', + '150103': '回民区', + '150104': '玉泉区', + '150105': '赛罕区', + '150121': '土默特左旗', + '150122': '托克托县', + '150123': '和林格尔县', + '150124': '清水河县', + '150125': '武川县', + '150171': '呼和浩特金海工业园区', + '150172': '呼和浩特经济技术开发区' + }, + '150200': { + '150201': '市辖区', + '150202': '东河区', + '150203': '昆都仑区', + '150204': '青山区', + '150205': '石拐区', + '150206': '白云鄂博矿区', + '150207': '九原区', + '150221': '土默特右旗', + '150222': '固阳县', + '150223': '达尔罕茂明安联合旗', + '150271': '包头稀土高新技术产业开发区' + }, + '150300': {'150301': '市辖区', '150302': '海勃湾区', '150303': '海南区', '150304': '乌达区'}, + '150400': { + '150401': '市辖区', + '150402': '红山区', + '150403': '元宝山区', + '150404': '松山区', + '150421': '阿鲁科尔沁旗', + '150422': '巴林左旗', + '150423': '巴林右旗', + '150424': '林西县', + '150425': '克什克腾旗', + '150426': '翁牛特旗', + '150428': '喀喇沁旗', + '150429': '宁城县', + '150430': '敖汉旗' + }, + '150500': { + '150501': '市辖区', + '150502': '科尔沁区', + '150521': '科尔沁左翼中旗', + '150522': '科尔沁左翼后旗', + '150523': '开鲁县', + '150524': '库伦旗', + '150525': '奈曼旗', + '150526': '扎鲁特旗', + '150571': '通辽经济技术开发区', + '150581': '霍林郭勒市' + }, + '150600': { + '150601': '市辖区', + '150602': '东胜区', + '150603': '康巴什区', + '150621': '达拉特旗', + '150622': '准格尔旗', + '150623': '鄂托克前旗', + '150624': '鄂托克旗', + '150625': '杭锦旗', + '150626': '乌审旗', + '150627': '伊金霍洛旗' + }, + '150700': { + '150701': '市辖区', + '150702': '海拉尔区', + '150703': '扎赉诺尔区', + '150721': '阿荣旗', + '150722': '莫力达瓦达斡尔族自治旗', + '150723': '鄂伦春自治旗', + '150724': '鄂温克族自治旗', + '150725': '陈巴尔虎旗', + '150726': '新巴尔虎左旗', + '150727': '新巴尔虎右旗', + '150781': '满洲里市', + '150782': '牙克石市', + '150783': '扎兰屯市', + '150784': '额尔古纳市', + '150785': '根河市' + }, + '150800': { + '150801': '市辖区', + '150802': '临河区', + '150821': '五原县', + '150822': '磴口县', + '150823': '乌拉特前旗', + '150824': '乌拉特中旗', + '150825': '乌拉特后旗', + '150826': '杭锦后旗' + }, + '150900': { + '150901': '市辖区', + '150902': '集宁区', + '150921': '卓资县', + '150922': '化德县', + '150923': '商都县', + '150924': '兴和县', + '150925': '凉城县', + '150926': '察哈尔右翼前旗', + '150927': '察哈尔右翼中旗', + '150928': '察哈尔右翼后旗', + '150929': '四子王旗', + '150981': '丰镇市' + }, + '152200': { + '152201': '乌兰浩特市', + '152202': '阿尔山市', + '152221': '科尔沁右翼前旗', + '152222': '科尔沁右翼中旗', + '152223': '扎赉特旗', + '152224': '突泉县' + }, + '152500': { + '152501': '二连浩特市', + '152502': '锡林浩特市', + '152522': '阿巴嘎旗', + '152523': '苏尼特左旗', + '152524': '苏尼特右旗', + '152525': '东乌珠穆沁旗', + '152526': '西乌珠穆沁旗', + '152527': '太仆寺旗', + '152528': '镶黄旗', + '152529': '正镶白旗', + '152530': '正蓝旗', + '152531': '多伦县', + '152571': '乌拉盖管委会' + }, + '152900': {'152921': '阿拉善左旗', '152922': '阿拉善右旗', '152923': '额济纳旗', '152971': '内蒙古阿拉善经济开发区'}, + '210000': { + '210100': '沈阳市', + '210200': '大连市', + '210300': '鞍山市', + '210400': '抚顺市', + '210500': '本溪市', + '210600': '丹东市', + '210700': '锦州市', + '210800': '营口市', + '210900': '阜新市', + '211000': '辽阳市', + '211100': '盘锦市', + '211200': '铁岭市', + '211300': '朝阳市', + '211400': '葫芦岛市' + }, + '210100': { + '210101': '市辖区', + '210102': '和平区', + '210103': '沈河区', + '210104': '大东区', + '210105': '皇姑区', + '210106': '铁西区', + '210111': '苏家屯区', + '210112': '浑南区', + '210113': '沈北新区', + '210114': '于洪区', + '210115': '辽中区', + '210123': '康平县', + '210124': '法库县', + '210181': '新民市' + }, + '210200': { + '210201': '市辖区', + '210202': '中山区', + '210203': '西岗区', + '210204': '沙河口区', + '210211': '甘井子区', + '210212': '旅顺口区', + '210213': '金州区', + '210214': '普兰店区', + '210224': '长海县', + '210281': '瓦房店市', + '210283': '庄河市' + }, + '210300': { + '210301': '市辖区', + '210302': '铁东区', + '210303': '铁西区', + '210304': '立山区', + '210311': '千山区', + '210321': '台安县', + '210323': '岫岩满族自治县', + '210381': '海城市' + }, + '210400': { + '210401': '市辖区', + '210402': '新抚区', + '210403': '东洲区', + '210404': '望花区', + '210411': '顺城区', + '210421': '抚顺县', + '210422': '新宾满族自治县', + '210423': '清原满族自治县' + }, + '210500': { + '210501': '市辖区', + '210502': '平山区', + '210503': '溪湖区', + '210504': '明山区', + '210505': '南芬区', + '210521': '本溪满族自治县', + '210522': '桓仁满族自治县' + }, + '210600': { + '210601': '市辖区', + '210602': '元宝区', + '210603': '振兴区', + '210604': '振安区', + '210624': '宽甸满族自治县', + '210681': '东港市', + '210682': '凤城市' + }, + '210700': { + '210701': '市辖区', + '210702': '古塔区', + '210703': '凌河区', + '210711': '太和区', + '210726': '黑山县', + '210727': '义县', + '210781': '凌海市', + '210782': '北镇市' + }, + '210800': { + '210801': '市辖区', + '210802': '站前区', + '210803': '西市区', + '210804': '鲅鱼圈区', + '210811': '老边区', + '210881': '盖州市', + '210882': '大石桥市' + }, + '210900': { + '210901': '市辖区', + '210902': '海州区', + '210903': '新邱区', + '210904': '太平区', + '210905': '清河门区', + '210911': '细河区', + '210921': '阜新蒙古族自治县', + '210922': '彰武县' + }, + '211000': { + '211001': '市辖区', + '211002': '白塔区', + '211003': '文圣区', + '211004': '宏伟区', + '211005': '弓长岭区', + '211011': '太子河区', + '211021': '辽阳县', + '211081': '灯塔市' + }, + '211100': {'211101': '市辖区', '211102': '双台子区', '211103': '兴隆台区', '211104': '大洼区', '211122': '盘山县'}, + '211200': { + '211201': '市辖区', + '211202': '银州区', + '211204': '清河区', + '211221': '铁岭县', + '211223': '西丰县', + '211224': '昌图县', + '211281': '调兵山市', + '211282': '开原市' + }, + '211300': { + '211301': '市辖区', + '211302': '双塔区', + '211303': '龙城区', + '211321': '朝阳县', + '211322': '建平县', + '211324': '喀喇沁左翼蒙古族自治县', + '211381': '北票市', + '211382': '凌源市' + }, + '211400': { + '211401': '市辖区', + '211402': '连山区', + '211403': '龙港区', + '211404': '南票区', + '211421': '绥中县', + '211422': '建昌县', + '211481': '兴城市' + }, + '220000': { + '220100': '长春市', + '220200': '吉林市', + '220300': '四平市', + '220400': '辽源市', + '220500': '通化市', + '220600': '白山市', + '220700': '松原市', + '220800': '白城市', + '222400': '延边朝鲜族自治州' + }, + '220100': { + '220101': '市辖区', + '220102': '南关区', + '220103': '宽城区', + '220104': '朝阳区', + '220105': '二道区', + '220106': '绿园区', + '220112': '双阳区', + '220113': '九台区', + '220122': '农安县', + '220171': '长春经济技术开发区', + '220172': '长春净月高新技术产业开发区', + '220173': '长春高新技术产业开发区', + '220174': '长春汽车经济技术开发区', + '220182': '榆树市', + '220183': '德惠市' + }, + '220200': { + '220201': '市辖区', + '220202': '昌邑区', + '220203': '龙潭区', + '220204': '船营区', + '220211': '丰满区', + '220221': '永吉县', + '220271': '吉林经济开发区', + '220272': '吉林高新技术产业开发区', + '220273': '吉林中国新加坡食品区', + '220281': '蛟河市', + '220282': '桦甸市', + '220283': '舒兰市', + '220284': '磐石市' + }, + '220300': { + '220301': '市辖区', + '220302': '铁西区', + '220303': '铁东区', + '220322': '梨树县', + '220323': '伊通满族自治县', + '220381': '公主岭市', + '220382': '双辽市' + }, + '220400': {'220401': '市辖区', '220402': '龙山区', '220403': '西安区', '220421': '东丰县', '220422': '东辽县'}, + '220500': { + '220501': '市辖区', + '220502': '东昌区', + '220503': '二道江区', + '220521': '通化县', + '220523': '辉南县', + '220524': '柳河县', + '220581': '梅河口市', + '220582': '集安市' + }, + '220600': { + '220601': '市辖区', + '220602': '浑江区', + '220605': '江源区', + '220621': '抚松县', + '220622': '靖宇县', + '220623': '长白朝鲜族自治县', + '220681': '临江市' + }, + '220700': { + '220701': '市辖区', + '220702': '宁江区', + '220721': '前郭尔罗斯蒙古族自治县', + '220722': '长岭县', + '220723': '乾安县', + '220771': '吉林松原经济开发区', + '220781': '扶余市' + }, + '220800': { + '220801': '市辖区', + '220802': '洮北区', + '220821': '镇赉县', + '220822': '通榆县', + '220871': '吉林白城经济开发区', + '220881': '洮南市', + '220882': '大安市' + }, + '222400': { + '222401': '延吉市', + '222402': '图们市', + '222403': '敦化市', + '222404': '珲春市', + '222405': '龙井市', + '222406': '和龙市', + '222424': '汪清县', + '222426': '安图县' + }, + '230000': { + '230100': '哈尔滨市', + '230200': '齐齐哈尔市', + '230300': '鸡西市', + '230400': '鹤岗市', + '230500': '双鸭山市', + '230600': '大庆市', + '230700': '伊春市', + '230800': '佳木斯市', + '230900': '七台河市', + '231000': '牡丹江市', + '231100': '黑河市', + '231200': '绥化市', + '232700': '大兴安岭地区' + }, + '230100': { + '230101': '市辖区', + '230102': '道里区', + '230103': '南岗区', + '230104': '道外区', + '230108': '平房区', + '230109': '松北区', + '230110': '香坊区', + '230111': '呼兰区', + '230112': '阿城区', + '230113': '双城区', + '230123': '依兰县', + '230124': '方正县', + '230125': '宾县', + '230126': '巴彦县', + '230127': '木兰县', + '230128': '通河县', + '230129': '延寿县', + '230183': '尚志市', + '230184': '五常市' + }, + '230200': { + '230201': '市辖区', + '230202': '龙沙区', + '230203': '建华区', + '230204': '铁锋区', + '230205': '昂昂溪区', + '230206': '富拉尔基区', + '230207': '碾子山区', + '230208': '梅里斯达斡尔族区', + '230221': '龙江县', + '230223': '依安县', + '230224': '泰来县', + '230225': '甘南县', + '230227': '富裕县', + '230229': '克山县', + '230230': '克东县', + '230231': '拜泉县', + '230281': '讷河市' + }, + '230300': { + '230301': '市辖区', + '230302': '鸡冠区', + '230303': '恒山区', + '230304': '滴道区', + '230305': '梨树区', + '230306': '城子河区', + '230307': '麻山区', + '230321': '鸡东县', + '230381': '虎林市', + '230382': '密山市' + }, + '230400': { + '230401': '市辖区', + '230402': '向阳区', + '230403': '工农区', + '230404': '南山区', + '230405': '兴安区', + '230406': '东山区', + '230407': '兴山区', + '230421': '萝北县', + '230422': '绥滨县' + }, + '230500': { + '230501': '市辖区', + '230502': '尖山区', + '230503': '岭东区', + '230505': '四方台区', + '230506': '宝山区', + '230521': '集贤县', + '230522': '友谊县', + '230523': '宝清县', + '230524': '饶河县' + }, + '230600': { + '230601': '市辖区', + '230602': '萨尔图区', + '230603': '龙凤区', + '230604': '让胡路区', + '230605': '红岗区', + '230606': '大同区', + '230621': '肇州县', + '230622': '肇源县', + '230623': '林甸县', + '230624': '杜尔伯特蒙古族自治县', + '230671': '大庆高新技术产业开发区' + }, + '230700': { + '230701': '市辖区', + '230717': '伊美区', + '230718': '乌翠区', + '230719': '友好区', + '230722': '嘉荫县', + '230723': '汤旺县', + '230724': '丰林县', + '230725': '大箐山县', + '230726': '南岔县', + '230751': '金林区', + '230781': '铁力市' + }, + '230800': { + '230801': '市辖区', + '230803': '向阳区', + '230804': '前进区', + '230805': '东风区', + '230811': '郊区', + '230822': '桦南县', + '230826': '桦川县', + '230828': '汤原县', + '230881': '同江市', + '230882': '富锦市', + '230883': '抚远市' + }, + '230900': {'230901': '市辖区', '230902': '新兴区', '230903': '桃山区', '230904': '茄子河区', '230921': '勃利县'}, + '231000': { + '231001': '市辖区', + '231002': '东安区', + '231003': '阳明区', + '231004': '爱民区', + '231005': '西安区', + '231025': '林口县', + '231071': '牡丹江经济技术开发区', + '231081': '绥芬河市', + '231083': '海林市', + '231084': '宁安市', + '231085': '穆棱市', + '231086': '东宁市' + }, + '231100': { + '231101': '市辖区', + '231102': '爱辉区', + '231123': '逊克县', + '231124': '孙吴县', + '231181': '北安市', + '231182': '五大连池市', + '231183': '嫩江市' + }, + '231200': { + '231201': '市辖区', + '231202': '北林区', + '231221': '望奎县', + '231222': '兰西县', + '231223': '青冈县', + '231224': '庆安县', + '231225': '明水县', + '231226': '绥棱县', + '231281': '安达市', + '231282': '肇东市', + '231283': '海伦市' + }, + '232700': { + '232701': '漠河市', + '232721': '呼玛县', + '232722': '塔河县', + '232761': '加格达奇区', + '232762': '松岭区', + '232763': '新林区', + '232764': '呼中区' + }, + '310000': {'310100': '市辖区'}, + '310100': { + '310101': '黄浦区', + '310104': '徐汇区', + '310105': '长宁区', + '310106': '静安区', + '310107': '普陀区', + '310109': '虹口区', + '310110': '杨浦区', + '310112': '闵行区', + '310113': '宝山区', + '310114': '嘉定区', + '310115': '浦东新区', + '310116': '金山区', + '310117': '松江区', + '310118': '青浦区', + '310120': '奉贤区', + '310151': '崇明区' + }, + '320000': { + '320100': '南京市', + '320200': '无锡市', + '320300': '徐州市', + '320400': '常州市', + '320500': '苏州市', + '320600': '南通市', + '320700': '连云港市', + '320800': '淮安市', + '320900': '盐城市', + '321000': '扬州市', + '321100': '镇江市', + '321200': '泰州市', + '321300': '宿迁市' + }, + '320100': { + '320101': '市辖区', + '320102': '玄武区', + '320104': '秦淮区', + '320105': '建邺区', + '320106': '鼓楼区', + '320111': '浦口区', + '320113': '栖霞区', + '320114': '雨花台区', + '320115': '江宁区', + '320116': '六合区', + '320117': '溧水区', + '320118': '高淳区' + }, + '320200': { + '320201': '市辖区', + '320205': '锡山区', + '320206': '惠山区', + '320211': '滨湖区', + '320213': '梁溪区', + '320214': '新吴区', + '320281': '江阴市', + '320282': '宜兴市' + }, + '320300': { + '320301': '市辖区', + '320302': '鼓楼区', + '320303': '云龙区', + '320305': '贾汪区', + '320311': '泉山区', + '320312': '铜山区', + '320321': '丰县', + '320322': '沛县', + '320324': '睢宁县', + '320371': '徐州经济技术开发区', + '320381': '新沂市', + '320382': '邳州市' + }, + '320400': { + '320401': '市辖区', + '320402': '天宁区', + '320404': '钟楼区', + '320411': '新北区', + '320412': '武进区', + '320413': '金坛区', + '320481': '溧阳市' + }, + '320500': { + '320501': '市辖区', + '320505': '虎丘区', + '320506': '吴中区', + '320507': '相城区', + '320508': '姑苏区', + '320509': '吴江区', + '320571': '苏州工业园区', + '320581': '常熟市', + '320582': '张家港市', + '320583': '昆山市', + '320585': '太仓市' + }, + '320600': { + '320601': '市辖区', + '320602': '崇川区', + '320611': '港闸区', + '320612': '通州区', + '320623': '如东县', + '320671': '南通经济技术开发区', + '320681': '启东市', + '320682': '如皋市', + '320684': '海门市', + '320685': '海安市' + }, + '320700': { + '320701': '市辖区', + '320703': '连云区', + '320706': '海州区', + '320707': '赣榆区', + '320722': '东海县', + '320723': '灌云县', + '320724': '灌南县', + '320771': '连云港经济技术开发区', + '320772': '连云港高新技术产业开发区' + }, + '320800': { + '320801': '市辖区', + '320803': '淮安区', + '320804': '淮阴区', + '320812': '清江浦区', + '320813': '洪泽区', + '320826': '涟水县', + '320830': '盱眙县', + '320831': '金湖县', + '320871': '淮安经济技术开发区' + }, + '320900': { + '320901': '市辖区', + '320902': '亭湖区', + '320903': '盐都区', + '320904': '大丰区', + '320921': '响水县', + '320922': '滨海县', + '320923': '阜宁县', + '320924': '射阳县', + '320925': '建湖县', + '320971': '盐城经济技术开发区', + '320981': '东台市' + }, + '321000': { + '321001': '市辖区', + '321002': '广陵区', + '321003': '邗江区', + '321012': '江都区', + '321023': '宝应县', + '321071': '扬州经济技术开发区', + '321081': '仪征市', + '321084': '高邮市' + }, + '321100': { + '321101': '市辖区', + '321102': '京口区', + '321111': '润州区', + '321112': '丹徒区', + '321171': '镇江新区', + '321181': '丹阳市', + '321182': '扬中市', + '321183': '句容市' + }, + '321200': { + '321201': '市辖区', + '321202': '海陵区', + '321203': '高港区', + '321204': '姜堰区', + '321271': '泰州医药高新技术产业开发区', + '321281': '兴化市', + '321282': '靖江市', + '321283': '泰兴市' + }, + '321300': { + '321301': '市辖区', + '321302': '宿城区', + '321311': '宿豫区', + '321322': '沭阳县', + '321323': '泗阳县', + '321324': '泗洪县', + '321371': '宿迁经济技术开发区' + }, + '330000': { + '330100': '杭州市', + '330200': '宁波市', + '330300': '温州市', + '330400': '嘉兴市', + '330500': '湖州市', + '330600': '绍兴市', + '330700': '金华市', + '330800': '衢州市', + '330900': '舟山市', + '331000': '台州市', + '331100': '丽水市' + }, + '330100': { + '330101': '市辖区', + '330102': '上城区', + '330103': '下城区', + '330104': '江干区', + '330105': '拱墅区', + '330106': '西湖区', + '330108': '滨江区', + '330109': '萧山区', + '330110': '余杭区', + '330111': '富阳区', + '330112': '临安区', + '330122': '桐庐县', + '330127': '淳安县', + '330182': '建德市' + }, + '330200': { + '330201': '市辖区', + '330203': '海曙区', + '330205': '江北区', + '330206': '北仑区', + '330211': '镇海区', + '330212': '鄞州区', + '330213': '奉化区', + '330225': '象山县', + '330226': '宁海县', + '330281': '余姚市', + '330282': '慈溪市' + }, + '330300': { + '330301': '市辖区', + '330302': '鹿城区', + '330303': '龙湾区', + '330304': '瓯海区', + '330305': '洞头区', + '330324': '永嘉县', + '330326': '平阳县', + '330327': '苍南县', + '330328': '文成县', + '330329': '泰顺县', + '330371': '温州经济技术开发区', + '330381': '瑞安市', + '330382': '乐清市', + '330383': '龙港市' + }, + '330400': { + '330401': '市辖区', + '330402': '南湖区', + '330411': '秀洲区', + '330421': '嘉善县', + '330424': '海盐县', + '330481': '海宁市', + '330482': '平湖市', + '330483': '桐乡市' + }, + '330500': {'330501': '市辖区', '330502': '吴兴区', '330503': '南浔区', '330521': '德清县', '330522': '长兴县', '330523': '安吉县'}, + '330600': { + '330601': '市辖区', + '330602': '越城区', + '330603': '柯桥区', + '330604': '上虞区', + '330624': '新昌县', + '330681': '诸暨市', + '330683': '嵊州市' + }, + '330700': { + '330701': '市辖区', + '330702': '婺城区', + '330703': '金东区', + '330723': '武义县', + '330726': '浦江县', + '330727': '磐安县', + '330781': '兰溪市', + '330782': '义乌市', + '330783': '东阳市', + '330784': '永康市' + }, + '330800': { + '330801': '市辖区', + '330802': '柯城区', + '330803': '衢江区', + '330822': '常山县', + '330824': '开化县', + '330825': '龙游县', + '330881': '江山市' + }, + '330900': {'330901': '市辖区', '330902': '定海区', '330903': '普陀区', '330921': '岱山县', '330922': '嵊泗县'}, + '331000': { + '331001': '市辖区', + '331002': '椒江区', + '331003': '黄岩区', + '331004': '路桥区', + '331022': '三门县', + '331023': '天台县', + '331024': '仙居县', + '331081': '温岭市', + '331082': '临海市', + '331083': '玉环市' + }, + '331100': { + '331101': '市辖区', + '331102': '莲都区', + '331121': '青田县', + '331122': '缙云县', + '331123': '遂昌县', + '331124': '松阳县', + '331125': '云和县', + '331126': '庆元县', + '331127': '景宁畲族自治县', + '331181': '龙泉市' + }, + '340000': { + '340100': '合肥市', + '340200': '芜湖市', + '340300': '蚌埠市', + '340400': '淮南市', + '340500': '马鞍山市', + '340600': '淮北市', + '340700': '铜陵市', + '340800': '安庆市', + '341000': '黄山市', + '341100': '滁州市', + '341200': '阜阳市', + '341300': '宿州市', + '341500': '六安市', + '341600': '亳州市', + '341700': '池州市', + '341800': '宣城市' + }, + '340100': { + '340101': '市辖区', + '340102': '瑶海区', + '340103': '庐阳区', + '340104': '蜀山区', + '340111': '包河区', + '340121': '长丰县', + '340122': '肥东县', + '340123': '肥西县', + '340124': '庐江县', + '340171': '合肥高新技术产业开发区', + '340172': '合肥经济技术开发区', + '340173': '合肥新站高新技术产业开发区', + '340181': '巢湖市' + }, + '340200': { + '340201': '市辖区', + '340202': '镜湖区', + '340203': '弋江区', + '340207': '鸠江区', + '340208': '三山区', + '340221': '芜湖县', + '340222': '繁昌县', + '340223': '南陵县', + '340225': '无为县', + '340271': '芜湖经济技术开发区', + '340272': '安徽芜湖长江大桥经济开发区' + }, + '340300': { + '340301': '市辖区', + '340302': '龙子湖区', + '340303': '蚌山区', + '340304': '禹会区', + '340311': '淮上区', + '340321': '怀远县', + '340322': '五河县', + '340323': '固镇县', + '340371': '蚌埠市高新技术开发区', + '340372': '蚌埠市经济开发区' + }, + '340400': { + '340401': '市辖区', + '340402': '大通区', + '340403': '田家庵区', + '340404': '谢家集区', + '340405': '八公山区', + '340406': '潘集区', + '340421': '凤台县', + '340422': '寿县' + }, + '340500': { + '340501': '市辖区', + '340503': '花山区', + '340504': '雨山区', + '340506': '博望区', + '340521': '当涂县', + '340522': '含山县', + '340523': '和县' + }, + '340600': {'340601': '市辖区', '340602': '杜集区', '340603': '相山区', '340604': '烈山区', '340621': '濉溪县'}, + '340700': {'340701': '市辖区', '340705': '铜官区', '340706': '义安区', '340711': '郊区', '340722': '枞阳县'}, + '340800': { + '340801': '市辖区', + '340802': '迎江区', + '340803': '大观区', + '340811': '宜秀区', + '340822': '怀宁县', + '340825': '太湖县', + '340826': '宿松县', + '340827': '望江县', + '340828': '岳西县', + '340871': '安徽安庆经济开发区', + '340881': '桐城市', + '340882': '潜山市' + }, + '341000': { + '341001': '市辖区', + '341002': '屯溪区', + '341003': '黄山区', + '341004': '徽州区', + '341021': '歙县', + '341022': '休宁县', + '341023': '黟县', + '341024': '祁门县' + }, + '341100': { + '341101': '市辖区', + '341102': '琅琊区', + '341103': '南谯区', + '341122': '来安县', + '341124': '全椒县', + '341125': '定远县', + '341126': '凤阳县', + '341171': '苏滁现代产业园', + '341172': '滁州经济技术开发区', + '341181': '天长市', + '341182': '明光市' + }, + '341200': { + '341201': '市辖区', + '341202': '颍州区', + '341203': '颍东区', + '341204': '颍泉区', + '341221': '临泉县', + '341222': '太和县', + '341225': '阜南县', + '341226': '颍上县', + '341271': '阜阳合肥现代产业园区', + '341272': '阜阳经济技术开发区', + '341282': '界首市' + }, + '341300': { + '341301': '市辖区', + '341302': '埇桥区', + '341321': '砀山县', + '341322': '萧县', + '341323': '灵璧县', + '341324': '泗县', + '341371': '宿州马鞍山现代产业园区', + '341372': '宿州经济技术开发区' + }, + '341500': { + '341501': '市辖区', + '341502': '金安区', + '341503': '裕安区', + '341504': '叶集区', + '341522': '霍邱县', + '341523': '舒城县', + '341524': '金寨县', + '341525': '霍山县' + }, + '341600': {'341601': '市辖区', '341602': '谯城区', '341621': '涡阳县', '341622': '蒙城县', '341623': '利辛县'}, + '341700': {'341701': '市辖区', '341702': '贵池区', '341721': '东至县', '341722': '石台县', '341723': '青阳县'}, + '341800': { + '341801': '市辖区', + '341802': '宣州区', + '341821': '郎溪县', + '341823': '泾县', + '341824': '绩溪县', + '341825': '旌德县', + '341871': '宣城市经济开发区', + '341881': '宁国市', + '341882': '广德市' + }, + '350000': { + '350100': '福州市', + '350200': '厦门市', + '350300': '莆田市', + '350400': '三明市', + '350500': '泉州市', + '350600': '漳州市', + '350700': '南平市', + '350800': '龙岩市', + '350900': '宁德市' + }, + '350100': { + '350101': '市辖区', + '350102': '鼓楼区', + '350103': '台江区', + '350104': '仓山区', + '350105': '马尾区', + '350111': '晋安区', + '350112': '长乐区', + '350121': '闽侯县', + '350122': '连江县', + '350123': '罗源县', + '350124': '闽清县', + '350125': '永泰县', + '350128': '平潭县', + '350181': '福清市' + }, + '350200': { + '350201': '市辖区', + '350203': '思明区', + '350205': '海沧区', + '350206': '湖里区', + '350211': '集美区', + '350212': '同安区', + '350213': '翔安区' + }, + '350300': {'350301': '市辖区', '350302': '城厢区', '350303': '涵江区', '350304': '荔城区', '350305': '秀屿区', '350322': '仙游县'}, + '350400': { + '350401': '市辖区', + '350402': '梅列区', + '350403': '三元区', + '350421': '明溪县', + '350423': '清流县', + '350424': '宁化县', + '350425': '大田县', + '350426': '尤溪县', + '350427': '沙县', + '350428': '将乐县', + '350429': '泰宁县', + '350430': '建宁县', + '350481': '永安市' + }, + '350500': { + '350501': '市辖区', + '350502': '鲤城区', + '350503': '丰泽区', + '350504': '洛江区', + '350505': '泉港区', + '350521': '惠安县', + '350524': '安溪县', + '350525': '永春县', + '350526': '德化县', + '350527': '金门县', + '350581': '石狮市', + '350582': '晋江市', + '350583': '南安市' + }, + '350600': { + '350601': '市辖区', + '350602': '芗城区', + '350603': '龙文区', + '350622': '云霄县', + '350623': '漳浦县', + '350624': '诏安县', + '350625': '长泰县', + '350626': '东山县', + '350627': '南靖县', + '350628': '平和县', + '350629': '华安县', + '350681': '龙海市' + }, + '350700': { + '350701': '市辖区', + '350702': '延平区', + '350703': '建阳区', + '350721': '顺昌县', + '350722': '浦城县', + '350723': '光泽县', + '350724': '松溪县', + '350725': '政和县', + '350781': '邵武市', + '350782': '武夷山市', + '350783': '建瓯市' + }, + '350800': { + '350801': '市辖区', + '350802': '新罗区', + '350803': '永定区', + '350821': '长汀县', + '350823': '上杭县', + '350824': '武平县', + '350825': '连城县', + '350881': '漳平市' + }, + '350900': { + '350901': '市辖区', + '350902': '蕉城区', + '350921': '霞浦县', + '350922': '古田县', + '350923': '屏南县', + '350924': '寿宁县', + '350925': '周宁县', + '350926': '柘荣县', + '350981': '福安市', + '350982': '福鼎市' + }, + '360000': { + '360100': '南昌市', + '360200': '景德镇市', + '360300': '萍乡市', + '360400': '九江市', + '360500': '新余市', + '360600': '鹰潭市', + '360700': '赣州市', + '360800': '吉安市', + '360900': '宜春市', + '361000': '抚州市', + '361100': '上饶市' + }, + '360100': { + '360101': '市辖区', + '360102': '东湖区', + '360103': '西湖区', + '360104': '青云谱区', + '360105': '湾里区', + '360111': '青山湖区', + '360112': '新建区', + '360121': '南昌县', + '360123': '安义县', + '360124': '进贤县' + }, + '360200': {'360201': '市辖区', '360202': '昌江区', '360203': '珠山区', '360222': '浮梁县', '360281': '乐平市'}, + '360300': {'360301': '市辖区', '360302': '安源区', '360313': '湘东区', '360321': '莲花县', '360322': '上栗县', '360323': '芦溪县'}, + '360400': { + '360401': '市辖区', + '360402': '濂溪区', + '360403': '浔阳区', + '360404': '柴桑区', + '360423': '武宁县', + '360424': '修水县', + '360425': '永修县', + '360426': '德安县', + '360428': '都昌县', + '360429': '湖口县', + '360430': '彭泽县', + '360481': '瑞昌市', + '360482': '共青城市', + '360483': '庐山市' + }, + '360500': {'360501': '市辖区', '360502': '渝水区', '360521': '分宜县'}, + '360600': {'360601': '市辖区', '360602': '月湖区', '360603': '余江区', '360681': '贵溪市'}, + '360700': { + '360701': '市辖区', + '360702': '章贡区', + '360703': '南康区', + '360704': '赣县区', + '360722': '信丰县', + '360723': '大余县', + '360724': '上犹县', + '360725': '崇义县', + '360726': '安远县', + '360727': '龙南县', + '360728': '定南县', + '360729': '全南县', + '360730': '宁都县', + '360731': '于都县', + '360732': '兴国县', + '360733': '会昌县', + '360734': '寻乌县', + '360735': '石城县', + '360781': '瑞金市' + }, + '360800': { + '360801': '市辖区', + '360802': '吉州区', + '360803': '青原区', + '360821': '吉安县', + '360822': '吉水县', + '360823': '峡江县', + '360824': '新干县', + '360825': '永丰县', + '360826': '泰和县', + '360827': '遂川县', + '360828': '万安县', + '360829': '安福县', + '360830': '永新县', + '360881': '井冈山市' + }, + '360900': { + '360901': '市辖区', + '360902': '袁州区', + '360921': '奉新县', + '360922': '万载县', + '360923': '上高县', + '360924': '宜丰县', + '360925': '靖安县', + '360926': '铜鼓县', + '360981': '丰城市', + '360982': '樟树市', + '360983': '高安市' + }, + '361000': { + '361001': '市辖区', + '361002': '临川区', + '361003': '东乡区', + '361021': '南城县', + '361022': '黎川县', + '361023': '南丰县', + '361024': '崇仁县', + '361025': '乐安县', + '361026': '宜黄县', + '361027': '金溪县', + '361028': '资溪县', + '361030': '广昌县' + }, + '361100': { + '361101': '市辖区', + '361102': '信州区', + '361103': '广丰区', + '361104': '广信区', + '361123': '玉山县', + '361124': '铅山县', + '361125': '横峰县', + '361126': '弋阳县', + '361127': '余干县', + '361128': '鄱阳县', + '361129': '万年县', + '361130': '婺源县', + '361181': '德兴市' + }, + '370000': { + '370100': '济南市', + '370200': '青岛市', + '370300': '淄博市', + '370400': '枣庄市', + '370500': '东营市', + '370600': '烟台市', + '370700': '潍坊市', + '370800': '济宁市', + '370900': '泰安市', + '371000': '威海市', + '371100': '日照市', + '371300': '临沂市', + '371400': '德州市', + '371500': '聊城市', + '371600': '滨州市', + '371700': '菏泽市' + }, + '370100': { + '370101': '市辖区', + '370102': '历下区', + '370103': '市中区', + '370104': '槐荫区', + '370105': '天桥区', + '370112': '历城区', + '370113': '长清区', + '370114': '章丘区', + '370115': '济阳区', + '370116': '莱芜区', + '370117': '钢城区', + '370124': '平阴县', + '370126': '商河县', + '370171': '济南高新技术产业开发区' + }, + '370200': { + '370201': '市辖区', + '370202': '市南区', + '370203': '市北区', + '370211': '黄岛区', + '370212': '崂山区', + '370213': '李沧区', + '370214': '城阳区', + '370215': '即墨区', + '370271': '青岛高新技术产业开发区', + '370281': '胶州市', + '370283': '平度市', + '370285': '莱西市' + }, + '370300': { + '370301': '市辖区', + '370302': '淄川区', + '370303': '张店区', + '370304': '博山区', + '370305': '临淄区', + '370306': '周村区', + '370321': '桓台县', + '370322': '高青县', + '370323': '沂源县' + }, + '370400': { + '370401': '市辖区', + '370402': '市中区', + '370403': '薛城区', + '370404': '峄城区', + '370405': '台儿庄区', + '370406': '山亭区', + '370481': '滕州市' + }, + '370500': { + '370501': '市辖区', + '370502': '东营区', + '370503': '河口区', + '370505': '垦利区', + '370522': '利津县', + '370523': '广饶县', + '370571': '东营经济技术开发区', + '370572': '东营港经济开发区' + }, + '370600': { + '370601': '市辖区', + '370602': '芝罘区', + '370611': '福山区', + '370612': '牟平区', + '370613': '莱山区', + '370634': '长岛县', + '370671': '烟台高新技术产业开发区', + '370672': '烟台经济技术开发区', + '370681': '龙口市', + '370682': '莱阳市', + '370683': '莱州市', + '370684': '蓬莱市', + '370685': '招远市', + '370686': '栖霞市', + '370687': '海阳市' + }, + '370700': { + '370701': '市辖区', + '370702': '潍城区', + '370703': '寒亭区', + '370704': '坊子区', + '370705': '奎文区', + '370724': '临朐县', + '370725': '昌乐县', + '370772': '潍坊滨海经济技术开发区', + '370781': '青州市', + '370782': '诸城市', + '370783': '寿光市', + '370784': '安丘市', + '370785': '高密市', + '370786': '昌邑市' + }, + '370800': { + '370801': '市辖区', + '370811': '任城区', + '370812': '兖州区', + '370826': '微山县', + '370827': '鱼台县', + '370828': '金乡县', + '370829': '嘉祥县', + '370830': '汶上县', + '370831': '泗水县', + '370832': '梁山县', + '370871': '济宁高新技术产业开发区', + '370881': '曲阜市', + '370883': '邹城市' + }, + '370900': { + '370901': '市辖区', + '370902': '泰山区', + '370911': '岱岳区', + '370921': '宁阳县', + '370923': '东平县', + '370982': '新泰市', + '370983': '肥城市' + }, + '371000': { + '371001': '市辖区', + '371002': '环翠区', + '371003': '文登区', + '371071': '威海火炬高技术产业开发区', + '371072': '威海经济技术开发区', + '371073': '威海临港经济技术开发区', + '371082': '荣成市', + '371083': '乳山市' + }, + '371100': {'371101': '市辖区', '371102': '东港区', '371103': '岚山区', '371121': '五莲县', '371122': '莒县', '371171': '日照经济技术开发区'}, + '371300': { + '371301': '市辖区', + '371302': '兰山区', + '371311': '罗庄区', + '371312': '河东区', + '371321': '沂南县', + '371322': '郯城县', + '371323': '沂水县', + '371324': '兰陵县', + '371325': '费县', + '371326': '平邑县', + '371327': '莒南县', + '371328': '蒙阴县', + '371329': '临沭县', + '371371': '临沂高新技术产业开发区', + '371372': '临沂经济技术开发区', + '371373': '临沂临港经济开发区' + }, + '371400': { + '371401': '市辖区', + '371402': '德城区', + '371403': '陵城区', + '371422': '宁津县', + '371423': '庆云县', + '371424': '临邑县', + '371425': '齐河县', + '371426': '平原县', + '371427': '夏津县', + '371428': '武城县', + '371471': '德州经济技术开发区', + '371472': '德州运河经济开发区', + '371481': '乐陵市', + '371482': '禹城市' + }, + '371500': { + '371501': '市辖区', + '371502': '东昌府区', + '371503': '茌平区', + '371521': '阳谷县', + '371522': '莘县', + '371524': '东阿县', + '371525': '冠县', + '371526': '高唐县', + '371581': '临清市' + }, + '371600': { + '371601': '市辖区', + '371602': '滨城区', + '371603': '沾化区', + '371621': '惠民县', + '371622': '阳信县', + '371623': '无棣县', + '371625': '博兴县', + '371681': '邹平市' + }, + '371700': { + '371701': '市辖区', + '371702': '牡丹区', + '371703': '定陶区', + '371721': '曹县', + '371722': '单县', + '371723': '成武县', + '371724': '巨野县', + '371725': '郓城县', + '371726': '鄄城县', + '371728': '东明县', + '371771': '菏泽经济技术开发区', + '371772': '菏泽高新技术开发区' + }, + '410000': { + '410100': '郑州市', + '410200': '开封市', + '410300': '洛阳市', + '410400': '平顶山市', + '410500': '安阳市', + '410600': '鹤壁市', + '410700': '新乡市', + '410800': '焦作市', + '410900': '濮阳市', + '411000': '许昌市', + '411100': '漯河市', + '411200': '三门峡市', + '411300': '南阳市', + '411400': '商丘市', + '411500': '信阳市', + '411600': '周口市', + '411700': '驻马店市', + '419000': '省直辖县级行政区划' + }, + '410100': { + '410101': '市辖区', + '410102': '中原区', + '410103': '二七区', + '410104': '管城回族区', + '410105': '金水区', + '410106': '上街区', + '410108': '惠济区', + '410122': '中牟县', + '410171': '郑州经济技术开发区', + '410172': '郑州高新技术产业开发区', + '410173': '郑州航空港经济综合实验区', + '410181': '巩义市', + '410182': '荥阳市', + '410183': '新密市', + '410184': '新郑市', + '410185': '登封市' + }, + '410200': { + '410201': '市辖区', + '410202': '龙亭区', + '410203': '顺河回族区', + '410204': '鼓楼区', + '410205': '禹王台区', + '410212': '祥符区', + '410221': '杞县', + '410222': '通许县', + '410223': '尉氏县', + '410225': '兰考县' + }, + '410300': { + '410301': '市辖区', + '410302': '老城区', + '410303': '西工区', + '410304': '瀍河回族区', + '410305': '涧西区', + '410306': '吉利区', + '410311': '洛龙区', + '410322': '孟津县', + '410323': '新安县', + '410324': '栾川县', + '410325': '嵩县', + '410326': '汝阳县', + '410327': '宜阳县', + '410328': '洛宁县', + '410329': '伊川县', + '410371': '洛阳高新技术产业开发区', + '410381': '偃师市' + }, + '410400': { + '410401': '市辖区', + '410402': '新华区', + '410403': '卫东区', + '410404': '石龙区', + '410411': '湛河区', + '410421': '宝丰县', + '410422': '叶县', + '410423': '鲁山县', + '410425': '郏县', + '410471': '平顶山高新技术产业开发区', + '410472': '平顶山市城乡一体化示范区', + '410481': '舞钢市', + '410482': '汝州市' + }, + '410500': { + '410501': '市辖区', + '410502': '文峰区', + '410503': '北关区', + '410505': '殷都区', + '410506': '龙安区', + '410522': '安阳县', + '410523': '汤阴县', + '410526': '滑县', + '410527': '内黄县', + '410571': '安阳高新技术产业开发区', + '410581': '林州市' + }, + '410600': { + '410601': '市辖区', + '410602': '鹤山区', + '410603': '山城区', + '410611': '淇滨区', + '410621': '浚县', + '410622': '淇县', + '410671': '鹤壁经济技术开发区' + }, + '410700': { + '410701': '市辖区', + '410702': '红旗区', + '410703': '卫滨区', + '410704': '凤泉区', + '410711': '牧野区', + '410721': '新乡县', + '410724': '获嘉县', + '410725': '原阳县', + '410726': '延津县', + '410727': '封丘县', + '410771': '新乡高新技术产业开发区', + '410772': '新乡经济技术开发区', + '410773': '新乡市平原城乡一体化示范区', + '410781': '卫辉市', + '410782': '辉县市', + '410783': '长垣市' + }, + '410800': { + '410801': '市辖区', + '410802': '解放区', + '410803': '中站区', + '410804': '马村区', + '410811': '山阳区', + '410821': '修武县', + '410822': '博爱县', + '410823': '武陟县', + '410825': '温县', + '410871': '焦作城乡一体化示范区', + '410882': '沁阳市', + '410883': '孟州市' + }, + '410900': { + '410901': '市辖区', + '410902': '华龙区', + '410922': '清丰县', + '410923': '南乐县', + '410926': '范县', + '410927': '台前县', + '410928': '濮阳县', + '410971': '河南濮阳工业园区', + '410972': '濮阳经济技术开发区' + }, + '411000': { + '411001': '市辖区', + '411002': '魏都区', + '411003': '建安区', + '411024': '鄢陵县', + '411025': '襄城县', + '411071': '许昌经济技术开发区', + '411081': '禹州市', + '411082': '长葛市' + }, + '411100': { + '411101': '市辖区', + '411102': '源汇区', + '411103': '郾城区', + '411104': '召陵区', + '411121': '舞阳县', + '411122': '临颍县', + '411171': '漯河经济技术开发区' + }, + '411200': { + '411201': '市辖区', + '411202': '湖滨区', + '411203': '陕州区', + '411221': '渑池县', + '411224': '卢氏县', + '411271': '河南三门峡经济开发区', + '411281': '义马市', + '411282': '灵宝市' + }, + '411300': { + '411301': '市辖区', + '411302': '宛城区', + '411303': '卧龙区', + '411321': '南召县', + '411322': '方城县', + '411323': '西峡县', + '411324': '镇平县', + '411325': '内乡县', + '411326': '淅川县', + '411327': '社旗县', + '411328': '唐河县', + '411329': '新野县', + '411330': '桐柏县', + '411371': '南阳高新技术产业开发区', + '411372': '南阳市城乡一体化示范区', + '411381': '邓州市' + }, + '411400': { + '411401': '市辖区', + '411402': '梁园区', + '411403': '睢阳区', + '411421': '民权县', + '411422': '睢县', + '411423': '宁陵县', + '411424': '柘城县', + '411425': '虞城县', + '411426': '夏邑县', + '411471': '豫东综合物流产业聚集区', + '411472': '河南商丘经济开发区', + '411481': '永城市' + }, + '411500': { + '411501': '市辖区', + '411502': '浉河区', + '411503': '平桥区', + '411521': '罗山县', + '411522': '光山县', + '411523': '新县', + '411524': '商城县', + '411525': '固始县', + '411526': '潢川县', + '411527': '淮滨县', + '411528': '息县', + '411571': '信阳高新技术产业开发区' + }, + '411600': { + '411601': '市辖区', + '411602': '川汇区', + '411603': '淮阳区', + '411621': '扶沟县', + '411622': '西华县', + '411623': '商水县', + '411624': '沈丘县', + '411625': '郸城县', + '411627': '太康县', + '411628': '鹿邑县', + '411671': '河南周口经济开发区', + '411681': '项城市' + }, + '411700': { + '411701': '市辖区', + '411702': '驿城区', + '411721': '西平县', + '411722': '上蔡县', + '411723': '平舆县', + '411724': '正阳县', + '411725': '确山县', + '411726': '泌阳县', + '411727': '汝南县', + '411728': '遂平县', + '411729': '新蔡县', + '411771': '河南驻马店经济开发区' + }, + '419000': {'419001': '济源市'}, + '420000': { + '420100': '武汉市', + '420200': '黄石市', + '420300': '十堰市', + '420500': '宜昌市', + '420600': '襄阳市', + '420700': '鄂州市', + '420800': '荆门市', + '420900': '孝感市', + '421000': '荆州市', + '421100': '黄冈市', + '421200': '咸宁市', + '421300': '随州市', + '422800': '恩施土家族苗族自治州', + '429000': '省直辖县级行政区划' + }, + '420100': { + '420101': '市辖区', + '420102': '江岸区', + '420103': '江汉区', + '420104': '硚口区', + '420105': '汉阳区', + '420106': '武昌区', + '420107': '青山区', + '420111': '洪山区', + '420112': '东西湖区', + '420113': '汉南区', + '420114': '蔡甸区', + '420115': '江夏区', + '420116': '黄陂区', + '420117': '新洲区' + }, + '420200': { + '420201': '市辖区', + '420202': '黄石港区', + '420203': '西塞山区', + '420204': '下陆区', + '420205': '铁山区', + '420222': '阳新县', + '420281': '大冶市' + }, + '420300': { + '420301': '市辖区', + '420302': '茅箭区', + '420303': '张湾区', + '420304': '郧阳区', + '420322': '郧西县', + '420323': '竹山县', + '420324': '竹溪县', + '420325': '房县', + '420381': '丹江口市' + }, + '420500': { + '420501': '市辖区', + '420502': '西陵区', + '420503': '伍家岗区', + '420504': '点军区', + '420505': '猇亭区', + '420506': '夷陵区', + '420525': '远安县', + '420526': '兴山县', + '420527': '秭归县', + '420528': '长阳土家族自治县', + '420529': '五峰土家族自治县', + '420581': '宜都市', + '420582': '当阳市', + '420583': '枝江市' + }, + '420600': { + '420601': '市辖区', + '420602': '襄城区', + '420606': '樊城区', + '420607': '襄州区', + '420624': '南漳县', + '420625': '谷城县', + '420626': '保康县', + '420682': '老河口市', + '420683': '枣阳市', + '420684': '宜城市' + }, + '420700': {'420701': '市辖区', '420702': '梁子湖区', '420703': '华容区', '420704': '鄂城区'}, + '420800': {'420801': '市辖区', '420802': '东宝区', '420804': '掇刀区', '420822': '沙洋县', '420881': '钟祥市', '420882': '京山市'}, + '420900': { + '420901': '市辖区', + '420902': '孝南区', + '420921': '孝昌县', + '420922': '大悟县', + '420923': '云梦县', + '420981': '应城市', + '420982': '安陆市', + '420984': '汉川市' + }, + '421000': { + '421001': '市辖区', + '421002': '沙市区', + '421003': '荆州区', + '421022': '公安县', + '421023': '监利县', + '421024': '江陵县', + '421071': '荆州经济技术开发区', + '421081': '石首市', + '421083': '洪湖市', + '421087': '松滋市' + }, + '421100': { + '421101': '市辖区', + '421102': '黄州区', + '421121': '团风县', + '421122': '红安县', + '421123': '罗田县', + '421124': '英山县', + '421125': '浠水县', + '421126': '蕲春县', + '421127': '黄梅县', + '421171': '龙感湖管理区', + '421181': '麻城市', + '421182': '武穴市' + }, + '421200': { + '421201': '市辖区', + '421202': '咸安区', + '421221': '嘉鱼县', + '421222': '通城县', + '421223': '崇阳县', + '421224': '通山县', + '421281': '赤壁市' + }, + '421300': {'421301': '市辖区', '421303': '曾都区', '421321': '随县', '421381': '广水市'}, + '422800': { + '422801': '恩施市', + '422802': '利川市', + '422822': '建始县', + '422823': '巴东县', + '422825': '宣恩县', + '422826': '咸丰县', + '422827': '来凤县', + '422828': '鹤峰县' + }, + '429000': {'429004': '仙桃市', '429005': '潜江市', '429006': '天门市', '429021': '神农架林区'}, + '430000': { + '430100': '长沙市', + '430200': '株洲市', + '430300': '湘潭市', + '430400': '衡阳市', + '430500': '邵阳市', + '430600': '岳阳市', + '430700': '常德市', + '430800': '张家界市', + '430900': '益阳市', + '431000': '郴州市', + '431100': '永州市', + '431200': '怀化市', + '431300': '娄底市', + '433100': '湘西土家族苗族自治州' + }, + '430100': { + '430101': '市辖区', + '430102': '芙蓉区', + '430103': '天心区', + '430104': '岳麓区', + '430105': '开福区', + '430111': '雨花区', + '430112': '望城区', + '430121': '长沙县', + '430181': '浏阳市', + '430182': '宁乡市' + }, + '430200': { + '430201': '市辖区', + '430202': '荷塘区', + '430203': '芦淞区', + '430204': '石峰区', + '430211': '天元区', + '430212': '渌口区', + '430223': '攸县', + '430224': '茶陵县', + '430225': '炎陵县', + '430271': '云龙示范区', + '430281': '醴陵市' + }, + '430300': { + '430301': '市辖区', + '430302': '雨湖区', + '430304': '岳塘区', + '430321': '湘潭县', + '430371': '湖南湘潭高新技术产业园区', + '430372': '湘潭昭山示范区', + '430373': '湘潭九华示范区', + '430381': '湘乡市', + '430382': '韶山市' + }, + '430400': { + '430401': '市辖区', + '430405': '珠晖区', + '430406': '雁峰区', + '430407': '石鼓区', + '430408': '蒸湘区', + '430412': '南岳区', + '430421': '衡阳县', + '430422': '衡南县', + '430423': '衡山县', + '430424': '衡东县', + '430426': '祁东县', + '430471': '衡阳综合保税区', + '430472': '湖南衡阳高新技术产业园区', + '430473': '湖南衡阳松木经济开发区', + '430481': '耒阳市', + '430482': '常宁市' + }, + '430500': { + '430501': '市辖区', + '430502': '双清区', + '430503': '大祥区', + '430511': '北塔区', + '430522': '新邵县', + '430523': '邵阳县', + '430524': '隆回县', + '430525': '洞口县', + '430527': '绥宁县', + '430528': '新宁县', + '430529': '城步苗族自治县', + '430581': '武冈市', + '430582': '邵东市' + }, + '430600': { + '430601': '市辖区', + '430602': '岳阳楼区', + '430603': '云溪区', + '430611': '君山区', + '430621': '岳阳县', + '430623': '华容县', + '430624': '湘阴县', + '430626': '平江县', + '430671': '岳阳市屈原管理区', + '430681': '汨罗市', + '430682': '临湘市' + }, + '430700': { + '430701': '市辖区', + '430702': '武陵区', + '430703': '鼎城区', + '430721': '安乡县', + '430722': '汉寿县', + '430723': '澧县', + '430724': '临澧县', + '430725': '桃源县', + '430726': '石门县', + '430771': '常德市西洞庭管理区', + '430781': '津市市' + }, + '430800': {'430801': '市辖区', '430802': '永定区', '430811': '武陵源区', '430821': '慈利县', '430822': '桑植县'}, + '430900': { + '430901': '市辖区', + '430902': '资阳区', + '430903': '赫山区', + '430921': '南县', + '430922': '桃江县', + '430923': '安化县', + '430971': '益阳市大通湖管理区', + '430972': '湖南益阳高新技术产业园区', + '430981': '沅江市' + }, + '431000': { + '431001': '市辖区', + '431002': '北湖区', + '431003': '苏仙区', + '431021': '桂阳县', + '431022': '宜章县', + '431023': '永兴县', + '431024': '嘉禾县', + '431025': '临武县', + '431026': '汝城县', + '431027': '桂东县', + '431028': '安仁县', + '431081': '资兴市' + }, + '431100': { + '431101': '市辖区', + '431102': '零陵区', + '431103': '冷水滩区', + '431121': '祁阳县', + '431122': '东安县', + '431123': '双牌县', + '431124': '道县', + '431125': '江永县', + '431126': '宁远县', + '431127': '蓝山县', + '431128': '新田县', + '431129': '江华瑶族自治县', + '431171': '永州经济技术开发区', + '431172': '永州市金洞管理区', + '431173': '永州市回龙圩管理区' + }, + '431200': { + '431201': '市辖区', + '431202': '鹤城区', + '431221': '中方县', + '431222': '沅陵县', + '431223': '辰溪县', + '431224': '溆浦县', + '431225': '会同县', + '431226': '麻阳苗族自治县', + '431227': '新晃侗族自治县', + '431228': '芷江侗族自治县', + '431229': '靖州苗族侗族自治县', + '431230': '通道侗族自治县', + '431271': '怀化市洪江管理区', + '431281': '洪江市' + }, + '431300': {'431301': '市辖区', '431302': '娄星区', '431321': '双峰县', '431322': '新化县', '431381': '冷水江市', '431382': '涟源市'}, + '433100': { + '433101': '吉首市', + '433122': '泸溪县', + '433123': '凤凰县', + '433124': '花垣县', + '433125': '保靖县', + '433126': '古丈县', + '433127': '永顺县', + '433130': '龙山县', + '433173': '湖南永顺经济开发区' + }, + '440000': { + '440100': '广州市', + '440200': '韶关市', + '440300': '深圳市', + '440400': '珠海市', + '440500': '汕头市', + '440600': '佛山市', + '440700': '江门市', + '440800': '湛江市', + '440900': '茂名市', + '441200': '肇庆市', + '441300': '惠州市', + '441400': '梅州市', + '441500': '汕尾市', + '441600': '河源市', + '441700': '阳江市', + '441800': '清远市', + '441900': '东莞市', + '442000': '中山市', + '445100': '潮州市', + '445200': '揭阳市', + '445300': '云浮市' + }, + '440100': { + '440101': '市辖区', + '440103': '荔湾区', + '440104': '越秀区', + '440105': '海珠区', + '440106': '天河区', + '440111': '白云区', + '440112': '黄埔区', + '440113': '番禺区', + '440114': '花都区', + '440115': '南沙区', + '440117': '从化区', + '440118': '增城区' + }, + '440200': { + '440201': '市辖区', + '440203': '武江区', + '440204': '浈江区', + '440205': '曲江区', + '440222': '始兴县', + '440224': '仁化县', + '440229': '翁源县', + '440232': '乳源瑶族自治县', + '440233': '新丰县', + '440281': '乐昌市', + '440282': '南雄市' + }, + '440300': { + '440301': '市辖区', + '440303': '罗湖区', + '440304': '福田区', + '440305': '南山区', + '440306': '宝安区', + '440307': '龙岗区', + '440308': '盐田区', + '440309': '龙华区', + '440310': '坪山区', + '440311': '光明区' + }, + '440400': {'440401': '市辖区', '440402': '香洲区', '440403': '斗门区', '440404': '金湾区'}, + '440500': { + '440501': '市辖区', + '440507': '龙湖区', + '440511': '金平区', + '440512': '濠江区', + '440513': '潮阳区', + '440514': '潮南区', + '440515': '澄海区', + '440523': '南澳县' + }, + '440600': {'440601': '市辖区', '440604': '禅城区', '440605': '南海区', '440606': '顺德区', '440607': '三水区', '440608': '高明区'}, + '440700': { + '440701': '市辖区', + '440703': '蓬江区', + '440704': '江海区', + '440705': '新会区', + '440781': '台山市', + '440783': '开平市', + '440784': '鹤山市', + '440785': '恩平市' + }, + '440800': { + '440801': '市辖区', + '440802': '赤坎区', + '440803': '霞山区', + '440804': '坡头区', + '440811': '麻章区', + '440823': '遂溪县', + '440825': '徐闻县', + '440881': '廉江市', + '440882': '雷州市', + '440883': '吴川市' + }, + '440900': {'440901': '市辖区', '440902': '茂南区', '440904': '电白区', '440981': '高州市', '440982': '化州市', '440983': '信宜市'}, + '441200': { + '441201': '市辖区', + '441202': '端州区', + '441203': '鼎湖区', + '441204': '高要区', + '441223': '广宁县', + '441224': '怀集县', + '441225': '封开县', + '441226': '德庆县', + '441284': '四会市' + }, + '441300': {'441301': '市辖区', '441302': '惠城区', '441303': '惠阳区', '441322': '博罗县', '441323': '惠东县', '441324': '龙门县'}, + '441400': { + '441401': '市辖区', + '441402': '梅江区', + '441403': '梅县区', + '441422': '大埔县', + '441423': '丰顺县', + '441424': '五华县', + '441426': '平远县', + '441427': '蕉岭县', + '441481': '兴宁市' + }, + '441500': {'441501': '市辖区', '441502': '城区', '441521': '海丰县', '441523': '陆河县', '441581': '陆丰市'}, + '441600': { + '441601': '市辖区', + '441602': '源城区', + '441621': '紫金县', + '441622': '龙川县', + '441623': '连平县', + '441624': '和平县', + '441625': '东源县' + }, + '441700': {'441701': '市辖区', '441702': '江城区', '441704': '阳东区', '441721': '阳西县', '441781': '阳春市'}, + '441800': { + '441801': '市辖区', + '441802': '清城区', + '441803': '清新区', + '441821': '佛冈县', + '441823': '阳山县', + '441825': '连山壮族瑶族自治县', + '441826': '连南瑶族自治县', + '441881': '英德市', + '441882': '连州市' + }, + '441900': { + '441900003': '东城街道', + '441900004': '南城街道', + '441900005': '万江街道', + '441900006': '莞城街道', + '441900101': '石碣镇', + '441900102': '石龙镇', + '441900103': '茶山镇', + '441900104': '石排镇', + '441900105': '企石镇', + '441900106': '横沥镇', + '441900107': '桥头镇', + '441900108': '谢岗镇', + '441900109': '东坑镇', + '441900110': '常平镇', + '441900111': '寮步镇', + '441900112': '樟木头镇', + '441900113': '大朗镇', + '441900114': '黄江镇', + '441900115': '清溪镇', + '441900116': '塘厦镇', + '441900117': '凤岗镇', + '441900118': '大岭山镇', + '441900119': '长安镇', + '441900121': '虎门镇', + '441900122': '厚街镇', + '441900123': '沙田镇', + '441900124': '道滘镇', + '441900125': '洪梅镇', + '441900126': '麻涌镇', + '441900127': '望牛墩镇', + '441900128': '中堂镇', + '441900129': '高埗镇', + '441900401': '松山湖', + '441900402': '东莞港', + '441900403': '东莞生态园' + }, + '442000': { + '442000001': '石岐街道', + '442000002': '东区街道', + '442000003': '中山港街道', + '442000004': '西区街道', + '442000005': '南区街道', + '442000006': '五桂山街道', + '442000100': '小榄镇', + '442000101': '黄圃镇', + '442000102': '民众镇', + '442000103': '东凤镇', + '442000104': '东升镇', + '442000105': '古镇镇', + '442000106': '沙溪镇', + '442000107': '坦洲镇', + '442000108': '港口镇', + '442000109': '三角镇', + '442000110': '横栏镇', + '442000111': '南头镇', + '442000112': '阜沙镇', + '442000113': '南朗镇', + '442000114': '三乡镇', + '442000115': '板芙镇', + '442000116': '大涌镇', + '442000117': '神湾镇' + }, + '445100': {'445101': '市辖区', '445102': '湘桥区', '445103': '潮安区', '445122': '饶平县'}, + '445200': {'445201': '市辖区', '445202': '榕城区', '445203': '揭东区', '445222': '揭西县', '445224': '惠来县', '445281': '普宁市'}, + '445300': {'445301': '市辖区', '445302': '云城区', '445303': '云安区', '445321': '新兴县', '445322': '郁南县', '445381': '罗定市'}, + '450000': { + '450100': '南宁市', + '450200': '柳州市', + '450300': '桂林市', + '450400': '梧州市', + '450500': '北海市', + '450600': '防城港市', + '450700': '钦州市', + '450800': '贵港市', + '450900': '玉林市', + '451000': '百色市', + '451100': '贺州市', + '451200': '河池市', + '451300': '来宾市', + '451400': '崇左市' + }, + '450100': { + '450101': '市辖区', + '450102': '兴宁区', + '450103': '青秀区', + '450105': '江南区', + '450107': '西乡塘区', + '450108': '良庆区', + '450109': '邕宁区', + '450110': '武鸣区', + '450123': '隆安县', + '450124': '马山县', + '450125': '上林县', + '450126': '宾阳县', + '450127': '横县' + }, + '450200': { + '450201': '市辖区', + '450202': '城中区', + '450203': '鱼峰区', + '450204': '柳南区', + '450205': '柳北区', + '450206': '柳江区', + '450222': '柳城县', + '450223': '鹿寨县', + '450224': '融安县', + '450225': '融水苗族自治县', + '450226': '三江侗族自治县' + }, + '450300': { + '450301': '市辖区', + '450302': '秀峰区', + '450303': '叠彩区', + '450304': '象山区', + '450305': '七星区', + '450311': '雁山区', + '450312': '临桂区', + '450321': '阳朔县', + '450323': '灵川县', + '450324': '全州县', + '450325': '兴安县', + '450326': '永福县', + '450327': '灌阳县', + '450328': '龙胜各族自治县', + '450329': '资源县', + '450330': '平乐县', + '450332': '恭城瑶族自治县', + '450381': '荔浦市' + }, + '450400': { + '450401': '市辖区', + '450403': '万秀区', + '450405': '长洲区', + '450406': '龙圩区', + '450421': '苍梧县', + '450422': '藤县', + '450423': '蒙山县', + '450481': '岑溪市' + }, + '450500': {'450501': '市辖区', '450502': '海城区', '450503': '银海区', '450512': '铁山港区', '450521': '合浦县'}, + '450600': {'450601': '市辖区', '450602': '港口区', '450603': '防城区', '450621': '上思县', '450681': '东兴市'}, + '450700': {'450701': '市辖区', '450702': '钦南区', '450703': '钦北区', '450721': '灵山县', '450722': '浦北县'}, + '450800': {'450801': '市辖区', '450802': '港北区', '450803': '港南区', '450804': '覃塘区', '450821': '平南县', '450881': '桂平市'}, + '450900': { + '450901': '市辖区', + '450902': '玉州区', + '450903': '福绵区', + '450921': '容县', + '450922': '陆川县', + '450923': '博白县', + '450924': '兴业县', + '450981': '北流市' + }, + '451000': { + '451001': '市辖区', + '451002': '右江区', + '451003': '田阳区', + '451022': '田东县', + '451023': '平果县', + '451024': '德保县', + '451026': '那坡县', + '451027': '凌云县', + '451028': '乐业县', + '451029': '田林县', + '451030': '西林县', + '451031': '隆林各族自治县', + '451081': '靖西市' + }, + '451100': {'451101': '市辖区', '451102': '八步区', '451103': '平桂区', '451121': '昭平县', '451122': '钟山县', '451123': '富川瑶族自治县'}, + '451200': { + '451201': '市辖区', + '451202': '金城江区', + '451203': '宜州区', + '451221': '南丹县', + '451222': '天峨县', + '451223': '凤山县', + '451224': '东兰县', + '451225': '罗城仫佬族自治县', + '451226': '环江毛南族自治县', + '451227': '巴马瑶族自治县', + '451228': '都安瑶族自治县', + '451229': '大化瑶族自治县' + }, + '451300': { + '451301': '市辖区', + '451302': '兴宾区', + '451321': '忻城县', + '451322': '象州县', + '451323': '武宣县', + '451324': '金秀瑶族自治县', + '451381': '合山市' + }, + '451400': { + '451401': '市辖区', + '451402': '江州区', + '451421': '扶绥县', + '451422': '宁明县', + '451423': '龙州县', + '451424': '大新县', + '451425': '天等县', + '451481': '凭祥市' + }, + '460000': {'460100': '海口市', '460200': '三亚市', '460300': '三沙市', '460400': '儋州市', '469000': '省直辖县级行政区划'}, + '460100': {'460101': '市辖区', '460105': '秀英区', '460106': '龙华区', '460107': '琼山区', '460108': '美兰区'}, + '460200': {'460201': '市辖区', '460202': '海棠区', '460203': '吉阳区', '460204': '天涯区', '460205': '崖州区'}, + '460300': {'460321': '西沙群岛', '460322': '南沙群岛', '460323': '中沙群岛的岛礁及其海域'}, + '460400': { + '460400100': '那大镇', + '460400101': '和庆镇', + '460400102': '南丰镇', + '460400103': '大成镇', + '460400104': '雅星镇', + '460400105': '兰洋镇', + '460400106': '光村镇', + '460400107': '木棠镇', + '460400108': '海头镇', + '460400109': '峨蔓镇', + '460400111': '王五镇', + '460400112': '白马井镇', + '460400113': '中和镇', + '460400114': '排浦镇', + '460400115': '东成镇', + '460400116': '新州镇', + '460400499': '洋浦经济开发区', + '460400500': '华南热作学院' + }, + '469000': { + '469001': '五指山市', + '469002': '琼海市', + '469005': '文昌市', + '469006': '万宁市', + '469007': '东方市', + '469021': '定安县', + '469022': '屯昌县', + '469023': '澄迈县', + '469024': '临高县', + '469025': '白沙黎族自治县', + '469026': '昌江黎族自治县', + '469027': '乐东黎族自治县', + '469028': '陵水黎族自治县', + '469029': '保亭黎族苗族自治县', + '469030': '琼中黎族苗族自治县' + }, + '500000': {'500100': '市辖区', '500200': '县'}, + '500100': { + '500101': '万州区', + '500102': '涪陵区', + '500103': '渝中区', + '500104': '大渡口区', + '500105': '江北区', + '500106': '沙坪坝区', + '500107': '九龙坡区', + '500108': '南岸区', + '500109': '北碚区', + '500110': '綦江区', + '500111': '大足区', + '500112': '渝北区', + '500113': '巴南区', + '500114': '黔江区', + '500115': '长寿区', + '500116': '江津区', + '500117': '合川区', + '500118': '永川区', + '500119': '南川区', + '500120': '璧山区', + '500151': '铜梁区', + '500152': '潼南区', + '500153': '荣昌区', + '500154': '开州区', + '500155': '梁平区', + '500156': '武隆区' + }, + '500200': { + '500229': '城口县', + '500230': '丰都县', + '500231': '垫江县', + '500233': '忠县', + '500235': '云阳县', + '500236': '奉节县', + '500237': '巫山县', + '500238': '巫溪县', + '500240': '石柱土家族自治县', + '500241': '秀山土家族苗族自治县', + '500242': '酉阳土家族苗族自治县', + '500243': '彭水苗族土家族自治县' + }, + '510000': { + '510100': '成都市', + '510300': '自贡市', + '510400': '攀枝花市', + '510500': '泸州市', + '510600': '德阳市', + '510700': '绵阳市', + '510800': '广元市', + '510900': '遂宁市', + '511000': '内江市', + '511100': '乐山市', + '511300': '南充市', + '511400': '眉山市', + '511500': '宜宾市', + '511600': '广安市', + '511700': '达州市', + '511800': '雅安市', + '511900': '巴中市', + '512000': '资阳市', + '513200': '阿坝藏族羌族自治州', + '513300': '甘孜藏族自治州', + '513400': '凉山彝族自治州' + }, + '510100': { + '510101': '市辖区', + '510104': '锦江区', + '510105': '青羊区', + '510106': '金牛区', + '510107': '武侯区', + '510108': '成华区', + '510112': '龙泉驿区', + '510113': '青白江区', + '510114': '新都区', + '510115': '温江区', + '510116': '双流区', + '510117': '郫都区', + '510121': '金堂县', + '510129': '大邑县', + '510131': '蒲江县', + '510132': '新津县', + '510181': '都江堰市', + '510182': '彭州市', + '510183': '邛崃市', + '510184': '崇州市', + '510185': '简阳市' + }, + '510300': { + '510301': '市辖区', + '510302': '自流井区', + '510303': '贡井区', + '510304': '大安区', + '510311': '沿滩区', + '510321': '荣县', + '510322': '富顺县' + }, + '510400': {'510401': '市辖区', '510402': '东区', '510403': '西区', '510411': '仁和区', '510421': '米易县', '510422': '盐边县'}, + '510500': { + '510501': '市辖区', + '510502': '江阳区', + '510503': '纳溪区', + '510504': '龙马潭区', + '510521': '泸县', + '510522': '合江县', + '510524': '叙永县', + '510525': '古蔺县' + }, + '510600': { + '510601': '市辖区', + '510603': '旌阳区', + '510604': '罗江区', + '510623': '中江县', + '510681': '广汉市', + '510682': '什邡市', + '510683': '绵竹市' + }, + '510700': { + '510701': '市辖区', + '510703': '涪城区', + '510704': '游仙区', + '510705': '安州区', + '510722': '三台县', + '510723': '盐亭县', + '510725': '梓潼县', + '510726': '北川羌族自治县', + '510727': '平武县', + '510781': '江油市' + }, + '510800': { + '510801': '市辖区', + '510802': '利州区', + '510811': '昭化区', + '510812': '朝天区', + '510821': '旺苍县', + '510822': '青川县', + '510823': '剑阁县', + '510824': '苍溪县' + }, + '510900': {'510901': '市辖区', '510903': '船山区', '510904': '安居区', '510921': '蓬溪县', '510923': '大英县', '510981': '射洪市'}, + '511000': { + '511001': '市辖区', + '511002': '市中区', + '511011': '东兴区', + '511024': '威远县', + '511025': '资中县', + '511071': '内江经济开发区', + '511083': '隆昌市' + }, + '511100': { + '511101': '市辖区', + '511102': '市中区', + '511111': '沙湾区', + '511112': '五通桥区', + '511113': '金口河区', + '511123': '犍为县', + '511124': '井研县', + '511126': '夹江县', + '511129': '沐川县', + '511132': '峨边彝族自治县', + '511133': '马边彝族自治县', + '511181': '峨眉山市' + }, + '511300': { + '511301': '市辖区', + '511302': '顺庆区', + '511303': '高坪区', + '511304': '嘉陵区', + '511321': '南部县', + '511322': '营山县', + '511323': '蓬安县', + '511324': '仪陇县', + '511325': '西充县', + '511381': '阆中市' + }, + '511400': { + '511401': '市辖区', + '511402': '东坡区', + '511403': '彭山区', + '511421': '仁寿县', + '511423': '洪雅县', + '511424': '丹棱县', + '511425': '青神县' + }, + '511500': { + '511501': '市辖区', + '511502': '翠屏区', + '511503': '南溪区', + '511504': '叙州区', + '511523': '江安县', + '511524': '长宁县', + '511525': '高县', + '511526': '珙县', + '511527': '筠连县', + '511528': '兴文县', + '511529': '屏山县' + }, + '511600': { + '511601': '市辖区', + '511602': '广安区', + '511603': '前锋区', + '511621': '岳池县', + '511622': '武胜县', + '511623': '邻水县', + '511681': '华蓥市' + }, + '511700': { + '511701': '市辖区', + '511702': '通川区', + '511703': '达川区', + '511722': '宣汉县', + '511723': '开江县', + '511724': '大竹县', + '511725': '渠县', + '511771': '达州经济开发区', + '511781': '万源市' + }, + '511800': { + '511801': '市辖区', + '511802': '雨城区', + '511803': '名山区', + '511822': '荥经县', + '511823': '汉源县', + '511824': '石棉县', + '511825': '天全县', + '511826': '芦山县', + '511827': '宝兴县' + }, + '511900': { + '511901': '市辖区', + '511902': '巴州区', + '511903': '恩阳区', + '511921': '通江县', + '511922': '南江县', + '511923': '平昌县', + '511971': '巴中经济开发区' + }, + '512000': {'512001': '市辖区', '512002': '雁江区', '512021': '安岳县', '512022': '乐至县'}, + '513200': { + '513201': '马尔康市', + '513221': '汶川县', + '513222': '理县', + '513223': '茂县', + '513224': '松潘县', + '513225': '九寨沟县', + '513226': '金川县', + '513227': '小金县', + '513228': '黑水县', + '513230': '壤塘县', + '513231': '阿坝县', + '513232': '若尔盖县', + '513233': '红原县' + }, + '513300': { + '513301': '康定市', + '513322': '泸定县', + '513323': '丹巴县', + '513324': '九龙县', + '513325': '雅江县', + '513326': '道孚县', + '513327': '炉霍县', + '513328': '甘孜县', + '513329': '新龙县', + '513330': '德格县', + '513331': '白玉县', + '513332': '石渠县', + '513333': '色达县', + '513334': '理塘县', + '513335': '巴塘县', + '513336': '乡城县', + '513337': '稻城县', + '513338': '得荣县' + }, + '513400': { + '513401': '西昌市', + '513422': '木里藏族自治县', + '513423': '盐源县', + '513424': '德昌县', + '513425': '会理县', + '513426': '会东县', + '513427': '宁南县', + '513428': '普格县', + '513429': '布拖县', + '513430': '金阳县', + '513431': '昭觉县', + '513432': '喜德县', + '513433': '冕宁县', + '513434': '越西县', + '513435': '甘洛县', + '513436': '美姑县', + '513437': '雷波县' + }, + '520000': { + '520100': '贵阳市', + '520200': '六盘水市', + '520300': '遵义市', + '520400': '安顺市', + '520500': '毕节市', + '520600': '铜仁市', + '522300': '黔西南布依族苗族自治州', + '522600': '黔东南苗族侗族自治州', + '522700': '黔南布依族苗族自治州' + }, + '520100': { + '520101': '市辖区', + '520102': '南明区', + '520103': '云岩区', + '520111': '花溪区', + '520112': '乌当区', + '520113': '白云区', + '520115': '观山湖区', + '520121': '开阳县', + '520122': '息烽县', + '520123': '修文县', + '520181': '清镇市' + }, + '520200': {'520201': '钟山区', '520203': '六枝特区', '520221': '水城县', '520281': '盘州市'}, + '520300': { + '520301': '市辖区', + '520302': '红花岗区', + '520303': '汇川区', + '520304': '播州区', + '520322': '桐梓县', + '520323': '绥阳县', + '520324': '正安县', + '520325': '道真仡佬族苗族自治县', + '520326': '务川仡佬族苗族自治县', + '520327': '凤冈县', + '520328': '湄潭县', + '520329': '余庆县', + '520330': '习水县', + '520381': '赤水市', + '520382': '仁怀市' + }, + '520400': { + '520401': '市辖区', + '520402': '西秀区', + '520403': '平坝区', + '520422': '普定县', + '520423': '镇宁布依族苗族自治县', + '520424': '关岭布依族苗族自治县', + '520425': '紫云苗族布依族自治县' + }, + '520500': { + '520501': '市辖区', + '520502': '七星关区', + '520521': '大方县', + '520522': '黔西县', + '520523': '金沙县', + '520524': '织金县', + '520525': '纳雍县', + '520526': '威宁彝族回族苗族自治县', + '520527': '赫章县' + }, + '520600': { + '520601': '市辖区', + '520602': '碧江区', + '520603': '万山区', + '520621': '江口县', + '520622': '玉屏侗族自治县', + '520623': '石阡县', + '520624': '思南县', + '520625': '印江土家族苗族自治县', + '520626': '德江县', + '520627': '沿河土家族自治县', + '520628': '松桃苗族自治县' + }, + '522300': { + '522301': '兴义市', + '522302': '兴仁市', + '522323': '普安县', + '522324': '晴隆县', + '522325': '贞丰县', + '522326': '望谟县', + '522327': '册亨县', + '522328': '安龙县' + }, + '522600': { + '522601': '凯里市', + '522622': '黄平县', + '522623': '施秉县', + '522624': '三穗县', + '522625': '镇远县', + '522626': '岑巩县', + '522627': '天柱县', + '522628': '锦屏县', + '522629': '剑河县', + '522630': '台江县', + '522631': '黎平县', + '522632': '榕江县', + '522633': '从江县', + '522634': '雷山县', + '522635': '麻江县', + '522636': '丹寨县' + }, + '522700': { + '522701': '都匀市', + '522702': '福泉市', + '522722': '荔波县', + '522723': '贵定县', + '522725': '瓮安县', + '522726': '独山县', + '522727': '平塘县', + '522728': '罗甸县', + '522729': '长顺县', + '522730': '龙里县', + '522731': '惠水县', + '522732': '三都水族自治县' + }, + '530000': { + '530100': '昆明市', + '530300': '曲靖市', + '530400': '玉溪市', + '530500': '保山市', + '530600': '昭通市', + '530700': '丽江市', + '530800': '普洱市', + '530900': '临沧市', + '532300': '楚雄彝族自治州', + '532500': '红河哈尼族彝族自治州', + '532600': '文山壮族苗族自治州', + '532800': '西双版纳傣族自治州', + '532900': '大理白族自治州', + '533100': '德宏傣族景颇族自治州', + '533300': '怒江傈僳族自治州', + '533400': '迪庆藏族自治州' + }, + '530100': { + '530101': '市辖区', + '530102': '五华区', + '530103': '盘龙区', + '530111': '官渡区', + '530112': '西山区', + '530113': '东川区', + '530114': '呈贡区', + '530115': '晋宁区', + '530124': '富民县', + '530125': '宜良县', + '530126': '石林彝族自治县', + '530127': '嵩明县', + '530128': '禄劝彝族苗族自治县', + '530129': '寻甸回族彝族自治县', + '530181': '安宁市' + }, + '530300': { + '530301': '市辖区', + '530302': '麒麟区', + '530303': '沾益区', + '530304': '马龙区', + '530322': '陆良县', + '530323': '师宗县', + '530324': '罗平县', + '530325': '富源县', + '530326': '会泽县', + '530381': '宣威市' + }, + '530400': { + '530401': '市辖区', + '530402': '红塔区', + '530403': '江川区', + '530422': '澄江县', + '530423': '通海县', + '530424': '华宁县', + '530425': '易门县', + '530426': '峨山彝族自治县', + '530427': '新平彝族傣族自治县', + '530428': '元江哈尼族彝族傣族自治县' + }, + '530500': {'530501': '市辖区', '530502': '隆阳区', '530521': '施甸县', '530523': '龙陵县', '530524': '昌宁县', '530581': '腾冲市'}, + '530600': { + '530601': '市辖区', + '530602': '昭阳区', + '530621': '鲁甸县', + '530622': '巧家县', + '530623': '盐津县', + '530624': '大关县', + '530625': '永善县', + '530626': '绥江县', + '530627': '镇雄县', + '530628': '彝良县', + '530629': '威信县', + '530681': '水富市' + }, + '530700': { + '530701': '市辖区', + '530702': '古城区', + '530721': '玉龙纳西族自治县', + '530722': '永胜县', + '530723': '华坪县', + '530724': '宁蒗彝族自治县' + }, + '530800': { + '530801': '市辖区', + '530802': '思茅区', + '530821': '宁洱哈尼族彝族自治县', + '530822': '墨江哈尼族自治县', + '530823': '景东彝族自治县', + '530824': '景谷傣族彝族自治县', + '530825': '镇沅彝族哈尼族拉祜族自治县', + '530826': '江城哈尼族彝族自治县', + '530827': '孟连傣族拉祜族佤族自治县', + '530828': '澜沧拉祜族自治县', + '530829': '西盟佤族自治县' + }, + '530900': { + '530901': '市辖区', + '530902': '临翔区', + '530921': '凤庆县', + '530922': '云县', + '530923': '永德县', + '530924': '镇康县', + '530925': '双江拉祜族佤族布朗族傣族自治县', + '530926': '耿马傣族佤族自治县', + '530927': '沧源佤族自治县' + }, + '532300': { + '532301': '楚雄市', + '532322': '双柏县', + '532323': '牟定县', + '532324': '南华县', + '532325': '姚安县', + '532326': '大姚县', + '532327': '永仁县', + '532328': '元谋县', + '532329': '武定县', + '532331': '禄丰县' + }, + '532500': { + '532501': '个旧市', + '532502': '开远市', + '532503': '蒙自市', + '532504': '弥勒市', + '532523': '屏边苗族自治县', + '532524': '建水县', + '532525': '石屏县', + '532527': '泸西县', + '532528': '元阳县', + '532529': '红河县', + '532530': '金平苗族瑶族傣族自治县', + '532531': '绿春县', + '532532': '河口瑶族自治县' + }, + '532600': { + '532601': '文山市', + '532622': '砚山县', + '532623': '西畴县', + '532624': '麻栗坡县', + '532625': '马关县', + '532626': '丘北县', + '532627': '广南县', + '532628': '富宁县' + }, + '532800': {'532801': '景洪市', '532822': '勐海县', '532823': '勐腊县'}, + '532900': { + '532901': '大理市', + '532922': '漾濞彝族自治县', + '532923': '祥云县', + '532924': '宾川县', + '532925': '弥渡县', + '532926': '南涧彝族自治县', + '532927': '巍山彝族回族自治县', + '532928': '永平县', + '532929': '云龙县', + '532930': '洱源县', + '532931': '剑川县', + '532932': '鹤庆县' + }, + '533100': {'533102': '瑞丽市', '533103': '芒市', '533122': '梁河县', '533123': '盈江县', '533124': '陇川县'}, + '533300': {'533301': '泸水市', '533323': '福贡县', '533324': '贡山独龙族怒族自治县', '533325': '兰坪白族普米族自治县'}, + '533400': {'533401': '香格里拉市', '533422': '德钦县', '533423': '维西傈僳族自治县'}, + '540000': { + '540100': '拉萨市', + '540200': '日喀则市', + '540300': '昌都市', + '540400': '林芝市', + '540500': '山南市', + '540600': '那曲市', + '542500': '阿里地区' + }, + '540100': { + '540101': '市辖区', + '540102': '城关区', + '540103': '堆龙德庆区', + '540104': '达孜区', + '540121': '林周县', + '540122': '当雄县', + '540123': '尼木县', + '540124': '曲水县', + '540127': '墨竹工卡县', + '540171': '格尔木藏青工业园区', + '540172': '拉萨经济技术开发区', + '540173': '西藏文化旅游创意园区', + '540174': '达孜工业园区' + }, + '540200': { + '540202': '桑珠孜区', + '540221': '南木林县', + '540222': '江孜县', + '540223': '定日县', + '540224': '萨迦县', + '540225': '拉孜县', + '540226': '昂仁县', + '540227': '谢通门县', + '540228': '白朗县', + '540229': '仁布县', + '540230': '康马县', + '540231': '定结县', + '540232': '仲巴县', + '540233': '亚东县', + '540234': '吉隆县', + '540235': '聂拉木县', + '540236': '萨嘎县', + '540237': '岗巴县' + }, + '540300': { + '540302': '卡若区', + '540321': '江达县', + '540322': '贡觉县', + '540323': '类乌齐县', + '540324': '丁青县', + '540325': '察雅县', + '540326': '八宿县', + '540327': '左贡县', + '540328': '芒康县', + '540329': '洛隆县', + '540330': '边坝县' + }, + '540400': { + '540402': '巴宜区', + '540421': '工布江达县', + '540422': '米林县', + '540423': '墨脱县', + '540424': '波密县', + '540425': '察隅县', + '540426': '朗县' + }, + '540500': { + '540501': '市辖区', + '540502': '乃东区', + '540521': '扎囊县', + '540522': '贡嘎县', + '540523': '桑日县', + '540524': '琼结县', + '540525': '曲松县', + '540526': '措美县', + '540527': '洛扎县', + '540528': '加查县', + '540529': '隆子县', + '540530': '错那县', + '540531': '浪卡子县' + }, + '540600': { + '540602': '色尼区', + '540621': '嘉黎县', + '540622': '比如县', + '540623': '聂荣县', + '540624': '安多县', + '540625': '申扎县', + '540626': '索县', + '540627': '班戈县', + '540628': '巴青县', + '540629': '尼玛县', + '540630': '双湖县' + }, + '542500': { + '542521': '普兰县', + '542522': '札达县', + '542523': '噶尔县', + '542524': '日土县', + '542525': '革吉县', + '542526': '改则县', + '542527': '措勤县' + }, + '610000': { + '610100': '西安市', + '610200': '铜川市', + '610300': '宝鸡市', + '610400': '咸阳市', + '610500': '渭南市', + '610600': '延安市', + '610700': '汉中市', + '610800': '榆林市', + '610900': '安康市', + '611000': '商洛市' + }, + '610100': { + '610101': '市辖区', + '610102': '新城区', + '610103': '碑林区', + '610104': '莲湖区', + '610111': '灞桥区', + '610112': '未央区', + '610113': '雁塔区', + '610114': '阎良区', + '610115': '临潼区', + '610116': '长安区', + '610117': '高陵区', + '610118': '鄠邑区', + '610122': '蓝田县', + '610124': '周至县' + }, + '610200': {'610201': '市辖区', '610202': '王益区', '610203': '印台区', '610204': '耀州区', '610222': '宜君县'}, + '610300': { + '610301': '市辖区', + '610302': '渭滨区', + '610303': '金台区', + '610304': '陈仓区', + '610322': '凤翔县', + '610323': '岐山县', + '610324': '扶风县', + '610326': '眉县', + '610327': '陇县', + '610328': '千阳县', + '610329': '麟游县', + '610330': '凤县', + '610331': '太白县' + }, + '610400': { + '610401': '市辖区', + '610402': '秦都区', + '610403': '杨陵区', + '610404': '渭城区', + '610422': '三原县', + '610423': '泾阳县', + '610424': '乾县', + '610425': '礼泉县', + '610426': '永寿县', + '610428': '长武县', + '610429': '旬邑县', + '610430': '淳化县', + '610431': '武功县', + '610481': '兴平市', + '610482': '彬州市' + }, + '610500': { + '610501': '市辖区', + '610502': '临渭区', + '610503': '华州区', + '610522': '潼关县', + '610523': '大荔县', + '610524': '合阳县', + '610525': '澄城县', + '610526': '蒲城县', + '610527': '白水县', + '610528': '富平县', + '610581': '韩城市', + '610582': '华阴市' + }, + '610600': { + '610601': '市辖区', + '610602': '宝塔区', + '610603': '安塞区', + '610621': '延长县', + '610622': '延川县', + '610625': '志丹县', + '610626': '吴起县', + '610627': '甘泉县', + '610628': '富县', + '610629': '洛川县', + '610630': '宜川县', + '610631': '黄龙县', + '610632': '黄陵县', + '610681': '子长市' + }, + '610700': { + '610701': '市辖区', + '610702': '汉台区', + '610703': '南郑区', + '610722': '城固县', + '610723': '洋县', + '610724': '西乡县', + '610725': '勉县', + '610726': '宁强县', + '610727': '略阳县', + '610728': '镇巴县', + '610729': '留坝县', + '610730': '佛坪县' + }, + '610800': { + '610801': '市辖区', + '610802': '榆阳区', + '610803': '横山区', + '610822': '府谷县', + '610824': '靖边县', + '610825': '定边县', + '610826': '绥德县', + '610827': '米脂县', + '610828': '佳县', + '610829': '吴堡县', + '610830': '清涧县', + '610831': '子洲县', + '610881': '神木市' + }, + '610900': { + '610901': '市辖区', + '610902': '汉滨区', + '610921': '汉阴县', + '610922': '石泉县', + '610923': '宁陕县', + '610924': '紫阳县', + '610925': '岚皋县', + '610926': '平利县', + '610927': '镇坪县', + '610928': '旬阳县', + '610929': '白河县' + }, + '611000': { + '611001': '市辖区', + '611002': '商州区', + '611021': '洛南县', + '611022': '丹凤县', + '611023': '商南县', + '611024': '山阳县', + '611025': '镇安县', + '611026': '柞水县' + }, + '620000': { + '620100': '兰州市', + '620200': '嘉峪关市', + '620300': '金昌市', + '620400': '白银市', + '620500': '天水市', + '620600': '武威市', + '620700': '张掖市', + '620800': '平凉市', + '620900': '酒泉市', + '621000': '庆阳市', + '621100': '定西市', + '621200': '陇南市', + '622900': '临夏回族自治州', + '623000': '甘南藏族自治州' + }, + '620100': { + '620101': '市辖区', + '620102': '城关区', + '620103': '七里河区', + '620104': '西固区', + '620105': '安宁区', + '620111': '红古区', + '620121': '永登县', + '620122': '皋兰县', + '620123': '榆中县', + '620171': '兰州新区' + }, + '620200': {'620201': '市辖区'}, + '620300': {'620301': '市辖区', '620302': '金川区', '620321': '永昌县'}, + '620400': {'620401': '市辖区', '620402': '白银区', '620403': '平川区', '620421': '靖远县', '620422': '会宁县', '620423': '景泰县'}, + '620500': { + '620501': '市辖区', + '620502': '秦州区', + '620503': '麦积区', + '620521': '清水县', + '620522': '秦安县', + '620523': '甘谷县', + '620524': '武山县', + '620525': '张家川回族自治县' + }, + '620600': {'620601': '市辖区', '620602': '凉州区', '620621': '民勤县', '620622': '古浪县', '620623': '天祝藏族自治县'}, + '620700': { + '620701': '市辖区', + '620702': '甘州区', + '620721': '肃南裕固族自治县', + '620722': '民乐县', + '620723': '临泽县', + '620724': '高台县', + '620725': '山丹县' + }, + '620800': { + '620801': '市辖区', + '620802': '崆峒区', + '620821': '泾川县', + '620822': '灵台县', + '620823': '崇信县', + '620825': '庄浪县', + '620826': '静宁县', + '620881': '华亭市' + }, + '620900': { + '620901': '市辖区', + '620902': '肃州区', + '620921': '金塔县', + '620922': '瓜州县', + '620923': '肃北蒙古族自治县', + '620924': '阿克塞哈萨克族自治县', + '620981': '玉门市', + '620982': '敦煌市' + }, + '621000': { + '621001': '市辖区', + '621002': '西峰区', + '621021': '庆城县', + '621022': '环县', + '621023': '华池县', + '621024': '合水县', + '621025': '正宁县', + '621026': '宁县', + '621027': '镇原县' + }, + '621100': { + '621101': '市辖区', + '621102': '安定区', + '621121': '通渭县', + '621122': '陇西县', + '621123': '渭源县', + '621124': '临洮县', + '621125': '漳县', + '621126': '岷县' + }, + '621200': { + '621201': '市辖区', + '621202': '武都区', + '621221': '成县', + '621222': '文县', + '621223': '宕昌县', + '621224': '康县', + '621225': '西和县', + '621226': '礼县', + '621227': '徽县', + '621228': '两当县' + }, + '622900': { + '622901': '临夏市', + '622921': '临夏县', + '622922': '康乐县', + '622923': '永靖县', + '622924': '广河县', + '622925': '和政县', + '622926': '东乡族自治县', + '622927': '积石山保安族东乡族撒拉族自治县' + }, + '623000': { + '623001': '合作市', + '623021': '临潭县', + '623022': '卓尼县', + '623023': '舟曲县', + '623024': '迭部县', + '623025': '玛曲县', + '623026': '碌曲县', + '623027': '夏河县' + }, + '630000': { + '630100': '西宁市', + '630200': '海东市', + '632200': '海北藏族自治州', + '632300': '黄南藏族自治州', + '632500': '海南藏族自治州', + '632600': '果洛藏族自治州', + '632700': '玉树藏族自治州', + '632800': '海西蒙古族藏族自治州' + }, + '630100': { + '630101': '市辖区', + '630102': '城东区', + '630103': '城中区', + '630104': '城西区', + '630105': '城北区', + '630121': '大通回族土族自治县', + '630122': '湟中县', + '630123': '湟源县' + }, + '630200': { + '630202': '乐都区', + '630203': '平安区', + '630222': '民和回族土族自治县', + '630223': '互助土族自治县', + '630224': '化隆回族自治县', + '630225': '循化撒拉族自治县' + }, + '632200': {'632221': '门源回族自治县', '632222': '祁连县', '632223': '海晏县', '632224': '刚察县'}, + '632300': {'632321': '同仁县', '632322': '尖扎县', '632323': '泽库县', '632324': '河南蒙古族自治县'}, + '632500': {'632521': '共和县', '632522': '同德县', '632523': '贵德县', '632524': '兴海县', '632525': '贵南县'}, + '632600': {'632621': '玛沁县', '632622': '班玛县', '632623': '甘德县', '632624': '达日县', '632625': '久治县', '632626': '玛多县'}, + '632700': {'632701': '玉树市', '632722': '杂多县', '632723': '称多县', '632724': '治多县', '632725': '囊谦县', '632726': '曲麻莱县'}, + '632800': { + '632801': '格尔木市', + '632802': '德令哈市', + '632803': '茫崖市', + '632821': '乌兰县', + '632822': '都兰县', + '632823': '天峻县', + '632857': '大柴旦行政委员会' + }, + '640000': {'640100': '银川市', '640200': '石嘴山市', '640300': '吴忠市', '640400': '固原市', '640500': '中卫市'}, + '640100': { + '640101': '市辖区', + '640104': '兴庆区', + '640105': '西夏区', + '640106': '金凤区', + '640121': '永宁县', + '640122': '贺兰县', + '640181': '灵武市' + }, + '640200': {'640201': '市辖区', '640202': '大武口区', '640205': '惠农区', '640221': '平罗县'}, + '640300': {'640301': '市辖区', '640302': '利通区', '640303': '红寺堡区', '640323': '盐池县', '640324': '同心县', '640381': '青铜峡市'}, + '640400': {'640401': '市辖区', '640402': '原州区', '640422': '西吉县', '640423': '隆德县', '640424': '泾源县', '640425': '彭阳县'}, + '640500': {'640501': '市辖区', '640502': '沙坡头区', '640521': '中宁县', '640522': '海原县'}, + '650000': { + '650100': '乌鲁木齐市', + '650200': '克拉玛依市', + '650400': '吐鲁番市', + '650500': '哈密市', + '652300': '昌吉回族自治州', + '652700': '博尔塔拉蒙古自治州', + '652800': '巴音郭楞蒙古自治州', + '652900': '阿克苏地区', + '653000': '克孜勒苏柯尔克孜自治州', + '653100': '喀什地区', + '653200': '和田地区', + '654000': '伊犁哈萨克自治州', + '654200': '塔城地区', + '654300': '阿勒泰地区', + '659000': '自治区直辖县级行政区划' + }, + '650100': { + '650101': '市辖区', + '650102': '天山区', + '650103': '沙依巴克区', + '650104': '新市区', + '650105': '水磨沟区', + '650106': '头屯河区', + '650107': '达坂城区', + '650109': '米东区', + '650121': '乌鲁木齐县' + }, + '650200': {'650201': '市辖区', '650202': '独山子区', '650203': '克拉玛依区', '650204': '白碱滩区', '650205': '乌尔禾区'}, + '650400': {'650402': '高昌区', '650421': '鄯善县', '650422': '托克逊县'}, + '650500': {'650502': '伊州区', '650521': '巴里坤哈萨克自治县', '650522': '伊吾县'}, + '652300': { + '652301': '昌吉市', + '652302': '阜康市', + '652323': '呼图壁县', + '652324': '玛纳斯县', + '652325': '奇台县', + '652327': '吉木萨尔县', + '652328': '木垒哈萨克自治县' + }, + '652700': {'652701': '博乐市', '652702': '阿拉山口市', '652722': '精河县', '652723': '温泉县'}, + '652800': { + '652801': '库尔勒市', + '652822': '轮台县', + '652823': '尉犁县', + '652824': '若羌县', + '652825': '且末县', + '652826': '焉耆回族自治县', + '652827': '和静县', + '652828': '和硕县', + '652829': '博湖县', + '652871': '库尔勒经济技术开发区' + }, + '652900': { + '652901': '阿克苏市', + '652922': '温宿县', + '652923': '库车县', + '652924': '沙雅县', + '652925': '新和县', + '652926': '拜城县', + '652927': '乌什县', + '652928': '阿瓦提县', + '652929': '柯坪县' + }, + '653000': {'653001': '阿图什市', '653022': '阿克陶县', '653023': '阿合奇县', '653024': '乌恰县'}, + '653100': { + '653101': '喀什市', + '653121': '疏附县', + '653122': '疏勒县', + '653123': '英吉沙县', + '653124': '泽普县', + '653125': '莎车县', + '653126': '叶城县', + '653127': '麦盖提县', + '653128': '岳普湖县', + '653129': '伽师县', + '653130': '巴楚县', + '653131': '塔什库尔干塔吉克自治县' + }, + '653200': { + '653201': '和田市', + '653221': '和田县', + '653222': '墨玉县', + '653223': '皮山县', + '653224': '洛浦县', + '653225': '策勒县', + '653226': '于田县', + '653227': '民丰县' + }, + '654000': { + '654002': '伊宁市', + '654003': '奎屯市', + '654004': '霍尔果斯市', + '654021': '伊宁县', + '654022': '察布查尔锡伯自治县', + '654023': '霍城县', + '654024': '巩留县', + '654025': '新源县', + '654026': '昭苏县', + '654027': '特克斯县', + '654028': '尼勒克县' + }, + '654200': { + '654201': '塔城市', + '654202': '乌苏市', + '654221': '额敏县', + '654223': '沙湾县', + '654224': '托里县', + '654225': '裕民县', + '654226': '和布克赛尔蒙古自治县' + }, + '654300': { + '654301': '阿勒泰市', + '654321': '布尔津县', + '654322': '富蕴县', + '654323': '福海县', + '654324': '哈巴河县', + '654325': '青河县', + '654326': '吉木乃县' + }, + '659000': {'659001': '石河子市', '659002': '阿拉尔市', '659003': '图木舒克市', '659004': '五家渠市', '659006': '铁门关市'}, + '710000': { + '710100': '台北市', + '710200': '高雄市', + '710300': '基隆市', + '710400': '台中市', + '710500': '台南市', + '710600': '新竹市', + '710700': '嘉义市' + }, + '710100': { + '710101': '内湖区', + '710102': '南港区', + '710103': '中正区', + '710104': '松山区', + '710105': '信义区', + '710106': '大安区', + '710107': '中山区', + '710108': '文山区', + '710109': '大同区', + '710110': '万华区', + '710111': '士林区', + '710112': '北投区' + }, + '710200': { + '710201': '新兴区', + '710202': '前金区', + '710203': '芩雅区', + '710204': '盐埕区', + '710205': '鼓山区', + '710206': '旗津区', + '710207': '前镇区', + '710208': '三民区', + '710209': '左营区', + '710210': '楠梓区', + '710211': '小港区' + }, + '710300': {'710301': '仁爱区', '710302': '信义区', '710303': '中正区', '710304': '暖暖区', '710305': '安乐区', '710307': '七堵区'}, + '710400': { + '710301': '中区', + '710302': '东区', + '710303': '南区', + '710304': '西区', + '710305': '北区', + '710306': '北屯区', + '710307': '西屯区', + '710308': '南屯区' + }, + '710500': {'710501': '中西区', '710502': '东区', '710503': '南区', '710504': '北区', '710505': '安平区', '710506': '安南区'}, + '710600': {'710601': '东区', '710602': '北区', '710603': '香山区'}, + '710700': {'710701': '东区', '710702': '西区'}, + '810000': { + '810001': '中西區', + '810002': '灣仔區', + '810003': '東區', + '810004': '南區', + '810005': '油尖旺區', + '810006': '深水埗區', + '810007': '九龍城區', + '810008': '黃大仙區', + '810009': '觀塘區', + '810010': '荃灣區', + '810011': '屯門區', + '810012': '元朗區', + '810013': '北區', + '810014': '大埔區', + '810015': '西貢區', + '810016': '沙田區', + '810017': '葵青區', + '810018': '離島區' + }, + '820000': { + '820001': '花地瑪堂區', + '820002': '花王堂區', + '820003': '望德堂區', + '820004': '大堂區', + '820005': '風順堂區', + '820006': '嘉模堂區', + '820007': '路氹填海區', + '820008': '聖方濟各堂區' } }; @@ -4134,7 +4134,7 @@ class Address { static bool addAllItem = true; static getCities(String province) { - var emptyData = {'name': "全部", 'cityCode': ''}; + var emptyData = {'name': '全部', 'cityCode': ''}; if (province == '全部' && addAllItem) return [emptyData]; String code = ''; diff --git a/lib/tools/pickers/address_picker/route/address_picker_route.dart b/lib/tools/pickers/address_picker/route/address_picker_route.dart index 43144f7e..9fce43ba 100755 --- a/lib/tools/pickers/address_picker/route/address_picker_route.dart +++ b/lib/tools/pickers/address_picker/route/address_picker_route.dart @@ -97,14 +97,14 @@ class AddressPickerRoute extends PopupRoute { } class _PickerContentView extends StatefulWidget { - _PickerContentView({ - Key? key, + const _PickerContentView({ required this.initProvince, required this.initCity, - this.initTown, required this.pickerStyle, required this.addAllItem, required this.route, + Key? key, + this.initTown, }) : super(key: key); final String initProvince, initCity; @@ -114,17 +114,17 @@ class _PickerContentView extends StatefulWidget { final PickerStyle pickerStyle; @override - State createState() => _PickerState(this.initProvince, - this.initCity, this.initTown, this.addAllItem, this.pickerStyle); + State createState() => + _PickerState(initProvince, initCity, initTown, addAllItem, pickerStyle); } class _PickerState extends State<_PickerContentView> { final PickerStyle _pickerStyle; late String _currentProvince, _currentCity; String? _currentTown; - var cities = []; - var towns = []; - var provinces = []; + List cities = []; + List towns = []; + List provinces = []; // 是否显示县级 bool hasTown = true; @@ -142,7 +142,7 @@ class _PickerState extends State<_PickerContentView> { _PickerState(this._currentProvince, this._currentCity, this._currentTown, this.addAllItem, this._pickerStyle) { provinces = Address.provinces; - hasTown = this._currentTown != null; + hasTown = _currentTown != null; _init(); } @@ -165,7 +165,7 @@ class _PickerState extends State<_PickerContentView> { return ClipRect( child: CustomSingleChildLayout( delegate: _BottomPickerLayout( - widget.route.animation!.value, this._pickerStyle), + widget.route.animation!.value, _pickerStyle), child: GestureDetector( child: Material( color: Colors.transparent, @@ -186,7 +186,7 @@ class _PickerState extends State<_PickerContentView> { int tindex = 0; pindex = provinces.indexWhere((p) => p == _currentProvince); pindex = pindex >= 0 ? pindex : 0; - String? selectedProvince = provinces[pindex]; + final String? selectedProvince = provinces[pindex]; if (selectedProvince != null) { _currentProvince = selectedProvince; @@ -202,7 +202,7 @@ class _PickerState extends State<_PickerContentView> { towns = Address.getTowns(cities[cindex]['cityCode']); tindex = towns.indexWhere((t) => t == _currentTown); tindex = tindex >= 0 ? tindex : 0; - if (towns.length == 0) { + if (towns.isEmpty) { _currentTown = ''; } else { _currentTown = towns[tindex]; @@ -210,13 +210,13 @@ class _PickerState extends State<_PickerContentView> { } } - provinceScrollCtrl = new FixedExtentScrollController(initialItem: pindex); - cityScrollCtrl = new FixedExtentScrollController(initialItem: cindex); - townScrollCtrl = new FixedExtentScrollController(initialItem: tindex); + provinceScrollCtrl = FixedExtentScrollController(initialItem: pindex); + cityScrollCtrl = FixedExtentScrollController(initialItem: cindex); + townScrollCtrl = FixedExtentScrollController(initialItem: tindex); } void _setProvince(int index) { - String selectedProvince = provinces[index]; + final String selectedProvince = provinces[index]; // AppLog.log('longer >>> index:$index _currentProvince:$_currentProvince selectedProvince:$selectedProvince '); if (_currentProvince != selectedProvince) { @@ -241,7 +241,7 @@ class _PickerState extends State<_PickerContentView> { void _setCity(int index) { index = cities.length > index ? index : 0; - String selectedCity = cities[index]['name']; + final String selectedCity = cities[index]['name']; if (_currentCity != selectedCity) { setState(() { _currentCity = selectedCity; @@ -258,7 +258,7 @@ class _PickerState extends State<_PickerContentView> { void _setTown(int index) { index = towns.length > index ? index : 0; - String selectedTown = towns[index]; + final String selectedTown = towns[index]; if (_currentTown != selectedTown) { _currentTown = selectedTown; _notifyLocationChanged(); @@ -272,7 +272,7 @@ class _PickerState extends State<_PickerContentView> { } double _pickerFontSize(String text) { - double ratio = hasTown ? 0.0 : 2.0; + final double ratio = hasTown ? 0.0 : 2.0; if (text.length <= 6) { return 18.0; } else if (text.length < 9) { @@ -285,12 +285,12 @@ class _PickerState extends State<_PickerContentView> { } Widget _renderPickerView() { - Widget itemView = _renderItemView(); + final Widget itemView = _renderItemView(); if (!_pickerStyle.showTitleBar && _pickerStyle.menu == null) { return itemView; } - List viewList = []; + final List viewList = []; if (_pickerStyle.showTitleBar) { viewList.add(_titleView()); } @@ -315,12 +315,10 @@ class _PickerState extends State<_PickerContentView> { scrollController: provinceScrollCtrl, selectionOverlay: _pickerStyle.itemOverlay, itemExtent: _pickerStyle.pickerItemHeight, - onSelectedItemChanged: (int index) { - _setProvince(index); - }, + onSelectedItemChanged: _setProvince, childCount: Address.provinces.length, - itemBuilder: (_, index) { - String text = Address.provinces[index]; + itemBuilder: (_, int index) { + final String text = Address.provinces[index]; return Align( alignment: Alignment.center, child: Text(text, @@ -336,20 +334,18 @@ class _PickerState extends State<_PickerContentView> { ), Expanded( child: Container( - padding: EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8.0), child: CupertinoPicker.builder( scrollController: cityScrollCtrl, selectionOverlay: _pickerStyle.itemOverlay, itemExtent: _pickerStyle.pickerItemHeight, - onSelectedItemChanged: (int index) { - _setCity(index); - }, + onSelectedItemChanged: _setCity, childCount: cities.length, - itemBuilder: (_, index) { - String text = cities[index]['name']; + itemBuilder: (_, int index) { + final String text = cities[index]['name']; return Align( alignment: Alignment.center, - child: Text('$text', + child: Text(text, style: TextStyle( color: _pickerStyle.textColor, fontSize: @@ -360,34 +356,33 @@ class _PickerState extends State<_PickerContentView> { }, )), ), - hasTown - ? Expanded( - child: Container( - padding: EdgeInsets.all(8.0), - child: CupertinoPicker.builder( - scrollController: townScrollCtrl, - selectionOverlay: _pickerStyle.itemOverlay, - itemExtent: _pickerStyle.pickerItemHeight, - onSelectedItemChanged: (int index) { - _setTown(index); - }, - childCount: towns.length, - itemBuilder: (_, index) { - String text = towns[index]; - return Align( - alignment: Alignment.center, - child: Text(text, - style: TextStyle( - color: _pickerStyle.textColor, - fontSize: _pickerStyle.textSize ?? - _pickerFontSize(text), - ), - textAlign: TextAlign.start), - ); - }, - )), - ) - : SizedBox() + if (hasTown) + Expanded( + child: Container( + padding: const EdgeInsets.all(8.0), + child: CupertinoPicker.builder( + scrollController: townScrollCtrl, + selectionOverlay: _pickerStyle.itemOverlay, + itemExtent: _pickerStyle.pickerItemHeight, + onSelectedItemChanged: _setTown, + childCount: towns.length, + itemBuilder: (_, int index) { + final String text = towns[index]; + return Align( + alignment: Alignment.center, + child: Text(text, + style: TextStyle( + color: _pickerStyle.textColor, + fontSize: _pickerStyle.textSize ?? + _pickerFontSize(text), + ), + textAlign: TextAlign.start), + ); + }, + )), + ) + else + const SizedBox() ], ), ); @@ -451,7 +446,7 @@ class _BottomPickerLayout extends SingleChildLayoutDelegate { @override Offset getPositionForChild(Size size, Size childSize) { - double height = size.height - childSize.height * progress; + final double height = size.height - childSize.height * progress; return Offset(0.0, height); } diff --git a/lib/tools/pickers/more_pickers/init_data.dart b/lib/tools/pickers/more_pickers/init_data.dart index 4154da33..d05e2f80 100755 --- a/lib/tools/pickers/more_pickers/init_data.dart +++ b/lib/tools/pickers/more_pickers/init_data.dart @@ -7,13 +7,58 @@ enum PickerDataType { ethnicity, // 名族 } -var pickerData = { - PickerDataType.sex: ['不限', '男', '女'], - PickerDataType.education: ["高中以下", "高中", "大专", "本科", "硕士", "博士", "博士后", '其它'], - PickerDataType.subject: ["语文", "数学", "英语", "物理", "化学", "生物", "政治", "地理", "历史"], - PickerDataType.constellation: ["水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座"], - PickerDataType.zodiac: ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'], - PickerDataType.ethnicity: [ +Map> pickerData = >{ + PickerDataType.sex: ['不限', '男', '女'], + PickerDataType.education: [ + '高中以下', + '高中', + '大专', + '本科', + '硕士', + '博士', + '博士后', + '其它' + ], + PickerDataType.subject: [ + '语文', + '数学', + '英语', + '物理', + '化学', + '生物', + '政治', + '地理', + '历史' + ], + PickerDataType.constellation: [ + '水瓶座', + '双鱼座', + '白羊座', + '金牛座', + '双子座', + '巨蟹座', + '狮子座', + '处女座', + '天秤座', + '天蝎座', + '射手座', + '摩羯座' + ], + PickerDataType.zodiac: [ + '鼠', + '牛', + '虎', + '兔', + '龙', + '蛇', + '马', + '羊', + '猴', + '鸡', + '狗', + '猪' + ], + PickerDataType.ethnicity: [ '汉族', '蒙古族', '回族', diff --git a/lib/tools/pickers/more_pickers/route/multiple_link_picker_route.dart b/lib/tools/pickers/more_pickers/route/multiple_link_picker_route.dart index c1bede84..92d030cd 100755 --- a/lib/tools/pickers/more_pickers/route/multiple_link_picker_route.dart +++ b/lib/tools/pickers/more_pickers/route/multiple_link_picker_route.dart @@ -108,10 +108,28 @@ class _PickerContentView extends StatefulWidget { @override State createState() => _PickerState( - this.data, this.selectData, this.pickerStyle, this.columeNum); + data, selectData, pickerStyle, columeNum); } class _PickerState extends State<_PickerContentView> { + + _PickerState( + this._data, List mSelectData, this._pickerStyle, this._columeNum) { + pickerItemHeight = _pickerStyle.pickerItemHeight; + // 已选择器数据为准,因为初始化数据有可能和选择器对不上 + _selectData = []; + _selectDataPosition = []; + for (int i = 0; i < _columeNum; ++i) { + if (i >= mSelectData.length) { + _selectData.add(''); + } else { + _selectData.add(mSelectData[i]); + } + _selectDataPosition.add(0); + } + + _init(mSelectData); + } final PickerStyle _pickerStyle; // 没有数据时占位字符 @@ -140,24 +158,6 @@ class _PickerState extends State<_PickerContentView> { // 选择器 高度 单独提出来,用来解决修改数据 不及时更新的BUG late double pickerItemHeight; - _PickerState( - this._data, List mSelectData, this._pickerStyle, this._columeNum) { - this.pickerItemHeight = _pickerStyle.pickerItemHeight; - // 已选择器数据为准,因为初始化数据有可能和选择器对不上 - this._selectData = []; - this._selectDataPosition = []; - for (int i = 0; i < _columeNum; ++i) { - if (i >= mSelectData.length) { - this._selectData.add(''); - } else { - this._selectData.add(mSelectData[i]); - } - this._selectDataPosition.add(0); - } - - _init(mSelectData); - } - @override void dispose() { scrollCtrl.forEach((element) { diff --git a/lib/tools/pickers/more_pickers/route/single_picker_route.dart b/lib/tools/pickers/more_pickers/route/single_picker_route.dart index 4b70d7d4..be91408d 100755 --- a/lib/tools/pickers/more_pickers/route/single_picker_route.dart +++ b/lib/tools/pickers/more_pickers/route/single_picker_route.dart @@ -12,14 +12,12 @@ typedef SingleCallback(var data, int position); class SinglePickerRoute extends PopupRoute { SinglePickerRoute({ required this.data, - this.selectData, + required this.theme, required this.pickerStyle, this.selectData, this.suffix, this.onChanged, this.onConfirm, this.onCancel, - required this.theme, this.barrierLabel, - required this.pickerStyle, RouteSettings? settings, }) : super(settings: settings); @@ -95,11 +93,8 @@ class SinglePickerRoute extends PopupRoute { class _PickerContentView extends StatefulWidget { _PickerContentView({ - Key? key, - required this.data, + required this.data, required this.pickerStyle, required this.route, Key? key, this.selectData, - required this.pickerStyle, - required this.route, }) : super(key: key); final List data; @@ -173,7 +168,7 @@ class _PickerState extends State<_PickerContentView> { } _selectPosition = pindex; - scrollCtrl = new FixedExtentScrollController(initialItem: pindex); + scrollCtrl = FixedExtentScrollController(initialItem: pindex); _laberLeft = _pickerLaberPadding(_data[pindex].toString()); } diff --git a/lib/tools/pickers/style/picker_style.dart b/lib/tools/pickers/style/picker_style.dart index 5e58d124..e93613e3 100755 --- a/lib/tools/pickers/style/picker_style.dart +++ b/lib/tools/pickers/style/picker_style.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; /// 基础样式 @@ -52,23 +53,23 @@ class PickerStyle { double? textSize, Widget? itemOverlay, }) { - this._context = context; - this._showTitleBar = showTitleBar; - this._menu = menu; + _context = context; + _showTitleBar = showTitleBar; + _menu = menu; - this._pickerHeight = pickerHeight; - this._pickerTitleHeight = pickerTitleHeight; - this._pickerItemHeight = pickerItemHeight; - this._menuHeight = menuHeight; + _pickerHeight = pickerHeight; + _pickerTitleHeight = pickerTitleHeight; + _pickerItemHeight = pickerItemHeight; + _menuHeight = menuHeight; - this._cancelButton = cancelButton; - this._commitButton = commitButton; - this._title = title; - this._headDecoration = headDecoration; - this._backgroundColor = backgroundColor; - this._textColor = textColor; - this._textSize = textSize; - this._itemOverlay = itemOverlay; + _cancelButton = cancelButton; + _commitButton = commitButton; + _title = title; + _headDecoration = headDecoration; + _backgroundColor = backgroundColor; + _textColor = textColor; + _textSize = textSize; + _itemOverlay = itemOverlay; } set context(BuildContext? value) { @@ -131,54 +132,54 @@ class PickerStyle { _showTitleBar = value; } - BuildContext? get context => this._context; + BuildContext? get context => _context; /// 选择器背景色 默认白色 - Color get backgroundColor => this._backgroundColor ?? Colors.white; + Color get backgroundColor => _backgroundColor ?? Colors.white; Decoration get headDecoration => - this._headDecoration ?? BoxDecoration(color: Colors.white); + _headDecoration ?? const BoxDecoration(color: Colors.white); - Widget? get menu => this._menu; + Widget? get menu => _menu; - double get menuHeight => this._menuHeight ?? 36.0; + double get menuHeight => _menuHeight ?? 36.0; - double get pickerHeight => this._pickerHeight ?? 220.0; + double get pickerHeight => _pickerHeight ?? 220.0; - double get pickerItemHeight => this._pickerItemHeight ?? 40.0; + double get pickerItemHeight => _pickerItemHeight ?? 40.0; - double get pickerTitleHeight => this._pickerTitleHeight ?? 44.0; + double get pickerTitleHeight => _pickerTitleHeight ?? 44.0; - bool get showTitleBar => this._showTitleBar ?? true; + bool get showTitleBar => _showTitleBar ?? true; - Color get textColor => this._textColor ?? Colors.black87; + Color get textColor => _textColor ?? Colors.black87; - double? get textSize => this._textSize; + double? get textSize => _textSize; - Widget get title => this._title ?? SizedBox(); + Widget get title => _title ?? const SizedBox(); Widget get commitButton => getCommitButton(); Widget get cancelButton => getCancelButton(); - Widget? get itemOverlay => this._itemOverlay; + Widget? get itemOverlay => _itemOverlay; Widget getCommitButton() { - return this._commitButton ?? + return _commitButton ?? Container( alignment: Alignment.center, padding: const EdgeInsets.only(left: 12, right: 22), - child: Text('确定', + child: Text('确定'.tr, style: TextStyle(color: AppColors.mainColor, fontSize: 16.0)), ); } Widget getCancelButton() { - return this._cancelButton ?? + return _cancelButton ?? Container( alignment: Alignment.center, padding: const EdgeInsets.only(left: 22, right: 12), - child: Text('取消', + child: Text('取消'.tr, style: TextStyle( color: Theme.of(context!).unselectedWidgetColor, fontSize: 16.0)), diff --git a/lib/tools/pickers/time_picker/model/date_item_model.dart b/lib/tools/pickers/time_picker/model/date_item_model.dart index 17f5bbe7..85a123f0 100755 --- a/lib/tools/pickers/time_picker/model/date_item_model.dart +++ b/lib/tools/pickers/time_picker/model/date_item_model.dart @@ -4,6 +4,18 @@ import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; class DateItemModel { + + DateItemModel( + this.year, this.month, this.day, this.hour, this.minute, this.second); + + DateItemModel.parse(DateMode dateMode) { + year = DateModeMap[dateMode]!.contains('年'); + month = DateModeMap[dateMode]!.contains('月'); + day = DateModeMap[dateMode]!.contains('日'); + hour = DateModeMap[dateMode]!.contains('时'); + minute = DateModeMap[dateMode]!.contains('分'); + second = DateModeMap[dateMode]!.contains('秒'); + } late bool year; late bool month; late bool day; @@ -11,34 +23,34 @@ class DateItemModel { late bool minute; late bool second; - DateItemModel( - this.year, this.month, this.day, this.hour, this.minute, this.second); - - DateItemModel.parse(DateMode dateMode) { - this.year = DateModeMap[dateMode]!.contains('年'); - this.month = DateModeMap[dateMode]!.contains('月'); - this.day = DateModeMap[dateMode]!.contains('日'); - this.hour = DateModeMap[dateMode]!.contains('时'); - this.minute = DateModeMap[dateMode]!.contains('分'); - this.second = DateModeMap[dateMode]!.contains('秒'); - } - // 返回需要显示多少个picker int get length { int i = 0; - if (this.year) ++i; - if (this.month) ++i; - if (this.day) ++i; - if (this.hour) ++i; - if (this.minute) ++i; - if (this.second) ++i; + if (year) { + ++i; + } + if (month) { + ++i; + } + if (day) { + ++i; + } + if (hour) { + ++i; + } + if (minute) { + ++i; + } + if (second) { + ++i; + } return i; } } const DateModeMap = { - DateMode.YMDHMS: "年月日时分秒", + DateMode.YMDHMS: '年月日时分秒', DateMode.YMDHM: '年月日时分', DateMode.YMDH: '年月日时', DateMode.YMD: '年月日', diff --git a/lib/tools/pickers/time_picker/model/date_time_data.dart b/lib/tools/pickers/time_picker/model/date_time_data.dart index 54d41c08..2161f477 100755 --- a/lib/tools/pickers/time_picker/model/date_time_data.dart +++ b/lib/tools/pickers/time_picker/model/date_time_data.dart @@ -4,12 +4,12 @@ import 'package:star_lock/tools/pickers/time_picker/model/date_type.dart'; /// 时间选择器 item 生成的对应数据 class DateTimeData { - List _year = []; - List _month = []; - List _day = []; - List _hour = []; - List _minute = []; - List _second = []; + final List _year = []; + final List _month = []; + final List _day = []; + final List _hour = []; + final List _minute = []; + final List _second = []; List getListByName(DateType type) { switch (type) { diff --git a/lib/tools/pickers/time_picker/model/pduration.dart b/lib/tools/pickers/time_picker/model/pduration.dart index 15596825..4da210dc 100755 --- a/lib/tools/pickers/time_picker/model/pduration.dart +++ b/lib/tools/pickers/time_picker/model/pduration.dart @@ -18,14 +18,43 @@ import 'package:star_lock/tools/pickers/time_picker/model/date_type.dart'; /// {year: 2020, month: 3, day: 4, hour: 0, minute: 0, second: 0} bool intEmpty(int? value) { - return (value == null || value == 0); + return value == null || value == 0; } bool intNotEmpty(int? value) { - return (value != null && value != 0); + return value != null && value != 0; } class PDuration { + + PDuration( + {this.year = 0, + this.month = 0, + this.day = 0, + this.hour = 0, + this.minute = 0, + this.second = 0}); + + // 注意默认会设为0 不是null + PDuration.parse(DateTime? dateTime) { + dateTime ??= DateTime.now(); + year = dateTime.year; + month = dateTime.month; + day = dateTime.day; + hour = dateTime.hour; + minute = dateTime.minute; + second = dateTime.second; + } + + PDuration.now() { + final DateTime thisInstant = DateTime.now(); + year = thisInstant.year; + month = thisInstant.month; + day = thisInstant.day; + hour = thisInstant.hour; + minute = thisInstant.minute; + second = thisInstant.second; + } int? year; int? month; int? day; @@ -33,54 +62,25 @@ class PDuration { int? minute; int? second; - PDuration( - {this.year: 0, - this.month: 0, - this.day: 0, - this.hour: 0, - this.minute: 0, - this.second: 0}); - - // 注意默认会设为0 不是null - PDuration.parse(DateTime? dateTime) { - dateTime ??= DateTime.now(); - this.year = dateTime.year; - this.month = dateTime.month; - this.day = dateTime.day; - this.hour = dateTime.hour; - this.minute = dateTime.minute; - this.second = dateTime.second; - } - - PDuration.now() { - var thisInstant = new DateTime.now(); - this.year = thisInstant.year; - this.month = thisInstant.month; - this.day = thisInstant.day; - this.hour = thisInstant.hour; - this.minute = thisInstant.minute; - this.second = thisInstant.second; - } - void setSingle(DateType dateType, var value) { switch (dateType) { case DateType.Year: - this.year = value; + year = value; break; case DateType.Month: - this.month = value; + month = value; break; case DateType.Day: - this.day = value; + day = value; break; case DateType.Hour: - this.hour = value; + hour = value; break; case DateType.Minute: - this.minute = value; + minute = value; break; case DateType.Second: - this.second = value; + second = value; break; } } @@ -89,17 +89,17 @@ class PDuration { int getSingle(DateType dateType) { switch (dateType) { case DateType.Year: - return this.year ?? 0; + return year ?? 0; case DateType.Month: - return this.month ?? 0; + return month ?? 0; case DateType.Day: - return this.day ?? 0; + return day ?? 0; case DateType.Hour: - return this.hour ?? 0; + return hour ?? 0; case DateType.Minute: - return this.minute ?? 0; + return minute ?? 0; case DateType.Second: - return this.second ?? 0; + return second ?? 0; } } diff --git a/lib/tools/pickers/time_picker/model/suffix.dart b/lib/tools/pickers/time_picker/model/suffix.dart index b883ce78..5f1b82f2 100755 --- a/lib/tools/pickers/time_picker/model/suffix.dart +++ b/lib/tools/pickers/time_picker/model/suffix.dart @@ -1,9 +1,26 @@ // import 'package:flutter_pickers/time_picker/model/date_type.dart'; +import 'package:get/get.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_type.dart'; /// 后缀标签 class Suffix { + Suffix( + {this.years = '', + this.month = '', + this.days = '', + this.hours = '', + this.minutes = '', + this.seconds = ''}); + + Suffix.normal() { + years = '年简称'.tr; + month = '月简称'.tr; + days = '日简称'.tr; + hours = '时简称'.tr; + minutes = '分简称'.tr; + seconds = '秒简称'.tr; + } late String years; late String month; late String days; @@ -11,37 +28,20 @@ class Suffix { late String minutes; late String seconds; - Suffix.normal() { - this.years = '年'; - this.month = '月'; - this.days = '日'; - this.hours = '时'; - this.minutes = '分'; - this.seconds = '秒'; - } - - Suffix( - {this.years: '', - this.month: '', - this.days: '', - this.hours: '', - this.minutes: '', - this.seconds: ''}); - String getSingle(DateType dateType) { switch (dateType) { case DateType.Year: - return this.years; + return years; case DateType.Month: - return this.month; + return month; case DateType.Day: - return this.days; + return days; case DateType.Hour: - return this.hours; + return hours; case DateType.Minute: - return this.minutes; + return minutes; case DateType.Second: - return this.seconds; + return seconds; } } } diff --git a/lib/tools/pickers/time_picker/route/date_picker_route.dart b/lib/tools/pickers/time_picker/route/date_picker_route.dart index 9f830eb5..f1d86e29 100755 --- a/lib/tools/pickers/time_picker/route/date_picker_route.dart +++ b/lib/tools/pickers/time_picker/route/date_picker_route.dart @@ -20,15 +20,12 @@ import 'package:star_lock/tools/pickers/time_picker/model/suffix.dart'; import '../time_utils.dart'; -typedef DateCallback(PDuration res); +typedef DateCallback = Function(PDuration res); class DatePickerRoute extends PopupRoute { DatePickerRoute({ - this.mode, - required this.initDate, + required this.initDate, required this.maxDate, required this.minDate, this.mode, this.pickerStyle, - required this.maxDate, - required this.minDate, this.suffix, this.onChanged, this.onConfirm, @@ -111,13 +108,8 @@ class DatePickerRoute extends PopupRoute { class _PickerContentView extends StatefulWidget { _PickerContentView({ - Key? key, + required this.initData, required this.pickerStyle, required this.maxDate, required this.minDate, required this.route, Key? key, this.mode, - required this.initData, - required this.pickerStyle, - required this.maxDate, - required this.minDate, - required this.route, this.hourShow24 = false, }) : super(key: key); @@ -139,6 +131,13 @@ class _PickerContentView extends StatefulWidget { } class _PickerState extends State<_PickerContentView> { + + _PickerState(DateMode? mode, this._initSelectData, this.maxDate, this.minDate, + this._pickerStyle, this.hourShow24) { + _dateItemModel = DateItemModel.parse(mode!); + pickerItemHeight = _pickerStyle.pickerItemHeight; + _init(); + } late final PickerStyle _pickerStyle; // 是否显示 [年月日时分秒] @@ -166,13 +165,6 @@ class _PickerState extends State<_PickerContentView> { // 选择器 高度 单独提出来,用来解决修改数据 不及时更新的BUG late double pickerItemHeight; - _PickerState(DateMode? mode, this._initSelectData, this.maxDate, this.minDate, - this._pickerStyle, this.hourShow24) { - _dateItemModel = DateItemModel.parse(mode!); - pickerItemHeight = _pickerStyle.pickerItemHeight; - _init(); - } - _init() { scrollCtrl.clear(); @@ -776,7 +768,7 @@ class _PickerState extends State<_PickerContentView> { child: Container( padding: const EdgeInsets.symmetric(horizontal: 2), child: CupertinoPicker.builder( - /// key :年月拼接 就不会重复了 fixme + /// key :年月拼接 就不会重复了 /// 最好别使用key 会生成新的widget /// 官方的bug : https://github.com/flutter/flutter/issues/22999 /// 临时方法 通过修改height diff --git a/lib/tools/pickers/time_picker/time_utils.dart b/lib/tools/pickers/time_picker/time_utils.dart index 95a256ae..7c5dca74 100755 --- a/lib/tools/pickers/time_picker/time_utils.dart +++ b/lib/tools/pickers/time_picker/time_utils.dart @@ -71,7 +71,7 @@ class TimeUtils { } String intToStr(int v) { - return (v < 10) ? "0$v" : "$v"; + return (v < 10) ? '0$v' : '$v'; } diff --git a/lib/tools/pickers/utils/check.dart b/lib/tools/pickers/utils/check.dart index ed44592a..959d5e28 100755 --- a/lib/tools/pickers/utils/check.dart +++ b/lib/tools/pickers/utils/check.dart @@ -1,44 +1,60 @@ class PicketUtil { /// 字符串不为空 static bool strNoEmpty(String? value) { - if (value == null) return false; + if (value == null) { + return false; + } return value.trim().isNotEmpty; } /// 字符串为空 static bool strEmpty(String? value) { - if (value == null) return true; + if (value == null) { + return true; + } return value.trim().isEmpty; } /// MAp不为空 static bool mapNoEmpty(Map? value) { - if (value == null) return false; + if (value == null) { + return false; + } return value.isNotEmpty; } /// MAp为空 static bool mapEmpty(Map? value) { - if (value == null) return true; + if (value == null) { + return true; + } return value.isEmpty; } ///判断List是否为空 static bool listNoEmpty(List? list) { - if (list == null) return false; + if (list == null) { + return false; + } - if (list.length == 0) return false; + if (list.isEmpty) { + return false; + } return true; } ///判断List是否为空 static bool listEmpty(List? list) { - if (list == null) return true; + if (list == null) { + return true; + } - if (list.length == 0) return true; + if (list.isEmpty) { + return true; + } return false; } diff --git a/lib/tools/push/message_management.dart b/lib/tools/push/message_management.dart index c274d858..f00b31ef 100644 --- a/lib/tools/push/message_management.dart +++ b/lib/tools/push/message_management.dart @@ -14,10 +14,10 @@ class MessageManagement { Map extra = {}; if (GetPlatform.isAndroid) { extra = _androidAnalysis(message); - AppLog.log('MessageManagement.shunting GetPlatform.isAndroid: $extra'); + // AppLog.log('MessageManagement.shunting GetPlatform.isAndroid: $extra'); } else if (GetPlatform.isIOS) { extra = _iosAnalysis(message); - AppLog.log('MessageManagement.shunting GetPlatform.isIos: $extra'); + // AppLog.log('MessageManagement.shunting GetPlatform.isIos: $extra'); } else { return; } diff --git a/lib/tools/screen_utils.dart b/lib/tools/screen_utils.dart index 5996bc0d..55a96e75 100755 --- a/lib/tools/screen_utils.dart +++ b/lib/tools/screen_utils.dart @@ -9,22 +9,13 @@ import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class JhScreenUtils { - static init(BuildContext context) { - // 假如设计稿是按iPhone6的尺寸设计的(iPhone6 750*1334) - ScreenUtil.init(context, designSize: const Size(750, 1334)); - } + static void init(BuildContext context) => ScreenUtil.init(context, designSize: const Size(750, 1334)); - static setWidth(double width) { - ScreenUtil().setWidth(width); - } + static double setWidth(double width) => ScreenUtil().setWidth(width); - static setHeight(double height) { - ScreenUtil().setHeight(height); - } + static double setHeight(double height) => ScreenUtil().setHeight(height); - static setSp(num fontSize) { - ScreenUtil().setSp(fontSize); - } + static double setSp(num fontSize) => ScreenUtil().setSp(fontSize); // static double get screenWidth => ScreenUtil.screenWidth; // @@ -41,43 +32,41 @@ class JhScreenUtils { // 系统方法获取 static double get screenWidth { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.size.width; } static double get screenHeight { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.size.height; } static double get scale { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.devicePixelRatio; } static double get textScaleFactor { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.textScaleFactor; } static double get navigationBarHeight { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.padding.top + kToolbarHeight; } static double get topSafeHeight { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.padding.top; } static double get bottomSafeHeight { - MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); + final MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window); return mediaQuery.padding.bottom; } - static updateStatusBarStyle(SystemUiOverlayStyle style) { - SystemChrome.setSystemUIOverlayStyle(style); - } + static void updateStatusBarStyle(SystemUiOverlayStyle style) => SystemChrome.setSystemUIOverlayStyle(style); } /* diff --git a/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_logic.dart b/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_logic.dart index ee5d2057..b4c10137 100755 --- a/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_logic.dart +++ b/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_logic.dart @@ -8,21 +8,21 @@ class SeletKeyCyclicDateLogic extends BaseGetXController { SeletKeyCyclicDateState state = SeletKeyCyclicDateState(); void subBtnAction(){ - var starDateTimestamp = DateTool().dateToTimestamp(state.starDate.value, 1).toString(); - var endDateTimestamp = DateTool().dateToTimestamp(state.endDate.value, 1).toString(); - var starTimeTimestamp = DateTool().dateToTimestamp(state.starTime.value, 0).toString(); - var endTimeTimestamp = DateTool().dateToTimestamp(state.endTime.value, 0).toString(); + final String starDateTimestamp = DateTool().dateToTimestamp(state.starDate.value, 1).toString(); + final String endDateTimestamp = DateTool().dateToTimestamp(state.endDate.value, 1).toString(); + final String starTimeTimestamp = DateTool().dateToTimestamp(state.starTime.value, 0).toString(); + final String endTimeTimestamp = DateTool().dateToTimestamp(state.endTime.value, 0).toString(); if (int.parse(starDateTimestamp) > int.parse(endDateTimestamp)) { - showToast("失效日期要大于生效日期".tr); + showToast('失效日期需晚于生效日期'.tr); return; } if (int.parse(starTimeTimestamp) >= int.parse(endTimeTimestamp)) { - showToast("失效时间要大于生效时间".tr); + showToast('失效时间需晚于生效时间'.tr); return; } - Map resultMap = {}; + final Map resultMap = {}; resultMap['starDate'] = state.starDate.value; resultMap['endDate'] = state.endDate.value; resultMap['starTime'] = state.starTime.value; diff --git a/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart b/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart index 4c5b51e3..5d3e80e7 100755 --- a/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart +++ b/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart @@ -3,9 +3,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; +import 'package:star_lock/tools/seletKeyCyclicDate/seletKeyCyclicDate_state.dart'; import '../../app_settings/app_colors.dart'; -import '../../translations/trans_lib.dart'; import '../commonItem.dart'; import '../pickers/pickers.dart'; import '../pickers/time_picker/model/date_mode.dart'; @@ -24,19 +24,19 @@ class SeletKeyCyclicDatePage extends StatefulWidget { } class _SeletKeyCyclicDatePageState extends State { - final logic = Get.put(SeletKeyCyclicDateLogic()); - final state = Get.find().state; + final SeletKeyCyclicDateLogic logic = Get.put(SeletKeyCyclicDateLogic()); + final SeletKeyCyclicDateState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: "有效期".tr, + barTitle: '有效期'.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( - children: [ + children: [ topWidget(), SizedBox(height: 10.h), middleWidget(), @@ -45,20 +45,18 @@ class _SeletKeyCyclicDatePageState extends State { Obx(() => Container( margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 30.h), child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.save!.tr, - isDisabled: (state.starDate.value.isNotEmpty && + btnName: '保存'.tr, + isDisabled: state.starDate.value.isNotEmpty && state.endDate.value.isNotEmpty && state.starTime.value.isNotEmpty && state.endTime.value.isNotEmpty && - state.weekDay.value.isNotEmpty), + state.weekDay.value.isNotEmpty, onClick: (state.starDate.value.isNotEmpty && state.endDate.value.isNotEmpty && state.starTime.value.isNotEmpty && state.endTime.value.isNotEmpty && state.weekDay.value.isNotEmpty) - ? () { - logic.subBtnAction(); - } : null), + ? logic.subBtnAction : null), )), ], )); @@ -66,35 +64,35 @@ class _SeletKeyCyclicDatePageState extends State { Widget topWidget() { return Column( - children: [ + children: [ Container( color: Colors.white, child: Column( - children: [ + children: [ Obx(() => CommonItem( - leftTitel: "生效日期".tr, + leftTitel: '生效日期'.tr, rightTitle: state.starDate.value, isHaveDirection: true, isHaveLine: true, action: () { - PDuration selectDate = PDuration.parse( + final PDuration selectDate = PDuration.parse( DateTime.tryParse(state.starDate.value)); Pickers.showDatePicker(context, selectDate: selectDate, - mode: DateMode.YMD, onConfirm: (p) { + mode: DateMode.YMD, onConfirm: (PDuration p) { state.starDate.value = DateTool().getYMDHNDateString(p, 2); }); })), Obx(() => CommonItem( - leftTitel: "失效日期".tr, + leftTitel: '失效日期'.tr, rightTitle: state.endDate.value, isHaveDirection: true, action: () { - PDuration selectDate = + final PDuration selectDate = PDuration.parse(DateTime.tryParse(state.endDate.value)); Pickers.showDatePicker(context, selectDate: selectDate, - mode: DateMode.YMD, onConfirm: (p) { + mode: DateMode.YMD, onConfirm: (PDuration p) { state.endDate.value = DateTool().getYMDHNDateString(p, 2); }); })), @@ -113,12 +111,12 @@ class _SeletKeyCyclicDatePageState extends State { color: Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Container( height: 60.h, // color: Colors.red, padding: EdgeInsets.only(left: 30.w, top: 15.h), - child: Text(TranslationLoader.lanKeys!.effectiveDay!.tr, + child: Text('有效日'.tr, style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600))), Container( @@ -129,7 +127,7 @@ class _SeletKeyCyclicDatePageState extends State { crossAxisCount: 7, childAspectRatio: 1.0), itemCount: 7, physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { + itemBuilder: (BuildContext context, int index) { index += 1; return btnItem(index); })), @@ -203,34 +201,34 @@ class _SeletKeyCyclicDatePageState extends State { Widget bottomWidget() { return Column( - children: [ + children: [ Container( color: Colors.white, child: Column( - children: [ + children: [ Obx(() => CommonItem( - leftTitel: "生效时间".tr, + leftTitel: '生效时间'.tr, rightTitle: state.starTime.value, isHaveDirection: true, isHaveLine: true, action: () { - PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.starTime.value, 0)); + final PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.starTime.value, 0)); Pickers.showDatePicker(context, selectDate: selectDate, - mode: DateMode.HM, onConfirm: (p) { + mode: DateMode.HM, onConfirm: (PDuration p) { state.starTime.value = DateTool().getYMDHNDateString(p, 3); }); })), Obx(() => CommonItem( - leftTitel: "失效时间".tr, + leftTitel: '失效时间'.tr, rightTitle: state.endTime.value, isHaveDirection: true, action: () { - PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.endTime.value, 0)); + final PDuration selectDate = PDuration.parse(DateTool().dateToDateTime(state.endTime.value, 0)); Pickers.showDatePicker(context, selectDate: selectDate, - mode: DateMode.HM, onConfirm: (p) { + mode: DateMode.HM, onConfirm: (PDuration p) { state.endTime.value = DateTool().getYMDHNDateString(p, 3); }); })), diff --git a/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_state.dart b/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_state.dart index c3e24fe7..784c1e49 100755 --- a/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_state.dart +++ b/lib/tools/seletKeyCyclicDate/seletKeyCyclicDate_state.dart @@ -3,29 +3,28 @@ import 'package:get/get.dart'; class SeletKeyCyclicDateState{ - var starDate = "".obs;// 开始时间 - var endDate = "".obs;// 结束时间 - var starTime = "".obs;// 生效时间 - var endTime = "".obs;// 失效时间 - - var weekDay = [].obs; - SeletKeyCyclicDateState() { - var map = Get.arguments; - if ((map["starDate"] != null)) { - starDate.value = map["starDate"]; + final map = Get.arguments; + if (map['starDate'] != null) { + starDate.value = map['starDate']; } - if ((map["endDate"] != null)) { - endDate.value = map["endDate"]; + if (map['endDate'] != null) { + endDate.value = map['endDate']; } - if ((map["starTime"] != null)) { - starTime.value = map["starTime"]; + if (map['starTime'] != null) { + starTime.value = map['starTime']; } - if ((map["endTime"] != null)) { - endTime.value = map["endTime"]; + if (map['endTime'] != null) { + endTime.value = map['endTime']; } - if ((map["validityValue"] != null)) { - weekDay.value = map["validityValue"]; + if (map['validityValue'] != null) { + weekDay.value = map['validityValue']; } } + RxString starDate = ''.obs;// 开始时间 + RxString endDate = ''.obs;// 结束时间 + RxString starTime = ''.obs;// 生效时间 + RxString endTime = ''.obs;// 失效时间 + + RxList weekDay = [].obs; } \ No newline at end of file diff --git a/lib/tools/shareModule/sharePopup.dart b/lib/tools/shareModule/sharePopup.dart index d0f43b67..bab81843 100755 --- a/lib/tools/shareModule/sharePopup.dart +++ b/lib/tools/shareModule/sharePopup.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; class SharePopup extends StatelessWidget { List nameItems = [ - '微信', - '朋友圈', - 'QQ', - 'QQ空间', - '微博', - 'FaceBook', - '邮件', - '链接' + '微信'.tr, + '朋友圈'.tr, + 'QQ'.tr, + 'QQ空间'.tr, + '微博'.tr, + 'FaceBook'.tr, + '邮件'.tr, + '链接'.tr ]; List urlItems = [ 'icon_wechat.png', @@ -90,12 +91,12 @@ class SharePopup extends StatelessWidget { height: 0.5, color: Colors.blueGrey, ), - const Center( + Center( child: Padding( - padding: EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 8.0), + padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 8.0), child: Text( - '取 消', - style: TextStyle(fontSize: 18.0, color: Colors.blueGrey), + '取消'.tr, + style: const TextStyle(fontSize: 18.0, color: Colors.blueGrey), )), ) ], diff --git a/lib/tools/showBottomSheetTool.dart b/lib/tools/showBottomSheetTool.dart index b30b054f..e7000d86 100755 --- a/lib/tools/showBottomSheetTool.dart +++ b/lib/tools/showBottomSheetTool.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_picker/flutter_picker.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; ///2023/7/17 ///底部弹出选择器工具类 @@ -9,6 +10,14 @@ typedef ArrayClickCallback = void Function(List selecteds, List st typedef DateClickCallback = void Function(dynamic selectDateStr, dynamic selectDate); class ShowBottomSheetTool { + + ShowBottomSheetTool({ + this.pickerHeight = 200.0, + this.itemHeight = 45.0, + this.btnColor = Colors.black, + this.titleColor = const Color.fromRGBO(127, 127, 127, 1.0), + this.textFontSize = 16.0 + }); //选择器的高度 double pickerHeight; //单行的高度 @@ -20,14 +29,6 @@ class ShowBottomSheetTool { //字体大小 double textFontSize; - ShowBottomSheetTool({ - this.pickerHeight = 200.0, - this.itemHeight = 45.0, - this.btnColor = Colors.black, - this.titleColor = const Color.fromRGBO(127, 127, 127, 1.0), - this.textFontSize = 16.0 - }); - ///单列 void showSingleRowPicker( BuildContext context, { @@ -80,15 +81,15 @@ class ShowBottomSheetTool { Picker( adapter: adapter, title: Text( - title ?? "请选择", + title ?? '请选择'.tr, style: TextStyle( color: titleColor, fontSize: textFontSize, ), ), selecteds: selecteds, - confirmText: sureTitle??'确定', - cancelText: cancelTitle??'取消', + confirmText: sureTitle??'确定'.tr, + cancelText: cancelTitle??'取消'.tr, cancelTextStyle: TextStyle( color: btnColor, fontSize: textFontSize, @@ -100,7 +101,7 @@ class ShowBottomSheetTool { textAlign: TextAlign.right, itemExtent: itemHeight, height: pickerHeight, - selectedTextStyle: TextStyle( + selectedTextStyle: const TextStyle( color: Colors.black, ), onConfirm: clickCallBack, diff --git a/lib/tools/showCalendar.dart b/lib/tools/showCalendar.dart index 551c355f..e296ef55 100755 --- a/lib/tools/showCalendar.dart +++ b/lib/tools/showCalendar.dart @@ -42,7 +42,7 @@ class ShowCalendar extends StatelessWidget { onDateChanged:selectAction!, // 月份改变回调函数 onDisplayedMonthChanged: (dateTime){ - AppLog.log("onDisplayedMonthChanged $dateTime"); + // AppLog.log("onDisplayedMonthChanged $dateTime"); }, // 筛选日期可不可点回调函数 selectableDayPredicate: (dayTime){ diff --git a/lib/tools/showCupertinoAlertView.dart b/lib/tools/showCupertinoAlertView.dart index a5eeb46a..62a53f6f 100755 --- a/lib/tools/showCupertinoAlertView.dart +++ b/lib/tools/showCupertinoAlertView.dart @@ -44,7 +44,7 @@ class ShowCupertinoAlertView { Padding( padding: EdgeInsets.only(left: 60.w, right: 60.w), child: Text( - '开启微信接收报警消息需要先关注$qrCodeText微信公众号,请保存二维码并使用微信扫一扫设置', + '${"开启微信接收报警消息需要先关注".tr}$qrCodeText${"微信公众号,请保存二维码并使用微信扫一扫设置".tr}', style: TextStyle(fontSize: 24.sp, color: Colors.black), )), @@ -86,9 +86,7 @@ class ShowCupertinoAlertView { '取消'.tr, style: TextStyle(color: AppColors.mainColor), ), - onPressed: () { - Get.back(); - }, + onPressed: Get.back, ), CupertinoDialogAction( child: Text( @@ -112,11 +110,14 @@ class ShowCupertinoAlertView { color: AppColors.vipFeatureBgColor, padding: EdgeInsets.only(left: 20.w), height: 80.h, + width: 1.sw, child: Row( children: [ - Text(tipsText, - style: TextStyle( - color: AppColors.vipFeatureBtnTextColor, fontSize: 22.sp)), + Flexible( + child: Text(tipsText, + style: TextStyle( + color: AppColors.vipFeatureBtnTextColor, fontSize: 22.sp)), + ), SizedBox( width: 10.w, ), @@ -137,10 +138,11 @@ class ShowCupertinoAlertView { style: TextStyle(color: Colors.white, fontSize: 22.sp), )), ), - Expanded( - child: SizedBox( - width: 2.w, - )) + SizedBox(width:2.w) + // Expanded( + // child: SizedBox( + // width: 2.w, + // )) ], ), ); @@ -200,9 +202,7 @@ class ShowCupertinoAlertView { '取消'.tr, style: TextStyle(color: AppColors.mainColor), ), - onPressed: () { - Get.back(); - }, + onPressed: Get.back, ), CupertinoDialogAction( child: Text( @@ -254,9 +254,7 @@ class ShowCupertinoAlertView { ), actions: [ CupertinoDialogAction( - onPressed: () { - Get.back(); - }, + onPressed: Get.back, child: Text( '取消'.tr, style: TextStyle(color: AppColors.mainColor), @@ -293,9 +291,7 @@ class ShowCupertinoAlertView { content: Text('是否要远程开锁?'.tr), actions: [ CupertinoDialogAction( - onPressed: () { - Get.back(); - }, + onPressed: Get.back, child: Text( '取消'.tr, style: TextStyle(color: AppColors.mainColor), @@ -332,9 +328,7 @@ class ShowCupertinoAlertView { '取消'.tr, style: TextStyle(color: AppColors.mainColor), ), - onPressed: () { - Get.back(); - }, + onPressed: Get.back, ), CupertinoDialogAction( child: @@ -356,16 +350,14 @@ class ShowCupertinoAlertView { context: Get.context!, builder: (context) { return CupertinoAlertDialog( - title: const Text('实名认证为付费功能,请联系锁的管理员购买后再使用'), + title: Text('实名认证为付费功能,请联系锁的管理员购买后再使用'.tr), actions: [ CupertinoDialogAction( child: Text( '确定'.tr, style: TextStyle(color: AppColors.mainColor), ), - onPressed: () { - Get.back(); - }, + onPressed: Get.back, ), ], ); @@ -387,9 +379,7 @@ class ShowCupertinoAlertView { '取消'.tr, style: TextStyle(color: AppColors.mainColor), ), - onPressed: () { - Get.back(); - }, + onPressed: Get.back, ), CupertinoDialogAction( child: diff --git a/lib/tools/showDeleteAdministratorIsHaveAllDataWidget.dart b/lib/tools/showDeleteAdministratorIsHaveAllDataWidget.dart index cdf0dec0..369d9105 100755 --- a/lib/tools/showDeleteAdministratorIsHaveAllDataWidget.dart +++ b/lib/tools/showDeleteAdministratorIsHaveAllDataWidget.dart @@ -4,12 +4,12 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; typedef BlockIsHaveAllDataCallback = void Function(bool isAllData); class ShowDeleteAdministratorIsHaveAllDataWidget extends StatefulWidget { - BlockIsHaveAllDataCallback? blockIsHaveAllDataCallback; - String? contentStr; ShowDeleteAdministratorIsHaveAllDataWidget( {Key? key, this.contentStr, this.blockIsHaveAllDataCallback}) : super(key: key); + BlockIsHaveAllDataCallback? blockIsHaveAllDataCallback; + String? contentStr; @override State createState() => @@ -43,7 +43,6 @@ class _ShowDeleteAdministratorIsHaveAllDataWidgetState ), Expanded( child: Text(widget.contentStr!, - maxLines: 2, textAlign: TextAlign.start, style: TextStyle(fontSize: 24.sp))), ], diff --git a/lib/tools/showIosTipView.dart b/lib/tools/showIosTipView.dart index 739392c0..b39d7db1 100755 --- a/lib/tools/showIosTipView.dart +++ b/lib/tools/showIosTipView.dart @@ -1,15 +1,8 @@ + import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import '../translations/trans_lib.dart'; - class ShowIosTipView extends StatelessWidget { - String? title; - String? tipTitle; - Function()? sureClick; - Function()? cancelClick; ShowIosTipView( {Key? key, @@ -18,6 +11,10 @@ class ShowIosTipView extends StatelessWidget { this.sureClick, this.cancelClick}) : super(key: key); + String? title; + String? tipTitle; + Function()? sureClick; + Function()? cancelClick; @override Widget build(BuildContext context) { @@ -43,56 +40,5 @@ class ShowIosTipView extends StatelessWidget { ), ], ); - - return Card( - color: const Color(0x00FFFFFF), - child: Builder( - builder: (context) { - - // return Theme( - // data: ThemeData.light(), - // child: CupertinoAlertDialog( - // title: Text(title!), - // content: Column( - // children: [ - // const SizedBox( - // height: 10, - // ), - // Column( - // children: [ - // Text(tipTitle!, style: TextStyle(fontSize: 24.sp)) - // ], - // ) - // ], - // ), - // actions: [ - // CupertinoDialogAction( - // child: Text( - // TranslationLoader.lanKeys!.cancel!.tr, - // style: const TextStyle(color: Colors.black), - // ), - // onPressed: () { - // // Navigator.pop(context); - // if (cancelClick != null) { - // cancelClick!(); - // } - // }, - // ), - // CupertinoDialogAction( - // child: Text(TranslationLoader.lanKeys!.sure!.tr, - // style: const TextStyle(color: Colors.black)), - // onPressed: () { - // if (sureClick != null) { - // sureClick!(); - // } - // // Navigator.pop(context); - // }, - // ), - // ], - // ), - // ); - } - ), - ); } } diff --git a/lib/tools/showSeletDateTime.dart b/lib/tools/showSeletDateTime.dart index b0381147..29a03d93 100755 --- a/lib/tools/showSeletDateTime.dart +++ b/lib/tools/showSeletDateTime.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart'; import 'package:get/get.dart'; -import '../translations/trans_lib.dart'; typedef DateValueCallback(DateTime dateTime, List selectedIndex); @@ -13,9 +12,9 @@ class ShowSelectDateTime { // String MIN_DATETIME = '1900-01-01 00:00'; // String MAX_DATETIME = '2100-01-01 00:00'; // String INIT_DATETIME = getNowDate(); - DateTime _dateTime = DateTime.parse(nowDate); - DateTimePickerLocale _locale = DateTimePickerLocale.zh_cn; - String _format = formatStr; + final DateTime _dateTime = DateTime.parse(nowDate); + const DateTimePickerLocale _locale = DateTimePickerLocale.zh_cn; + final String _format = formatStr; DatePicker.showDatePicker( context, @@ -42,26 +41,4 @@ class ShowSelectDateTime { onConfirm: onConfirm, ); } - - // String getNowDate(){ - // // 获取当前时间对象 - // DateTime today = DateTime.now(); - // String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')} ${today.hour.toString().padLeft(2,'0')}:${today.minute.toString().padLeft(2,'0')}"; - // - // // //获取当前时间的年 - // // int year = now.year; - // // //获取当前时间的月 - // // int month = now.month; - // // //获取当前时间的日 - // // int day = now.day; - // // //获取当前时间的时 - // // int hour = now.hour; - // // //获取当前时间的分 - // // int minute = now.minute; - // // //获取当前时间的秒 - // // int millisecond = now.millisecond; - // - // // AppLog.log("组合 $year-$month-$day $hour:$minute:$millisecond"); - // return dateSlug; - // } } diff --git a/lib/tools/showTFView.dart b/lib/tools/showTFView.dart index 0b7ace17..d7a31e87 100755 --- a/lib/tools/showTFView.dart +++ b/lib/tools/showTFView.dart @@ -5,8 +5,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; -import '../translations/trans_lib.dart'; - class ShowTFView extends StatelessWidget { String? title; String? tipTitle; diff --git a/lib/tools/showTipView.dart b/lib/tools/showTipView.dart index 3a6ed329..727fbcb8 100755 --- a/lib/tools/showTipView.dart +++ b/lib/tools/showTipView.dart @@ -7,7 +7,6 @@ import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/tools/showTFView.dart'; -import '../translations/trans_lib.dart'; import 'showDeleteAdministratorIsHaveAllDataWidget.dart'; typedef BlockIsHaveAllDataCallback = void Function(bool isAllData); @@ -76,14 +75,16 @@ class ShowTipView { context: Get.context!, builder: (BuildContext context) { return CupertinoAlertDialog( - content: Text(contentStr), + content: Text(contentStr.tr), actions: [ CupertinoDialogAction( - child: Text('取消', style: TextStyle(color: AppColors.mainColor)), + child: + Text('取消'.tr, style: TextStyle(color: AppColors.mainColor)), onPressed: Get.back, ), CupertinoDialogAction( - child: Text('确定', style: TextStyle(color: AppColors.mainColor)), + child: + Text('确定'.tr, style: TextStyle(color: AppColors.mainColor)), onPressed: () { Get.back(); sureClick(); diff --git a/lib/tools/store_service.dart b/lib/tools/store_service.dart index 9f98430a..201e1872 100755 --- a/lib/tools/store_service.dart +++ b/lib/tools/store_service.dart @@ -7,8 +7,8 @@ import 'package:star_lock/login/login/entity/LoginData.dart'; import '../login/login/entity/LoginEntity.dart'; final box = GetStorage(); -class StoreService extends GetxService { +class StoreService extends GetxService { static StoreService get to => Get.find(); Future> init() async { await GetStorage.init(); @@ -21,11 +21,13 @@ class StoreService extends GetxService { bool hasData(String? key) => box.hasData(key!); final String _deviceUUID = 'DEVICE_ID'; - final String _languageCode = 'LANGUAGE_CODE'; + final String _language = 'LANGUAGE'; - String? getDeviceId() => hasData(_deviceUUID) ? read(_deviceUUID).toString(): ""; + String? getDeviceId() => + hasData(_deviceUUID) ? read(_deviceUUID).toString() : ''; Future saveDeviceId(String uuid) => save(_deviceUUID, uuid); - String? getLanguageCode() => hasData(_languageCode) ? read(_languageCode).toString(): ""; - Future saveLanguageCode(String code) => save(_languageCode, code); + String? getLanguageCode() => + hasData(_language) ? read(_language).toString() : ''; + Future saveLanguageCode(String code) => save(_language, code); } diff --git a/lib/tools/submitBtn.dart b/lib/tools/submitBtn.dart index 53531afa..57b6ea69 100755 --- a/lib/tools/submitBtn.dart +++ b/lib/tools/submitBtn.dart @@ -1,7 +1,6 @@ -import 'package:flutter/cupertino.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; import '../app_settings/app_colors.dart'; diff --git a/lib/tools/tf_input_haveBorder.dart b/lib/tools/tf_input_haveBorder.dart index cdb6fad4..443717f4 100755 --- a/lib/tools/tf_input_haveBorder.dart +++ b/lib/tools/tf_input_haveBorder.dart @@ -1,4 +1,4 @@ -import 'package:flutter/cupertino.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -8,19 +8,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; * */ class TFInputHaveBorder extends StatelessWidget { - TextEditingController? controller; - List? inputFormatters; - TextInputType? keyboardType; - Color? background; - String? hintText; - String? leftImg; - String? label; - bool? isPwd; - Widget? rightSlot; - Function()? onChangeAction; TFInputHaveBorder( - {Key? key, - required this.controller, + {required this.controller, Key? key, this.rightSlot, this.label, this.isPwd, @@ -31,6 +20,16 @@ class TFInputHaveBorder extends StatelessWidget { this.onChangeAction, this.leftImg}) : super(key: key); + TextEditingController? controller; + List? inputFormatters; + TextInputType? keyboardType; + Color? background; + String? hintText; + String? leftImg; + String? label; + bool? isPwd; + Widget? rightSlot; + Function()? onChangeAction; @override Widget build(BuildContext context) { diff --git a/lib/tools/titleAppBar.dart b/lib/tools/titleAppBar.dart index c6f3e263..06897eb2 100755 --- a/lib/tools/titleAppBar.dart +++ b/lib/tools/titleAppBar.dart @@ -3,6 +3,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/flavors.dart'; +import 'package:star_lock/tools/langue/langue_tool.dart'; class TitleAppBar extends AppBar { @override @@ -42,6 +43,9 @@ class TitleAppBar extends AppBar { class _TitleAppBarState extends State { @override Widget build(BuildContext context) { + bool isRTL = + LanguageTool.instance.isArabic || LanguageTool.instance.isHebrew; + return AppBar( elevation: 0, leadingWidth: widget.leadingWidth, @@ -49,7 +53,8 @@ class _TitleAppBarState extends State { ? widget.leftWidget : (widget.haveBack ?? false ? IconButton( - icon: Icon(Icons.arrow_back_ios, + icon: Icon( + isRTL ? Icons.arrow_forward_ios : Icons.arrow_back_ios, color: widget.iconColor ?? Colors.white), onPressed: () { if (widget.backAction != null) { @@ -66,10 +71,13 @@ class _TitleAppBarState extends State { title: widget.haveTitleWidget! ? widget.titleWidget : Text(widget.barTitle ?? '', + // '发生的发生的发生的发生大发三大发手打', + maxLines: 3, + textAlign: TextAlign.center, style: TextStyle( color: widget.titleColor ?? Colors.white, - fontSize: 28.sp, - fontWeight: FontWeight.w600)), + fontSize: 26.sp, + fontWeight: FontWeight.w500)), centerTitle: true, actions: widget.actionsList ?? []); } diff --git a/lib/tools/wechat/wx_push_miniProgram/wx_push_miniProgram.dart b/lib/tools/wechat/wx_push_miniProgram/wx_push_miniProgram.dart new file mode 100644 index 00000000..2779eb4b --- /dev/null +++ b/lib/tools/wechat/wx_push_miniProgram/wx_push_miniProgram.dart @@ -0,0 +1,49 @@ +import 'package:fluwx/fluwx.dart'; + +import '../../storage.dart'; + +/// +/// 进入微信小程序 +/// +/// +class WxPushWeChatMiniProgramTool { + static Fluwx fluwx = Fluwx(); + static bool isInit = false; + + static void setAssociationUrl(String associationUrl) { + Storage.saveAssociationUrl(associationUrl); + } + + static Future initWeChatMiniProgram( + String appId, String universalLink) async { + fluwx.registerApi( + appId: appId, + universalLink: universalLink, + doOnAndroid: true, + doOnIOS: true); + } + + static Future pushWeChatMiniProgram(String appId) async { + if (!isInit) { + isInit = true; + final String _associationUrl = await Storage.getAssociationUrl(); + await initWeChatMiniProgram(appId, _associationUrl); + + final MiniProgram miniProgram = MiniProgram( + username: 'gh_93a4493485e1', // 微信小程序原始ID + path: 'pages/index/index', // 跳转的小程序页面路径,可选 + miniProgramType: WXMiniProgramType.release, // 小程序版本类型 + ); + + await fluwx.open(target: miniProgram); + } else { + final MiniProgram miniProgram = MiniProgram( + username: 'gh_93a4493485e1', // 微信小程序原始ID + path: 'pages/index/index', // 跳转的小程序页面路径,可选 + miniProgramType: WXMiniProgramType.release, // 小程序版本类型 + ); + + await fluwx.open(target: miniProgram); + } + } +} diff --git a/lib/translations/app_dept.dart b/lib/translations/app_dept.dart index d0897f7e..55cf2762 100755 --- a/lib/translations/app_dept.dart +++ b/lib/translations/app_dept.dart @@ -1,34 +1,101 @@ - -import 'dart:convert'; import 'dart:ui'; -import 'package:flutter/services.dart'; import 'package:get/get.dart'; -import 'package:star_lock/translations/trans_lib.dart'; import '../tools/app_manager.dart'; enum AppDept { - cdl, + starLock, } extension ExtensionAppDept on AppDept { - static AppDept fromAppPackageName(String packageName) { - AppDept dept = AppDept.cdl; + AppDept dept = AppDept.starLock; packageName = packageName.toLowerCase(); - if(packageName.contains('cdl')){ - dept = AppDept.cdl; + if (packageName.contains('starLock')) { + dept = AppDept.starLock; } return dept; } List get deptSupportedLocales { - Locale enL = const Locale('en', 'US'); - Locale zhL = const Locale('zh', 'CN'); + const Locale enL = Locale('en', 'US'); + const Locale zhL = Locale('zh', 'CN'); + const Locale twL = Locale('zh', 'TW'); + const Locale hkL = Locale('zh', 'HK'); + const Locale frL = Locale('fr', 'FR'); + const Locale ruL = Locale('ru', 'RU'); + const Locale deL = Locale('de', 'DE'); + const Locale jaL = Locale('ja', 'JP'); + const Locale koL = Locale('ko', 'KR'); + const Locale itL = Locale('it', 'IT'); + const Locale ptL = Locale('pt', 'PT'); + const Locale esL = Locale('es', 'ES'); + const Locale arL = Locale('ar', 'SA'); + const Locale viL = Locale('vi', 'VN'); + const Locale msL = Locale('ms', 'MY'); + const Locale nlL = Locale('nl', 'NL'); + const Locale roL = Locale('ro', 'RO'); + const Locale ltL = Locale('lt', 'LT'); + const Locale svL = Locale('sv', 'SE'); + const Locale etL = Locale('et', 'EE'); + const Locale plL = Locale('pl', 'PL'); + const Locale skL = Locale('sk', 'SK'); + const Locale csL = Locale('cs', 'CZ'); + const Locale elL = Locale('el', 'GR'); + const Locale heL = Locale('he', 'IL'); + const Locale trL = Locale('tr', 'TR'); + const Locale huL = Locale('hu', 'HU'); + const Locale bgL = Locale('bg', 'BG'); + const Locale kkL = Locale('kk', 'KZ'); + const Locale bnL = Locale('bn', 'BD'); + const Locale hbsL = Locale('hr', 'BA'); + const Locale thL = Locale('th', 'TH'); + const Locale idL = Locale('id', 'ID'); + const Locale fiL = Locale('fi', 'FI'); + const Locale daL = Locale('da', 'DK'); + const Locale ukL = Locale('uk', 'UA'); + const Locale srCyrillic = Locale('sr', 'RS'); - return [enL,zhL]; + return [ + enL, + zhL, + twL, + hkL, + frL, + ruL, + deL, + jaL, + koL, + itL, + ptL, + esL, + arL, + viL, + msL, + nlL, + roL, + ltL, + svL, + etL, + plL, + skL, + csL, + elL, + heL, + trL, + huL, + bgL, + kkL, + bnL, + hbsL, + thL, + idL, + fiL, + daL, + ukL, + srCyrillic + ]; } - } AppDept appDept = ExtensionAppDept.fromAppPackageName(AppManager().packageName); @@ -36,62 +103,518 @@ AppDept appDept = ExtensionAppDept.fromAppPackageName(AppManager().packageName); final List appSupportedLocales = appDept.deptSupportedLocales; enum LanguageType { + system, chinese, english, - deutsch, // 德语 - francais, // 法语 - italiano, // 意大利 - dutch, // 荷兰语 - spanish, // 西班牙 - czech, // 捷克语 - slovak // 斯洛伐克语 + // 繁体中文(中国台湾) + traditionalChineseTW, + // 繁体中文(中国香港) + traditionalChineseHK, + // 法语 + french, + // 俄语 + russian, + // 德语 + german, + // 日语 + japanese, + // 韩语 + korean, + // 意大利语 + italian, + // 乌克兰语 + // ukrainian, + // 葡萄牙语 + portuguese, + // 西班牙语 + spanish, + // 阿拉伯语 + arabic, + // 越南语 + vietnamese, + // 马莱语 + malay, + // 荷兰语 + dutch, + // 罗马尼亚语 + romanian, + // 立陶宛语 + lithuanian, + // 瑞典语 + swedish, + // 爱沙尼亚语 + estonian, + // 波兰语 + polish, + // 斯洛伐克语 + slovak, + // 捷克语 + czech, + // 希腊语 + greek, + // 希伯来语 + hebrew, + // 塞尔维亚语(西里尔文) + serbian, + // 土耳其语 + turkish, + // 匈牙利语 + hungarian, + // 保加利亚语 + bulgarian, + // 哈萨克斯坦语 + kazakh, + // 孟加拉语 + bengali, + // 克罗地亚语 + croatian, + // 泰语 + thai, + // 印度尼西亚语 + indonesian, + // 芬兰语 + finnish, + // 丹麦语 + danish, + // 乌克兰语 + ukrainian } extension ExtensionLanguageType on LanguageType { String get lanTitle { var str = ''; - switch(this){ + switch (this) { case LanguageType.english: - str = TranslationLoader.lanKeys!.lanEnglish!.tr; + str = '英文'.tr; break; case LanguageType.chinese: - str = TranslationLoader.lanKeys!.lanChinese!.tr; + str = '简体中文'.tr; + break; + case LanguageType.traditionalChineseTW: + str = '繁体中文(中国台湾)'.tr; + break; + case LanguageType.traditionalChineseHK: + str = '繁体中文(中国香港)'.tr; + break; + case LanguageType.french: + str = '法语'.tr; + break; + case LanguageType.russian: + str = '俄语'.tr; + break; + case LanguageType.german: + str = '德语'.tr; + break; + case LanguageType.japanese: + str = '日语'.tr; + break; + case LanguageType.korean: + str = '韩语'.tr; + break; + case LanguageType.italian: + str = '意大利语'.tr; + break; + case LanguageType.portuguese: + str = '葡萄牙语'.tr; + break; + case LanguageType.spanish: + str = '西班牙语'.tr; + break; + case LanguageType.arabic: + str = '阿拉伯语'.tr; + break; + case LanguageType.vietnamese: + str = '越南语'.tr; + break; + case LanguageType.malay: + str = '马来语'.tr; + break; + case LanguageType.dutch: + str = '荷兰语'.tr; + break; + case LanguageType.romanian: + str = '罗马尼亚语'.tr; + break; + case LanguageType.lithuanian: + str = '立陶宛语'.tr; + break; + case LanguageType.swedish: + str = '瑞典语'.tr; + break; + case LanguageType.estonian: + str = '爱沙尼亚语'.tr; + break; + case LanguageType.polish: + str = '波兰语'.tr; + break; + case LanguageType.slovak: + str = '斯洛伐克语'.tr; + break; + case LanguageType.czech: + str = '捷克语'.tr; + break; + case LanguageType.greek: + str = '希腊语'.tr; + break; + case LanguageType.hebrew: + str = '希伯来语'.tr; + break; + case LanguageType.serbian: + str = '塞尔维亚语'.tr; + break; + case LanguageType.turkish: + str = '土耳其语'.tr; + break; + case LanguageType.hungarian: + str = '匈牙利语'.tr; + break; + case LanguageType.bulgarian: + str = '保加利亚语'.tr; + break; + case LanguageType.kazakh: + str = '哈萨克斯坦语'.tr; + break; + case LanguageType.bengali: + str = '孟加拉语'.tr; + break; + case LanguageType.croatian: + str = '克罗地亚语'.tr; + break; + case LanguageType.thai: + str = '泰语'.tr; + break; + case LanguageType.indonesian: + str = '印度尼西亚语'.tr; + break; + case LanguageType.finnish: + str = '芬兰语'.tr; + break; + case LanguageType.danish: + str = '丹麦语'.tr; + break; + case LanguageType.ukrainian: + str = '乌克兰语'.tr; break; - } return str; } - static LanguageType fromLanguageCode(String code) { - LanguageType languageType = LanguageType.english; - switch(code.toLowerCase()){ - case 'en': - languageType = LanguageType.english; - break; - case 'zh': - languageType = LanguageType.chinese; - break; - - } - return languageType; - } - static LanguageType fromLocale(Locale locale) { LanguageType languageType = LanguageType.english; final String code = locale.languageCode; final String countryCode = locale.countryCode ?? ''; - switch(code.toLowerCase()){ + switch (code.toLowerCase()) { case 'en': languageType = LanguageType.english; break; case 'zh': - if(countryCode.toLowerCase() == 'cn'){ + if (countryCode.toLowerCase() == 'cn') { languageType = LanguageType.chinese; - }else{ - // languageType = LanguageType.traditionalChinese; + } else if (countryCode.toLowerCase() == 'tw') { + languageType = LanguageType.traditionalChineseTW; + } else if (countryCode.toLowerCase() == 'hk') { + languageType = LanguageType.traditionalChineseHK; } break; + case 'fr': + languageType = LanguageType.french; + break; + case 'ru': + languageType = LanguageType.russian; + break; + case 'de': + languageType = LanguageType.german; + break; + case 'ja': + languageType = LanguageType.japanese; + break; + case 'ko': + languageType = LanguageType.korean; + break; + case 'it': + languageType = LanguageType.italian; + break; + case 'pt': + languageType = LanguageType.portuguese; + break; + case 'es': + languageType = LanguageType.spanish; + break; + case 'ar': + languageType = LanguageType.arabic; + break; + case 'vi': + languageType = LanguageType.vietnamese; + break; + case 'ms': + languageType = LanguageType.malay; + break; + case 'nl': + languageType = LanguageType.dutch; + break; + case 'ro': + languageType = LanguageType.romanian; + break; + case 'lt': + languageType = LanguageType.lithuanian; + break; + case 'sv': + languageType = LanguageType.swedish; + break; + case 'et': + languageType = LanguageType.estonian; + break; + case 'pl': + languageType = LanguageType.polish; + break; + case 'sk': + languageType = LanguageType.slovak; + break; + case 'cs': + languageType = LanguageType.czech; + break; + case 'el': + languageType = LanguageType.greek; + break; + case 'he': + languageType = LanguageType.hebrew; + break; + case 'sr': + languageType = LanguageType.serbian; + break; + case 'tr': + languageType = LanguageType.turkish; + break; + case 'hu': + languageType = LanguageType.hungarian; + break; + case 'bg': + languageType = LanguageType.bulgarian; + break; + case 'kk': + languageType = LanguageType.kazakh; + break; + case 'bn': + languageType = LanguageType.bengali; + break; + case 'hr': + languageType = LanguageType.croatian; + break; + case 'th': + languageType = LanguageType.thai; + break; + case 'id': + languageType = LanguageType.indonesian; + break; + case 'fi': + languageType = LanguageType.finnish; + break; + case 'da': + languageType = LanguageType.danish; + break; + case 'uk': + languageType = LanguageType.ukrainian; + break; + default: + languageType = LanguageType.english; + break; } return languageType; } -} \ No newline at end of file + + static Locale fromLanguageType(LanguageType languageType) { + for (Locale locale in appDept.deptSupportedLocales) { + switch (languageType) { + case LanguageType.english: + if (locale.languageCode == 'en' && locale.countryCode == 'US') { + return locale; + } + break; + case LanguageType.chinese: + if (locale.languageCode == 'zh' && locale.countryCode == 'CN') { + return locale; + } + break; + case LanguageType.traditionalChineseTW: + if (locale.languageCode == 'zh' && locale.countryCode == 'TW') { + return locale; + } + break; + case LanguageType.traditionalChineseHK: + if (locale.languageCode == 'zh' && locale.countryCode == 'HK') { + return locale; + } + break; + case LanguageType.french: + if (locale.languageCode == 'fr' && locale.countryCode == 'FR') { + return locale; + } + break; + case LanguageType.russian: + if (locale.languageCode == 'ru' && locale.countryCode == 'RU') { + return locale; + } + break; + case LanguageType.german: + if (locale.languageCode == 'de' && locale.countryCode == 'DE') { + return locale; + } + break; + case LanguageType.japanese: + if (locale.languageCode == 'ja' && locale.countryCode == 'JP') { + return locale; + } + break; + case LanguageType.korean: + if (locale.languageCode == 'ko' && locale.countryCode == 'KR') { + return locale; + } + break; + case LanguageType.italian: + if (locale.languageCode == 'it' && locale.countryCode == 'IT') { + return locale; + } + break; + case LanguageType.portuguese: + if (locale.languageCode == 'pt' && locale.countryCode == 'PT') { + return locale; + } + break; + case LanguageType.spanish: + if (locale.languageCode == 'es' && locale.countryCode == 'ES') { + return locale; + } + break; + case LanguageType.arabic: + if (locale.languageCode == 'ar' && locale.countryCode == 'SA') { + return locale; + } + break; + case LanguageType.vietnamese: + if (locale.languageCode == 'vi' && locale.countryCode == 'VN') { + return locale; + } + break; + case LanguageType.malay: + if (locale.languageCode == 'ms' && locale.countryCode == 'MY') { + return locale; + } + break; + case LanguageType.dutch: + if (locale.languageCode == 'nl' && locale.countryCode == 'NL') { + return locale; + } + break; + case LanguageType.romanian: + if (locale.languageCode == 'ro' && locale.countryCode == 'RO') { + return locale; + } + break; + case LanguageType.lithuanian: + if (locale.languageCode == 'lt' && locale.countryCode == 'LT') { + return locale; + } + break; + case LanguageType.swedish: + if (locale.languageCode == 'sv' && locale.countryCode == 'SE') { + return locale; + } + break; + case LanguageType.estonian: + if (locale.languageCode == 'et' && locale.countryCode == 'EE') { + return locale; + } + break; + case LanguageType.polish: + if (locale.languageCode == 'pl' && locale.countryCode == 'PL') { + return locale; + } + break; + case LanguageType.slovak: + if (locale.languageCode == 'sk' && locale.countryCode == 'SK') { + return locale; + } + break; + case LanguageType.czech: + if (locale.languageCode == 'cs' && locale.countryCode == 'CZ') { + return locale; + } + break; + case LanguageType.greek: + if (locale.languageCode == 'el' && locale.countryCode == 'GR') { + return locale; + } + break; + case LanguageType.hebrew: + if (locale.languageCode == 'he' && locale.countryCode == 'IL') { + return locale; + } + break; + case LanguageType.serbian: + if (locale.languageCode == 'sr' && locale.countryCode == 'RS') { + return locale; + } + break; + case LanguageType.turkish: + if (locale.languageCode == 'tr' && locale.countryCode == 'TR') { + return locale; + } + break; + case LanguageType.hungarian: + if (locale.languageCode == 'hu' && locale.countryCode == 'HU') { + return locale; + } + break; + case LanguageType.bulgarian: + if (locale.languageCode == 'bg' && locale.countryCode == 'BG') { + return locale; + } + break; + case LanguageType.kazakh: + if (locale.languageCode == 'kk' && locale.countryCode == 'KZ') { + return locale; + } + break; + case LanguageType.bengali: + if (locale.languageCode == 'bn' && locale.countryCode == 'BD') { + return locale; + } + break; + case LanguageType.croatian: + if (locale.languageCode == 'hr' && locale.countryCode == 'BA') { + return locale; + } + break; + case LanguageType.thai: + if (locale.languageCode == 'th' && locale.countryCode == 'TH') { + return locale; + } + break; + case LanguageType.indonesian: + if (locale.languageCode == 'id' && locale.countryCode == 'ID') { + return locale; + } + break; + case LanguageType.finnish: + if (locale.languageCode == 'fi' && locale.countryCode == 'FI') { + return locale; + } + break; + case LanguageType.danish: + if (locale.languageCode == 'da' && locale.countryCode == 'DK') { + return locale; + } + break; + case LanguageType.ukrainian: + if (locale.languageCode == 'uk' && locale.countryCode == 'UA') { + return locale; + } + break; + case LanguageType.system: + // TODO: Handle this case. + break; + } + } + return const Locale('en', 'US'); + } +} diff --git a/lib/translations/current_locale_tool.dart b/lib/translations/current_locale_tool.dart new file mode 100644 index 00000000..cc883bd4 --- /dev/null +++ b/lib/translations/current_locale_tool.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../app_settings/app_settings.dart'; +import '../tools/store_service.dart'; +import 'app_dept.dart'; + +class CurrentLocaleTool { + /// 获取当前语言的Locale字符串,没有的话获取系统的 + static String getCurrentLocaleString() { + AppLog.log( + '11111StoreService.to.getLanguageCode():${StoreService.to.getLanguageCode()}'); + final Locale locale = StoreService.to.getLanguageCode()!.isNotEmpty + ? appDept.deptSupportedLocales + .where((Locale element) => + element.languageCode.toString() == + getCurrentLocaleWithLanguageCode( + StoreService.to.getLanguageCode()!) + .languageCode) + .first + : Get.deviceLocale!; // Get.deviceLocale; + final String languageCode = convertLocale(locale).toString(); + AppLog.log( + '11111locale.toString(): ${locale.toString()} locale: $locale languageCode:$languageCode'); + return languageCode; + } + + /// 获取当前储存的Locale,没有的话获取系统的 + static Locale getCurrentLocale() { + AppLog.log( + '222StoreService.to.getLanguageCode():${StoreService.to.getLanguageCode()}'); + final Locale locale = StoreService.to.getLanguageCode()!.isNotEmpty + ? appDept.deptSupportedLocales + .where((Locale element) => + element.languageCode.toString() == + getCurrentLocaleWithLanguageCode( + StoreService.to.getLanguageCode()!) + .languageCode) + .first + : Get.deviceLocale!; // Get.deviceLocale; + final Locale getLocale = convertLocale(locale); + AppLog.log( + '222locale.toString(): ${locale.toString()} locale: $locale getLocale:$getLocale'); + return getLocale; + } + + static Locale getCurrentLocaleWithLanguageCode(String languageCode) { + final List parts = languageCode.split('_'); + final String language = parts[0]; + final String country = parts.length > 1 ? parts[1] : ''; + + for (Locale locale in appDept.deptSupportedLocales) { + if (locale.languageCode == language && locale.countryCode == country) { + return locale; + } + } + + return const Locale('en', 'US'); + } + + /// 国际化中文繁体及中文的转化 + static Locale convertLocale(Locale locale) { + if (locale.languageCode == 'zh') { + if (locale.scriptCode == 'Hans') { + // 简体中文 + return const Locale('zh', 'CN'); + } else if (locale.scriptCode == 'Hant') { + // 繁体中文 + if (locale.countryCode == 'CN') { + return const Locale('zh', 'TW'); + } else if (locale.countryCode == 'HK') { + return const Locale('zh', 'HK'); + } + } + } + // 默认返回 Locale 的完整格式 + return locale; + } +} diff --git a/lib/translations/lanKeyEntity.dart b/lib/translations/lanKeyEntity.dart deleted file mode 100755 index 7065149a..00000000 --- a/lib/translations/lanKeyEntity.dart +++ /dev/null @@ -1,1976 +0,0 @@ -class LanKeyEntity { - LanKeyEntity({ - // this.starLock, - // this.clickUnlockAndHoldDownClose, - // this.checkingIn, - // this.electronicKey, - // this.password, - // this.card, - // this.fingerprint, - // this.remoteControl, - // this.face, - // this.operatingRecord, - // this.doorLockLog, - // this.number, - // this.additive, - // this.addTime, - // this.reset, - // this.sendKey, - // this.timeLimit, - // this.permanent, - // this.once, - // this.circulation, - // this.receiver, - // this.pleaseEnterNumberOrEmail, - // this.name, - // this.enterYourName, - // this.effectiveTime, - // this.failureTime, - // this.effectiveDate, - // this.failureDate, - - // this.monday, - // this.tuesday, - // this.wednesday, - // this.thursday, - // this.friday, - // this.saturday, - // this.sunday, - // this.mondayShort, - // this.tuesdayShort, - // this.wednesdayShort, - // this.thursdayShort, - // this.fridayShort, - // this.saturdayShort, - // this.sundayShort, - - // this.realNameAuthentication, - // this.sendKeyBottomTip, - // this.send, - // this.periodValidity, - // this.sendGroupKey, - // this.lock, - // this.pleaseAdd, - // this.pleaseSelect, - // this.remoteUnlockingAllowed, - // this.pleaseEnter, - // this.getPassword, - // this.custom, - // this.clearAll, - // this.recursiveDevice, - // this.pleaseNameYourPassword, - // this.pleaseEnterDigitsNumber, - // this.getPasswordTip1, - // this.getPasswordTip2, - // this.getPasswordTip3, - // this.getPasswordTip4, - // this.getPasswordTip5, - // this.getPasswordTip6, - // this.getTip, - // this.addTip, - // this.sender, - // this.senderTime, - // this.keyDetail, - // this.detail, - // this.delete, - // this.passwordDetail, - // this.share, - // this.amend, - // this.sure, - // this.cancel, - - // this.add, - this.accountNumber, - this.volumeAuthorizationLock, - this.authorizedAdminTip, - this.lockOperatingRecordTip, - this.rankingList, - this.earlyArrivalList, - this.lateList, - this.hardWorkingList, - this.basicInformation, - this.wirelessKeyboard, - this.doorMagnetic, - this.remoteUnlocking, - this.automaticBlocking, - this.normallyOpenMode, - this.automaticUnLock, - this.automaticUnLockTip, - this.lockSound, - this.burglarAlarm, - this.resetButton, - this.lockTime, - this.diagnose, - this.uploadData, - this.importOtherLockData, - this.lockEscalation, - this.markedHouseState, - this.unlockReminder, - this.unlockQRCode, - this.lockNumber, - this.electricQuantity, - this.lockName, - this.lockGrouping, - this.selectGroup, - this.createNewGroup, - this.adminOpenLockPassword, - this.update, - this.updateElectricQuantityTip, - this.adminOpenLockPasswordTip, - this.updateLockAdminPassword, - this.whenScreenFlashesClickNext, - this.theScreenNeverFlickered, - this.enterNumberOrPressSet, - this.theLocationOfTheSetKeyWillBeDifferent, - this.pressAndHoldTheResetButtonTwoSeconds, - this.nearbyEquipment, - this.noData, - this.doorMagneticListTopTip, - this.remoteUnlockingPageTip, - this.currentMode, - this.delayTime, - this.automaticBlockingTip, - this.time, - this.normallyOpen, - this.date, - this.begin, - this.end, - this.allDay, - this.save, - this.normallyOpenModeTip, - this.pleaseSelectLockVolume, - this.lockSoundTip, - this.low, - this.lower, - this.medium, - this.high, - this.higher, - this.burglarAlarmTip, - this.resetButtonTip1, - this.resetButtonTip2, - this.calibrationTime, - this.setTheDSTMode, - this.diagnoseTip, - this.uploading, - this.uploadDataTip, - this.importOtherLockDataTip, - this.haveNewVersion, - this.currentVersion, - this.newVersion, - this.upgrade, - this.leisure, - this.checkedIn, - this.company, - this.staff, - this.work, - this.workday, - this.holidays, - this.punchingMode, - this.whetherTheEmployeeHasAKey, - this.selectKey, - this.officeHours, - this.closingTime, - this.thisWeek, - this.singleDayWeekend, - this.twoDaysOff, - this.oddOrEvenDaysOff, - this.year, - this.month, - this.libertyDay, - this.coverDate, - this.addedHoliday, - this.startDate, - this.accessDate, - this.mustFillIn, - this.endDate, - this.dailyCharts, - this.monthlyLeaderboard, - this.noAttendanceRecord, - this.everyoneIsVeryMotivated, - this.workingHoursWereNotReleased, - this.beLate, - this.leaveEarly, - this.noCardPunched, - this.holidayInfo, - this.lanEnglish, - this.lanChinese, - this.multilingual, - this.addLock, - this.lockAddress, - this.selectLockType, - this.videoIntercomDoorLock, - this.NFCPassiveLock, - this.addDevice, - this.gateway, - this.message, - this.supportStaff, - this.set, - this.moreServices, - this.moreSet, - this.prompTone, - this.touchUnlock, - this.pushNotification, - this.lockUserManagement, - this.ownedKey, - this.authorityManagement, - this.associatedDevice, - this.associatedName, - this.device, - this.authorizedAdmin, - this.addAuthorizedAdmin, - this.lockGroup, - this.transferSmartLock, - this.selectiveLock, - this.recipientInformation, - this.transferGateway, - this.multiLanguage, - this.lockScreen, - this.closed, - this.opened, - this.close, - this.open, - this.hideInvalidUnlockPermissions, - this.appUnlockRequiresMobilePhoneAccessToTheLock, - this.valueAddedServices, - this.about, - this.userAgreement, - this.privacyPolicy, - this.personalInformationCollectionList, - this.applicationPermissionDescription, - this.thirdPartyInformationSharingList, - this.logout, - this.deleteAccount, - this.personalInformation, - this.avatar, - this.nickName, - this.changeNickName, - this.modifyAccount, - this.resetPasswords, - this.safetyProblem, - this.modifyAccountTip, - this.pleaseEnterAccountNumber, - this.pleaseEnterNewAccountNumber, - this.changeIphoneTip, - this.changeEmailTip, - this.goBind, - this.originalPassword, - this.newPassword, - this.surePassword, - this.safetyProblemTip, - this.problemOne, - this.problemTwo, - this.problemThree, - this.pleaseEnterYourAnswer, - this.aboutToExpire, - this.deAuthorize, - this.changeName, - this.designation, - this.state, - this.wifiName, - this.networkMAC, - this.gatewayUpgrade, - this.gatewayConnectionLock, - this.strongSignal, - this.mediumSignal, - this.averageSignal, - this.weakSignal, - this.selectGatewayType, - this.addGateway, - this.turnThePowerBackOn, - this.indicatorLight, - this.selectGatewayTypeNextTip, - this.selectGateway, - this.gatewayConfigurationWifiTip, - this.wifiPassward, - this.pleaseEnterTheWiFiPassword, - this.gatewayName, - this.pleaseEnterGatewayName, - this.wifiMAC, - this.ipAddress, - this.subnetMask, - this.defaultGateway, - this.automaticallyGetTheDNSServerAddress, - this.preferredDNS, - this.alternativeDNS, - this.noStaticIPIsUsed, - this.allLock, - this.searchAllLockType, - this.doorLock, - this.padlock, - this.safeLock, - this.intelligentLockCore, - this.itelligentAccessControl, - this.parkingLock, - this.bicycleLock, - this.longRangeControl, - this.lightTouchScreen, - this.lightTouchScreenTip, - this.next, - this.nearbyLock, - this.addSuccessfullyPleaseRename, - this.whenAddingLockThePhoneMustBeNextToTheLock, - this.login, - this.register, - this.forgetPassword, - this.readAndAgree, - this.verificationCode, - this.registerPasswordTip, - this.iphone, - this.email, - this.mobileNumber, - this.countryAndRegion, - this.select, - this.businessCooperation, - this.officialWebsite, - this.computerWebVersion, - this.hotelSystem, - this.manualWebVersion, - this.introduce, - this.note, - this.mail, - this.advancedFunction, - this.pushMessage, - this.recordsRetention, - this.smsBuyTip, - this.emailBuyTip, - this.currentRemainingQuantity, - this.buy, - this.customSMSTemplate, - this.customMailTemplate, - this.record, - this.buyRealNameTip, - this.buyRealNameSelectYouWantBuyTip, - this.forTheFirstTime, - this.onceDay, - this.weekOnce, - this.monthOnce, - this.currentState, - this.onTrial, - this.haveNotOpened, - this.advancedFeaturesAndBenefitsContent, - this.smsTemplate, - this.emailTemplate, - this.cardIssuingtool, - this.titleForBuyingAdvancedFeatures, - this.tipsForBuyingAdvancedFeatures, - this.freeTrial, - this.openNow, - this.buySMS, - this.buyMail, - this.buyRealNameAuthenticationTimes, - this.enablingAdvancedFeatures, - this.chooseAPackage, - this.modeOfPayment, - this.alipay, - this.goToPay, - this.customTemplatesTip, - this.haveOpened, - this.unHaveOpenedTip1, - this.unHaveOpenedTip2, - this.freeTrialKeywords, - this.goToTheOpen, - this.creatingANewTemplate, - this.type, - this.templateContent, - this.preview, - this.hello, - this.yourRoomIs, - this.roomName, - this.theCodeToOpenTheDoorIs, - this.templateTip1, - this.templateTip2, - this.templateTip3, - this.expectedNotoCount, - this.templateTip4, - this.and, - this.willBeReplacedWithTheActualValue, - this.downloadLink, - this.lockScreenTip, - this.hideInvalidUnlockPermissionsTip, - this.appUnlockRequiresMobilePhoneAccessToTheLockTip, - this.checkAll, - this.getVerificationCode, - this.configuringWiFi, - this.pleaseEnterWifiName, - this.wifiPwd, - this.pleaseEnterWifiPwd, - this.wifiDistributionNetwork, - this.attendanceRecord, - this.edit, - this.stressFingerprint, - this.effectiveDay, - this.whetherTheEmployeeHasPassword, - this.whetherTheEmployeeHasCard, - this.whetherTheEmployeeHasFingerprint, - this.selectPassword, - this.selectCard, - this.selectFingerprint, - this.getKey, - this.getCard, - this.getFingerprint, - this.safeVerify, - this.deleteAccountTips, - this.humanFace, - this.monitoring, - this.videoLog, - this.messageReminding, - this.superAdmin, - this.normalUser, - this.gatewayDevice, - this.illumination, - this.doorOpener, - this.faceUnlocks, - this.catEyeSet, - this.openingDirectionSet, - this.motorPowerSetting, - this.bluetoothBroadcast, - this.whetherInternetRequiredWhenUnlocking, - this.selectTheLockToJoinTheGroup, - this.lockTrCount, - this.xiaomiIOTPlatform, - this.connectBlueErrorTip, - this.pleaseEnterAGroupName, - this.hint, - this.areYouSureYouWantToDeleteIt, - this.faceUnlocksSet, - this.customMode, - this.videoSlot, - this.automaticBrighteningScreen, - this.sensingDistance, - this.sensingDistanceTip, - this.preventWrongOpening, - this.preventWrongOpeningTip, - this.remote, - this.closeRange, - this.addAndUseFaceWhenUnlocking, - this.addAndUseFaceWhenUnlockingTip, - this.second, - this.motorPowerSettingTip, - this.miniwatt, - this.miniwattTip, - this.highPower, - this.highPowerTip, - this.openingDirectionSetTip, - this.openLeft, - this.openRight, - this.judgmentMethod, - this.judgmentMethodContent, - this.stressPassword, - this.stressCard, - }); - - LanKeyEntity.fromJson(dynamic json) { - // starLock = json['starLock']; - // clickUnlockAndHoldDownClose = json['clickUnlockAndHoldDownClose']; - // checkingIn = json['checkingIn']; - // electronicKey = json['electronicKey']; - // password = json['password']; - // card = json['card']; - // fingerprint = json['fingerprint']; - // remoteControl = json['remoteControl']; - // face = json['face']; - // operatingRecord = json['operatingRecord']; - // doorLockLog = json['doorLockLog']; - // number = json['number']; - // additive = json['additive']; - // addTime = json['addTime']; - // reset = json['reset']; - // sendKey = json['sendKey']; - // timeLimit = json['timeLimit']; - // permanent = json['permanent']; - // once = json['once']; - // circulation = json['circulation']; - // receiver = json['receiver']; - // pleaseEnterNumberOrEmail = json['pleaseEnterNumberOrEmail']; - // name = json['name']; - // enterYourName = json['enterYourName']; - // effectiveTime = json['effectiveTime']; - - // failureTime = json['failureTime']; - // effectiveDate = json['effectiveDate']; - // failureDate = json['failureDate']; - // monday = json['monday']; - // tuesday = json['tuesday']; - // wednesday = json['wednesday']; - // thursday = json['thursday']; - // friday = json['friday']; - // saturday = json['saturday']; - // sunday = json['sunday']; - - // mondayShort = json['mondayShort']; - // tuesdayShort = json['tuesdayShort']; - // wednesdayShort = json['wednesdayShort']; - // thursdayShort = json['thursdayShort']; - // fridayShort = json['fridayShort']; - // saturdayShort = json['saturdayShort']; - // sundayShort = json['sundayShort']; - - // realNameAuthentication = json['realNameAuthentication']; - // sendKeyBottomTip = json['sendKeyBottomTip']; - // send = json['send']; - // periodValidity = json['periodValidity']; - // sendGroupKey = json['sendGroupKey']; - // lock = json['lock']; - // pleaseAdd = json['pleaseAdd']; - // pleaseSelect = json['pleaseSelect']; - // remoteUnlockingAllowed = json['remoteUnlockingAllowed']; - // pleaseEnter = json['pleaseEnter']; - // getPassword = json['getPassword']; - // custom = json['custom']; - // clearAll = json['clearAll']; - // recursiveDevice = json['recursiveDevice']; - // pleaseNameYourPassword = json['pleaseNameYourPassword']; - // pleaseEnterDigitsNumber = json['pleaseEnterDigitsNumber']; - // getPasswordTip1 = json['getPasswordTip1']; - // getPasswordTip2 = json['getPasswordTip2']; - // getPasswordTip3 = json['getPasswordTip3']; - // getPasswordTip4 = json['getPasswordTip4']; - // getPasswordTip5 = json['getPasswordTip5']; - // getPasswordTip6 = json['getPasswordTip6']; - // getTip = json['getTip']; - // addTip = json['addTip']; - // sender = json['sender']; - // senderTime = json['senderTime']; - // keyDetail = json['keyDetail']; - // detail = json['detail']; - // delete = json['delete']; - // passwordDetail = json['passwordDetail']; - // share = json['share']; - // amend = json['amend']; - // sure = json['sure']; - // cancel = json['cancel']; - // add = json['add']; - accountNumber = json['accountNumber']; - volumeAuthorizationLock = json['volumeAuthorizationLock']; - authorizedAdminTip = json['authorizedAdminTip']; - lockOperatingRecordTip = json['lockOperatingRecordTip']; - remoteUnlockingPageTip = json['remoteUnlockingPageTip']; - currentMode = json['currentMode']; - delayTime = json['delayTime']; - automaticBlockingTip = json['automaticBlockingTip']; - time = json['time']; - normallyOpen = json['normallyOpen']; - date = json['date']; - begin = json['begin']; - end = json['end']; - allDay = json['allDay']; - save = json['save']; - normallyOpenModeTip = json['normallyOpenModeTip']; - pleaseSelectLockVolume = json['pleaseSelectLockVolume']; - lockSoundTip = json['lockSoundTip']; - low = json['low']; - lower = json['lower']; - medium = json['medium']; - high = json['high']; - higher = json['higher']; - burglarAlarmTip = json['burglarAlarmTip']; - resetButtonTip1 = json['resetButtonTip1']; - resetButtonTip2 = json['resetButtonTip2']; - calibrationTime = json['calibrationTime']; - setTheDSTMode = json['setTheDSTMode']; - diagnoseTip = json['diagnoseTip']; - uploading = json['uploading']; - uploadDataTip = json['uploadDataTip']; - importOtherLockDataTip = json['importOtherLockDataTip']; - haveNewVersion = json['haveNewVersion']; - currentVersion = json['currentVersion']; - newVersion = json['newVersion']; - upgrade = json['upgrade']; - leisure = json['leisure']; - checkedIn = json['checkedIn']; - - basicInformation = json['basicInformation']; - wirelessKeyboard = json['wirelessKeyboard']; - doorMagnetic = json['doorMagnetic']; - remoteUnlocking = json['remoteUnlocking']; - automaticBlocking = json['automaticBlocking']; - normallyOpenMode = json['normallyOpenMode']; - automaticUnLock = json['automaticUnLock']; - automaticUnLockTip = json['automaticUnLockTip']; - lockSound = json['lockSound']; - burglarAlarm = json['burglarAlarm']; - resetButton = json['resetButton']; - lockTime = json['lockTime']; - diagnose = json['diagnose']; - uploadData = json['uploadData']; - importOtherLockData = json['importOtherLockData']; - lockEscalation = json['lockEscalation']; - markedHouseState = json['markedHouseState']; - unlockReminder = json['unlockReminder']; - unlockQRCode = json['unlockQRCode']; - lockNumber = json['lockNumber']; - electricQuantity = json['electricQuantity']; - lockName = json['lockName']; - lockGrouping = json['lockGrouping']; - selectGroup = json['selectGroup']; - createNewGroup = json['createNewGroup']; - adminOpenLockPassword = json['adminOpenLockPassword']; - update = json['update']; - updateElectricQuantityTip = json['updateElectricQuantityTip']; - adminOpenLockPasswordTip = json['adminOpenLockPasswordTip']; - updateLockAdminPassword = json['updateLockAdminPassword']; - whenScreenFlashesClickNext = json['whenScreenFlashesClickNext']; - theScreenNeverFlickered = json['theScreenNeverFlickered']; - enterNumberOrPressSet = json['enterNumberOrPressSet']; - theLocationOfTheSetKeyWillBeDifferent = - json['theLocationOfTheSetKeyWillBeDifferent']; - pressAndHoldTheResetButtonTwoSeconds = - json['pressAndHoldTheResetButtonTwoSeconds']; - nearbyEquipment = json['nearbyEquipment']; - noData = json['noData']; - doorMagneticListTopTip = json['doorMagneticListTopTip']; - rankingList = json['rankingList']; - earlyArrivalList = json['earlyArrivalList']; - lateList = json['lateList']; - hardWorkingList = json['hardWorkingList']; - company = json['company']; - staff = json['staff']; - work = json['work']; - workday = json['workday']; - holidays = json['holidays']; - punchingMode = json['punchingMode']; - whetherTheEmployeeHasAKey = json['whetherTheEmployeeHasAKey']; - selectKey = json['selectKey']; - officeHours = json['officeHours']; - closingTime = json['closingTime']; - thisWeek = json['thisWeek']; - singleDayWeekend = json['singleDayWeekend']; - twoDaysOff = json['twoDaysOff']; - oddOrEvenDaysOff = json['oddOrEvenDaysOff']; - year = json['year']; - month = json['month']; - libertyDay = json['libertyDay']; - coverDate = json['coverDate']; - addedHoliday = json['addedHoliday']; - startDate = json['startDate']; - accessDate = json['accessDate']; - mustFillIn = json['mustFillIn']; - endDate = json['endDate']; - dailyCharts = json['dailyCharts']; - monthlyLeaderboard = json['monthlyLeaderboard']; - noAttendanceRecord = json['noAttendanceRecord']; - everyoneIsVeryMotivated = json['everyoneIsVeryMotivated']; - workingHoursWereNotReleased = json['workingHoursWereNotReleased']; - beLate = json['beLate']; - leaveEarly = json['leaveEarly']; - noCardPunched = json['noCardPunched']; - holidayInfo = json['holidayInfo']; - - lanEnglish = json['lanEnglish']; - lanChinese = json['lanChinese']; - multilingual = json['multilingual']; - addLock = json['addLock']; - lockAddress = json["lockAddress"]; - selectLockType = json['selectLockType']; - videoIntercomDoorLock = json['videoIntercomDoorLock']; - NFCPassiveLock = json['NFCPassiveLock']; - addDevice = json['addDevice']; - gateway = json['gateway']; - message = json['message']; - supportStaff = json['supportStaff']; - set = json['set']; - moreServices = json['moreServices']; - - moreSet = json['moreSet']; - prompTone = json['prompTone']; - touchUnlock = json['touchUnlock']; - pushNotification = json['pushNotification']; - lockUserManagement = json['lockUserManagement']; - ownedKey = json['ownedKey']; - authorityManagement = json['authorityManagement']; - associatedDevice = json['associatedDevice']; - associatedName = json['associatedName']; - device = json['device']; - - authorizedAdmin = json['authorizedAdmin']; - addAuthorizedAdmin = json['addAuthorizedAdmin']; - lockGroup = json['lockGroup']; - transferSmartLock = json['transferSmartLock']; - selectiveLock = json['selectiveLock']; - recipientInformation = json['recipientInformation']; - transferGateway = json['transferGateway']; - - multiLanguage = json['multiLanguage']; - lockScreen = json['lockScreen']; - closed = json['closed']; - opened = json['opened']; - close = json['close']; - open = json['open']; - hideInvalidUnlockPermissions = json['hideInvalidUnlockPermissions']; - appUnlockRequiresMobilePhoneAccessToTheLock = - json['appUnlockRequiresMobilePhoneAccessToTheLock']; - valueAddedServices = json['valueAddedServices']; - about = json['about']; - userAgreement = json['userAgreement']; - privacyPolicy = json['privacyPolicy']; - personalInformationCollectionList = - json['personalInformationCollectionList']; - applicationPermissionDescription = json['applicationPermissionDescription']; - thirdPartyInformationSharingList = json['thirdPartyInformationSharingList']; - logout = json['logout']; - deleteAccount = json['deleteAccount']; - personalInformation = json['personalInformation']; - avatar = json['avatar']; - nickName = json['nickName']; - changeNickName = json['changeNickName']; - modifyAccount = json['modifyAccount']; - resetPasswords = json['resetPasswords']; - safetyProblem = json['safetyProblem']; - modifyAccountTip = json['modifyAccountTip']; - pleaseEnterAccountNumber = json['pleaseEnterAccountNumber']; - pleaseEnterNewAccountNumber = json['pleaseEnterNewAccountNumber']; - changeIphoneTip = json['changeIphoneTip']; - changeEmailTip = json['changeEmailTip']; - goBind = json['goBind']; - originalPassword = json['originalPassword']; - newPassword = json['newPassword']; - surePassword = json['surePassword']; - safetyProblemTip = json['safetyProblemTip']; - problemOne = json['problemOne']; - problemTwo = json['problemTwo']; - problemThree = json['problemThree']; - pleaseEnterYourAnswer = json['pleaseEnterYourAnswer']; - aboutToExpire = json['aboutToExpire']; - deAuthorize = json['deAuthorize']; - changeName = json['changeName']; - - designation = json['designation']; - state = json['state']; - wifiName = json['wifiName']; - networkMAC = json['networkMAC']; - gatewayUpgrade = json['gatewayUpgrade']; - gatewayConnectionLock = json['gatewayConnectionLock']; - strongSignal = json['strongSignal']; - mediumSignal = json['mediumSignal']; - averageSignal = json['averageSignal']; - weakSignal = json['weakSignal']; - selectGatewayType = json['selectGatewayType']; - addGateway = json['addGateway']; - turnThePowerBackOn = json['turnThePowerBackOn']; - indicatorLight = json['indicatorLight']; - selectGatewayTypeNextTip = json['selectGatewayTypeNextTip']; - selectGateway = json['selectGateway']; - gatewayConfigurationWifiTip = json['gatewayConfigurationWifiTip']; - wifiPassward = json['wifiPassward']; - pleaseEnterTheWiFiPassword = json['pleaseEnterTheWiFiPassword']; - gatewayName = json['gatewayName']; - pleaseEnterGatewayName = json['pleaseEnterGatewayName']; - gatewayName = json['gatewayName']; - pleaseEnterGatewayName = json['pleaseEnterGatewayName']; - wifiMAC = json['wifiMAC']; - ipAddress = json['ipAddress']; - subnetMask = json['subnetMask']; - defaultGateway = json['defaultGateway']; - automaticallyGetTheDNSServerAddress = - json['automaticallyGetTheDNSServerAddress']; - preferredDNS = json['preferredDNS']; - alternativeDNS = json['alternativeDNS']; - noStaticIPIsUsed = json['noStaticIPIsUsed']; - - allLock = json['allLock']; - searchAllLockType = json['searchAllLockType']; - doorLock = json['doorLock']; - padlock = json['padlock']; - safeLock = json['safeLock']; - intelligentLockCore = json['intelligentLockCore']; - itelligentAccessControl = json['itelligentAccessControl']; - parkingLock = json['parkingLock']; - bicycleLock = json['bicycleLock']; - longRangeControl = json['longRangeControl']; - lightTouchScreen = json['lightTouchScreen']; - lightTouchScreenTip = json['lightTouchScreenTip']; - next = json['next']; - nearbyLock = json['nearbyLock']; - addSuccessfullyPleaseRename = json['addSuccessfullyPleaseRename']; - whenAddingLockThePhoneMustBeNextToTheLock = - json['whenAddingLockThePhoneMustBeNextToTheLock']; - - login = json['login']; - register = json['register']; - forgetPassword = json['forgetPassword']; - readAndAgree = json['readAndAgree']; - verificationCode = json['verificationCode']; - registerPasswordTip = json['registerPasswordTip']; - iphone = json['iphone']; - email = json['email']; - mobileNumber = json['mobileNumber']; - countryAndRegion = json['countryAndRegion']; - select = json['select']; - - businessCooperation = json['businessCooperation']; - officialWebsite = json['officialWebsite']; - computerWebVersion = json['computerWebVersion']; - hotelSystem = json['hotelSystem']; - manualWebVersion = json['manualWebVersion']; - introduce = json['introduce']; - - note = json['note']; - mail = json['mail']; - advancedFunction = json['advancedFunction']; - pushMessage = json['pushMessage']; - recordsRetention = json['recordsRetention']; - - smsBuyTip = json['smsBuyTip']; - emailBuyTip = json['emailBuyTip']; - currentRemainingQuantity = json['currentRemainingQuantity']; - buy = json['buy']; - customSMSTemplate = json['customSMSTemplate']; - customMailTemplate = json['customMailTemplate']; - record = json['record']; - - buyRealNameTip = json['buyRealNameTip']; - buyRealNameSelectYouWantBuyTip = json['buyRealNameSelectYouWantBuyTip']; - forTheFirstTime = json['forTheFirstTime']; - onceDay = json['onceDay']; - weekOnce = json['weekOnce']; - monthOnce = json['monthOnce']; - - currentState = json['currentState']; - onTrial = json['onTrial']; - haveNotOpened = json['haveNotOpened']; - advancedFeaturesAndBenefitsContent = - json['advancedFeaturesAndBenefitsContent']; - smsTemplate = json['smsTemplate']; - emailTemplate = json['emailTemplate']; - cardIssuingtool = json['cardIssuingtool']; - titleForBuyingAdvancedFeatures = json['titleForBuyingAdvancedFeatures']; - tipsForBuyingAdvancedFeatures = json['tipsForBuyingAdvancedFeatures']; - freeTrial = json['freeTrial']; - openNow = json['openNow']; - - buySMS = json['buySMS']; - buyMail = json['buyMail']; - buyRealNameAuthenticationTimes = json['buyRealNameAuthenticationTimes']; - enablingAdvancedFeatures = json['enablingAdvancedFeatures']; - chooseAPackage = json['chooseAPackage']; - modeOfPayment = json['modeOfPayment']; - alipay = json['alipay']; - goToPay = json['goToPay']; - - customTemplatesTip = json['customTemplatesTip']; - haveOpened = json['haveOpened']; - unHaveOpenedTip1 = json['unHaveOpenedTip1']; - unHaveOpenedTip2 = json['unHaveOpenedTip2']; - freeTrialKeywords = json['freeTrialKeywords']; - goToTheOpen = json['goToTheOpen']; - creatingANewTemplate = json['creatingANewTemplate']; - type = json['type']; - templateContent = json['templateContent']; - preview = json['preview']; - hello = json['hello']; - yourRoomIs = json['yourRoomIs']; - roomName = json['roomName']; - theCodeToOpenTheDoorIs = json['theCodeToOpenTheDoorIs']; - templateTip1 = json['templateTip1']; - templateTip2 = json['templateTip2']; - templateTip3 = json['templateTip3']; - expectedNotoCount = json['expectedNotoCount']; - templateTip4 = json['templateTip4']; - and = json['and']; - willBeReplacedWithTheActualValue = json['willBeReplacedWithTheActualValue']; - downloadLink = json['downloadLink']; - - lockScreenTip = json['lockScreenTip']; - hideInvalidUnlockPermissionsTip = json['hideInvalidUnlockPermissionsTip']; - appUnlockRequiresMobilePhoneAccessToTheLockTip = - json['appUnlockRequiresMobilePhoneAccessToTheLockTip']; - checkAll = json['checkAll']; - getVerificationCode = json['getVerificationCode']; - - configuringWiFi = json['configuringWiFi']; - pleaseEnterWifiName = json['pleaseEnterWifiName']; - wifiPwd = json['wifiPwd']; - pleaseEnterWifiPwd = json['pleaseEnterWifiPwd']; - wifiDistributionNetwork = json['wifiDistributionNetwork']; - attendanceRecord = json['attendanceRecord']; - edit = json['edit']; - stressFingerprint = json['stressFingerprint']; - effectiveDay = json['effectiveDay']; - whetherTheEmployeeHasPassword = json['whetherTheEmployeeHasPassword']; - whetherTheEmployeeHasCard = json['whetherTheEmployeeHasCard']; - whetherTheEmployeeHasFingerprint = json['whetherTheEmployeeHasFingerprint']; - selectPassword = json['selectPassword']; - selectCard = json['selectCard']; - selectFingerprint = json['selectFingerprint']; - getKey = json['getKey']; - getCard = json['getCard']; - getFingerprint = json['getFingerprint']; - safeVerify = json['safeVerify']; - deleteAccountTips = json['deleteAccountTips']; - - humanFace = json['humanFace']; - monitoring = json['monitoring']; - videoLog = json['videoLog']; - messageReminding = json['messageReminding']; - superAdmin = json['superAdmin']; - normalUser = json['normalUser']; - gatewayDevice = json['gatewayDevice']; - - illumination = json['illumination']; - doorOpener = json['doorOpener']; - faceUnlocks = json['faceUnlocks']; - catEyeSet = json['catEyeSet']; - openingDirectionSet = json['openingDirectionSet']; - motorPowerSetting = json['motorPowerSetting']; - bluetoothBroadcast = json['bluetoothBroadcast']; - whetherInternetRequiredWhenUnlocking = - json['whetherInternetRequiredWhenUnlocking']; - selectTheLockToJoinTheGroup = json['selectTheLockToJoinTheGroup']; - lockTrCount = json['lockTrCount']; - xiaomiIOTPlatform = json['xiaomiIOTPlatform']; - connectBlueErrorTip = json['connectBlueErrorTip']; - pleaseEnterAGroupName = json['pleaseEnterAGroupName']; - hint = json['hint']; - areYouSureYouWantToDeleteIt = json['areYouSureYouWantToDeleteIt']; - - faceUnlocksSet = json['faceUnlocksSet']; - customMode = json['customMode']; - videoSlot = json['videoSlot']; - automaticBrighteningScreen = json['automaticBrighteningScreen']; - sensingDistance = json['sensingDistance']; - sensingDistanceTip = json['sensingDistanceTip']; - preventWrongOpening = json['preventWrongOpening']; - preventWrongOpeningTip = json['preventWrongOpeningTip']; - remote = json['remote']; - closeRange = json['closeRange']; - addAndUseFaceWhenUnlocking = json['addAndUseFaceWhenUnlocking']; - addAndUseFaceWhenUnlockingTip = json['addAndUseFaceWhenUnlockingTip']; - - second = json['second']; - motorPowerSettingTip = json['motorPowerSettingTip']; - miniwatt = json['miniwatt']; - miniwattTip = json['miniwattTip']; - highPower = json['highPower']; - highPowerTip = json['highPowerTip']; - - openingDirectionSetTip = json['openingDirectionSetTip']; - openLeft = json['openLeft']; - openRight = json['openRight']; - judgmentMethod = json['judgmentMethod']; - judgmentMethodContent = json['judgmentMethodContent']; - stressPassword = json['stressPassword']; - stressCard = json['stressCard']; - - permissionDialogCamera = json['permission_dialog_camera']; - permissionDialogPhotos = json['permission_dialog_photos']; - permissionDialogStorage = json['permission_dialog_storage']; - permissionDialogLocation = json['permission_dialog_location']; - permissionDialogCameraText = json['permission_dialog_camera_text']; - permissionDialogPhotosText = json['permission_dialog_photos_text']; - permissionDialogStorageText = json['permission_dialog_storage_text']; - permissionDialogLocationText = json['permission_dialog_location_text']; - permissionDialogApplication = json['permission_dialog_application']; - permissionDialogAuthority = json['permission_dialog_authority']; - permissionDialogNotAllowed = json['permission_dialog_not_allowed']; - permissionDialogAllowed = json['permission_dialog_allowed']; - permissionDialogPermissionDenied = json['permission_dialog_permission_denied']; - permissionDialogOpenPermissions = json['permission_dialog_open_permissions']; - permissionDialogPermissionContinueText = json['permission_dialog_permission_continue_text']; - permissionDialogGoSetUp = json['permission_dialog_go_set_up']; - - } - // String? starLock; - // String? clickUnlockAndHoldDownClose; - // String? checkingIn; - // String? electronicKey; - // String? password; - // String? card; - // String? fingerprint; - // String? remoteControl; - // String? face; - // String? operatingRecord; - // String? doorLockLog; - // String? number; - // String? additive; - // String? addTime; - // String? reset; - // String? sendKey; - // String? timeLimit; - // String? permanent; - // String? once; - // String? circulation; - // String? receiver; - // String? pleaseEnterNumberOrEmail; - // String? name; - // String? enterYourName; - - // String? effectiveTime; - // String? failureTime; - // String? effectiveDate; - // String? failureDate; - // String? monday; - // String? tuesday; - // String? wednesday; - // String? thursday; - // String? friday; - // String? saturday; - // String? sunday; - - // String? mondayShort; - // String? tuesdayShort; - // String? wednesdayShort; - // String? thursdayShort; - // String? fridayShort; - // String? saturdayShort; - // String? sundayShort; - - // String? realNameAuthentication; - // String? sendKeyBottomTip; - // String? send; - // String? periodValidity; - // String? sendGroupKey; - // String? lock; - // String? pleaseAdd; - // String? pleaseSelect; - // String? remoteUnlockingAllowed; - // String? pleaseEnter; - // String? getPassword; - // String? custom; - // String? clearAll; - // String? recursiveDevice; - // String? pleaseNameYourPassword; - // String? pleaseEnterDigitsNumber; - // String? getPasswordTip1; - // String? getPasswordTip2; - // String? getPasswordTip3; - // String? getPasswordTip4; - // String? getPasswordTip5; - // String? getPasswordTip6; - // String? getTip; - // String? addTip; - // String? sender; - // String? senderTime; - // String? keyDetail; - // String? detail; - // String? delete; - // String? passwordDetail; - // String? share; - // String? amend; - // String? sure; - // String? cancel; - // String? add; - String? accountNumber; - String? volumeAuthorizationLock; - String? authorizedAdminTip; - String? lockOperatingRecordTip; - String? remoteUnlockingPageTip; - String? currentMode; - String? delayTime; - String? automaticBlockingTip; - String? time; - String? normallyOpen; - String? date; - String? begin; - String? end; - String? allDay; - String? save; - String? normallyOpenModeTip; - String? pleaseSelectLockVolume; - String? lockSoundTip; - String? low; - String? lower; - String? medium; - String? high; - String? higher; - String? burglarAlarmTip; - String? resetButtonTip1; - String? resetButtonTip2; - String? calibrationTime; - String? setTheDSTMode; - String? diagnoseTip; - String? uploading; - String? uploadDataTip; - String? importOtherLockDataTip; - String? haveNewVersion; - String? currentVersion; - String? newVersion; - String? upgrade; - String? leisure; - String? checkedIn; - String? rankingList; - String? earlyArrivalList; - String? lateList; - String? hardWorkingList; - String? company; - String? staff; - String? work; - String? workday; - String? holidays; - String? punchingMode; - String? whetherTheEmployeeHasAKey; - String? selectKey; - String? officeHours; - String? closingTime; - String? thisWeek; - String? singleDayWeekend; - String? twoDaysOff; - String? oddOrEvenDaysOff; - String? year; - String? month; - String? libertyDay; - String? coverDate; - String? addedHoliday; - String? startDate; - String? accessDate; - String? mustFillIn; - String? endDate; - String? dailyCharts; - String? monthlyLeaderboard; - String? noAttendanceRecord; - String? everyoneIsVeryMotivated; - String? workingHoursWereNotReleased; - String? beLate; - String? leaveEarly; - String? noCardPunched; - String? holidayInfo; - - String? basicInformation; - String? wirelessKeyboard; - String? doorMagnetic; - String? remoteUnlocking; - String? automaticBlocking; - String? normallyOpenMode; - String? automaticUnLock; - String? automaticUnLockTip; - String? lockSound; - String? burglarAlarm; - String? resetButton; - String? lockTime; - String? diagnose; - String? uploadData; - String? importOtherLockData; - String? lockEscalation; - String? markedHouseState; - String? unlockReminder; - String? unlockQRCode; - String? lockNumber; - String? electricQuantity; - String? lockName; - String? lockGrouping; - String? adminOpenLockPassword; - String? update; - String? updateElectricQuantityTip; - String? adminOpenLockPasswordTip; - String? updateLockAdminPassword; - String? whenScreenFlashesClickNext; - String? theScreenNeverFlickered; - String? enterNumberOrPressSet; - String? theLocationOfTheSetKeyWillBeDifferent; - String? pressAndHoldTheResetButtonTwoSeconds; - String? nearbyEquipment; - String? noData; - String? doorMagneticListTopTip; - - String? lanEnglish; - String? lanChinese; - String? multilingual; - String? addLock; - String? lockAddress; - String? selectLockType; - String? videoIntercomDoorLock; - String? NFCPassiveLock; - String? addDevice; - String? gateway; - String? message; - String? supportStaff; - String? set; - String? moreServices; - - String? moreSet; - String? prompTone; - String? touchUnlock; - String? pushNotification; - String? lockUserManagement; - String? ownedKey; - String? authorityManagement; - String? associatedDevice; - String? associatedName; - String? device; - String? authorizedAdmin; - String? addAuthorizedAdmin; - String? lockGroup; - String? selectGroup; - String? createNewGroup; - String? transferSmartLock; - String? selectiveLock; - String? recipientInformation; - String? transferGateway; - - String? multiLanguage; - String? lockScreen; - String? closed; - String? opened; - String? close; - String? open; - String? hideInvalidUnlockPermissions; - String? appUnlockRequiresMobilePhoneAccessToTheLock; - String? valueAddedServices; - String? about; - String? userAgreement; - String? privacyPolicy; - String? personalInformationCollectionList; - String? applicationPermissionDescription; - String? thirdPartyInformationSharingList; - String? logout; - String? deleteAccount; - String? personalInformation; - String? avatar; - String? nickName; - String? changeNickName; - String? modifyAccount; - String? resetPasswords; - String? safetyProblem; - String? modifyAccountTip; - String? pleaseEnterAccountNumber; - String? pleaseEnterNewAccountNumber; - String? changeIphoneTip; - String? changeEmailTip; - String? goBind; - String? originalPassword; - String? newPassword; - String? surePassword; - String? safetyProblemTip; - String? problemOne; - String? problemTwo; - String? problemThree; - String? pleaseEnterYourAnswer; - String? aboutToExpire; - String? deAuthorize; - String? changeName; - - String? designation; - String? state; - String? wifiName; - String? networkMAC; - String? gatewayUpgrade; - String? gatewayConnectionLock; - String? strongSignal; - String? mediumSignal; - String? averageSignal; - String? weakSignal; - String? selectGatewayType; - String? addGateway; - String? turnThePowerBackOn; - String? indicatorLight; - String? selectGatewayTypeNextTip; - String? selectGateway; - String? gatewayConfigurationWifiTip; - String? wifiPassward; - String? pleaseEnterTheWiFiPassword; - String? gatewayName; - String? pleaseEnterGatewayName; - String? wifiMAC; - String? ipAddress; - String? subnetMask; - String? defaultGateway; - String? automaticallyGetTheDNSServerAddress; - String? preferredDNS; - String? alternativeDNS; - String? noStaticIPIsUsed; - - String? allLock; - String? searchAllLockType; - String? doorLock; - String? padlock; - String? safeLock; - String? intelligentLockCore; - String? itelligentAccessControl; - String? parkingLock; - String? bicycleLock; - String? longRangeControl; - String? lightTouchScreen; - String? lightTouchScreenTip; - String? next; - String? nearbyLock; - String? addSuccessfullyPleaseRename; - String? whenAddingLockThePhoneMustBeNextToTheLock; - - String? login; - String? register; - String? forgetPassword; - String? readAndAgree; - String? verificationCode; - String? registerPasswordTip; - String? iphone; - String? email; - String? mobileNumber; - String? countryAndRegion; - String? select; - - String? businessCooperation; - String? officialWebsite; - String? computerWebVersion; - String? hotelSystem; - String? manualWebVersion; - String? introduce; - - String? note; - String? mail; - String? advancedFunction; - String? pushMessage; - String? recordsRetention; - - String? smsBuyTip; - String? emailBuyTip; - String? currentRemainingQuantity; - String? buy; - String? customSMSTemplate; - String? customMailTemplate; - String? record; - - String? buyRealNameTip; - String? buyRealNameSelectYouWantBuyTip; - String? forTheFirstTime; - String? onceDay; - String? weekOnce; - String? monthOnce; - - String? currentState; - String? onTrial; - String? haveNotOpened; - String? advancedFeaturesAndBenefitsContent; - String? smsTemplate; - String? emailTemplate; - String? cardIssuingtool; - String? titleForBuyingAdvancedFeatures; - String? tipsForBuyingAdvancedFeatures; - String? freeTrial; - String? openNow; - - String? buySMS; - String? buyMail; - String? buyRealNameAuthenticationTimes; - String? enablingAdvancedFeatures; - String? chooseAPackage; - String? modeOfPayment; - String? alipay; - String? goToPay; - - String? customTemplatesTip; - String? haveOpened; - String? unHaveOpenedTip1; - String? unHaveOpenedTip2; - String? freeTrialKeywords; - String? goToTheOpen; - String? creatingANewTemplate; - String? type; - String? templateContent; - String? preview; - String? hello; - String? yourRoomIs; - String? roomName; - String? theCodeToOpenTheDoorIs; - String? templateTip1; - String? templateTip2; - String? templateTip3; - String? expectedNotoCount; - String? templateTip4; - String? and; - String? willBeReplacedWithTheActualValue; - String? downloadLink; - String? lockScreenTip; - String? hideInvalidUnlockPermissionsTip; - String? appUnlockRequiresMobilePhoneAccessToTheLockTip; - String? checkAll; - String? getVerificationCode; - - String? configuringWiFi; - String? pleaseEnterWifiName; - String? wifiPwd; - String? pleaseEnterWifiPwd; - String? wifiDistributionNetwork; - String? attendanceRecord; - String? edit; - String? stressFingerprint; - String? effectiveDay; - String? whetherTheEmployeeHasPassword; - String? whetherTheEmployeeHasCard; - String? whetherTheEmployeeHasFingerprint; - String? selectPassword; - String? selectCard; - String? selectFingerprint; - String? getKey; - String? getCard; - String? getFingerprint; - String? safeVerify; - String? deleteAccountTips; - - String? humanFace; - String? monitoring; - String? videoLog; - String? messageReminding; - String? superAdmin; - String? normalUser; - String? gatewayDevice; - - String? illumination; - String? doorOpener; - String? faceUnlocks; - String? catEyeSet; - String? openingDirectionSet; - String? motorPowerSetting; - String? bluetoothBroadcast; - String? whetherInternetRequiredWhenUnlocking; - String? selectTheLockToJoinTheGroup; - String? lockTrCount; - String? xiaomiIOTPlatform; - String? connectBlueErrorTip; - String? pleaseEnterAGroupName; - String? hint; - String? areYouSureYouWantToDeleteIt; - - String? faceUnlocksSet; - String? customMode; - String? videoSlot; - String? automaticBrighteningScreen; - String? sensingDistance; - String? sensingDistanceTip; - String? preventWrongOpening; - String? preventWrongOpeningTip; - String? remote; - String? closeRange; - String? addAndUseFaceWhenUnlocking; - String? addAndUseFaceWhenUnlockingTip; - - String? second; - String? motorPowerSettingTip; - String? miniwatt; - String? miniwattTip; - String? highPower; - String? highPowerTip; - - String? openingDirectionSetTip; - String? openLeft; - String? openRight; - String? judgmentMethod; - String? judgmentMethodContent; - String? stressPassword; - String? stressCard; - - String? permissionDialogCamera; - String? permissionDialogPhotos; - String? permissionDialogStorage; - String? permissionDialogLocation; - String? permissionDialogCameraText; - String? permissionDialogPhotosText; - String? permissionDialogStorageText; - String? permissionDialogLocationText; - String? permissionDialogApplication; - String? permissionDialogAuthority; - String? permissionDialogNotAllowed; - String? permissionDialogAllowed; - String? permissionDialogPermissionDenied; - String? permissionDialogOpenPermissions; - String? permissionDialogPermissionContinueText; - String? permissionDialogGoSetUp; - - Map toJson() { - final map = {}; - // map['starLock'] = starLock; - // map['clickUnlockAndHoldDownClose'] = clickUnlockAndHoldDownClose; - // map['checkingIn'] = checkingIn; - // map['electronicKey'] = electronicKey; - // map['password'] = password; - // map['card'] = card; - // map['fingerprint'] = fingerprint; - // map['remoteControl'] = remoteControl; - // map['face'] = face; - // map['operatingRecord'] = operatingRecord; - // map['doorLockLog'] = doorLockLog; - // map['number'] = number; - // map['additive'] = additive; - // map['addTime'] = addTime; - // map['reset'] = reset; - // map['sendKey'] = sendKey; - // map['timeLimit'] = timeLimit; - // map['permanent'] = permanent; - // map['once'] = once; - // map['circulation'] = circulation; - // map['receiver'] = receiver; - // map['pleaseEnterNumberOrEmail'] = pleaseEnterNumberOrEmail; - // map['name'] = name; - // map['enterYourName'] = enterYourName; - - // map['effectiveTime'] = effectiveTime; - // map['failureTime'] = failureTime; - // map['effectiveDate'] = effectiveDate; - // map['failureDate'] = failureDate; - // map['monday'] = monday; - // map['tuesday'] = tuesday; - // map['wednesday'] = wednesday; - // map['thursday'] = thursday; - // map['friday'] = friday; - // map['saturday'] = saturday; - // map['sunday'] = sunday; - - // map['mondayShort'] = mondayShort; - // map['tuesdayShort'] = tuesdayShort; - // map['wednesdayShort'] = wednesdayShort; - // map['thursdayShort'] = thursdayShort; - // map['fridayShort'] = fridayShort; - // map['saturdayShort'] = saturdayShort; - // map['sundayShort'] = sundayShort; - - // map['realNameAuthentication'] = realNameAuthentication; - // map['sendKeyBottomTip'] = sendKeyBottomTip; - // map['send'] = send; - // map['periodValidity'] = periodValidity; - // map['sendGroupKey'] = sendGroupKey; - // map['lock'] = lock; - // map['pleaseAdd'] = pleaseAdd; - // map['pleaseSelect'] = pleaseSelect; - // map['remoteUnlockingAllowed'] = remoteUnlockingAllowed; - // map['pleaseEnter'] = pleaseEnter; - // map['getPassword'] = getPassword; - - // map['custom'] = custom; - // map['clearAll'] = clearAll; - // map['recursiveDevice'] = recursiveDevice; - // map['pleaseNameYourPassword'] = pleaseNameYourPassword; - // map['pleaseEnterDigitsNumber'] = pleaseEnterDigitsNumber; - // map['getPasswordTip1'] = getPasswordTip1; - // map['getPasswordTip2'] = getPasswordTip2; - // map['getPasswordTip3'] = getPasswordTip3; - // map['getPasswordTip4'] = getPasswordTip4; - // map['getPasswordTip5'] = getPasswordTip5; - // map['getPasswordTip6'] = getPasswordTip6; - // map['getTip'] = getTip; - // map['addTip'] = addTip; - // map['sender'] = sender; - // map['senderTime'] = senderTime; - // map['keyDetail'] = keyDetail; - // map['detail'] = detail; - // map['delete'] = delete; - // map['passwordDetail'] = passwordDetail; - // map['share'] = share; - // map['amend'] = amend; - // map['sure'] = sure; - // map['cancel'] = cancel; - // map['add'] = add; - map['accountNumber'] = accountNumber; - map['volumeAuthorizationLock'] = volumeAuthorizationLock; - map['authorizedAdminTip'] = authorizedAdminTip; - map['lockOperatingRecordTip'] = lockOperatingRecordTip; - map['remoteUnlockingPageTip'] = remoteUnlockingPageTip; - map['currentMode'] = currentMode; - map['delayTime'] = delayTime; - map['automaticBlockingTip'] = automaticBlockingTip; - map['time'] = time; - map['normallyOpen'] = normallyOpen; - map['date'] = date; - map['begin'] = begin; - map['end'] = end; - map['allDay'] = allDay; - map['save'] = save; - map['normallyOpenModeTip'] = normallyOpenModeTip; - map['pleaseSelectLockVolume'] = pleaseSelectLockVolume; - map['lockSoundTip'] = lockSoundTip; - map['low'] = low; - map['lower'] = lower; - map['medium'] = medium; - map['high'] = high; - map['higher'] = higher; - map['burglarAlarmTip'] = burglarAlarmTip; - map['resetButtonTip1'] = resetButtonTip1; - map['resetButtonTip2'] = resetButtonTip2; - map['calibrationTime'] = calibrationTime; - map['setTheDSTMode'] = setTheDSTMode; - map['diagnoseTip'] = diagnoseTip; - map['uploading'] = uploading; - map['uploadDataTip'] = uploadDataTip; - map['importOtherLockDataTip'] = importOtherLockDataTip; - map['haveNewVersion'] = haveNewVersion; - map['currentVersion'] = currentVersion; - map['newVersion'] = newVersion; - map['upgrade'] = upgrade; - map['leisure'] = leisure; - map['checkedIn'] = checkedIn; - map['rankingList'] = rankingList; - map['earlyArrivalList'] = earlyArrivalList; - map['lateList'] = lateList; - map['hardWorkingList'] = hardWorkingList; - - map['basicInformation'] = basicInformation; - map['wirelessKeyboard'] = wirelessKeyboard; - map['doorMagnetic'] = doorMagnetic; - map['remoteUnlocking'] = remoteUnlocking; - map['automaticBlocking'] = automaticBlocking; - map['normallyOpenMode'] = normallyOpenMode; - map['automaticUnLock'] = automaticUnLock; - map['automaticUnLockTip'] = automaticUnLockTip; - map['lockSound'] = lockSound; - map['burglarAlarm'] = burglarAlarm; - map['resetButton'] = resetButton; - map['lockTime'] = lockTime; - map['diagnose'] = diagnose; - map['uploadData'] = uploadData; - map['importOtherLockData'] = importOtherLockData; - map['lockEscalation'] = lockEscalation; - map['markedHouseState'] = markedHouseState; - map['unlockReminder'] = unlockReminder; - map['unlockQRCode'] = unlockQRCode; - map['lockNumber'] = lockNumber; - map['electricQuantity'] = electricQuantity; - map['lockName'] = lockName; - map['lockGrouping'] = lockGrouping; - map['adminOpenLockPassword'] = adminOpenLockPassword; - map['update'] = update; - map['updateElectricQuantityTip'] = updateElectricQuantityTip; - map['adminOpenLockPasswordTip'] = adminOpenLockPasswordTip; - map['updateLockAdminPassword'] = updateLockAdminPassword; - map['whenScreenFlashesClickNext'] = whenScreenFlashesClickNext; - map['theScreenNeverFlickered'] = theScreenNeverFlickered; - map['enterNumberOrPressSet'] = enterNumberOrPressSet; - map['theLocationOfTheSetKeyWillBeDifferent'] = - theLocationOfTheSetKeyWillBeDifferent; - map['pressAndHoldTheResetButtonTwoSeconds'] = - pressAndHoldTheResetButtonTwoSeconds; - map['nearbyEquipment'] = nearbyEquipment; - map['noData'] = noData; - map['doorMagneticListTopTip'] = doorMagneticListTopTip; - map['company'] = company; - map['staff'] = staff; - map['work'] = work; - map['workday'] = workday; - map['holidays'] = holidays; - map['punchingMode'] = punchingMode; - map['whetherTheEmployeeHasAKey'] = whetherTheEmployeeHasAKey; - map['selectKey'] = selectKey; - map['officeHours'] = officeHours; - map['closingTime'] = closingTime; - map['thisWeek'] = thisWeek; - map['singleDayWeekend'] = singleDayWeekend; - map['twoDaysOff'] = twoDaysOff; - map['oddOrEvenDaysOff'] = oddOrEvenDaysOff; - map['year'] = year; - map['month'] = month; - map['libertyDay'] = libertyDay; - map['coverDate'] = coverDate; - map['addedHoliday'] = addedHoliday; - map['startDate'] = startDate; - map['accessDate'] = accessDate; - map['mustFillIn'] = mustFillIn; - map['endDate'] = endDate; - map['dailyCharts'] = dailyCharts; - map['monthlyLeaderboard'] = monthlyLeaderboard; - map['noAttendanceRecord'] = noAttendanceRecord; - map['everyoneIsVeryMotivated'] = everyoneIsVeryMotivated; - map['workingHoursWereNotReleased'] = workingHoursWereNotReleased; - map['beLate'] = beLate; - map['leaveEarly'] = leaveEarly; - map['noCardPunched'] = noCardPunched; - map['holidayInfo'] = holidayInfo; - - map['lanEnglish'] = lanEnglish; - map['lanChinese'] = lanChinese; - map['multilingual'] = multilingual; - map['addLock'] = addLock; - map['lockAddress'] = lockAddress; - map['selectLockType'] = selectLockType; - map['videoIntercomDoorLock'] = videoIntercomDoorLock; - map['NFCPassiveLock'] = NFCPassiveLock; - map['addDevice'] = addDevice; - map['gateway'] = gateway; - map['message'] = message; - map['supportStaff'] = supportStaff; - map['set'] = set; - map['moreServices'] = moreServices; - - map['moreSet'] = moreSet; - map['prompTone'] = prompTone; - map['touchUnlock'] = touchUnlock; - map['pushNotification'] = pushNotification; - map['lockUserManagement'] = lockUserManagement; - map['ownedKey'] = ownedKey; - map['authorityManagement'] = authorityManagement; - map['associatedDevice'] = associatedDevice; - map['associatedName'] = associatedName; - map['device'] = device; - map['authorizedAdmin'] = authorizedAdmin; - map['addAuthorizedAdmin'] = addAuthorizedAdmin; - map['lockGroup'] = lockGroup; - map['transferSmartLock'] = transferSmartLock; - map['selectiveLock'] = selectiveLock; - map['recipientInformation'] = recipientInformation; - map['transferGateway'] = transferGateway; - - map['multiLanguage'] = multiLanguage; - map['lockScreen'] = lockScreen; - map['closed'] = closed; - map['opened'] = opened; - map['close'] = close; - map['open'] = open; - map['hideInvalidUnlockPermissions'] = hideInvalidUnlockPermissions; - map['appUnlockRequiresMobilePhoneAccessToTheLock'] = - appUnlockRequiresMobilePhoneAccessToTheLock; - map['valueAddedServices'] = valueAddedServices; - map['about'] = about; - map['userAgreement'] = userAgreement; - map['privacyPolicy'] = privacyPolicy; - map['personalInformationCollectionList'] = - personalInformationCollectionList; - map['applicationPermissionDescription'] = applicationPermissionDescription; - map['thirdPartyInformationSharingList'] = thirdPartyInformationSharingList; - map['logout'] = logout; - map['deleteAccount'] = deleteAccount; - map['personalInformation'] = personalInformation; - map['avatar'] = avatar; - map['nickName'] = nickName; - map['changeNickName'] = changeNickName; - map['modifyAccount'] = modifyAccount; - map['resetPasswords'] = resetPasswords; - map['safetyProblem'] = safetyProblem; - map['safetyProblem'] = safetyProblem; - map['modifyAccountTip'] = modifyAccountTip; - map['pleaseEnterAccountNumber'] = pleaseEnterAccountNumber; - map['pleaseEnterNewAccountNumber'] = pleaseEnterNewAccountNumber; - map['changeIphoneTip'] = changeIphoneTip; - map['changeEmailTip'] = changeEmailTip; - map['goBind'] = goBind; - map['originalPassword'] = originalPassword; - map['newPassword'] = newPassword; - map['surePassword'] = surePassword; - map['safetyProblemTip'] = safetyProblemTip; - map['problemOne'] = problemOne; - map['problemTwo'] = problemTwo; - map['problemThree'] = problemThree; - map['pleaseEnterYourAnswer'] = pleaseEnterYourAnswer; - map['aboutToExpire'] = aboutToExpire; - map['deAuthorize'] = deAuthorize; - map['changeName'] = changeName; - - map['designation'] = designation; - map['state'] = state; - map['wifiName'] = wifiName; - map['networkMAC'] = networkMAC; - map['gatewayUpgrade'] = gatewayUpgrade; - map['gatewayConnectionLock'] = gatewayConnectionLock; - map['strongSignal'] = strongSignal; - map['mediumSignal'] = mediumSignal; - map['averageSignal'] = averageSignal; - map['weakSignal'] = weakSignal; - map['selectGatewayType'] = selectGatewayType; - map['addGateway'] = addGateway; - map['turnThePowerBackOn'] = turnThePowerBackOn; - map['indicatorLight'] = indicatorLight; - map['selectGatewayTypeNextTip'] = selectGatewayTypeNextTip; - map['selectGateway'] = selectGateway; - map['gatewayConfigurationWifiTip'] = gatewayConfigurationWifiTip; - map['wifiPassward'] = wifiPassward; - map['pleaseEnterTheWiFiPassword'] = pleaseEnterTheWiFiPassword; - map['gatewayName'] = gatewayName; - map['pleaseEnterGatewayName'] = pleaseEnterGatewayName; - map['wifiMAC'] = wifiMAC; - map['ipAddress'] = ipAddress; - map['subnetMask'] = subnetMask; - map['defaultGateway'] = defaultGateway; - map['automaticallyGetTheDNSServerAddress'] = - automaticallyGetTheDNSServerAddress; - map['preferredDNS'] = preferredDNS; - map['alternativeDNS'] = alternativeDNS; - map['noStaticIPIsUsed'] = noStaticIPIsUsed; - - map['allLock'] = allLock; - map['searchAllLockType'] = searchAllLockType; - map['doorLock'] = doorLock; - map['padlock'] = padlock; - map['safeLock'] = safeLock; - map['intelligentLockCore'] = intelligentLockCore; - map['itelligentAccessControl'] = itelligentAccessControl; - map['parkingLock'] = parkingLock; - map['bicycleLock'] = bicycleLock; - map['longRangeControl'] = longRangeControl; - map['lightTouchScreen'] = lightTouchScreen; - map['lightTouchScreenTip'] = lightTouchScreenTip; - map['next'] = next; - map['nearbyLock'] = nearbyLock; - map['addSuccessfullyPleaseRename'] = addSuccessfullyPleaseRename; - map['whenAddingLockThePhoneMustBeNextToTheLock'] = - whenAddingLockThePhoneMustBeNextToTheLock; - - map['login'] = login; - map['register'] = register; - map['forgetPassword'] = forgetPassword; - map['readAndAgree'] = readAndAgree; - map['verificationCode'] = verificationCode; - map['registerPasswordTip'] = registerPasswordTip; - map['iphone'] = iphone; - map['email'] = email; - map['mobileNumber'] = mobileNumber; - map['countryAndRegion'] = countryAndRegion; - map['select'] = select; - - map['businessCooperation'] = businessCooperation; - map['officialWebsite'] = officialWebsite; - map['computerWebVersion'] = computerWebVersion; - map['hotelSystem'] = hotelSystem; - map['manualWebVersion'] = manualWebVersion; - map['introduce'] = introduce; - - map['note'] = note; - map['mail'] = mail; - map['advancedFunction'] = advancedFunction; - map['pushMessage'] = pushMessage; - map['recordsRetention'] = recordsRetention; - - map['smsBuyTip'] = smsBuyTip; - map['emailBuyTip'] = emailBuyTip; - map['currentRemainingQuantity'] = currentRemainingQuantity; - map['buy'] = buy; - map['customSMSTemplate'] = customSMSTemplate; - map['customMailTemplate'] = customMailTemplate; - map['record'] = record; - - map['buyRealNameTip'] = buyRealNameTip; - map['buyRealNameSelectYouWantBuyTip'] = buyRealNameSelectYouWantBuyTip; - map['forTheFirstTime'] = forTheFirstTime; - map['onceDay'] = onceDay; - map['weekOnce'] = weekOnce; - map['monthOnce'] = monthOnce; - - map['currentState'] = currentState; - map['onTrial'] = onTrial; - map['haveNotOpened'] = haveNotOpened; - map['advancedFeaturesAndBenefitsContent'] = - advancedFeaturesAndBenefitsContent; - map['smsTemplate'] = smsTemplate; - map['emailTemplate'] = emailTemplate; - map['cardIssuingtool'] = cardIssuingtool; - map['titleForBuyingAdvancedFeatures'] = titleForBuyingAdvancedFeatures; - map['tipsForBuyingAdvancedFeatures'] = tipsForBuyingAdvancedFeatures; - map['freeTrial'] = freeTrial; - map['openNow'] = openNow; - - map['buySMS'] = buySMS; - map['buyMail'] = buyMail; - map['buyRealNameAuthenticationTimes'] = buyRealNameAuthenticationTimes; - map['enablingAdvancedFeatures'] = enablingAdvancedFeatures; - map['chooseAPackage'] = chooseAPackage; - map['modeOfPayment'] = modeOfPayment; - map['alipay'] = alipay; - map['goToPay'] = goToPay; - - map['customTemplatesTip'] = customTemplatesTip; - map['haveOpened'] = haveOpened; - map['unHaveOpenedTip1'] = unHaveOpenedTip1; - map['unHaveOpenedTip2'] = unHaveOpenedTip2; - map['freeTrialKeywords'] = freeTrialKeywords; - map['goToTheOpen'] = goToTheOpen; - map['creatingANewTemplate'] = creatingANewTemplate; - map['type'] = type; - map['templateContent'] = templateContent; - map['preview'] = preview; - map['hello'] = hello; - map['yourRoomIs'] = yourRoomIs; - map['roomName'] = roomName; - map['theCodeToOpenTheDoorIs'] = theCodeToOpenTheDoorIs; - map['templateTip1'] = templateTip1; - map['templateTip2'] = templateTip2; - map['templateTip3'] = templateTip3; - map['expectedNotoCount'] = expectedNotoCount; - map['templateTip4'] = templateTip4; - map['and'] = and; - map['willBeReplacedWithTheActualValue'] = willBeReplacedWithTheActualValue; - map['downloadLink'] = downloadLink; - - map['lockScreenTip'] = lockScreenTip; - map['hideInvalidUnlockPermissionsTip'] = hideInvalidUnlockPermissionsTip; - map['appUnlockRequiresMobilePhoneAccessToTheLockTip'] = - appUnlockRequiresMobilePhoneAccessToTheLockTip; - map['checkAll'] = checkAll; - map['getVerificationCode'] = getVerificationCode; - - map['configuringWiFi'] = configuringWiFi; - map['pleaseEnterWifiName'] = pleaseEnterWifiName; - map['wifiPwd'] = wifiPwd; - map['pleaseEnterWifiPwd'] = pleaseEnterWifiPwd; - map['wifiDistributionNetwork'] = wifiDistributionNetwork; - map['attendanceRecord'] = attendanceRecord; - map['edit'] = edit; - map['stressFingerprint'] = stressFingerprint; - map['effectiveDay'] = effectiveDay; - map['whetherTheEmployeeHasPassword'] = whetherTheEmployeeHasPassword; - map['whetherTheEmployeeHasCard'] = whetherTheEmployeeHasCard; - map['whetherTheEmployeeHasFingerprint'] = whetherTheEmployeeHasFingerprint; - map['selectPassword'] = selectPassword; - map['selectCard'] = selectCard; - map['selectFingerprint'] = selectFingerprint; - map['getKey'] = getKey; - map['getCard'] = getCard; - map['getFingerprint'] = getFingerprint; - map['safeVerify'] = safeVerify; - map['deleteAccountTips'] = deleteAccountTips; - - map['humanFace'] = humanFace; - map['monitoring'] = monitoring; - map['videoLog'] = videoLog; - map['messageReminding'] = messageReminding; - map['superAdmin'] = superAdmin; - map['normalUser'] = normalUser; - map['gatewayDevice'] = gatewayDevice; - - map['illumination'] = illumination; - map['doorOpener'] = doorOpener; - map['faceUnlocks'] = faceUnlocks; - map['catEyeSet'] = catEyeSet; - map['openingDirectionSet'] = openingDirectionSet; - map['motorPowerSetting'] = motorPowerSetting; - map['bluetoothBroadcast'] = bluetoothBroadcast; - map['whetherInternetRequiredWhenUnlocking'] = - whetherInternetRequiredWhenUnlocking; - map['selectTheLockToJoinTheGroup'] = selectTheLockToJoinTheGroup; - map['lockTrCount'] = lockTrCount; - map['xiaomiIOTPlatform'] = xiaomiIOTPlatform; - map['connectBlueErrorTip'] = connectBlueErrorTip; - map['pleaseEnterAGroupName'] = pleaseEnterAGroupName; - map['hint'] = hint; - map['areYouSureYouWantToDeleteIt'] = areYouSureYouWantToDeleteIt; - - map['faceUnlocksSet'] = faceUnlocksSet; - map['customMode'] = customMode; - map['videoSlot'] = videoSlot; - map['automaticBrighteningScreen'] = automaticBrighteningScreen; - map['sensingDistance'] = sensingDistance; - map['sensingDistanceTip'] = sensingDistanceTip; - map['preventWrongOpening'] = preventWrongOpening; - map['preventWrongOpeningTip'] = preventWrongOpeningTip; - map['remote'] = remote; - map['closeRange'] = closeRange; - map['addAndUseFaceWhenUnlocking'] = addAndUseFaceWhenUnlocking; - map['addAndUseFaceWhenUnlockingTip'] = addAndUseFaceWhenUnlockingTip; - - map['second'] = second; - map['motorPowerSettingTip'] = motorPowerSettingTip; - map['miniwatt'] = miniwatt; - map['miniwattTip'] = miniwattTip; - map['highPower'] = highPower; - map['highPowerTip'] = highPowerTip; - - map['openingDirectionSetTip'] = openingDirectionSetTip; - map['openLeft'] = openLeft; - map['openRight'] = openRight; - map['judgmentMethod'] = judgmentMethod; - map['judgmentMethodContent'] = judgmentMethodContent; - map['stressPassword'] = stressPassword; - map['stressCard'] = stressCard; - - map['permission_dialog_camera'] = permissionDialogCamera; - map['permission_dialog_photos'] = permissionDialogPhotos; - map['permission_dialog_storage'] = permissionDialogStorage; - map['permission_dialog_location'] = permissionDialogLocation; - map['permission_dialog_camera_text'] = permissionDialogCameraText; - map['permission_dialog_photos_text'] = permissionDialogPhotosText; - map['permission_dialog_storage_text'] = permissionDialogStorageText; - map['permission_dialog_location_text'] = permissionDialogLocationText; - map['permission_dialog_application'] = permissionDialogApplication; - map['permission_dialog_authority'] = permissionDialogAuthority; - map['permission_dialog_not_allowed'] = permissionDialogNotAllowed; - map['permission_dialog_allowed'] = permissionDialogAllowed; - map['permission_dialog_permission_denied'] = permissionDialogPermissionDenied; - map['permission_dialog_open_permissions'] = permissionDialogOpenPermissions; - map['permission_dialog_permission_continue_text'] = permissionDialogPermissionContinueText; - map['permission_dialog_go_set_up'] = permissionDialogGoSetUp; - - return map; - } -} diff --git a/lib/translations/trans_lib.dart b/lib/translations/trans_lib.dart index b42e09dd..6f7b31c3 100755 --- a/lib/translations/trans_lib.dart +++ b/lib/translations/trans_lib.dart @@ -4,6 +4,5 @@ import 'dart:convert'; import 'dart:ui'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; -import 'lanKeyEntity.dart'; part 'translation_loader.dart'; part 'translation_message.dart'; \ No newline at end of file diff --git a/lib/translations/translation_loader.dart b/lib/translations/translation_loader.dart index a8dd33ed..9dddc4d9 100755 --- a/lib/translations/translation_loader.dart +++ b/lib/translations/translation_loader.dart @@ -1,40 +1,175 @@ part of lib_trans; class TranslationLoader { + // LAN_ZH_CN="zh" # 简体中文 + // LAN_EN_US="en" # 英文 + // LAN_ZH_TW="tw" # 繁体中文 + // LAN_Fr_FR="fr" # 法语 + // LAN_RU_RU="ru" # 俄语 + // LAN_DE_DE="de" # 德语 + // LAN_ZH_JA="ja" # 日语 + // LAN_ZH_KO="ko" # 韩语 + // LAN_ZH_IT="it" # 意大利语 + // #LAN_ZH_TW="uk" # 乌克兰语 + // LAN_ZH_PT="pt" # 葡萄牙语 + // LAN_ZH_ES="es" # 西班牙语 + // LAN_ZH_AR="ar" # 阿拉伯语 + // LAN_ZH_vi="vi" # 越南语 + // LAN_ZH_MS="ms" # 马莱语 + // LAN_ZH_NL="nl" # 荷兰语 + // LAN_ZH_RO="ro" # 罗马尼亚语 + // LAN_ZH_LT="lt" # 立陶宛语 + // LAN_ZH_SV="sv" # 瑞典语 + // LAN_ZH_ET="et" # 爱沙尼亚语 + // LAN_ZH_PL="pl" # 波兰语 + // LAN_ZH_SK="sk" # 斯洛伐克语 + // LAN_ZH_CS="cs" # 捷克语 + // LAN_ZH_EL="el" # 希腊语 + // LAN_ZH_HE="he" # 希伯来语 + // #LAN_ZH_TW="sr" # 塞尔维亚语' + // LAN_ZH_TR="tr" # 土耳其语 + // LAN_ZH_HU="hu" # 匈牙利语 + // LAN_ZH_BG="bg" # 保加利亚语 + // LAN_ZH_KK="kk" # 哈萨克斯坦语 === 哈萨克语 + // LAN_ZH_BN="bn" # 孟加拉语 + // LAN_ZH_HBS="hr" # 克罗地亚语 + // LAN_ZH_TH="th" # 泰语 + // LAN_ZH_ID="id" # 印度尼西亚语 + // LAN_ZH_FI="fi" # 芬兰语 + // LAN_ZH_DA="da" # 丹麦语 - static bool get isZh => Get.locale?.languageCode.toLowerCase() == 'zh'; - static bool get isEn => Get.locale?.languageCode.toLowerCase() == 'en'; + // static bool get isZh => Get.locale?.languageCode.toLowerCase() == 'zh'; + // static bool get isEn => Get.locale?.languageCode.toLowerCase() == 'en'; - static Map - _zhMap = {}, - _enMap = {}, - _keyMap = {}; + static Map _zhMap = {}; + static Map _enMap = {}; + static Map _twMap = {}; + static Map _hkMap = {}; + static Map _frMap = {}; + static Map _ruMap = {}; + static Map _deMap = {}; + static Map _jaMap = {}; + static Map _koMap = {}; + static Map _itMap = {}; + static Map _ukMap = {}; + static Map _ptMap = {}; + static Map _esMap = {}; + static Map _arMap = {}; + static Map _viMap = {}; + static Map _msMap = {}; + static Map _nlMap = {}; + static Map _roMap = {}; + static Map _ltMap = {}; + static Map _svMap = {}; + static Map _etMap = {}; + static Map _plMap = {}; + static Map _skMap = {}; + static Map _csMap = {}; + static Map _elMap = {}; + static Map _heMap = {}; + static Map _srMap = {}; + static Map _trMap = {}; + static Map _huMap = {}; + static Map _bgMap = {}; + static Map _kkMap = {}; + static Map _bnMap = {}; + static Map _hrMap = {}; + static Map _thMap = {}; + static Map _idMap = {}; + static Map _fiMap = {}; + static Map _daMap = {}; - static Map get zhDic => _zhMap; - static Map get enDic => _enMap; + static Map get zhDic => _zhMap; + static Map get enDic => _enMap; + static Map get twDic => _twMap; + static Map get hkDic => _hkMap; + static Map get frDic => _frMap; + static Map get ruDic => _ruMap; + static Map get deDic => _deMap; + static Map get jaDic => _jaMap; + static Map get koDic => _koMap; + static Map get itDic => _itMap; + static Map get ukDic => _ukMap; + static Map get ptDic => _ptMap; + static Map get esDic => _esMap; + static Map get arDic => _arMap; + static Map get viDic => _viMap; + static Map get msDic => _msMap; + static Map get nlDic => _nlMap; + static Map get roDic => _roMap; + static Map get ltDic => _ltMap; + static Map get svDic => _svMap; + static Map get etDic => _etMap; + static Map get plDic => _plMap; + static Map get skDic => _skMap; + static Map get csDic => _csMap; + static Map get elDic => _elMap; + static Map get heDic => _heMap; + static Map get srDic => _srMap; + static Map get trDic => _trMap; + static Map get huDic => _huMap; + static Map get bgDic => _bgMap; + static Map get kkDic => _kkMap; + static Map get bnDic => _bnMap; + static Map get hrDic => _hrMap; + static Map get thDic => _thMap; + static Map get idDic => _idMap; + static Map get fiDic => _fiMap; + static Map get daDic => _daMap; + static Map get ukMap => _ukMap; + static Map get srMap => _srMap; - static LanKeyEntity? _lanKeyEntity; - static LanKeyEntity? get lanKeys => _lanKeyEntity; - - static Future loadTranslation({ - String? zhSource, - String? enSource, - String? keySource,}) async { - _zhMap = await _loadJsonFile(zhSource!); - _enMap = await _loadJsonFile(enSource!); - _keyMap = await _loadJsonFile(keySource!); - _lanKeyEntity = LanKeyEntity.fromJson(_keyMap); + static Future loadTranslation() async { + _zhMap = await _loadJsonFile('lan/lan_zh.json'); + _enMap = await _loadJsonFile('lan/lan_en.json'); + _twMap = await _loadJsonFile('lan/lan_tw.json'); + _hkMap = await _loadJsonFile('lan/lan_hk.json'); + _frMap = await _loadJsonFile('lan/lan_fr.json'); + _ruMap = await _loadJsonFile('lan/lan_ru.json'); + _deMap = await _loadJsonFile('lan/lan_de.json'); + _jaMap = await _loadJsonFile('lan/lan_ja.json'); + _koMap = await _loadJsonFile('lan/lan_ko.json'); + _itMap = await _loadJsonFile('lan/lan_it.json'); + _ukMap = await _loadJsonFile('lan/lan_uk.json'); + _ptMap = await _loadJsonFile('lan/lan_pt.json'); + _esMap = await _loadJsonFile('lan/lan_es.json'); + _arMap = await _loadJsonFile('lan/lan_ar.json'); + _viMap = await _loadJsonFile('lan/lan_vi.json'); + _msMap = await _loadJsonFile('lan/lan_ms.json'); + _nlMap = await _loadJsonFile('lan/lan_nl.json'); + _roMap = await _loadJsonFile('lan/lan_ro.json'); + _ltMap = await _loadJsonFile('lan/lan_lt.json'); + _svMap = await _loadJsonFile('lan/lan_sv.json'); + _etMap = await _loadJsonFile('lan/lan_et.json'); + _plMap = await _loadJsonFile('lan/lan_pl.json'); + _skMap = await _loadJsonFile('lan/lan_sk.json'); + _csMap = await _loadJsonFile('lan/lan_cs.json'); + _elMap = await _loadJsonFile('lan/lan_el.json'); + _heMap = await _loadJsonFile('lan/lan_he.json'); + _srMap = await _loadJsonFile('lan/lan_sr.json'); + _trMap = await _loadJsonFile('lan/lan_tr.json'); + _huMap = await _loadJsonFile('lan/lan_hu.json'); + _bgMap = await _loadJsonFile('lan/lan_bg.json'); + _kkMap = await _loadJsonFile('lan/lan_kk.json'); + _bnMap = await _loadJsonFile('lan/lan_bn.json'); + _hrMap = await _loadJsonFile('lan/lan_hr.json'); + _thMap = await _loadJsonFile('lan/lan_th.json'); + _idMap = await _loadJsonFile('lan/lan_id.json'); + _fiMap = await _loadJsonFile('lan/lan_fi.json'); + _daMap = await _loadJsonFile('lan/lan_da.json'); + _ukMap = await _loadJsonFile('lan/lan_uk.json'); + _srMap = await _loadJsonFile('lan/lan_sr_cyrl.json'); } - static Future> _loadJsonFile(String filePath) async => rootBundle.loadString(filePath).then((String jsonString){ - final Map enJson = jsonDecode(jsonString); - final Map map = {}; - enJson.forEach((String key,dynamic value) { - map[key] = value.toString(); - }); - return map; - }).onError((Object? error, StackTrace stackTrace){ - return Future>.value({}); - }); - + static Future> _loadJsonFile(String filePath) async => + rootBundle.loadString(filePath).then((String jsonString) { + final Map enJson = jsonDecode(jsonString); + final Map map = {}; + enJson.forEach((String key, dynamic value) { + map[key] = value.toString(); + }); + return map; + }).onError((Object? error, StackTrace stackTrace) { + return Future>.value({}); + }); } diff --git a/lib/translations/translation_message.dart b/lib/translations/translation_message.dart index b554eacb..eafecdf9 100755 --- a/lib/translations/translation_message.dart +++ b/lib/translations/translation_message.dart @@ -1,13 +1,46 @@ part of lib_trans; class TranslationMessage extends Translations { - @override Map> get keys => { - 'en_US' : TranslationLoader.enDic, - 'zh_CN': TranslationLoader.zhDic, - }; + 'zh_CN': TranslationLoader.zhDic, + 'en_US': TranslationLoader.enDic, + 'zh_TW': TranslationLoader.twDic, + 'hk_HK': TranslationLoader.hkDic, + 'fr_FR': TranslationLoader.frDic, + 'ru_RU': TranslationLoader.ruDic, + 'de_DE': TranslationLoader.deDic, + 'ja_JP': TranslationLoader.jaDic, + 'ko_KR': TranslationLoader.koDic, + 'it_IT': TranslationLoader.itDic, + 'uk_UA': TranslationLoader.ukDic, + 'pt_PT': TranslationLoader.ptDic, + 'es_ES': TranslationLoader.esDic, + 'ar_SA': TranslationLoader.arDic, + 'vi_VN': TranslationLoader.viDic, + 'ms_MY': TranslationLoader.msDic, + 'nl_NL': TranslationLoader.nlDic, + 'ro_RO': TranslationLoader.roDic, + 'lt_LT': TranslationLoader.ltDic, + 'sv_SE': TranslationLoader.svDic, + 'et_EE': TranslationLoader.etDic, + 'pl_PL': TranslationLoader.plDic, + 'sk_SK': TranslationLoader.skDic, + 'cs_CZ': TranslationLoader.csDic, + 'el_GR': TranslationLoader.elDic, + 'he_IL': TranslationLoader.heDic, + 'sr_RS': TranslationLoader.srDic, + 'tr_TR': TranslationLoader.trDic, + 'hu_HU': TranslationLoader.huDic, + 'bg_BG': TranslationLoader.bgDic, + 'kk_KZ': TranslationLoader.kkDic, + 'bn_BD': TranslationLoader.bnDic, + 'hr_BA': TranslationLoader.hrDic, + 'th_TH': TranslationLoader.thDic, + 'id_ID': TranslationLoader.idDic, + 'fi_FI': TranslationLoader.fiDic, + 'da_DK': TranslationLoader.daDic, + }; void updateLocal(Locale l) => Get.updateLocale(l); - -} \ No newline at end of file +} diff --git a/lib/versionUndate/versionUndateTool.dart b/lib/versionUndate/versionUndateTool.dart index 9ec8a5ae..35d5fdbc 100755 --- a/lib/versionUndate/versionUndateTool.dart +++ b/lib/versionUndate/versionUndateTool.dart @@ -11,15 +11,16 @@ import 'package:url_launcher/url_launcher.dart'; import '../app_settings/app_settings.dart'; import '../network/api_repository.dart'; -import '../translations/trans_lib.dart'; import 'versionUndate_entity.dart'; class VersionUndateTool { - static VersionUndateTool? _manager; + + factory VersionUndateTool() => shareManager()!; VersionUndateTool._init() { // _initLoadUpdateVersionData(); } + static VersionUndateTool? _manager; static VersionUndateTool? shareManager() { _manager ??= VersionUndateTool._init(); @@ -27,8 +28,6 @@ class VersionUndateTool { return _manager; } - factory VersionUndateTool() => shareManager()!; - VersionUndateTool? get manager => shareManager(); void _initLoadUpdateVersionData() { @@ -36,11 +35,11 @@ class VersionUndateTool { } // 获取版本号 - void getVersionData() async { - DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + Future getVersionData() async { + final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); String brandName = ''; if (Platform.isAndroid) { - AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + final AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; AppLog.log('androidInfo.manufacturer:${androidInfo.manufacturer}' 'androidInfo.device:${androidInfo.device}' 'androidInfo.model:${androidInfo.model}' @@ -55,14 +54,14 @@ class VersionUndateTool { 'androidInfo.bootloader:${androidInfo.bootloader}'); brandName = androidInfo.manufacturer; } else if (Platform.isIOS) { - IosDeviceInfo iosInfo = await deviceInfo.iosInfo; + final IosDeviceInfo iosInfo = await deviceInfo.iosInfo; brandName = iosInfo.systemName!; } - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - var version = packageInfo.version; - AppLog.log("updateGetversion:$version"); - var entity = await ApiRepository.to.getVersionData( + final PackageInfo packageInfo = await PackageInfo.fromPlatform(); + final String version = packageInfo.version; + // AppLog.log("updateGetversion:$version"); + final VersionUndateEntity entity = await ApiRepository.to.getVersionData( brandName: brandName, currentVersion: version, ); @@ -76,31 +75,31 @@ class VersionUndateTool { void showUpdateAlertDialog(VersionUndateEntity versionUndateEntity) { showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return CupertinoAlertDialog( content: Column( mainAxisSize: MainAxisSize.min, - children: [ + children: [ Container( // color: AppColors.mainColor, alignment: Alignment.topCenter, height: 50.h, child: Text( - '版本更新', + '版本更新'.tr, style: TextStyle(fontSize: 28.sp, color: Colors.blue), )), Container( padding: EdgeInsets.only(left: 20.w, right: 20.w, top: 10.h), alignment: Alignment.centerLeft, - child: Text(versionUndateEntity.data!.description! ?? "", + child: Text(versionUndateEntity.data!.description!, textAlign: TextAlign.start, style: TextStyle(fontSize: 20.sp))), ], ), actions: versionUndateEntity.data!.isForceUpdate == 0 - ? [ + ? [ CupertinoDialogAction( - child: Text("下次再说"), + child: Text('下次再说'.tr), onPressed: () { Navigator.pop(context); // Storage.setString( @@ -120,7 +119,7 @@ class VersionUndateTool { }, ), ] - : [ + : [ CupertinoDialogAction( child: Text('确定'.tr), onPressed: () async { diff --git a/lib/versionUndate/versionUndate_entity.dart b/lib/versionUndate/versionUndate_entity.dart index 1f8be81d..d54392c2 100755 --- a/lib/versionUndate/versionUndate_entity.dart +++ b/lib/versionUndate/versionUndate_entity.dart @@ -1,8 +1,5 @@ + class VersionUndateEntity { - int? errorCode; - String? description; - String? errorMsg; - Data? data; VersionUndateEntity( {this.errorCode, this.description, this.errorMsg, this.data}); @@ -13,6 +10,10 @@ class VersionUndateEntity { errorMsg = json['errorMsg']; data = json['data'] != null ? Data.fromJson(json['data']) : null; } + int? errorCode; + String? description; + String? errorMsg; + Data? data; Map toJson() { final Map data = {}; @@ -27,10 +28,6 @@ class VersionUndateEntity { } class Data { - int? isUpdate; - String? appDownloadUrl; - String? description; - int? isForceUpdate; Data( {this.isUpdate, @@ -44,6 +41,10 @@ class Data { description = json['description']; isForceUpdate = json['isForceUpdate']; } + int? isUpdate; + String? appDownloadUrl; + String? description; + int? isForceUpdate; Map toJson() { final Map data = {}; diff --git a/lib/widget/flavors_img.dart b/lib/widget/flavors_img.dart index 54dc7323..4d7eb325 100755 --- a/lib/widget/flavors_img.dart +++ b/lib/widget/flavors_img.dart @@ -4,20 +4,18 @@ import 'package:flutter/material.dart'; import 'package:star_lock/flavors.dart'; class FlavorsImg extends StatelessWidget { - FlavorsImg({required this.child, this.black = false, key}); + FlavorsImg({required this.child, Key? key, this.black = false}) : super(key: key); bool black; Widget child; ColorFilterGenerator myFilter = - ColorFilterGenerator(name: "xhj", filters: []); + ColorFilterGenerator(name: 'xhj', filters: >[]); @override Widget build(BuildContext context) { - myFilter = ColorFilterGenerator(name: "xhj", filters: [ - black - ? ColorFilterAddons.addictiveColor(-255, -255, -255) - : ColorFilterAddons.addictiveColor(1, 22, 93), + myFilter = ColorFilterGenerator(name: 'xhj', filters: >[ + if (black) ColorFilterAddons.addictiveColor(-255, -255, -255) else ColorFilterAddons.addictiveColor(1, 22, 93), ]); if (F.appFlavor != Flavor.xhj) { return child; diff --git a/lib/widget/permission/permission_dialog.dart b/lib/widget/permission/permission_dialog.dart index dc7afbf6..150f3867 100755 --- a/lib/widget/permission/permission_dialog.dart +++ b/lib/widget/permission/permission_dialog.dart @@ -4,6 +4,8 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/tools/storage.dart'; +import '../../tools/bugly/bugly_tool.dart'; + class PermissionDialog { static Map titles = { Permission.camera: '相机'.tr, @@ -66,12 +68,14 @@ class PermissionDialog { CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { + BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { + BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: true); }, ), @@ -282,7 +286,7 @@ class PermissionDialog { //显示权限判断申请框 static Future request(Permission permission, [String? content]) async { - AppLog.log('context:${content}'); + AppLog.log('context:$content'); if (Get.context == null) { return false; } @@ -302,12 +306,14 @@ class PermissionDialog { CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { + BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { + BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: true); }, ), diff --git a/notify.sh b/notify.sh new file mode 100755 index 00000000..b881f57f --- /dev/null +++ b/notify.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -e +APP_PRODUCT_NAME=$APP_PRODUCT_NAME +BUILD_STATUS=$1 +if [[ "${CI_COMMIT_BRANCH}" == "release" ]] ; then + WECAHT_WEBHOOK_URL=$PRE_QYWECAHT_WEBHOOK_URL + SKY_IOS_DOWNLOAD_URL=$PRE_SKY_IOS_DOWNLOAD_URL + SKY_ANDROID_DOWNLOAD_URL=$PRE_SKY_ANDROID_DOWNLOAD_URL + XHJ_IOS_DOWNLOAD_URL=$PRE_XHJ_IOS_DOWNLOAD_URL + XHJ_ANDROID_DOWNLOAD_URL=$PRE_XHJ_ANDROID_DOWNLOAD_URL +elif [[ "${CI_COMMIT_BRANCH}" == "develop" ]] || [[ "${CI_COMMIT_BRANCH}" == "feat_devops" ]]; then + WECAHT_WEBHOOK_URL=$DEV_QYWECAHT_WEBHOOK_URL + SKY_IOS_DOWNLOAD_URL=$DEV_SKY_IOS_DOWNLOAD_URL + SKY_ANDROID_DOWNLOAD_URL=$DEV_SKY_ANDROID_DOWNLOAD_URL + XHJ_IOS_DOWNLOAD_URL=$DEV_XHJ_IOS_DOWNLOAD_URL + XHJ_ANDROID_DOWNLOAD_URL=$DEV_XHJ_ANDROID_DOWNLOAD_URL +fi + +if [[ "${BUILD_STATUS}" == "success" ]]; then + TITLE="😎 构建成功" + BUILD_STATUS_DESC="成功" + NOTIFICATION_CONENT='{"msgtype":"markdown","markdown":{"content":"'$TITLE'\n> **项目名称**: '$APP_PRODUCT_NAME'\n> **分支**: '$CI_COMMIT_REF_NAME'\n> **构建状态**: '$BUILD_STATUS_DESC'\n> **安装地址**:\n 锁通通 ** [iOS]('$SKY_IOS_DOWNLOAD_URL') ** ** [Android]('$SKY_ANDROID_DOWNLOAD_URL')**\n > ** 星星锁 ** [iOS]('$XHJ_IOS_DOWNLOAD_URL') ** ** [Android]('$XHJ_ANDROID_DOWNLOAD_URL')** \n> **详情查看**: [构建日志]('$CI_JOB_URL')"}}' +else + TITLE="😥 部署失败" + BUILD_STATUS_DESC="失败" + NOTIFICATION_CONENT='{"msgtype":"markdown","markdown":{"content": "'$TITLE'\n> **项目名称**: '$APP_PRODUCT_NAME'\n> **分支**: '$CI_COMMIT_REF_NAME'\n> **构建状态**: '$BUILD_STATUS_DESC'\n>**详情查看**: [构建日志]('$CI_JOB_URL')"}}' +fi +echo "$NOTIFICATION_CONENT" +JSON_PAYLOAD=$(cat <=2.12.0 <3.0.0' @@ -228,15 +239,17 @@ dependencies: # audio_service: ^0.18.12 app_settings: ^5.1.1 flutter_local_notifications: ^17.0.0 - fluwx: ^4.5.5 + fluwx: 4.5.5 system_settings: ^2.0.0 expandable: ^5.0.1 colorfilter_generator: ^0.0.8 file_picker: ^5.3.1 # 错误日志监控 - flutter_bugly_plugin: ^0.0.9 +# flutter_bugly_plugin: ^0.0.9 + flutter_bugly: ^1.0.2 open_filex: ^4.4.0 + umeng_common_sdk: 1.2.7 dependency_overrides: #强制设置google_maps_flutter_ios 为 2.5.2 diff --git a/translation.sh b/translation.sh index 2a5b285b..a3ca68bf 100644 --- a/translation.sh +++ b/translation.sh @@ -10,9 +10,46 @@ SOURCE_LANGUAGE="en" #项目语言常量 -LAN_ZH_CN="zh_CN" -LAN_ZH_TW="zh_TW" -LAN_EN_US="en_US" +#LAN_ZH_CN="zh_CN" +#LAN_ZH_TW="zh_TW" +#LAN_EN_US="en_US" + +LAN_ZH_CN="zh" # 简体中文 +LAN_EN_US="en" # 英文 +LAN_ZH_TW="tw" # 繁体中文 +LAN_Fr_FR="fr" # 法语 +LAN_RU_RU="ru" # 俄语 +LAN_DE_DE="de" # 德语 +LAN_ZH_JA="ja" # 日语 +LAN_ZH_KO="ko" # 韩语 +LAN_ZH_IT="it" # 意大利语 +#LAN_ZH_TW="tw" # 乌克兰语 +LAN_ZH_PT="pt" # 葡萄牙语 +LAN_ZH_ES="es" # 西班牙语 +LAN_ZH_AR="ar" # 阿拉伯语 +LAN_ZH_vi="vi" # 越南语 +LAN_ZH_MS="ms" # 马莱语 +LAN_ZH_NL="nl" # 荷兰语 +LAN_ZH_RO="ro" # 罗马尼亚语 +LAN_ZH_LT="lt" # 立陶宛语 +LAN_ZH_SV="sv" # 瑞典语 +LAN_ZH_ET="et" # 爱沙尼亚语 +LAN_ZH_PL="pl" # 波兰语 +LAN_ZH_SK="sk" # 斯洛伐克语 +LAN_ZH_CS="cs" # 捷克语 +LAN_ZH_EL="el" # 希腊语 +LAN_ZH_HE="he" # 希伯来语 +#LAN_ZH_TW="tw" # 塞尔维亚文 +LAN_ZH_TR="tr" # 土耳其语 +LAN_ZH_HU="hu" # 匈牙利语 +LAN_ZH_BG="bg" # 保加利亚语 +LAN_ZH_KK="kk" # 哈萨克斯坦语 === 哈萨克语 +LAN_ZH_BN="bn" # 孟加拉语 +LAN_ZH_HBS="hbs" # 克罗地亚语 +LAN_ZH_TH="th" # 泰语 +LAN_ZH_ID="id" # 印度尼西亚语 +LAN_ZH_FI="fi" # 芬兰语 +LAN_ZH_DA="da" # 丹麦语 declare -A LANG_LIST=( ["$LAN_ZH_CN"]="简体中文" @@ -25,6 +62,42 @@ declare -A ALIYUN_LANG_MAP=( ["$LAN_ZH_CN"]="zh" ["$LAN_ZH_TW"]="zh-tw" ["$LAN_EN_US"]="en" +# ["$LAN_ZH_CN"]="zh" # 简体中文 +# ["$LAN_EN_US"]="en" # 英文 +# ["$LAN_ZH_TW"]="tw" # 繁体中文 + ["$LAN_Fr_FR"]="fr" # 法语 + ["$LAN_RU_RU"]="ru" # 俄语 + ["$LAN_DE_DE"]="de" # 德语 + ["$LAN_ZH_JA"]="ja" # 日语 + ["$LAN_ZH_KO"]="ko" # 韩语 + ["$LAN_ZH_IT"]="it" # 意大利语 + #LAN_ZH_TW="tw" # 乌克兰语 + ["$LAN_ZH_PT"]="pt" # 葡萄牙语 + ["$LAN_ZH_ES"]="es" # 西班牙语 + ["$LAN_ZH_AR"]="ar" # 阿拉伯语 + ["$LAN_ZH_vi"]="vi" # 越南语 + ["$LAN_ZH_MS"]="ms" # 马莱语 + ["$LAN_ZH_NL"]="nl" # 荷兰语 + ["$LAN_ZH_RO"]="ro" # 罗马尼亚语 + ["$LAN_ZH_LT"]="lt" # 立陶宛语 + ["$LAN_ZH_SV"]="sv" # 瑞典语 + ["$LAN_ZH_ET"]="et" # 爱沙尼亚语 + ["$LAN_ZH_PL"]="pl" # 波兰语 + ["$LAN_ZH_SK"]="sk" # 斯洛伐克语 + ["$LAN_ZH_CS"]="cs" # 捷克语 + ["$LAN_ZH_EL"]="el" # 希腊语 + ["$LAN_ZH_HE"]="he" # 希伯来语 + #LAN_ZH_TW="tw" # 塞尔维亚文 + ["$LAN_ZH_TR"]="tr" # 土耳其语 + ["$LAN_ZH_HU"]="hu" # 匈牙利语 + ["$LAN_ZH_BG"]="bg" # 保加利亚语 + ["$LAN_ZH_KK"]="kk" # 哈萨克斯坦语 === 哈萨克语 + ["$LAN_ZH_BN"]="bn" # 孟加拉语 + ["$LAN_ZH_HBS"]="hbs" # 克罗地亚语 + ["$LAN_ZH_TH"]="th" # 泰语 + ["$LAN_ZH_ID"]="id" # 印度尼西亚语 + ["$LAN_ZH_FI"]="fi" # 芬兰语 + ["$LAN_ZH_DA"]="da" # 丹麦语 )