diff --git a/README.md b/README.md index 7c14d20..65c58f7 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ By using the app, you can * German Deutsch (de) * French Français (fr) * Italian Italiano (it) +* Russian Русский (ru) You are welcomed to help translate the app into more languages (refer to this section) @@ -115,12 +116,13 @@ Thank you the following contributors who have made the app better! |:-:|:-:|:-:| | mondstern | [mondlicht-und-sterne](https://github.com/mondlicht-und-sterne) | German language translation | | Valentino Bocchetti | [luftmensch-luftmensch](https://github.com/luftmensch-luftmensch) | Italian language translation | +| Smooth-E | [Smooth-E](https://github.com/Smooth-E) | Russian language translation | ## Framework ```sh Ionic CLI : 6.20.4 - Ionic Framework : @ionic/angular 6.3.7 + Ionic Framework : @ionic/angular 6.3.9 @angular-devkit/build-angular : 14.2.10 @angular-devkit/schematics : 14.2.10 @angular/cli : 14.2.10 diff --git a/android/app/build.gradle b/android/app/build.gradle index 7b72905..ee05241 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.tomfong.simpleqr" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 3020000 - versionName "3.2.0" + versionCode 3030000 + versionName "3.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/android/app/src/main/res/values-ru/colors.xml b/android/app/src/main/res/values-ru/colors.xml new file mode 100644 index 0000000..540a54f --- /dev/null +++ b/android/app/src/main/res/values-ru/colors.xml @@ -0,0 +1,6 @@ + + + #00a5aa + #00a5aa + #00a5aa + diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..b4bc7ba --- /dev/null +++ b/android/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,7 @@ + + + Simple QR + Simple QR + com.tomfong.simpleqr + com.tomfong.simpleqr + diff --git a/android/app/src/main/res/values-ru/styles.xml b/android/app/src/main/res/values-ru/styles.xml new file mode 100644 index 0000000..0bcb2f7 --- /dev/null +++ b/android/app/src/main/res/values-ru/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/fastlane/metadata/android/en-US/changelogs/3030000.txt b/fastlane/metadata/android/en-US/changelogs/3030000.txt new file mode 100644 index 0000000..4d9420b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3030000.txt @@ -0,0 +1,3 @@ +* Support Russian language +* Allow user to manually save a record if auto logging is off +* Minor update on UI \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 154fbe2..c3d83df 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,6 +1,6 @@ Simple QR is an open-source app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads. -English, French, German, Itanlian, Traditional Chinese and Simplified Chinese are supported. +English, French, German, Itanlian, Russian, Traditional Chinese and Simplified Chinese are supported. By using the app, you can: diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index da63b9f..3b3b675 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 1B75189429375EAB00800D38 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -160,6 +161,7 @@ de, fr, it, + ru, ); mainGroup = 504EC2FB1FED79650016851F; productRefGroup = 504EC3051FED79650016851F /* Products */; @@ -268,6 +270,7 @@ D26FE7F9283D1E6C002A61AE /* fr */, D26FE7FA283D1E76002A61AE /* de */, D29D2E2A2847C31D00566DFF /* it */, + 1B75189429375EAB00800D38 /* ru */, ); name = InfoPlist.strings; sourceTree = ""; @@ -396,7 +399,7 @@ INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.2.0; + MARKETING_VERSION = 3.3.0; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -419,7 +422,7 @@ INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 3.2.0; + MARKETING_VERSION = 3.3.0; PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "Simple QR"; diff --git a/ios/App/App/ru.lproj/InfoPlist.strings b/ios/App/App/ru.lproj/InfoPlist.strings new file mode 100644 index 0000000..e18b40f --- /dev/null +++ b/ios/App/App/ru.lproj/InfoPlist.strings @@ -0,0 +1,6 @@ +"CFBundleDisplayName" = "Simple QR"; +"CFBundleName" = "Simple QR"; +"NSCameraUsageDescription" = "Simple QR использует камеру для сканирования QR-кода и штрих-кодов"; +"NSContactsUsageDescription" = "Simple QR использует Контакты для добавления контакта"; +"NSPhotoLibraryAddUsageDescription" = "Simple QR использует библиотеку фотографий для сохранения изображения QR-кода"; +"NSPhotoLibraryUsageDescription" = "Simple QR использует библиотеку фотографий для импорта изображений и сканирования QR-кода."; diff --git a/package-lock.json b/package-lock.json index e4d9de1..b15ceca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,24 @@ { "name": "simple-qr", - "version": "3.2.0", + "version": "3.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "simple-qr", - "version": "3.2.0", + "version": "3.3.0", "dependencies": { "@angular/animations": "^14.2.3", "@angular/cdk": "^14.2.2", "@angular/common": "^14.2.3", "@angular/core": "^14.2.3", - "@angular/forms": "^14.2.11", - "@angular/localize": "^14.2.11", + "@angular/forms": "^14.2.12", + "@angular/localize": "^14.2.12", "@angular/material": "^14.2.2", "@angular/material-moment-adapter": "^14.2.7", "@angular/platform-browser": "^14.2.3", - "@angular/platform-browser-dynamic": "^14.2.11", - "@angular/router": "^14.2.11", + "@angular/platform-browser-dynamic": "^14.2.12", + "@angular/router": "^14.2.12", "@awesome-cordova-plugins/aes-256": "^6.2.0", "@awesome-cordova-plugins/chooser": "^6.2.0", "@awesome-cordova-plugins/core": "^6.2.0", @@ -26,7 +26,7 @@ "@awesome-cordova-plugins/sms": "^6.2.0", "@awesome-cordova-plugins/social-sharing": "^6.2.0", "@awesome-cordova-plugins/theme-detection": "^6.2.0", - "@capacitor-community/barcode-scanner": "^3.0.0", + "@capacitor-community/barcode-scanner": "^3.0.1", "@capacitor-community/contacts": "^2.0.0-0", "@capacitor-community/screen-brightness": "^4.0.0", "@capacitor/android": "^4.5.0", @@ -43,7 +43,7 @@ "@capacitor/splash-screen": "^4.1.2", "@capacitor/status-bar": "^4.1.0", "@capacitor/toast": "^4.1.0", - "@ionic/angular": "^6.3.7", + "@ionic/angular": "^6.3.9", "@ionic/storage": "^3.0.6", "@ionic/storage-angular": "^3.0.6", "@ng-bootstrap/ng-bootstrap": "^13.1.1", @@ -75,7 +75,7 @@ "@angular/cli": "^14.2.10", "@angular/compiler": "^14.2.3", "@angular/compiler-cli": "^14.2.3", - "@angular/language-service": "^14.2.11", + "@angular/language-service": "^14.2.12", "@capacitor/cli": "^4.5.0", "@ionic/angular-toolkit": "^6.1.0", "@ionic/cli": "6.20.1", @@ -306,9 +306,9 @@ } }, "node_modules/@angular/animations": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.11.tgz", - "integrity": "sha512-HOw8xecbKfs7A5Ezjf+BfXKvvwU7X8I0US5Ey6bOuLvpA3QVOGSLw9BeutY5Q2mPWiRgnNNQW+FOd8Pe9gEkpQ==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz", + "integrity": "sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==", "dependencies": { "tslib": "^2.3.0" }, @@ -316,7 +316,7 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "14.2.11" + "@angular/core": "14.2.12" } }, "node_modules/@angular/cdk": { @@ -372,9 +372,9 @@ } }, "node_modules/@angular/common": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.11.tgz", - "integrity": "sha512-a5w7lz4SoUzCwSDnuUPnfbEYPA8ufFiXz44mOv48P4uIb78q3rZ/R/EyWD1O3yJPof0o8aPNKpKZzuRDv3Q8ow==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz", + "integrity": "sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==", "dependencies": { "tslib": "^2.3.0" }, @@ -382,14 +382,14 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "14.2.11", + "@angular/core": "14.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.11.tgz", - "integrity": "sha512-QD4tq37qqPxxNK4o0Pd7dJm06evwEPChV67S/ecX3S6UkSDp8lVoWKiVx9htp/5s4iydKZU4eGu9oTOMOLVdOw==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz", + "integrity": "sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -397,7 +397,7 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "14.2.11" + "@angular/core": "14.2.12" }, "peerDependenciesMeta": { "@angular/core": { @@ -406,9 +406,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.11.tgz", - "integrity": "sha512-ipIEgueW8bhxVSq6qlgndBLVRCJoTvk1he/TI3w34m2EnZY1ctgGGCm1VbB3XARh+irVesPVMIAxRtjYds7XOw==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.12.tgz", + "integrity": "sha512-9Gkb9KFkaQPz8XaS8ZwwTioRZ4ywykdAWyceICEi78/Y9ConYrTX2SbFogzI2dPUZU8a04tMlbqTSmHjVbJftQ==", "dependencies": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -430,14 +430,14 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/compiler": "14.2.11", + "@angular/compiler": "14.2.12", "typescript": ">=4.6.2 <4.9" } }, "node_modules/@angular/core": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.11.tgz", - "integrity": "sha512-4uEIA6ESMLt2f/ivKuVBpME0IbuFHWmpweN4dwJt83DfJBiBfpqdrFYZHz/Kbkh9cGCiP7L4/eKPRWTlAHehhw==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz", + "integrity": "sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==", "dependencies": { "tslib": "^2.3.0" }, @@ -450,9 +450,9 @@ } }, "node_modules/@angular/forms": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.11.tgz", - "integrity": "sha512-sItoA3/I8j/pf3zhv8sR37M5dAYUJpezv8rw2fTT2Y+nZJFUpkFWqX2N4qpMlPY0MP9OX++8K8/d2j0Lfi3wJQ==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz", + "integrity": "sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==", "dependencies": { "tslib": "^2.3.0" }, @@ -460,25 +460,25 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "14.2.11", - "@angular/core": "14.2.11", - "@angular/platform-browser": "14.2.11", + "@angular/common": "14.2.12", + "@angular/core": "14.2.12", + "@angular/platform-browser": "14.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.11.tgz", - "integrity": "sha512-YOQ7zVnRkZaIlAwA+u+x+wUGlvvKQDR+CGkIF19L/C0Zo6b8vFmfcNqWig6Wq8sRwS+5fULcPoOAESaUwq3urw==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.12.tgz", + "integrity": "sha512-YmW6simyEVmpDmbYVUhZ2IxSP6pmsWrV120rB9Y21/BeM39WIXA4NCNirVWlAd/KAKY9O7Sbn1nXI6rSDfhopQ==", "dev": true, "engines": { "node": "^14.15.0 || >=16.10.0" } }, "node_modules/@angular/localize": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.2.11.tgz", - "integrity": "sha512-vrYv2f6BR1dKebZB+c0O4Arx7iGF1MqN4gHB+V5KHS7UPIc3YnoQn9LaFDRWWazjrXCvq1uf1Cb8qzzu19+lZQ==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.2.12.tgz", + "integrity": "sha512-6TTnuvubvYL1LDIJhDfd7ygxTaj0ShTILCDXT4URBhZKQbQ3HAorDqsc6SXqZVGCHdqF0hGTaeN/7zVvgP9kzA==", "dependencies": { "@babel/core": "7.18.9", "glob": "8.0.3", @@ -493,8 +493,8 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/compiler": "14.2.11", - "@angular/compiler-cli": "14.2.11" + "@angular/compiler": "14.2.12", + "@angular/compiler-cli": "14.2.12" } }, "node_modules/@angular/localize/node_modules/@babel/core": { @@ -565,9 +565,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.11.tgz", - "integrity": "sha512-lGi9pF0Kf/GGrVKcfxxfStM2eMSluDTmbcYuVAX28iBn5XEdfsonrkfy2cnxUMnQ7nioMAZBNGOJHbQPKz4jwg==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz", + "integrity": "sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==", "dependencies": { "tslib": "^2.3.0" }, @@ -575,9 +575,9 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/animations": "14.2.11", - "@angular/common": "14.2.11", - "@angular/core": "14.2.11" + "@angular/animations": "14.2.12", + "@angular/common": "14.2.12", + "@angular/core": "14.2.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -586,9 +586,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.11.tgz", - "integrity": "sha512-kjcZda+gcAiYd0I3mjLSr6xR/HkUCnmIMyqaFGoHnIDXI2c6wLDxi49pivrJFvUYJPfYAJ6GjlYTM6L9B3XSEQ==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz", + "integrity": "sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==", "dependencies": { "tslib": "^2.3.0" }, @@ -596,16 +596,16 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "14.2.11", - "@angular/compiler": "14.2.11", - "@angular/core": "14.2.11", - "@angular/platform-browser": "14.2.11" + "@angular/common": "14.2.12", + "@angular/compiler": "14.2.12", + "@angular/core": "14.2.12", + "@angular/platform-browser": "14.2.12" } }, "node_modules/@angular/router": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.11.tgz", - "integrity": "sha512-AbnyKXabar2WsG3fL24O1xdwkcRhRKI7u2vc9D8bcp2ks5GOJNxfbtG2Z6PSO18vtDszQxwELRe2cOEe+0TmPQ==", + "version": "14.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz", + "integrity": "sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==", "dependencies": { "tslib": "^2.3.0" }, @@ -613,9 +613,9 @@ "node": "^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "14.2.11", - "@angular/core": "14.2.11", - "@angular/platform-browser": "14.2.11", + "@angular/common": "14.2.12", + "@angular/core": "14.2.12", + "@angular/platform-browser": "14.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -720,9 +720,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", "engines": { "node": ">=6.9.0" } @@ -841,9 +841,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", + "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -862,13 +862,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "regexpu-core": "^5.2.1" }, "engines": { "node": ">=6.9.0" @@ -1101,28 +1101,28 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" @@ -1142,9 +1142,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1400,14 +1400,14 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1673,9 +1673,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", - "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", + "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" @@ -1917,13 +1917,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1964,9 +1964,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", - "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", + "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" @@ -1994,13 +1994,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" @@ -2300,18 +2300,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.20.5", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2320,11 +2320,11 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", "dependencies": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.20.5", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -2346,9 +2346,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -2359,11 +2359,11 @@ } }, "node_modules/@capacitor-community/barcode-scanner": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@capacitor-community/barcode-scanner/-/barcode-scanner-3.0.0.tgz", - "integrity": "sha512-Jzr4phHyDS+C2ZE+eoVsuq15oFvFLVtAJmmegIjwVBcb3CxgRdkt/kdVurXgVKMQ6mJ6StYI7hALeMu2vkyC6A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@capacitor-community/barcode-scanner/-/barcode-scanner-3.0.1.tgz", + "integrity": "sha512-3R6LXQ3kikuc71Pvffkul9pLvHK8v85VcvBw6E0rjAWgWJbCLf0ssBmycrqMa8/aMZjdw1XNn3nJTXijkfCifQ==", "peerDependencies": { - "@capacitor/core": "^4.0.0" + "@capacitor/core": "^4.5.0" } }, "node_modules/@capacitor-community/contacts": { @@ -2848,11 +2848,11 @@ "dev": true }, "node_modules/@ionic/angular": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.7.tgz", - "integrity": "sha512-a6EAhK5+elNNvnnSFKdNxdcNKd+epEpR1csQaiixisrWpWirxTNteqNLn9HAe+13iR8esI3mGgyOzVKr011ILw==", + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.3.9.tgz", + "integrity": "sha512-j/nuHCulDygDeU4WwdKY1l+kwQGKRBN9afwdbCO79lztKenlPwiqyYwds2lZuvhMmF+S5oqXrN5gt26mVUBdCA==", "dependencies": { - "@ionic/core": "^6.3.6", + "@ionic/core": "6.3.9", "ionicons": "^6.0.4", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" @@ -3323,9 +3323,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.7.tgz", - "integrity": "sha512-HWntdPsc4lVHHwz7kY2BSQteafwXsPxc8y5wAdfeA8woRLGse+1Vq00CDUihf7tTUflM1CdmVgGtyYlDAnO2fA==", + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.9.tgz", + "integrity": "sha512-0JlCGIgLASoxZ6XXEkhCMQzdedvzqI7lsD6zBYPkUyMFOMTff7fZdQg1r9v9IQVHW+UCuyM4xc0MT4YOD4/S3A==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.4", @@ -4467,9 +4467,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5018,9 +5018,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "version": "1.0.30001435", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz", + "integrity": "sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA==", "funding": [ { "type": "opencollective", @@ -5831,9 +5831,9 @@ } }, "node_modules/cssdb": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.1.0.tgz", - "integrity": "sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.2.0.tgz", + "integrity": "sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg==", "dev": true, "funding": { "type": "opencollective", @@ -6284,9 +6284,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7866,9 +7866,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true, "engines": { "node": ">= 4" @@ -9371,9 +9371,9 @@ } }, "node_modules/log4js": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.0.tgz", - "integrity": "sha512-KA0W9ffgNBLDj6fZCq/lRbgR6ABAodRIDHrZnS48vOtfKa4PzWImb0Md1lmGCdO3n3sbCm/n1/WmrNlZ8kCI3Q==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.1.tgz", + "integrity": "sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ==", "dev": true, "dependencies": { "date-format": "^4.0.14", @@ -9651,9 +9651,9 @@ } }, "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" @@ -11029,9 +11029,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "12.1.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz", - "integrity": "sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A==", + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -12868,17 +12868,17 @@ } }, "node_modules/socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", + "engine.io": "~6.2.1", "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "socket.io-parser": "~4.2.1" }, "engines": { "node": ">=10.0.0" @@ -13973,9 +13973,9 @@ } }, "node_modules/vm2": { - "version": "3.9.11", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", - "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", + "version": "3.9.12", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.12.tgz", + "integrity": "sha512-OMmRsKh1gmdosFzuqmj6O43hqIStqXA24YbwjtUTO0TkOBP8yLNHLplbr4odnAzEcMnm9lt2r3R8kTivn8urMg==", "dev": true, "dependencies": { "acorn": "^8.7.0", diff --git a/package.json b/package.json index c940dbf..7b31ceb 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,7 @@ { "name": "simple-qr", - "version": "3.2.0", + "version": "3.3.0", "author": "Tom Fong", - "homepage": "https://tomfong.github.io", "scripts": { "ng": "ng", "build:an": "ionic cap build android --prod --no-open", @@ -21,13 +20,13 @@ "@angular/cdk": "^14.2.2", "@angular/common": "^14.2.3", "@angular/core": "^14.2.3", - "@angular/forms": "^14.2.11", - "@angular/localize": "^14.2.11", + "@angular/forms": "^14.2.12", + "@angular/localize": "^14.2.12", "@angular/material": "^14.2.2", "@angular/material-moment-adapter": "^14.2.7", "@angular/platform-browser": "^14.2.3", - "@angular/platform-browser-dynamic": "^14.2.11", - "@angular/router": "^14.2.11", + "@angular/platform-browser-dynamic": "^14.2.12", + "@angular/router": "^14.2.12", "@awesome-cordova-plugins/aes-256": "^6.2.0", "@awesome-cordova-plugins/chooser": "^6.2.0", "@awesome-cordova-plugins/core": "^6.2.0", @@ -35,7 +34,7 @@ "@awesome-cordova-plugins/sms": "^6.2.0", "@awesome-cordova-plugins/social-sharing": "^6.2.0", "@awesome-cordova-plugins/theme-detection": "^6.2.0", - "@capacitor-community/barcode-scanner": "^3.0.0", + "@capacitor-community/barcode-scanner": "^3.0.1", "@capacitor-community/contacts": "^2.0.0-0", "@capacitor-community/screen-brightness": "^4.0.0", "@capacitor/android": "^4.5.0", @@ -52,7 +51,7 @@ "@capacitor/splash-screen": "^4.1.2", "@capacitor/status-bar": "^4.1.0", "@capacitor/toast": "^4.1.0", - "@ionic/angular": "^6.3.7", + "@ionic/angular": "^6.3.9", "@ionic/storage": "^3.0.6", "@ionic/storage-angular": "^3.0.6", "@ng-bootstrap/ng-bootstrap": "^13.1.1", @@ -84,7 +83,7 @@ "@angular/cli": "^14.2.10", "@angular/compiler": "^14.2.3", "@angular/compiler-cli": "^14.2.3", - "@angular/language-service": "^14.2.11", + "@angular/language-service": "^14.2.12", "@capacitor/cli": "^4.5.0", "@ionic/angular-toolkit": "^6.1.0", "@ionic/cli": "6.20.1", diff --git a/src/app/pages/history/history.page.ts b/src/app/pages/history/history.page.ts index 5ed56ca..4e580c8 100644 --- a/src/app/pages/history/history.page.ts +++ b/src/app/pages/history/history.page.ts @@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { AlertController, IonItemSliding, LoadingController, ModalController, PopoverController, ToastController } from '@ionic/angular'; import { EnvService } from 'src/app/services/env.service'; import { format, Locale } from 'date-fns'; -import { de, enUS, fr, it, zhCN, zhHK } from 'date-fns/locale'; +import { de, enUS, fr, it, ru, zhCN, zhHK } from 'date-fns/locale'; import { ScanRecord } from 'src/app/models/scan-record'; import { TranslateService } from '@ngx-translate/core'; import { Bookmark } from 'src/app/models/bookmark'; @@ -138,6 +138,9 @@ export class HistoryPage { case "it": locale = it; break; + case "ru": + locale = ru; + break; case "zh-CN": locale = zhCN; break; diff --git a/src/app/pages/landing/landing.page.ts b/src/app/pages/landing/landing.page.ts index 9785c56..8742333 100644 --- a/src/app/pages/landing/landing.page.ts +++ b/src/app/pages/landing/landing.page.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; +import { Preferences } from '@capacitor/preferences'; import { AlertController, IonRouterOutlet, Platform } from '@ionic/angular'; import { TranslateService } from '@ngx-translate/core'; import { EnvService } from 'src/app/services/env.service'; @@ -50,26 +51,45 @@ export class LandingPage { } async confirmExitApp(): Promise { - const alert = await this.alertController.create({ - header: this.translate.instant('EXIT_APP'), - message: this.translate.instant('MSG.EXIT_APP'), - cssClass: ['alert-bg'], - buttons: [ - { - text: this.translate.instant('EXIT'), - handler: () => { - navigator['app'].exitApp(); + if (this.env.showExitAppAlert == "on") { + const alert = await this.alertController.create({ + header: this.translate.instant('EXIT_APP'), + message: this.translate.instant('MSG.EXIT_APP'), + inputs: [ + { + type: "checkbox", + label: this.translate.instant("MSG.TUTORIAL_NOT_SHOW_AGAIN"), + checked: false, + handler: async (result) => { + if (result.checked) { + this.env.showExitAppAlert = "off"; + } else { + this.env.showExitAppAlert = "on"; + } + await Preferences.set({ key: this.env.KEY_SHOW_EXIT_APP_ALERT, value: this.env.showExitAppAlert }); + } } - }, - { - text: this.translate.instant('RATE_THE_APP'), - handler: () => { - this.openGooglePlay(); + ], + cssClass: ['alert-bg', 'alert-input-no-border'], + buttons: [ + { + text: this.translate.instant('EXIT'), + handler: () => { + navigator['app'].exitApp(); + } + }, + { + text: this.translate.instant('RATE_THE_APP'), + handler: () => { + this.openGooglePlay(); + } } - } - ] - }); - await alert.present(); + ] + }); + await alert.present(); + } else { + navigator['app'].exitApp(); + } } } diff --git a/src/app/pages/result/result.page.html b/src/app/pages/result/result.page.html index ed5a9ba..2bb842a 100644 --- a/src/app/pages/result/result.page.html +++ b/src/app/pages/result/result.page.html @@ -106,19 +106,22 @@ [ngStyle]="env.colorTheme === 'dark'? {'background-color': '#222428'} : (env.colorTheme === 'black'? {'background-color': '#000000'} : {'background-color': '#F0F0F0'})"> - + - + - + @@ -170,52 +173,68 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
- + + {{ 'SAVE' | translate }} + + Facts diff --git a/src/app/pages/result/result.page.ts b/src/app/pages/result/result.page.ts index 621d552..b7d55c8 100644 --- a/src/app/pages/result/result.page.ts +++ b/src/app/pages/result/result.page.ts @@ -54,6 +54,8 @@ export class ResultPage { showQrFirst: boolean = false; + resultSaved: boolean = false; + @ViewChildren(MatFormField) formFields: QueryList; constructor( @@ -104,6 +106,14 @@ export class ResultPage { this.reset(); } + async saveRecord() { + if (this.qrCodeContent != null && this.qrCodeContent != "") { + await this.env.saveScanRecord(this.qrCodeContent); + } + this.resultSaved = true; + this.presentToast(this.translate.instant("SAVED"), "short", "bottom"); + } + reset() { this.contentType = "freeText"; delete this.qrCodeContent; @@ -125,6 +135,7 @@ export class ResultPage { this.base64DecodedText = ""; this.bookmarked = false; this.showQrFirst = false; + this.resultSaved = false; delete this.env.recordSource; delete this.env.detailedRecordSource; delete this.env.viewResultFrom; diff --git a/src/app/pages/setting-language/setting-language.page.html b/src/app/pages/setting-language/setting-language.page.html index 5f150a2..848d3bd 100644 --- a/src/app/pages/setting-language/setting-language.page.html +++ b/src/app/pages/setting-language/setting-language.page.html @@ -19,8 +19,7 @@

- + @@ -31,8 +30,7 @@

- +
@@ -43,8 +41,7 @@

- +
@@ -55,8 +52,7 @@

- +
@@ -67,8 +63,18 @@

- + + +
+ + +

+ + Русский (ru) + +

+
+
@@ -79,8 +85,7 @@

- +
@@ -91,8 +96,7 @@

- +
diff --git a/src/app/pages/setting-record/setting-record.page.ts b/src/app/pages/setting-record/setting-record.page.ts index 5b7afee..b9ca1d8 100644 --- a/src/app/pages/setting-record/setting-record.page.ts +++ b/src/app/pages/setting-record/setting-record.page.ts @@ -13,7 +13,7 @@ import { Bookmark } from 'src/app/models/bookmark'; import { SocialSharing } from '@awesome-cordova-plugins/social-sharing/ngx'; import { Haptics, ImpactStyle } from '@capacitor/haptics'; import { Preferences } from '@capacitor/preferences'; -import { de, enUS, fr, it, zhCN, zhHK } from 'date-fns/locale'; +import { de, enUS, fr, it, ru, zhCN, zhHK } from 'date-fns/locale'; @Component({ selector: 'app-setting-record', @@ -316,6 +316,9 @@ export class SettingRecordPage { case "it": rawCsvData = "ID,Contenuto,Creato a,Fonte,Tipo di codice a barre,Aggiunto ai preferiti?,Etichetta\r\n"; break; + case "ru": + rawCsvData = "ID,Содержание,Создано в,Источник,Тип штрих-кода,В закладках?,Ярлык\r\n"; + break; case "zh-CN": rawCsvData = "ID,内容,建立于,来源,条码类型,已书签?,标签\r\n"; break; @@ -471,6 +474,9 @@ export class SettingRecordPage { case "it": locale = it; break; + case "ru": + locale = ru; + break; case "zh-CN": locale = zhCN; break; @@ -501,6 +507,9 @@ export class SettingRecordPage { case "it": locale = it; break; + case "ru": + locale = ru; + break; case "zh-CN": locale = zhCN; break; diff --git a/src/app/pages/setting/setting.page.html b/src/app/pages/setting/setting.page.html index 7768845..48a8c9f 100644 --- a/src/app/pages/setting/setting.page.html +++ b/src/app/pages/setting/setting.page.html @@ -134,7 +134,29 @@ + (click)="rateAndroidApp()"> + + +

+ + {{ 'RATE_THE_APP' | translate }} + +

+
+
+ + + +

+ + {{ 'RATE_THE_APP' | translate }} + +

+
+
+

diff --git a/src/app/pages/setting/setting.page.ts b/src/app/pages/setting/setting.page.ts index 408364c..5b3cb0a 100644 --- a/src/app/pages/setting/setting.page.ts +++ b/src/app/pages/setting/setting.page.ts @@ -28,10 +28,22 @@ export class SettingPage { await SplashScreen.hide() } + get isIos(): boolean { + return this.platform.is('ios'); + } + get isAndroid(): boolean { return this.platform.is('android'); } + rateAndroidApp() { + window.open(this.env.GOOGLE_PLAY_URL, '_system'); + } + + rateIosApp() { + window.open(this.env.APP_STORE_URL, '_system'); + } + setLanguage() { this.router.navigate(['setting-language']); } @@ -127,27 +139,8 @@ export class SettingPage { alert.present(); } - async confirmExitApp(): Promise { - const alert = await this.alertController.create({ - header: this.translate.instant('EXIT_APP'), - message: this.translate.instant('MSG.EXIT_APP'), - cssClass: ['alert-bg'], - buttons: [ - { - text: this.translate.instant('EXIT'), - handler: () => { - navigator['app'].exitApp(); - } - }, - { - text: this.translate.instant('RATE_THE_APP'), - handler: () => { - this.openGooglePlay(); - } - } - ] - }); - await alert.present(); + exitApp() { + navigator['app'].exitApp(); } openGooglePlay(): void { diff --git a/src/app/services/env.service.ts b/src/app/services/env.service.ts index 3299e32..a9dfa9a 100644 --- a/src/app/services/env.service.ts +++ b/src/app/services/env.service.ts @@ -15,7 +15,7 @@ import { v4 as uuidv4 } from 'uuid'; import { Preferences } from '@capacitor/preferences'; import { Observable } from 'rxjs'; -export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | 'zh-CN' | 'zh-HK'; +export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | 'ru' | 'zh-CN' | 'zh-HK'; export declare type TabPageType = "/tabs/scan" | "/tabs/generate" | "/tabs/import-image" | "/tabs/history" | "/tabs/setting"; export declare type HistoryPageSegmentType = 'history' | 'bookmarks'; export declare type OnOffType = "on" | "off"; @@ -31,7 +31,7 @@ export declare type ResultPageButtonsType = 'detailed' | 'icon-only'; }) export class EnvService { - public appVersionNumber: string = '3.2.0'; + public appVersionNumber: string = '3.3.0'; public startPage: TabPageType = "/tabs/scan"; public historyPageStartSegment: HistoryPageSegmentType = 'history'; @@ -75,6 +75,7 @@ export class EnvService { public showSendMessageButton: OnOffType = 'on'; public showSendEmailButton: OnOffType = 'on'; public showOpenFoodFactsButton: OnOffType = 'on'; + public showExitAppAlert: OnOffType = "on"; public debugMode: OnOffType = 'off'; public autoExitAppMin: 1 | 3 | 5 | -1 = -1; @@ -86,6 +87,7 @@ export class EnvService { public readonly KEY_LANGUAGE = "language"; public readonly KEY_COLOR = "color"; public readonly KEY_DEBUG_MODE = "debug-mode-on"; + public readonly KEY_SHOW_EXIT_APP_ALERT = "showExitAppAlert"; public readonly KEY_ORIENTATION = "orientation"; public readonly KEY_SCAN_RECORD_LOGGING = "scan-record-logging"; public readonly KEY_RECORDS_LIMIT = "recordsLimit"; @@ -121,10 +123,10 @@ export class EnvService { public readonly KEY_SHOW_OPEN_FOOD_FACTS_BUTTON = "showOpenFoodFactsButton"; public readonly KEY_AUTO_EXIT_MIN = "autoExitAppMin"; - public readonly KEY_ANDROID_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30200"; - public readonly KEY_IOS_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30200"; - public readonly KEY_ANDROID_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30100"; - public readonly KEY_IOS_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30100"; + public readonly KEY_ANDROID_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30300"; + public readonly KEY_IOS_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30300"; + public readonly KEY_ANDROID_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30200"; + public readonly KEY_IOS_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30200"; public readonly APP_FOLDER_NAME: string = 'SimpleQR'; @@ -852,6 +854,15 @@ export class EnvService { await this.toggleColorTheme(); } ); + await Preferences.get({ key: this.KEY_SHOW_EXIT_APP_ALERT }).then( + async result => { + if (result.value != null) { + this.showExitAppAlert = result.value as OnOffType; + } else { + this.showExitAppAlert = 'on'; + } + } + ); await Preferences.get({ key: this.KEY_DEBUG_MODE }).then( async result => { if (result.value != null) { @@ -1216,6 +1227,7 @@ export class EnvService { this.showOpenFoodFactsButton = 'on'; this.scanRecords = []; this.bookmarks = []; + this.showExitAppAlert = 'on'; this.debugMode = 'off'; this.autoExitAppMin = -1; } @@ -1349,6 +1361,9 @@ export class EnvService { this.showOpenFoodFactsButton = 'on'; await Preferences.set({ key: this.KEY_SHOW_OPEN_FOOD_FACTS_BUTTON, value: this.showOpenFoodFactsButton }); + this.showExitAppAlert = 'on'; + await Preferences.set({ key: this.KEY_SHOW_EXIT_APP_ALERT, value: this.showExitAppAlert }); + this.debugMode = 'off'; await Preferences.set({ key: this.KEY_DEBUG_MODE, value: this.debugMode }); @@ -1600,6 +1615,9 @@ export class EnvService { case "it": language = "it" break; + case "ru": + language = "ru" + break; case "zh": if (browserCultureLang == 'zh-CN' || browserCultureLang == 'zh-SG') { language = 'zh-CN'; diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 0876045..2ee1022 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -165,6 +165,8 @@ "RESET_DEFAULT": "Standard zurücksetzen", "RESTORE": "Wiederherstellen", "RESULT": "Ergebnis", + "SAVE": "Speichern", + "SAVED": "Gespeichert", "SCAN": "Scannen", "SCANNED": "Gescannt", "SCANNING_FEEDBACK_ONLY": "Nur Feedback scannen", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index ef07b3a..6d96311 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -165,6 +165,8 @@ "RESET_DEFAULT": "Reset Default", "RESTORE": "Restore", "RESULT": "Result", + "SAVE": "Save", + "SAVED": "Saved", "SCAN": "Scan", "SCANNED": "Scanned", "SCANNING_FEEDBACK_ONLY": "Scanning Feedback Only", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 41d0856..2dc6b70 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -165,6 +165,8 @@ "RESET_DEFAULT": "Réinitialiser par défaut", "RESTORE": "Restaurer", "RESULT": "Résultat", + "SAVE": "Enregistrer", + "SAVED": "Enregistrée", "SCAN": "Scanner", "SCANNED": "Scanné", "SCANNING_FEEDBACK_ONLY": "Vibrer lors de la numérisation uniquement", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index c8aa586..408b71e 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -165,6 +165,8 @@ "RESET_DEFAULT": "Ripristina predefinito", "RESTORE": "Ripristina", "RESULT": "Risultato", + "SAVE": "Salva", + "SAVED": "Salvato", "SCAN": "Scannerizza", "SCANNED": "Scannerizzato", "SCANNING_FEEDBACK_ONLY": "Scansione esclusivamente del feedback", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json new file mode 100644 index 0000000..025bee2 --- /dev/null +++ b/src/assets/i18n/ru.json @@ -0,0 +1,316 @@ +{ + "100_RECORDS": "100 записей", + "30_RECORDS": "30 записей", + "49_DIGIT": "49-значный", + "50_RECORDS": "50 записей", + "ABOUT": "О приложении", + "ABOUT_SIMPLE_QR": "О Simple QR", + "ADD": "Добавить", + "ADD_BCC": "Добавить BCC", + "ADD_CC": "Добавить CC", + "ADD_CONTACT": "Добавить контакт", + "ADD_RECIPIENT": "Добавить получателя", + "APP": "Приложение", + "APPEARANCE_AND_EFFECTS": "Внешний вид и эффекты", + "APP_INITIAL_PAGE": "Стартовая страница", + "APP_VERSION": "Версия приложения", + "AT": "в", + "AT_LEAST_1_MINUTE_LATER": "Как минимум через минуту", + "AT_LEAST_3_MINUTES_LATER": "Как минимум через 3 минуты", + "AT_LEAST_5_MINUTES_LATER": "Как минимум через 5 минут", + "AUTO_KILL_BACKGROUND": "Фоновая активность", + "AUTO_LOGGING": "Автоматическое добавление в историю", + "AUTO_MAX_BRIGHTNESS": "Максимальная яркость", + "AUTO_QR_CODE_POPUP": "Показывать QR-Код", + "BACKGROUND_COLOR": "Цвет фона", + "BACKING_UP": "Сохранение резервной копии", + "BACKUP": "Резервное копирование", + "BASE64": "Base64", + "BASE64_DECODED": "Декодировано из Base64", + "BASE64_ENCODED": "Закодировано в Base64", + "BCC": "BCC", + "BLACK": "Черная", + "BOOKMARK": "Закладки", + "BOOKMARKED": "Добавлено в закладки", + "BOOKMARKED_TEXTS": "Сохраненные тексты", + "BOOKMARKS": "Закладки", + "BROWSE": "Просмотреть", + "BROWSER": "Браузер", + "BROWSE_WEBSITE": "Посетить веб-сайт", + "CALL": "Позвонить", + "CANCEL": "Отмена", + "CC": "CC", + "CITY": "Город", + "CLEAR": "Очистить", + "CLOSE": "Закрыть", + "COLOR": "Цвет", + "COLOR_THEME": "Тема", + "COMING_SOON": "Скоро...", + "CONTACT_METHOD": "Метод связи", + "CONTACT_NAME": "Имя контакта", + "CONTENT": "Содержание", + "CONTENT_TYPE": "Тип содержания", + "COPIED": "Скопировано", + "COPY": "Скопировать", + "COPY_SECRET_AND_SAVE_BACKUP": "Скопировать ключ и сохранить резервную копию", + "COPY_TEXT": "Скопировать текст", + "COUNTRY": "Страна", + "CREATE": "Создать", + "CREATED": "Создано", + "CREATE_QR_CODE": "Создать QR-Код", + "DARK": "Тёмная", + "DATE_OF_BIRTH": "Дата рождения", + "DEBUG_MODE": "Режим отладки", + "DECODING": "Декодирование", + "DECRYPTING": "Расшифровка", + "DETAILED": "Подробнее", + "DONE": "Готово", + "DUCK_DUCK_GO": "DuckDuckGo", + "ECOSIA": "Ecosia", + "EDIT": "Редактировать", + "EMAIL_ADDRESS": "Адрес электронной почты", + "EMAIL_BODY": "Содержание электронного письма", + "EMAIL_NTT_DOCOMO": "Электронное письмо (NTT Docomo)", + "EMAIL_RECIPIENT": "Получатель", + "EMAIL_SUBJECT": "Тема", + "EMAIL_TO": "Отправить по электронной почте", + "EMAIL_W3C_STANDARD": "Электронное письмо (стандарт W3C)", + "ENCRYPTING": "Шифрование", + "ERROR_CORRECTION_LEVEL": "Уровень коррекции ошибок", + "EXIT": "Выйти", + "EXIT_APP": "Выйти из приложения", + "EXPORT": "Экспорт", + "EXPORTING": "Экспортирование", + "EXPORT_TO_CSV": "Экспортировать в CSV", + "FAX_NUMBER": "Номер Fax", + "FEMALE": "Женский", + "FIRST_NAME": "Имя", + "FOLLOW_SYSTEM_SETTINGS": "Как в системе", + "FREE_TEXT": "Текст", + "FULL_RESET": "Полный сброс", + "FUNCTIONS": "Функции", + "GENDER": "Пол", + "GOOGLE_SEARCH": "Google Search", + "HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик", + "HIDDEN_NETWORK_?": "Скрытая сеть?", + "HOME_ADDRESS": "Домашний адрес", + "HOME_PHONE_NUMBER": "Номер домашнего телефона", + "ICON_ONLY": "Только иконка", + "IMPORT": "Импорт", + "IMPORT_FROM_CSV": "Импортировать из CSV", + "IMPORT_IMAGE": "Импорт изображения", + "INITIAL_SEGMENT": "Стартовая страница", + "JOB_TITLE": "Должность", + "LANGUAGE": "Язык", + "LAST_NAME": "Фамилия", + "LEVEL_H": "Уровень H", + "LEVEL_L": "Уровень L", + "LEVEL_M": "Уровень M", + "LEVEL_Q": "Уровень Q", + "LIGHT": "Светлая", + "LOADING_DATA": "Загрузка информации", + "LOCK_LANDSCAPE": "Альбомная", + "LOCK_PORTRAIT": "Портретная", + "LOG": "История", + "LOG_BACKUP_AND_RESTORE": "История и восстановление", + "MALE": "Мужской", + "MANAGE_RECORDS": "Управление записями", + "MARGIN": "Отступ", + "MESSAGE": "Сообщение", + "MESSAGE_CONTENT": "Содержание сообщения", + "MICROSOFT_BING": "Microsoft Bing", + "MOBILE_PHONE_NUMBER": "Номер мобильного телефона", + "MORE": "Подробнее", + "NAME": "Имя", + "NO": "Нет", + "NONE": "None", + "NOT_AVAILABLE": "Нет доступа", + "NOT_PROVIDED": "Не предоставлено", + "NOT_TO_DISCLOSE": "Не указан", + "NO_LIMIT": "Нет ограничений", + "NUMBER_OF_RECORDS": "Количество записей", + "OK": "ОК", + "ONLY_DELETE_DATA": "Только удалить информацию", + "ONLY_RESET_SETTING": "Только сбросить настройки", + "OPEN": "Открыть", + "OPEN_URL": "Открыть URL", + "OPEN_WITH_...": "Открыть с помощью...", + "OPTIMIZING_DATA_...": "Оптимизация информации...", + "ORGANIZATION": "Организация", + "ORIGINAL": "Оригинал", + "OTHERS": "Другое", + "PASSWORD": "Пароль", + "PATCH_NOTES": "Нововведения", + "PERMISSION_REQUIRED": "Необходимо разрешение", + "PERSONAL": "Персональные данные", + "PHONE_NO": "Номер телефона", + "PHONE_NUMBER": "Номер телефона", + "PLEASE_WAIT": "Пожалуйста, подождите", + "POSTAL_CODE": "Почтовый индекс", + "PREPARING": "Подготовка", + "PREVIEW": "Предпросмотр", + "PRIVACY_POLICY": "Политика конфиденциальности", + "QR_CODE": "QR-Код", + "QR_CODE_AND_DECODED_RESULT": "QR-Код и результат", + "QR_CODE_CONTENT": "Содержание QR-Кода", + "QR_CODE_STYLE": "Стиль QR-Кода", + "RATE_THE_APP": "Оценить приложение", + "RECORDS_LIMIT": "Ограничение количества записей", + "REMOVE_ALL": "Удалить все", + "REMOVE_BCC": "Убрать BCC", + "REMOVE_CC": "Убрать CC", + "REMOVE_RECIPIENT": "Убрать получателя", + "REPORT_ISSUE": "Сообщить о проблеме", + "RESET_APP": "Сброс приложения", + "RESET_DEFAULT": "Настройки по умолчанию", + "RESTORE": "Восстановление", + "RESULT": "Результат", + "SAVE": "Сохранять", + "SAVED": "Сохранено", + "SCAN": "Сканировать", + "SCANNED": "Просканировано", + "SCANNING_FEEDBACK_ONLY": "Только отклик сканирования", + "SCAN_BY_CAMERA": "Сканирование с помощью камеры", + "SCREEN_ORIENTATION": "Ориентация экрана", + "SEARCH": "Поиск", + "SEARCH_ENGINE": "Поисковая система", + "SECRET": "Ключ", + "SEND": "Отправить", + "SEND_EMAIL": "Отправить электронное письмо", + "SEND_MESSAGE": "Отправить сообщение", + "SETTING": "Настройки", + "SETTINGS": "Настройки", + "SHARE": "Поделиться", + "SHARING": "Отправка", + "SHOW": "Показать", + "SHOW_NUMBER_OR_RECORDS": "Показывать количество записей", + "SHOW_QR_CODE": "Показать QR-Код", + "SIMPLE_QR": "Simple QR", + "STATE": "Округ", + "STREET": "Улица", + "SUCCESS": "Успешно", + "SUPPORTED_BARCODE_TYPE": "Поддерживаемые операции", + "SUPPORTED_TYPE": "Поддерживаемые операции", + "SYSTEM_DEFAULT": "Как в системе", + "TASK": "Задача", + "TASK_BUTTON_LAYOUT": "Кнопки действия", + "TURN_OFF": "Выключить", + "TURN_ON": "Включить", + "TURNED_OFF": "Выключено", + "TURNED_ON": "Включено", + "TUTORIAL": "Обучение", + "UNDO": "Отменить", + "UNKNOWN": "Неизвестно", + "UPDATE_SUCCESSFULLY": "Успешно обновлено", + "URL": "URL", + "VCARD_CONTACT": "Контакт vCard", + "VERSION_VERSION": "Версия {version}", + "VIBRATION": "Вибрация", + "VIEWED": "Просмотрено", + "VIEW_BOOKMARK": "Просмотр закладки", + "VIEW_GITHUB": "Посетить GitHub", + "VIEW_LOG": "Просмотр истории", + "VIEW_STORE_AND_SOURCE_CODE": "Посетить магазин и репозиторий с исходным кодом ", + "VIEW_INSTRUCTIONS": "Посмотреть обучение", + "WEBSITE": "Веб-сайт", + "WIFI": "WiFi", + "WIFI_ENCRYPTION": "Шифрование WiFi", + "WIFI_SSID": "WiFi SSID", + "WORK": "Место работы", + "WORK_PHONE_NUMBER": "Номер рабочего телефона", + "YAHOO_SEARCH": "Yahoo! Search", + "YANDEX": "Yandex", + "YES": "Да", + "MSG": { + "ALREADY_BOOKMARKED": "Ошибка! Уже добавлено в закладки ранее", + "AUTO_KILL_BACKGROUND_EXPLAIN": "

Чтобы использовать меньше системных ресурсов и батареи, выставьте количество времени, спустя которое приложение будет автоматически остановлено, если оно работает в фоне.


Если вы выберете опцию Как в системе, фоновая активность приложения будет полностью контролироваться системой, приложение не будет приостанавливать свою работу самостоятельно.


Заметьте, что в некоторых ситуациях система может останавливать приложение заблаговременно.

", + "AUTO_LOGGING_EXPLAIN": "Содержание каждого QR-Кода и Бар-Кода автоматически сохраняется после сканирования. Вы можете повторно обращаться к этим записям в разделе Истории.", + "AUTO_MAX_BRIGHTNESS_EXPLAIN": "Автоматически увеличивать яркость экрана до максимального значения во время просмотра QR-Кода.", + "AUTO_SHOW_QR_EXPLAIN": "Автоматически показывать QR-Код на странице результата после этих действий.", + "BACKUP_EXPLAIN": "Вы можете создать локальную резервную копию всех записей истории и закладок. Вам будет выдан набор ключей после резервного копирования. Сохраняйте эти ключи, иначе вы не сможете восстановить созданную резервную копию. Заметьте, что Simple QR не поддерживает резервное копирование между разными платформами.", + "BACKUP_FAILED": "Не удалось создать резервную копию", + "BACKUP_FAILED_2": "Не удалось создать резервную копию. Пожалуйста, убедитесь, что приложению выдано разрешение на взаимодействие с файлами.", + "BACKUP_SUCCESSFULLY": "

Резервное копирование успешно завершено. Пожалуйста, сохраните файл резервной копии и следующий ключ

{secret}

", + "BARCODE_TYPE": "Сканирование
  • QR-Код
  • Бар-Код
  • Код Aztec
  • Data Matrix
  • PDF417
Импорт изображения
  • QR-Код
Создание
  • QR-Код
", + "BOOKMARKED": "Успешно добавлено в закладки", + "BUTTON_DISPLAY_EXPLAIN": "Показать или скрыть кнопки действий.", + "BUTTON_STYLE_EXPLAIN": "Выберите стиль кнопок действий.", + "CAMERA_PERMISSION": "Чтобы приложение могло осуществлять сканирование, предоставьте доступ к Камере.", + "CONTACT_PERMISSION": "Для сохранения контакта, необходимо предоставить доступ к Контактам.", + "COPIED_SECRET": "Ключ скопирован", + "COPY_TEXT": "Какую часть контента вы бы хотели скопировать?", + "CREATE_QRCODE_MAX_LENGTH": "Максимум 1817 символов", + "CREATE_QRCODE_MAX_LENGTH_EXPLAIN": "Длина содержания сгенерированного QR-Кода не должна превышать 1817 символов.", + "DEBUG_MODE_ON": "Режим Отладки успешно активирован", + "DELETE_OVERFLOWED_RECORDS": "После того, как вы покинете эту страницу, лишние записи будут безвозвратно удалены.", + "EMAIL_MAX_LENGTH": "Максимум 254 символа", + "EMAIL_SUBJECT_MAX_LENGTH": "Максимум 78 символов", + "ERROR_CORRECTION_LEVEL_EXPLAIN": "

В структуру QR-Кодов заложена способность восстановления информации, даже если Код поврежден.

Существует 4 уровня такой защиты:

Уровень L восстанавливает 7% байт информации.

Уровень M восстанавливает 15% байт информации.

Уровень Q восстанавливает 25% байт информации.

Уровень H восстанавливает 30% байт информации.


Заметьте, что увеличение уровня защиты может увеличить вероятность восстановления информации, но также увеличивает размер QR-Кода. Поэтому, при обычных условиях рекомендуем использовать уровень M.

", + "EXIT_APP": "

Уверены, что хотите покинуть приложение?

Если вам нравится Simple QR, пожалуйста, оцените его в магазине приложений.

", + "EXPORT_TO_CSV_EXPLAIN": "Вы можете экспортировать все записи истории и закладки в CSV файл.", + "FAILED_SAVING_CONTACT": "Не удалось сохранить контакт", + "FAIL_PREPARE_SMS": "Не удалось отправить сообщение", + "IMPORT_FAILED": "Не удалось импортировать", + "IMPORT_FROM_CSV_EXPLAIN": "Вы можете импортировать записи истории и закладки из CSV файла в формате, заданном Simple QR. Если вы желаете переместить информацию между Android и iOS, воспользуйтесь этой функцией.", + "INPUT_TAG": "Пожалуйста, дайте закладке имя", + "INVALID_BK_FILE": "Это несовместимый файл резервной копии.", + "INVALID_CSV_FILE": "Это несовместимый CSV файл.", + "NOT_BASE64_DE": "Невозможно декодировать информацию из Base64", + "NOT_BASE64_EN": "Невозможно закодировать информацию в Base64", + "NOT_BASE64_EN_DE": "Невозможно закодировать или декодировать информацию Base64", + "NO_QR_CODE": "Не удалось распознать QR-Код", + "ONLY_VCARD_3_0": "Поддерживается только формат vCard 3.0", + "PLEASE_INPUT_VALID_SECRET": "Пожалуйста, введите правильный ключ", + "PORTRAIT_ONLY": "Портретная", + "PREPARE_SMS": "Подготовка сообщения", + "PREVIOUS_RECORDS": "Записи предыдущих действий: сканирования, создания или просмотра", + "QR_CODE_VALUE_NOT_EMPTY": "Содержание QR-Кода не может быть пустым", + "READ_IMAGE_PERMISSION": "Необходимо предоставить разрешение взаимодействовать с файлами, чтобы просканировать изображение.", + "RECORDS_LIMIT_EXPLAIN": "Укажите максимальное количество записей истории. Старые записи будут автоматически удалены при достижении указанного лимита.", + "REMOVE_ALL_BOOKMARKS": "Уверены, что хотите безвозвратно удалить все закладки?", + "REMOVE_ALL_RECORD": "Уверены, что хотите безвозвратно удалить все записи истории?", + "RESET_APP": "Уверены, что хотите вернуться к настройкам по умолчанию и удалить все данные приложения? Это действие необратимо.", + "RESET_DEFAULT": "Уверены, что хотите вернуться к настройкам по умолчанию?", + "RESTORE_EXPLAIN": "Вы можете восстановить закладки и записи истории из резервной копии. Полученные данные будут совмещены с текущими данными приложения. Файл резервной копии должен иметь тип TFSQBK.", + "RESTORE_EXPLAIN_IOS": "Вы можете восстановить закладки и записи истории из резервной копии. Полученные данные будут совмещены с текущими данными приложения. Файл резервной копии должен иметь тип ISQBK.", + "RESTORE_FAILED": "Не удалось восстановить", + "RESTORE_SECRET": "Пожалуйста, введите ключ для восстановления данных", + "RESTORE_SUCCESSFUL": "Восстановление успешно завершено", + "RESTORE_WRONG_SECRET": "Неверный ключ", + "SAVED_CONTACT": "Контакт сохранен", + "SAVING_CONTACT": "Идет сохранение контакта", + "SCAN_QR_FROM_IMAGE": "Simple QR использует модуль \"cozmo/jsQR\", чтобы сканировать QR-Код из изображение. Чтобы успешно осуществить сканирование", + "SCAN_QR_FROM_IMAGE_R1": "Дайте приложению разрешение на доступ к Памяти устройства или Фото на нем.", + "SCAN_QR_FROM_IMAGE_R2": "Убедитесь, что фон изображения не прозрачный. Не рекомендовано использовать изображение, полученные не при помощи камеры.", + "SCAN_QR_FROM_IMAGE_R3": "Отмените редактирование фото, если вы хотите просканировать изображение целиком (по ситуации).", + "SEARCH": "Что конкретно вы хотите найти?", + "SEARCH_ENGINE_EXPLAIN": "Выберите поисковую систему для осуществления поиска после получения результата.", + "SHARE_QR": "Скорее сканируй!\n\nОтправлено при помощи Simple QR", + "SMS_MAX_LENGTH": "Максимум 160 символов", + "SSID_MAX_LENGTH": "Максимум 32 символа", + "START_PAGE_EXPLAIN": "Выберете стартовую страницу приложения.", + "START_PAGE_HEADER_EXPLAIN": "Показывать заголовок Simple QR на стартовой странице.", + "TAG_MAX_LENGTH": "Максимум 30 символов", + "TAG_MAX_LENGTH_EXPLAIN": "Длина имени не должна превышать 30 символов..", + "TUTORIAL_NOT_SHOW_AGAIN": "Не показывать снова", + "TUTORIAL_SWIPE_LEFT": "Смахните влево, чтобы удалить соответствующую запись.", + "TUTORIAL_SWIPE_RIGHT": "Смахните вправо, чтобы добавить текст соответствующей записи в закладки / редактировать имя соответствующей закладки.", + "UNDO_DELETE": "Вы можете отменить удаление", + "VIBRATION_EXPLAIN": "Использовать вибрацию или тактильный отклик. Заметьте, что не все устройства поддерживают эту функцию." + }, + "BARCODE_TYPE": { + "1D": "Бар-Код ", + "AZTEC": "Код Aztec ", + "DATA_MATRIX": "Data Matrix ", + "EAN": "European Article Number ", + "MAXICODE": "MaxiCode ", + "PDF_417": "PDF417 ", + "QR_CODE": "QR-Код ", + "RSS": "GS1 DataBar ", + "UPC": "Universal Product Code " + }, + "UPDATE": { + "UPDATE_NOTES_ANDROID": "

В этом релизе вас ждет несколько обновлений и новых функций. Посетите GitHub проекта, чтобы узнать детали.

", + "UPDATE_NOTES_IOS": "

В этом релизе вас ждет несколько обновлений и новых функций. Посетите GitHub проекта, чтобы узнать детали.

" + } +} \ No newline at end of file diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json index d60be36..9887a12 100644 --- a/src/assets/i18n/zh-CN.json +++ b/src/assets/i18n/zh-CN.json @@ -165,6 +165,8 @@ "RESET_DEFAULT": "还原预设值", "RESTORE": "还原", "RESULT": "结果", + "SAVE": "储存", + "SAVED": "已储存", "SCAN": "扫描", "SCANNED": "扫描", "SCANNING_FEEDBACK_ONLY": "仅扫描反馈", diff --git a/src/assets/i18n/zh-HK.json b/src/assets/i18n/zh-HK.json index f7e4956..6c0e939 100644 --- a/src/assets/i18n/zh-HK.json +++ b/src/assets/i18n/zh-HK.json @@ -165,6 +165,8 @@ "RESET_DEFAULT": "還原預設值", "RESTORE": "還原", "RESULT": "結果", + "SAVE": "儲存", + "SAVED": "已儲存", "SCAN": "掃描", "SCANNED": "掃描", "SCANNING_FEEDBACK_ONLY": "僅掃描反饋", diff --git a/src/global.scss b/src/global.scss index e755143..d1e7602 100644 --- a/src/global.scss +++ b/src/global.scss @@ -109,6 +109,15 @@ ion-tab-button:not(.tab-selected)::part(native):hover { opacity: 0.5; } +.alert-input-no-border .alert-checkbox-group { + border: 0px !important; +} + +.alert-input-no-border .alert-checkbox-label { + overflow: auto !important; + white-space: pre-line !important; +} + .alert-can-copy { user-select: text !important; }