Merge pull request #77 from tomfong/dev/v4.1

Dev/v4.1
This commit is contained in:
Tom Fong 2024-03-31 02:28:46 +08:00 committed by GitHub
commit 4e436c70ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 4687 additions and 2939 deletions

View file

@ -36,7 +36,7 @@ By using the app, you can
2. Import image files and scan the QR Code on it. 2. Import image files and scan the QR Code on it.
3. Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi. 3. Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email, Wi-Fi and Geolocation.
4. Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable. 4. Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable.
@ -46,11 +46,12 @@ By using the app, you can
* Execute base64 encoding/decoding on it. * Execute base64 encoding/decoding on it.
* Use it as a content to generate a new shareable QR code. * Use it as a content to generate a new shareable QR code.
* Do corresponding tasks if it is a * Do corresponding tasks if it is a
* URL: Browse website * URL: Browse website / Open application
* vCard contact: Add contact * vCard contact: Add contact
* Phone number: Phone call, add contact * Phone number: Phone call, add contact
* Message: Send message, add contact * Message: Send message, add contact
* Email: Send email * Email: Send email
* Geolocation: Open map
6. Customize the generated QR code, e.g. error correction level, color, margin and screen brightness. 6. Customize the generated QR code, e.g. error correction level, color, margin and screen brightness.
@ -63,11 +64,12 @@ By using the app, you can
### Languages Supported ### Languages Supported
* English (en) * English (en)
* Traditional Chinese (Hong Kong) 中文 (香港) (zh-HK) * Chinese (Hong Kong) 中文 (香港) (zh-HK)
* Simplified Chinese 简体中文 (zh-CN) * Chinese (Simplified) 简体中文 (zh-CN)
* German Deutsch (de) * German Deutsch (de)
* French Français (fr) * French Français (fr)
* Italian Italiano (it) * Italian Italiano (it)
* Portuguese (Brazil) (pt-BR)
* Russian Русский (ru) * Russian Русский (ru)
You are welcomed to help translate the app into more languages (refer to this <a href="#how-to-help-translate">section</a>) You are welcomed to help translate the app into more languages (refer to this <a href="#how-to-help-translate">section</a>)
@ -117,24 +119,22 @@ Thank you the following contributors who have made the app better!
| mondstern | [mondlicht-und-sterne](https://github.com/mondlicht-und-sterne) | German language translation | | 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 | | Valentino Bocchetti | [luftmensch-luftmensch](https://github.com/luftmensch-luftmensch) | Italian language translation |
| Smooth-E | [Smooth-E](https://github.com/Smooth-E) | Russian language translation | | Smooth-E | [Smooth-E](https://github.com/Smooth-E) | Russian language translation |
| Daniel Ribeiro | [drcsj](https://github.com/drcsj) | Portuguese (Brazil) language translation |
## Framework ## Framework
```sh ```sh
Ionic CLI : 7.1.1 Ionic CLI : 7.2.0
Ionic Framework : @ionic/angular 7.1.3 Ionic Framework : @ionic/angular 7.8.2
@angular-devkit/build-angular : 16.1.4 @angular-devkit/build-angular : 16.2.13
@angular-devkit/schematics : 16.1.4 @angular-devkit/schematics : 16.2.13
@angular/cli : 16.1.4 @angular/cli : 16.2.13
@ionic/angular-toolkit : 9.0.0 @ionic/angular-toolkit : 9.0.0
Capacitor CLI : 5.2.1 Capacitor CLI : 5.7.4
@capacitor/android : 5.2.1 @capacitor/android : 5.7.4
@capacitor/core : 5.2.1 @capacitor/core : 5.7.4
@capacitor/ios : 5.2.1 @capacitor/ios : 5.7.4
NodeJS : v18.16.1
npm : 9.5.1
``` ```
## Privacy Policy ## Privacy Policy

View file

@ -11,7 +11,7 @@
</map> </map>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View file

@ -7,8 +7,8 @@ android {
applicationId "com.tomfong.simpleqr" applicationId "com.tomfong.simpleqr"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 4000100 versionCode 4010000
versionName "4.0.1" versionName "4.1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions { aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.

View file

@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"attributes": [], "attributes": [],
"versionCode": 4000100, "versionCode": 4010000,
"versionName": "4.0.1", "versionName": "4.1.0",
"outputFile": "app-release.apk" "outputFile": "app-release.apk"
} }
], ],

View file

@ -6,7 +6,7 @@ Mit der App ist das möglich
* QR-Code und andere Barcodes in Sekundenschnelle zu scannen, einschließlich UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode und GS1 DataBar. * QR-Code und andere Barcodes in Sekundenschnelle zu scannen, einschließlich UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode und GS1 DataBar.
* Bilddateien zu importieren und den darauf befindlichen QR-Code zu scannen. * Bilddateien zu importieren und den darauf befindlichen QR-Code zu scannen.
* QR-Codes aus Vorlagen,die Freitext, URL, vCard-Kontakt, Telefonnummer, Nachricht, E-Mail und WLAN enthalten, zu erstellen. * QR-Codes aus Vorlagen,die Freitext, URL, vCard-Kontakt, Telefonnummer, Nachricht, Geolokalisierung, E-Mail und WLAN enthalten, zu erstellen.
* Gescannte Ergebnissen, die gescannt wurden, erstellt oder erneut angezeigt wurden zu protokollieren. Diese protokollierten Aufzeichnungen können für schnellen Zugriff mit einem Lesezeichen versehen und auch gesichert werden. * Gescannte Ergebnissen, die gescannt wurden, erstellt oder erneut angezeigt wurden zu protokollieren. Diese protokollierten Aufzeichnungen können für schnellen Zugriff mit einem Lesezeichen versehen und auch gesichert werden.
* Aufgaben auf dem Ergebnis mit einem Fingertipp zu erledigen, einschließlich, aber nicht beschränkt auf * Aufgaben auf dem Ergebnis mit einem Fingertipp zu erledigen, einschließlich, aber nicht beschränkt auf
* Verwenden als Schlüsselwort für die Websuche. * Verwenden als Schlüsselwort für die Websuche.
@ -19,5 +19,6 @@ Mit der App ist das möglich
* Telefonnummer: Telefonanruf, Kontakt hinzufügen * Telefonnummer: Telefonanruf, Kontakt hinzufügen
* Nachricht: Nachricht senden, Kontakt hinzufügen * Nachricht: Nachricht senden, Kontakt hinzufügen
* E-Mail: E-Mail senden * E-Mail: E-Mail senden
* Geolokalisierung: Karte öffnen
* Passen Sie den generierten QR-Code an, z. Fehlerkorrekturstufe, Farbe, Rand und Bildschirmhelligkeit. * Passen Sie den generierten QR-Code an, z. Fehlerkorrekturstufe, Farbe, Rand und Bildschirmhelligkeit.
* Die App anzupassen, z.B. App-Startseite, Sprache und Farbthema etc. * Die App anzupassen, z.B. App-Startseite, Sprache und Farbthema etc.

View file

@ -0,0 +1,3 @@
* Support geolocation QR code
* Support Portuguese (Brazil) language
* Disable auto URL opening by default

View file

@ -6,7 +6,7 @@ By using the app, you can:
* Scan QR Code and other barcodes in a second, including UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode and GS1 DataBar. * Scan QR Code and other barcodes in a second, including UPC, EAN, Code 39/128, ITF, Codabar, Aztec, Data Matrix, PDF417, MaxiCode and GS1 DataBar.
* Import image files and scan the QR Code on it. * Import image files and scan the QR Code on it.
* Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email and Wi-Fi. * Create QR code from templates, which includes Free Text, URL, vCard Contact, Phone Number, Message, Email, Wi-Fi and Geolocation.
* Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable. * Automatically log results that you scan, create or view again. These logged records can be bookmarked for quick access, and also backupable.
* Do tasks on the result with a tap, including but not limited to * Do tasks on the result with a tap, including but not limited to
* Use it as a keyword to do web search. * Use it as a keyword to do web search.
@ -14,10 +14,11 @@ By using the app, you can:
* Execute base64 encoding/decoding on it. * Execute base64 encoding/decoding on it.
* Generate a new shareable QR code by using it as the content. * Generate a new shareable QR code by using it as the content.
* Do corresponding tasks if it is a * Do corresponding tasks if it is a
* URL: Browse website * URL: Browse website / Open application
* vCard contact: Add contact * vCard contact: Add contact
* Phone number: Phone call, add contact * Phone number: Phone call, add contact
* Message: Send message, add contact * Message: Send message, add contact
* Email: Send email * Email: Send email
* Geolocation: Open map
* Customize the generated QR code, e.g. error correction level, color, margin and screen brightness. * Customize the generated QR code, e.g. error correction level, color, margin and screen brightness.
* Customize the app, e.g. app initial page, language and color theme etc. * Customize the app, e.g. app initial page, language and color theme etc.

View file

@ -399,7 +399,7 @@
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 4.0.1; MARKETING_VERSION = 4.1.0;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr; PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -422,7 +422,7 @@
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 4.0.1; MARKETING_VERSION = 4.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr; PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Simple QR"; PROVISIONING_PROFILE_SPECIFIER = "Simple QR";

View file

@ -1,36 +1,36 @@
PODS: PODS:
- Capacitor (5.2.1): - Capacitor (5.7.4):
- CapacitorCordova - CapacitorCordova
- CapacitorApp (5.0.6): - CapacitorApp (5.0.7):
- Capacitor - Capacitor
- CapacitorCamera (5.0.6): - CapacitorCamera (5.0.9):
- Capacitor - Capacitor
- CapacitorClipboard (5.0.6): - CapacitorClipboard (5.0.7):
- Capacitor - Capacitor
- CapacitorCommunityBarcodeScanner (4.0.1): - CapacitorCommunityBarcodeScanner (4.0.1):
- Capacitor - Capacitor
- CapacitorCommunityContacts (5.0.4): - CapacitorCommunityContacts (5.0.5):
- Capacitor - Capacitor
- CapacitorCommunityScreenBrightness (5.0.0): - CapacitorCommunityScreenBrightness (5.0.0):
- Capacitor - Capacitor
- CapacitorCordova (5.2.1) - CapacitorCordova (5.7.4)
- CapacitorDevice (5.0.6): - CapacitorDevice (5.0.7):
- Capacitor - Capacitor
- CapacitorFilesystem (5.1.0): - CapacitorFilesystem (5.2.1):
- Capacitor - Capacitor
- CapacitorHaptics (5.0.6): - CapacitorHaptics (5.0.7):
- Capacitor - Capacitor
- CapacitorKeyboard (5.0.6): - CapacitorKeyboard (5.0.8):
- Capacitor - Capacitor
- CapacitorPreferences (5.0.6): - CapacitorPreferences (5.0.7):
- Capacitor - Capacitor
- CapacitorSplashScreen (5.0.6): - CapacitorSplashScreen (5.0.7):
- Capacitor - Capacitor
- CapacitorStatusBar (5.0.6): - CapacitorStatusBar (5.0.7):
- Capacitor - Capacitor
- CapacitorToast (5.0.6): - CapacitorToast (5.0.7):
- Capacitor - Capacitor
- CordovaPlugins (5.2.1): - CordovaPlugins (5.7.4):
- CapacitorCordova - CapacitorCordova
DEPENDENCIES: DEPENDENCIES:
@ -89,23 +89,23 @@ EXTERNAL SOURCES:
:path: "../capacitor-cordova-ios-plugins" :path: "../capacitor-cordova-ios-plugins"
SPEC CHECKSUMS: SPEC CHECKSUMS:
Capacitor: 36510199454641113344c2e5ef43bf3f54b5af79 Capacitor: 4fe9adf012caceb4c71ffea2f1f4d005cdcbeea7
CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a CapacitorApp: 17fecd0e6cb23feafac7eb0939417389038b0979
CapacitorCamera: 4a95204d13a05b0b726bf9086b44124349ab1952 CapacitorCamera: 4892c5c392f60039d853dde78bc50ba19fbd113e
CapacitorClipboard: 77edf49827ea21da2a9c05c690a4a6a4d07199c4 CapacitorClipboard: 45e5e25f2271f98712985d422776cdc5a779cca1
CapacitorCommunityBarcodeScanner: 7feb206489c8555a8ca0c74c57ddf49ead774eb8 CapacitorCommunityBarcodeScanner: 7feb206489c8555a8ca0c74c57ddf49ead774eb8
CapacitorCommunityContacts: 45de2477f7dc6265d267677939a2c75465d2ed87 CapacitorCommunityContacts: e8fbc4d669c9478a29f1e104818b4c16e158b2e0
CapacitorCommunityScreenBrightness: b2d9c6fffee6b684994cd69f727f2090e2f05c6d CapacitorCommunityScreenBrightness: b2d9c6fffee6b684994cd69f727f2090e2f05c6d
CapacitorCordova: d173eeb1635e62aa95a20874a5d5cbbf0aa1e0df CapacitorCordova: a6e87fccc0307dee7aec1560ec9398485f2b0ce7
CapacitorDevice: 2c968f98a1ec4d22357418c1521e7ddc46c675e6 CapacitorDevice: fc91bdb484dc0e70755e9b621cd557afe642613a
CapacitorFilesystem: 071f1ea81928a56c62c231f9f48f96983cf0eada CapacitorFilesystem: 9f3e3c7fea2fff12f46dd5b07a2914f2103e4cfc
CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c CapacitorHaptics: 7c7c206f0c96a628fed073830c96d28c4b2e772e
CapacitorKeyboard: b978154b024a5f65e044908e37d15b7de58b9d12 CapacitorKeyboard: aec619a578235c6ce279075009a2689c2cf5c42c
CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10 CapacitorPreferences: 77ac427e98db83bace772455f8ba447430382c4c
CapacitorSplashScreen: 5fa2ab5e46cf5cc530cf16a51c80c7a986579ccd CapacitorSplashScreen: dd3de3f3644710fa2a697cfb91ec262eece4d242
CapacitorStatusBar: 565c0a1ebd79bb40d797606a8992b4a105885309 CapacitorStatusBar: f390fbb49b82ffb754ea4b3cf71dc8b048baf3e7
CapacitorToast: bb0d79b78d9c27c0199b57f735dd50b8fc363489 CapacitorToast: c8bb89eeb59a23c1fc298f138cc06c8ff4d90ac1
CordovaPlugins: b6cca1806c2470c768387b8e3f0d8193fed80787 CordovaPlugins: 5495649167d6829fea7bc7eacd2034646aee5bd1
PODFILE CHECKSUM: dc80e3587547d0d302dad43090af30e2a96d6c5a PODFILE CHECKSUM: dc80e3587547d0d302dad43090af30e2a96d6c5a

6929
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "simple-qr", "name": "simple-qr",
"version": "4.0.1", "version": "4.1.0",
"author": "Tom Fong", "author": "Tom Fong",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
@ -20,48 +20,48 @@
"@angular/cdk": "^16.1.3", "@angular/cdk": "^16.1.3",
"@angular/common": "^16.1.3", "@angular/common": "^16.1.3",
"@angular/core": "^16.1.3", "@angular/core": "^16.1.3",
"@angular/forms": "^16.1.5", "@angular/forms": "^16.2.12",
"@angular/localize": "^16.1.5", "@angular/localize": "^16.2.12",
"@angular/material": "^16.1.3", "@angular/material": "^16.1.3",
"@angular/material-moment-adapter": "^16.1.5", "@angular/material-moment-adapter": "^16.2.14",
"@angular/platform-browser": "^16.1.3", "@angular/platform-browser": "^16.1.3",
"@angular/platform-browser-dynamic": "^16.1.5", "@angular/platform-browser-dynamic": "^16.2.12",
"@angular/router": "^16.1.5", "@angular/router": "^16.2.12",
"@awesome-cordova-plugins/aes-256": "^6.4.0", "@awesome-cordova-plugins/aes-256": "^6.6.0",
"@awesome-cordova-plugins/chooser": "^6.4.0", "@awesome-cordova-plugins/chooser": "^6.6.0",
"@awesome-cordova-plugins/core": "^6.4.0", "@awesome-cordova-plugins/core": "^6.6.0",
"@awesome-cordova-plugins/screen-orientation": "^6.4.0", "@awesome-cordova-plugins/screen-orientation": "^6.6.0",
"@awesome-cordova-plugins/sms": "^6.4.0", "@awesome-cordova-plugins/sms": "^6.6.0",
"@awesome-cordova-plugins/social-sharing": "^6.4.0", "@awesome-cordova-plugins/social-sharing": "^6.6.0",
"@awesome-cordova-plugins/theme-detection": "^6.4.0", "@awesome-cordova-plugins/theme-detection": "^6.6.0",
"@capacitor-community/barcode-scanner": "^4.0.1", "@capacitor-community/barcode-scanner": "^4.0.1",
"@capacitor-community/contacts": "^5.0.4", "@capacitor-community/contacts": "^5.0.5",
"@capacitor-community/screen-brightness": "^5.0.0", "@capacitor-community/screen-brightness": "^5.0.0",
"@capacitor/android": "^5.2.1", "@capacitor/android": "^5.7.4",
"@capacitor/app": "^5.0.6", "@capacitor/app": "^5.0.7",
"@capacitor/camera": "^5.0.6", "@capacitor/camera": "^5.0.9",
"@capacitor/clipboard": "^5.0.6", "@capacitor/clipboard": "^5.0.7",
"@capacitor/core": "^5.2.1", "@capacitor/core": "^5.7.4",
"@capacitor/device": "^5.0.6", "@capacitor/device": "^5.0.7",
"@capacitor/filesystem": "^5.1.0", "@capacitor/filesystem": "^5.2.1",
"@capacitor/haptics": "^5.0.6", "@capacitor/haptics": "^5.0.7",
"@capacitor/ios": "^5.2.1", "@capacitor/ios": "^5.7.4",
"@capacitor/keyboard": "^5.0.6", "@capacitor/keyboard": "^5.0.8",
"@capacitor/preferences": "^5.0.6", "@capacitor/preferences": "^5.0.7",
"@capacitor/splash-screen": "^5.0.6", "@capacitor/splash-screen": "^5.0.7",
"@capacitor/status-bar": "^5.0.6", "@capacitor/status-bar": "^5.0.7",
"@capacitor/toast": "^5.0.6", "@capacitor/toast": "^5.0.7",
"@ionic/angular": "^7.1.3", "@ionic/angular": "^7.8.2",
"@ionic/storage": "^4.0.0", "@ionic/storage": "^4.0.0",
"@ionic/storage-angular": "^4.0.0", "@ionic/storage-angular": "^4.0.0",
"@ng-bootstrap/ng-bootstrap": "^15.1.0", "@ng-bootstrap/ng-bootstrap": "^15.1.2",
"@ngx-translate/core": "^15.0.0", "@ngx-translate/core": "^15.0.0",
"@ngx-translate/http-loader": "^8.0.0", "@ngx-translate/http-loader": "^8.0.0",
"angularx-qrcode": "^16.0.0", "angularx-qrcode": "^16.0.2",
"bootstrap": "^5.3.0", "bootstrap": "^5.3.3",
"cordova-plugin-aes256-encryption": "^2.0.1", "cordova-plugin-aes256-encryption": "^2.0.1",
"cordova-plugin-chooser": "^1.3.2", "cordova-plugin-chooser": "^1.3.2",
"cordova-plugin-screen-orientation": "^3.0.3", "cordova-plugin-screen-orientation": "^3.0.4",
"cordova-plugin-theme-detection": "^1.3.0", "cordova-plugin-theme-detection": "^1.3.0",
"cordova-plugin-x-socialsharing": "^6.0.4", "cordova-plugin-x-socialsharing": "^6.0.4",
"cordova-sms-plugin": "^1.0.3", "cordova-sms-plugin": "^1.0.3",
@ -74,26 +74,26 @@
"properties-parser": "^0.3.1", "properties-parser": "^0.3.1",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"strip-final-newline": "^2.0.0", "strip-final-newline": "^2.0.0",
"tslib": "^2.6.0", "tslib": "^2.6.2",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"zone.js": "^0.13.1" "zone.js": "^0.13.3"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^16.1.4", "@angular-devkit/build-angular": "^16.2.13",
"@angular/cli": "^16.1.4", "@angular/cli": "^16.2.13",
"@angular/compiler": "^16.1.3", "@angular/compiler": "^16.1.3",
"@angular/compiler-cli": "^16.1.3", "@angular/compiler-cli": "^16.1.3",
"@angular/language-service": "^16.1.5", "@angular/language-service": "^16.2.12",
"@capacitor/cli": "^5.2.1", "@capacitor/cli": "^5.7.4",
"@ionic/angular-toolkit": "^9.0.0", "@ionic/angular-toolkit": "^9.0.0",
"@ionic/cli": "^7.1.1", "@ionic/cli": "^7.2.0",
"@types/jasmine": "^3.10.11", "@types/jasmine": "^3.10.18",
"@types/jasminewd2": "^2.0.10", "@types/jasminewd2": "^2.0.13",
"@types/node": "^12.20.55", "@types/node": "^12.20.55",
"@types/uuid": "^8.3.4", "@types/uuid": "^8.3.4",
"jasmine-core": "~3.8.0", "jasmine-core": "~3.8.0",
"jasmine-spec-reporter": "~5.0.0", "jasmine-spec-reporter": "~5.0.0",
"karma": "^6.4.2", "karma": "^6.4.3",
"karma-chrome-launcher": "^3.2.0", "karma-chrome-launcher": "^3.2.0",
"karma-coverage": "~2.0.3", "karma-coverage": "~2.0.3",
"karma-coverage-istanbul-reporter": "~3.0.2", "karma-coverage-istanbul-reporter": "~3.0.2",

View file

@ -215,6 +215,25 @@
</ng-container> </ng-container>
<ng-container *ngIf="contentType === 'geo'">
<ion-row class="ion-padding-horizontal" [@inAnimation]>
<ion-col>
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
<mat-label>{{ 'LATITUDE' | translate}}</mat-label>
<input matInput [(ngModel)]="latitude" type="number" #latitudeInput>
</mat-form-field>
</ion-col>
</ion-row>
<ion-row class="ion-padding-horizontal" [@inAnimation]>
<ion-col>
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
<mat-label>{{ 'LONGITUDE' | translate}}</mat-label>
<input matInput [(ngModel)]="longitude" type="number" #longitudeInput>
</mat-form-field>
</ion-col>
</ion-row>
</ng-container>
<ng-container *ngIf="contentType === 'phone'"> <ng-container *ngIf="contentType === 'phone'">
<ion-row class="ion-padding-horizontal" [@inAnimation]> <ion-row class="ion-padding-horizontal" [@inAnimation]>
<ion-col> <ion-col>

View file

@ -5,7 +5,7 @@ import { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics';
import { AlertController, LoadingController, ToastController } from '@ionic/angular'; import { AlertController, LoadingController, ToastController } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { EnvService } from 'src/app/services/env.service'; import { EnvService, QrCreateContentTypeType } from 'src/app/services/env.service';
import { Toast } from '@capacitor/toast'; import { Toast } from '@capacitor/toast';
import { fadeIn } from 'src/app/utils/animations'; import { fadeIn } from 'src/app/utils/animations';
import { SplashScreen } from '@capacitor/splash-screen'; import { SplashScreen } from '@capacitor/splash-screen';
@ -23,6 +23,7 @@ export class GeneratePage {
freeTxtText: string = "Free Text"; freeTxtText: string = "Free Text";
urlText: string = "URL"; urlText: string = "URL";
contactText: string = "vCard Contact"; contactText: string = "vCard Contact";
geolocationText: string = "Geolocation";
phoneText: string = "Phone"; phoneText: string = "Phone";
smsText: string = "Message"; smsText: string = "Message";
emailW3CText: string = "Email (W3C Standard)"; emailW3CText: string = "Email (W3C Standard)";
@ -37,6 +38,9 @@ export class GeneratePage {
emailSubject: string = ""; emailSubject: string = "";
emailBody: string = ""; emailBody: string = "";
latitude: number = 0;
longitude: number = 0;
phoneNumber: string = ""; phoneNumber: string = "";
smsMessage: string = ""; smsMessage: string = "";
@ -84,17 +88,18 @@ export class GeneratePage {
{ text: this.wpaText, value: "WPA" }, { text: this.wpaText, value: "WPA" },
] ]
contentTypes: { text: string, value: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" }[] = [ contentTypes: { text: string, value: QrCreateContentTypeType }[] = [
{ text: this.freeTxtText, value: 'freeText' }, { text: this.freeTxtText, value: 'freeText' },
{ text: this.emailW3CText, value: 'emailW3C' }, { text: this.emailW3CText, value: 'emailW3C' },
{ text: this.emailDocomoText, value: 'emailDocomo' }, { text: this.emailDocomoText, value: 'emailDocomo' },
{ text: this.geolocationText, value: 'geo' },
{ text: this.phoneText, value: 'phone' }, { text: this.phoneText, value: 'phone' },
{ text: this.smsText, value: 'sms' }, { text: this.smsText, value: 'sms' },
{ text: this.urlText, value: 'url' }, { text: this.urlText, value: 'url' },
{ text: this.contactText, value: 'contact' }, { text: this.contactText, value: 'contact' },
{ text: this.wifiText, value: 'wifi' }, { text: this.wifiText, value: 'wifi' },
]; ];
contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText"; contentType: QrCreateContentTypeType = "freeText";
constructor( constructor(
public translate: TranslateService, public translate: TranslateService,
@ -113,6 +118,7 @@ export class GeneratePage {
this.freeTxtText = this.translate.instant("FREE_TEXT"); this.freeTxtText = this.translate.instant("FREE_TEXT");
this.urlText = this.translate.instant("URL"); this.urlText = this.translate.instant("URL");
this.contactText = this.translate.instant("VCARD_CONTACT"); this.contactText = this.translate.instant("VCARD_CONTACT");
this.geolocationText = this.translate.instant("GEOLOCATION");
this.phoneText = this.translate.instant("PHONE_NO"); this.phoneText = this.translate.instant("PHONE_NO");
this.smsText = this.translate.instant("MESSAGE"); this.smsText = this.translate.instant("MESSAGE");
this.emailW3CText = this.translate.instant("EMAIL_W3C_STANDARD"); this.emailW3CText = this.translate.instant("EMAIL_W3C_STANDARD");
@ -122,6 +128,7 @@ export class GeneratePage {
{ text: this.freeTxtText, value: 'freeText' }, { text: this.freeTxtText, value: 'freeText' },
{ text: this.emailW3CText, value: 'emailW3C' }, { text: this.emailW3CText, value: 'emailW3C' },
{ text: this.emailDocomoText, value: 'emailDocomo' }, { text: this.emailDocomoText, value: 'emailDocomo' },
{ text: this.geolocationText, value: 'geo' },
{ text: this.phoneText, value: 'phone' }, { text: this.phoneText, value: 'phone' },
{ text: this.smsText, value: 'sms' }, { text: this.smsText, value: 'sms' },
{ text: this.urlText, value: 'url' }, { text: this.urlText, value: 'url' },
@ -195,6 +202,9 @@ export class GeneratePage {
this.emailSubject = ""; this.emailSubject = "";
this.emailBody = ""; this.emailBody = "";
this.latitude = 0;
this.longitude = 0;
this.phoneNumber = ""; this.phoneNumber = "";
this.smsMessage = ""; this.smsMessage = "";
@ -263,6 +273,9 @@ export class GeneratePage {
this.qrCodeContent = `MATMSG:TO:${this.toEmails[0]};SUB:${this.emailSubject};BODY:${this.emailBody};;`; this.qrCodeContent = `MATMSG:TO:${this.toEmails[0]};SUB:${this.emailSubject};BODY:${this.emailBody};;`;
this.qrCodeContent = encodeURI(this.qrCodeContent); this.qrCodeContent = encodeURI(this.qrCodeContent);
break; break;
case "geo":
this.qrCodeContent = `geo:${this.latitude},${this.longitude}`;
break;
case "phone": case "phone":
this.qrCodeContent = "tel:"; this.qrCodeContent = "tel:";
this.qrCodeContent += this.phoneNumber; this.qrCodeContent += this.phoneNumber;
@ -348,7 +361,7 @@ export class GeneratePage {
return format(new Date(), "yyyy-MM-dd"); return format(new Date(), "yyyy-MM-dd");
} }
getIcon(type: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi"): string { getIcon(type: QrCreateContentTypeType): string {
switch (type) { switch (type) {
case "freeText": case "freeText":
return "format_align_left"; return "format_align_left";
@ -356,6 +369,8 @@ export class GeneratePage {
return "link"; return "link";
case "contact": case "contact":
return "contact_phone"; return "contact_phone";
case "geo":
return "location_on";
case "phone": case "phone":
return "call"; return "call";
case "sms": case "sms":
@ -371,7 +386,7 @@ export class GeneratePage {
} }
} }
getText(type: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi"): string { getText(type: QrCreateContentTypeType): string {
switch (type) { switch (type) {
case "freeText": case "freeText":
return this.freeTxtText; return this.freeTxtText;
@ -379,6 +394,8 @@ export class GeneratePage {
return this.urlText; return this.urlText;
case "contact": case "contact":
return this.contactText; return this.contactText;
case "geo":
return this.geolocationText;
case "phone": case "phone":
return this.phoneText; return this.phoneText;
case "sms": case "sms":

View file

@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router';
import { AlertController, IonItemSliding, LoadingController, ModalController, PopoverController, ToastController } from '@ionic/angular'; import { AlertController, IonItemSliding, LoadingController, ModalController, PopoverController, ToastController } from '@ionic/angular';
import { EnvService } from 'src/app/services/env.service'; import { EnvService } from 'src/app/services/env.service';
import { format, Locale } from 'date-fns'; import { format, Locale } from 'date-fns';
import { de, enUS, fr, it, ru, zhCN, zhHK } from 'date-fns/locale'; import { de, enUS, fr, it, ptBR, ru, zhCN, zhHK } from 'date-fns/locale';
import { ScanRecord } from 'src/app/models/scan-record'; import { ScanRecord } from 'src/app/models/scan-record';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Bookmark } from 'src/app/models/bookmark'; import { Bookmark } from 'src/app/models/bookmark';
@ -138,6 +138,9 @@ export class HistoryPage {
case "it": case "it":
locale = it; locale = it;
break; break;
case "pt-BR":
locale = ptBR;
break;
case "ru": case "ru":
locale = ru; locale = ru;
break; break;

View file

@ -18,7 +18,7 @@
<ion-col> <ion-col>
<ion-badge class="p-2" color="primary"> <ion-badge class="p-2" color="primary">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<mat-icon class="me-3" *ngIf="contentTypeIcon != ''" [fontIcon]="contentTypeIcon"> <mat-icon class="me-2" *ngIf="contentTypeIcon != ''" [fontIcon]="contentTypeIcon">
</mat-icon> </mat-icon>
<span>{{ contentTypeText }}</span> <span>{{ contentTypeText }}</span>
</div> </div>
@ -96,6 +96,15 @@
[ngTemplateOutletContext]="{ label: 'HIDDEN_NETWORK_?' | translate, content: wifiHidden === true? ('YES' | translate) : ('NO' | translate) }"> [ngTemplateOutletContext]="{ label: 'HIDDEN_NETWORK_?' | translate, content: wifiHidden === true? ('YES' | translate) : ('NO' | translate) }">
</ng-container> </ng-container>
<ng-container *ngIf="contentType === 'geo' && qrCodeContent && qrCodeContent.trim().length > 0 && latitude != null"
[ngTemplateOutlet]="contentBlock" [ngTemplateOutletContext]="{ label: 'LATITUDE' | translate, content: latitude }">
</ng-container>
<ng-container *ngIf="contentType === 'geo' && qrCodeContent && qrCodeContent.trim().length > 0 && longitude != null"
[ngTemplateOutlet]="contentBlock"
[ngTemplateOutletContext]="{ label: 'LONGITUDE' | translate, content: longitude }">
</ng-container>
<div class="ion-padding-horizontal ion-margin-horizontal ion-padding-bottom"> <div class="ion-padding-horizontal ion-margin-horizontal ion-padding-bottom">
</div> </div>
@ -126,6 +135,13 @@
</ion-button> </ion-button>
</ion-row> </ion-row>
<ion-row *ngIf="contentType === 'geo' && env.showOpenUrlButton === 'on'"
class="d-flex justify-content-center">
<ion-button (click)="tapHaptic(); openLink()" [color]="'primary'" fill="clear">
<ion-icon name="map"></ion-icon>
</ion-button>
</ion-row>
<ion-row *ngIf="contentType === 'contact' && env.showAddContactButton === 'on'" <ion-row *ngIf="contentType === 'contact' && env.showAddContactButton === 'on'"
class="d-flex justify-content-center"> class="d-flex justify-content-center">
<ion-button (click)="tapHaptic(); addContact()" [color]="'primary'" fill="clear"> <ion-button (click)="tapHaptic(); addContact()" [color]="'primary'" fill="clear">
@ -245,10 +261,11 @@
<ion-icon class="pe-2" name="globe"></ion-icon> <ion-icon class="pe-2" name="globe"></ion-icon>
<ion-label>{{ 'BROWSE' | translate}}</ion-label> <ion-label>{{ 'BROWSE' | translate}}</ion-label>
</ion-button> </ion-button>
<ion-button class="pe-1" *ngIf="contentType === 'url' && env.showOpenUrlButton === 'on' && !isHttp" <ion-button class="pe-1"
*ngIf="(contentType === 'url' || contentType === 'geo') && env.showOpenUrlButton === 'on' && !isHttp"
(click)="tapHaptic(); openLink()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline" (click)="tapHaptic(); openLink()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
shape="round" [@inAnimation]> shape="round" [@inAnimation]>
<ion-icon class="pe-2" name="open"></ion-icon> <ion-icon class="pe-2" [name]="contentType === 'geo'? 'map' : 'open'"></ion-icon>
<ion-label>{{ 'OPEN' | translate}}</ion-label> <ion-label>{{ 'OPEN' | translate}}</ion-label>
</ion-button> </ion-button>
<ion-button class="pe-1" <ion-button class="pe-1"
@ -340,7 +357,8 @@
[cdkAutosizeMaxRows]="20" readonly> [cdkAutosizeMaxRows]="20" readonly>
</textarea> </textarea>
<mat-hint *ngIf="hint && hint != ''" style="opacity: 0.5;">{{ hint }}</mat-hint> <mat-hint *ngIf="hint && hint != ''" style="opacity: 0.5;">{{ hint }}</mat-hint>
<button mat-button color="primary" (click)="editContent()" *ngIf="showEdit" class="m-0 p-0 mt-3" style="background-color: transparent !important; color: var(--ion-color-primary) !important;"> <button mat-button color="primary" (click)="editContent()" *ngIf="showEdit" class="m-0 p-0 mt-3"
style="background-color: transparent !important; color: var(--ion-color-primary) !important;">
{{ 'EDIT' | translate }} {{ 'EDIT' | translate }}
</button> </button>
</mat-form-field> </mat-form-field>

View file

@ -6,7 +6,7 @@ import { Haptics, ImpactStyle } from '@capacitor/haptics';
import { AlertController, LoadingController, ModalController, Platform } from '@ionic/angular'; import { AlertController, LoadingController, ModalController, Platform } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { VCardContact } from 'src/app/models/v-card-contact'; import { VCardContact } from 'src/app/models/v-card-contact';
import { EnvService } from 'src/app/services/env.service'; import { EnvService, QrResultContentTypeType } from 'src/app/services/env.service';
import { Toast } from '@capacitor/toast'; import { Toast } from '@capacitor/toast';
import { MatFormField } from '@angular/material/form-field'; import { MatFormField } from '@angular/material/form-field';
import { BarcodeScanner } from '@capacitor-community/barcode-scanner'; import { BarcodeScanner } from '@capacitor-community/barcode-scanner';
@ -23,7 +23,7 @@ import { QRCodeElementType } from 'angularx-qrcode';
}) })
export class ResultPage { export class ResultPage {
contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText"; contentType: QrResultContentTypeType = "freeText";
qrCodeContent: string; qrCodeContent: string;
qrElementType: QRCodeElementType = "canvas"; qrElementType: QRCodeElementType = "canvas";
@ -45,6 +45,9 @@ export class ResultPage {
wifiEncryption: 'NONE' | 'WEP' | 'WPA'; wifiEncryption: 'NONE' | 'WEP' | 'WPA';
wifiHidden: boolean = false; wifiHidden: boolean = false;
latitude: number;
longitude: number;
base64Encoded: boolean = false; base64Encoded: boolean = false;
base64EncodedText: string = ""; base64EncodedText: string = "";
base64Decoded: boolean = false; base64Decoded: boolean = false;
@ -138,6 +141,8 @@ export class ResultPage {
delete this.wifiPassword delete this.wifiPassword
delete this.wifiEncryption delete this.wifiEncryption
delete this.wifiHidden delete this.wifiHidden
delete this.latitude
delete this.longitude
this.base64Encoded = false; this.base64Encoded = false;
this.base64EncodedText = ""; this.base64EncodedText = "";
this.base64Decoded = false; this.base64Decoded = false;
@ -157,6 +162,7 @@ export class ResultPage {
const emailW3CPrefix = "MAILTO:"; const emailW3CPrefix = "MAILTO:";
const emailDoconoPrefix = "MATMSG:"; const emailDoconoPrefix = "MATMSG:";
const wifiPrefix = "WIFI:"; const wifiPrefix = "WIFI:";
const geoPrefix = "GEO:";
const content0 = this.qrCodeContent.trim(); const content0 = this.qrCodeContent.trim();
const tContent = this.qrCodeContent.trim().toUpperCase(); const tContent = this.qrCodeContent.trim().toUpperCase();
if (tContent.substr(0, contactPrefix.length) === contactPrefix) { if (tContent.substr(0, contactPrefix.length) === contactPrefix) {
@ -183,6 +189,10 @@ export class ResultPage {
} else if (tContent.substr(0, wifiPrefix.length) === wifiPrefix) { } else if (tContent.substr(0, wifiPrefix.length) === wifiPrefix) {
this.contentType = "wifi"; this.contentType = "wifi";
this.prepareWifi(); this.prepareWifi();
} else if (tContent.substring(0, geoPrefix.length) === geoPrefix) {
this.contentType = "geo";
this.latitude = +tContent.substring(geoPrefix.length, tContent.indexOf(","));
this.longitude = +tContent.substring(tContent.indexOf(",") + 1);
} else if (this.isValidUrl(content0)) { } else if (this.isValidUrl(content0)) {
this.contentType = "url"; this.contentType = "url";
} else { } else {
@ -880,6 +890,8 @@ export class ResultPage {
return this.translate.instant("EMAIL_W3C_STANDARD"); return this.translate.instant("EMAIL_W3C_STANDARD");
case 'emailDocomo': case 'emailDocomo':
return this.translate.instant("EMAIL_NTT_DOCOMO"); return this.translate.instant("EMAIL_NTT_DOCOMO");
case 'geo':
return this.translate.instant("GEOLOCATION");
case 'phone': case 'phone':
return this.translate.instant("PHONE_NO"); return this.translate.instant("PHONE_NO");
case 'sms': case 'sms':
@ -901,6 +913,8 @@ export class ResultPage {
return "link"; return "link";
case "contact": case "contact":
return "contact_phone"; return "contact_phone";
case 'geo':
return "location_on";
case "phone": case "phone":
return "call"; return "call";
case "sms": case "sms":

View file

@ -66,6 +66,17 @@
<ion-radio class="ion-margin-end" slot="end" [value]="'it'" [color]="'primary'"> <ion-radio class="ion-margin-end" slot="end" [value]="'it'" [color]="'primary'">
</ion-radio> </ion-radio>
</ion-item> </ion-item>
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
Português do Brasil (pt-BR)
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="'pt-BR'" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none"> <ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
<ion-label class="ion-padding-start"> <ion-label class="ion-padding-start">
<p class="ion-padding pre-line"> <p class="ion-padding pre-line">

View file

@ -13,7 +13,7 @@ import { Bookmark } from 'src/app/models/bookmark';
import { SocialSharing } from '@awesome-cordova-plugins/social-sharing/ngx'; import { SocialSharing } from '@awesome-cordova-plugins/social-sharing/ngx';
import { Haptics, ImpactStyle } from '@capacitor/haptics'; import { Haptics, ImpactStyle } from '@capacitor/haptics';
import { Preferences } from '@capacitor/preferences'; import { Preferences } from '@capacitor/preferences';
import { de, enUS, fr, it, ru, zhCN, zhHK } from 'date-fns/locale'; import { de, enUS, fr, it, ptBR, ru, zhCN, zhHK } from 'date-fns/locale';
@Component({ @Component({
selector: 'app-setting-record', selector: 'app-setting-record',
@ -196,7 +196,11 @@ export class SettingRecordPage {
handler: async data => { handler: async data => {
alert.dismiss(); alert.dismiss();
if (data.secret != null && data.secret.trim().length == 49) { if (data.secret != null && data.secret.trim().length == 49) {
await this.restore(value.data, data.secret.trim()); if ((typeof value.data) == 'string') {
await this.restore(value.data as string, data.secret.trim());
} else {
this.presentToast(this.translate.instant("MSG.RESTORE_FAILED"), "short", "bottom");
}
} else { } else {
this.presentToast(this.translate.instant("MSG.PLEASE_INPUT_VALID_SECRET"), "short", "bottom"); this.presentToast(this.translate.instant("MSG.PLEASE_INPUT_VALID_SECRET"), "short", "bottom");
} }
@ -316,6 +320,9 @@ export class SettingRecordPage {
case "it": case "it":
rawCsvData = "ID,Contenuto,Creato a,Fonte,Tipo di codice a barre,Aggiunto ai preferiti?,Etichetta\r\n"; rawCsvData = "ID,Contenuto,Creato a,Fonte,Tipo di codice a barre,Aggiunto ai preferiti?,Etichetta\r\n";
break; break;
case "pt-BR":
rawCsvData = "ID,Conteúdo,Criado em,Origem,Tipo de código de barras,Marcado como favorito?,Tag\r\n";
break;
case "ru": case "ru":
rawCsvData = "ID,Содержание,Создано в,Источник,Тип штрих-кода,В закладках?,Ярлык\r\n"; rawCsvData = "ID,Содержание,Создано в,Источник,Тип штрих-кода,В закладках?,Ярлык\r\n";
break; break;
@ -474,6 +481,9 @@ export class SettingRecordPage {
case "it": case "it":
locale = it; locale = it;
break; break;
case "pt-BR":
locale = ptBR;
break;
case "ru": case "ru":
locale = ru; locale = ru;
break; break;
@ -507,6 +517,9 @@ export class SettingRecordPage {
case "it": case "it":
locale = it; locale = it;
break; break;
case "pt-BR":
locale = ptBR;
break;
case "ru": case "ru":
locale = ru; locale = ru;
break; break;

View file

@ -86,7 +86,6 @@ export class TabsPage {
await Preferences.set({ key: storageKey, value: 'yes' }); await Preferences.set({ key: storageKey, value: 'yes' });
if (!this.env.notShowUpdateNotes) { if (!this.env.notShowUpdateNotes) {
this.env.notShowUpdateNotes = true; this.env.notShowUpdateNotes = true;
await this.showUpdateNotes();
const versionWording = this.translate.instant("VERSION_VERSION") as string; const versionWording = this.translate.instant("VERSION_VERSION") as string;
await this.presentToast(versionWording.replace("{version}", this.env.appVersionNumber), "short", 'bottom'); await this.presentToast(versionWording.replace("{version}", this.env.appVersionNumber), "short", 'bottom');
} }

View file

@ -15,7 +15,7 @@ import { v4 as uuidv4 } from 'uuid';
import { Preferences } from '@capacitor/preferences'; import { Preferences } from '@capacitor/preferences';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | 'ru' | 'zh-CN' | 'zh-HK'; export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | 'pt-BR' | 'ru' | 'zh-CN' | 'zh-HK';
export declare type TabPageType = "/tabs/scan" | "/tabs/generate" | "/tabs/import-image" | "/tabs/history" | "/tabs/setting"; export declare type TabPageType = "/tabs/scan" | "/tabs/generate" | "/tabs/import-image" | "/tabs/history" | "/tabs/setting";
export declare type HistoryPageSegmentType = 'history' | 'bookmarks'; export declare type HistoryPageSegmentType = 'history' | 'bookmarks';
export declare type OnOffType = "on" | "off"; export declare type OnOffType = "on" | "off";
@ -25,18 +25,20 @@ export declare type VibrationType = "on" | "off" | 'on-haptic' | 'on-scanned';
export declare type OrientationType = 'portrait' | 'landscape'; export declare type OrientationType = 'portrait' | 'landscape';
export declare type SearchEngineType = 'google' | 'bing' | 'yahoo' | 'duckduckgo' | 'yandex' | 'ecosia' | 'brave'; export declare type SearchEngineType = 'google' | 'bing' | 'yahoo' | 'duckduckgo' | 'yandex' | 'ecosia' | 'brave';
export declare type ResultPageButtonsType = 'detailed' | 'icon-only'; export declare type ResultPageButtonsType = 'detailed' | 'icon-only';
export declare type QrResultContentTypeType = "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" | "geo";
export declare type QrCreateContentTypeType = "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" | "geo";
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class EnvService { export class EnvService {
public appVersionNumber: string = '4.0.1'; public appVersionNumber: string = '4.1.0';
public startPage: TabPageType = "/tabs/scan"; public startPage: TabPageType = "/tabs/scan";
public historyPageStartSegment: HistoryPageSegmentType = 'history'; public historyPageStartSegment: HistoryPageSegmentType = 'history';
public startPageHeader: OnOffType = 'on'; public startPageHeader: OnOffType = 'on';
public languages: LanguageType[] = ['en', 'zh-HK', 'zh-CN', 'de', 'fr', 'it']; public languages: LanguageType[] = ['en', 'zh-HK', 'zh-CN', 'de', 'fr', 'it', 'pt-BR', 'ru'];
public language: LanguageType = 'en'; public language: LanguageType = 'en';
public selectedLanguage: 'default' | LanguageType = 'default'; public selectedLanguage: 'default' | LanguageType = 'default';
public colorTheme: ColorThemeType = 'light'; public colorTheme: ColorThemeType = 'light';
@ -45,7 +47,7 @@ export class EnvService {
public recordsLimit: 30 | 50 | 100 | -1 = -1; public recordsLimit: 30 | 50 | 100 | -1 = -1;
public showNumberOfRecords: OnOffType = 'on'; public showNumberOfRecords: OnOffType = 'on';
public autoMaxBrightness: OnOffType = 'off'; public autoMaxBrightness: OnOffType = 'off';
public autoOpenUrl: OnOffType = 'on'; public autoOpenUrl: OnOffType = 'off';
public errorCorrectionLevel: ErrorCorrectionLevelType = 'M'; public errorCorrectionLevel: ErrorCorrectionLevelType = 'M';
public qrCodeLightR: number = 255; public qrCodeLightR: number = 255;
public qrCodeLightG: number = 255; public qrCodeLightG: number = 255;
@ -125,10 +127,10 @@ export class EnvService {
public readonly KEY_SHOW_OPEN_FOOD_FACTS_BUTTON = "showOpenFoodFactsButton"; public readonly KEY_SHOW_OPEN_FOOD_FACTS_BUTTON = "showOpenFoodFactsButton";
public readonly KEY_AUTO_EXIT_MIN = "autoExitAppMin"; public readonly KEY_AUTO_EXIT_MIN = "autoExitAppMin";
public readonly KEY_ANDROID_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40001"; public readonly KEY_ANDROID_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40100";
public readonly KEY_IOS_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40001"; public readonly KEY_IOS_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40100";
public readonly KEY_ANDROID_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40000"; public readonly KEY_ANDROID_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40001";
public readonly KEY_IOS_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40000"; public readonly KEY_IOS_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40001";
public readonly APP_FOLDER_NAME: string = 'SimpleQR'; public readonly APP_FOLDER_NAME: string = 'SimpleQR';
@ -1008,7 +1010,7 @@ export class EnvService {
if (result.value != null) { if (result.value != null) {
this.autoOpenUrl = result.value as OnOffType; this.autoOpenUrl = result.value as OnOffType;
} else { } else {
this.autoOpenUrl = 'on'; this.autoOpenUrl = 'off';
} }
} }
); );
@ -1207,7 +1209,7 @@ export class EnvService {
this.recordsLimit = -1; this.recordsLimit = -1;
this.showNumberOfRecords = 'on'; this.showNumberOfRecords = 'on';
this.autoMaxBrightness = 'off'; this.autoMaxBrightness = 'off';
this.autoOpenUrl = 'on'; this.autoOpenUrl = 'off';
this.errorCorrectionLevel = 'M'; this.errorCorrectionLevel = 'M';
this.qrCodeLightR = 255; this.qrCodeLightR = 255;
this.qrCodeLightG = 255; this.qrCodeLightG = 255;
@ -1281,7 +1283,7 @@ export class EnvService {
this.autoMaxBrightness = 'off'; this.autoMaxBrightness = 'off';
await Preferences.set({ key: this.KEY_AUTO_MAX_BRIGHTNESS, value: this.autoMaxBrightness }); await Preferences.set({ key: this.KEY_AUTO_MAX_BRIGHTNESS, value: this.autoMaxBrightness });
this.autoOpenUrl = 'on'; this.autoOpenUrl = 'off';
await Preferences.set({ key: this.KEY_AUTO_OPEN_URL, value: this.autoOpenUrl }); await Preferences.set({ key: this.KEY_AUTO_OPEN_URL, value: this.autoOpenUrl });
this.errorCorrectionLevel = 'M'; this.errorCorrectionLevel = 'M';
@ -1632,6 +1634,9 @@ export class EnvService {
case "it": case "it":
language = "it" language = "it"
break; break;
case "pt":
language = "pt-BR";
break;
case "ru": case "ru":
language = "ru" language = "ru"
break; break;

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Voller Reset", "FULL_RESET": "Voller Reset",
"FUNCTIONS": "Funktionen", "FUNCTIONS": "Funktionen",
"GENDER": "Geschlecht", "GENDER": "Geschlecht",
"GEOLOCATION": "Geolokalisierung",
"GOOGLE_SEARCH": "Google-Suche", "GOOGLE_SEARCH": "Google-Suche",
"HAPTIC_FEEDBACK_ONLY": "Nur haptisches Feedback", "HAPTIC_FEEDBACK_ONLY": "Nur haptisches Feedback",
"HIDDEN_NETWORK_?": "Verstecktes Netzwerk?", "HIDDEN_NETWORK_?": "Verstecktes Netzwerk?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Berufsbezeichnung", "JOB_TITLE": "Berufsbezeichnung",
"LANGUAGE": "Sprache", "LANGUAGE": "Sprache",
"LAST_NAME": "Nachname", "LAST_NAME": "Nachname",
"LATITUDE": "Breitengrad",
"LEVEL_H": "Level H", "LEVEL_H": "Level H",
"LEVEL_L": "Level L", "LEVEL_L": "Level L",
"LEVEL_M": "Level M", "LEVEL_M": "Level M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Porträt sperren", "LOCK_PORTRAIT": "Porträt sperren",
"LOG": "Protokoll", "LOG": "Protokoll",
"LOG_BACKUP_AND_RESTORE": "Protokoll, Sicherung und Wiederherstellung", "LOG_BACKUP_AND_RESTORE": "Protokoll, Sicherung und Wiederherstellung",
"LONGITUDE": "Längengrad",
"MALE": "Männlich", "MALE": "Männlich",
"MANAGE_RECORDS": "Aufzeichnungen verwalten", "MANAGE_RECORDS": "Aufzeichnungen verwalten",
"MARGIN": "Rand", "MARGIN": "Rand",

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Full Reset", "FULL_RESET": "Full Reset",
"FUNCTIONS": "Functions", "FUNCTIONS": "Functions",
"GENDER": "Gender", "GENDER": "Gender",
"GEOLOCATION": "Geolocation",
"GOOGLE_SEARCH": "Google Search", "GOOGLE_SEARCH": "Google Search",
"HAPTIC_FEEDBACK_ONLY": "Haptic Feedback Only", "HAPTIC_FEEDBACK_ONLY": "Haptic Feedback Only",
"HIDDEN_NETWORK_?": "Hidden Network?", "HIDDEN_NETWORK_?": "Hidden Network?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Job Title", "JOB_TITLE": "Job Title",
"LANGUAGE": "Language", "LANGUAGE": "Language",
"LAST_NAME": "Last Name", "LAST_NAME": "Last Name",
"LATITUDE": "Latitude",
"LEVEL_H": "Level H", "LEVEL_H": "Level H",
"LEVEL_L": "Level L", "LEVEL_L": "Level L",
"LEVEL_M": "Level M", "LEVEL_M": "Level M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Lock Portrait", "LOCK_PORTRAIT": "Lock Portrait",
"LOG": "Log", "LOG": "Log",
"LOG_BACKUP_AND_RESTORE": "Log, Backup & Restore", "LOG_BACKUP_AND_RESTORE": "Log, Backup & Restore",
"LONGITUDE": "Longitude",
"MALE": "Male", "MALE": "Male",
"MANAGE_RECORDS": "Manage Records", "MANAGE_RECORDS": "Manage Records",
"MARGIN": "Margin", "MARGIN": "Margin",

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Réinitialiser complètement", "FULL_RESET": "Réinitialiser complètement",
"FUNCTIONS": "Fonctions", "FUNCTIONS": "Fonctions",
"GENDER": "Sexe", "GENDER": "Sexe",
"GEOLOCATION": "Géolocalisation",
"GOOGLE_SEARCH": "Recherche Google", "GOOGLE_SEARCH": "Recherche Google",
"HAPTIC_FEEDBACK_ONLY": "Retour haptique uniquement", "HAPTIC_FEEDBACK_ONLY": "Retour haptique uniquement",
"HIDDEN_NETWORK_?": "Réseau caché ?", "HIDDEN_NETWORK_?": "Réseau caché ?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Titre d'emploi", "JOB_TITLE": "Titre d'emploi",
"LANGUAGE": "Langue", "LANGUAGE": "Langue",
"LAST_NAME": "Nom de famille", "LAST_NAME": "Nom de famille",
"LATITUDE": "Latitude",
"LEVEL_H": "Niveau H", "LEVEL_H": "Niveau H",
"LEVEL_L": "Niveau L", "LEVEL_L": "Niveau L",
"LEVEL_M": "Niveau M", "LEVEL_M": "Niveau M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Verrouiller le portrait", "LOCK_PORTRAIT": "Verrouiller le portrait",
"LOG": "Registre", "LOG": "Registre",
"LOG_BACKUP_AND_RESTORE": "Journalisation, sauvegarde et restauration", "LOG_BACKUP_AND_RESTORE": "Journalisation, sauvegarde et restauration",
"LONGITUDE": "Longitude",
"MALE": "Mâle", "MALE": "Mâle",
"MANAGE_RECORDS": "Gérer les enregistrements", "MANAGE_RECORDS": "Gérer les enregistrements",
"MARGIN": "Marge", "MARGIN": "Marge",

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Reset", "FULL_RESET": "Reset",
"FUNCTIONS": "Opzioni", "FUNCTIONS": "Opzioni",
"GENDER": "Sesso", "GENDER": "Sesso",
"GEOLOCATION": "Geolocalizzazione",
"GOOGLE_SEARCH": "Ricerca con Google", "GOOGLE_SEARCH": "Ricerca con Google",
"HAPTIC_FEEDBACK_ONLY": "Feedback disponibile solo tramite Haptic", "HAPTIC_FEEDBACK_ONLY": "Feedback disponibile solo tramite Haptic",
"HIDDEN_NETWORK_?": "Rete nascosta?", "HIDDEN_NETWORK_?": "Rete nascosta?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Titolo di lavoro", "JOB_TITLE": "Titolo di lavoro",
"LANGUAGE": "Lingua", "LANGUAGE": "Lingua",
"LAST_NAME": "Cognome", "LAST_NAME": "Cognome",
"LATITUDE": "Latitudine",
"LEVEL_H": "Livello H", "LEVEL_H": "Livello H",
"LEVEL_L": "Livello L", "LEVEL_L": "Livello L",
"LEVEL_M": "Livello M", "LEVEL_M": "Livello M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Blocca vista verticale", "LOCK_PORTRAIT": "Blocca vista verticale",
"LOG": "Log", "LOG": "Log",
"LOG_BACKUP_AND_RESTORE": "Logga, Esegui backup & Ripristina", "LOG_BACKUP_AND_RESTORE": "Logga, Esegui backup & Ripristina",
"LONGITUDE": "Longitudine",
"MALE": "Uomo", "MALE": "Uomo",
"MANAGE_RECORDS": "Gestisci record", "MANAGE_RECORDS": "Gestisci record",
"MARGIN": "Margine", "MARGIN": "Margine",

322
src/assets/i18n/pt-BR.json Normal file
View file

@ -0,0 +1,322 @@
{
"100_RECORDS": "100 Registros",
"30_RECORDS": "30 Registros",
"49_DIGIT": "49 dígitos",
"50_RECORDS": "50 Registros",
"ABOUT": "Sobre",
"ABOUT_SIMPLE_QR": "Sobre o Simple QR",
"ADD": "Adicionar",
"ADD_BCC": "Adicionar CCO",
"ADD_CC": "Adicionar CC",
"ADD_CONTACT": "Adicionar Contato",
"ADD_RECIPIENT": "Adicionar Destinatário",
"APP": "Aplicativo",
"APPEARANCE_AND_EFFECTS": "Aparência e Efeitos",
"APP_INITIAL_PAGE": "Página Inicial do Aplicativo",
"APP_VERSION": "Versão do Aplicativo",
"AT": "em",
"AT_LEAST_1_MINUTE_LATER": "Pelo Menos 1 Minuto Depois",
"AT_LEAST_3_MINUTES_LATER": "Pelo Menos 3 Minutos Depois",
"AT_LEAST_5_MINUTES_LATER": "Pelo Menos 5 Minutos Depois",
"AUTO_KILL_BACKGROUND": "Encerrar Automaticamente em Segundo Plano",
"AUTO_LOGGING": "Registro Automático",
"AUTO_MAX_BRIGHTNESS": "Brilho Máximo Automático",
"AUTO_OPEN_URL": "Abrir URL Automaticamente",
"AUTO_QR_CODE_POPUP": "Popup de Código QR Automático",
"BACKGROUND_COLOR": "Cor de Fundo",
"BACKING_UP": "Fazendo Backup",
"BACKUP": "Backup",
"BASE64": "Base64",
"BASE64_DECODED": "Base64 Decodificado",
"BASE64_ENCODED": "Base64 Codificado",
"BCC": "CCO",
"BLACK": "Preto",
"BOOKMARK": "Favoritar",
"BOOKMARKED": "Favoritado",
"BOOKMARKED_TEXTS": "Textos Favoritados",
"BOOKMARKS": "Favoritos",
"BRAVE_SEARCH": "Busca Brave",
"BROWSE": "Pesquisar",
"BROWSER": "Navegador",
"BROWSE_WEBSITE": "Navegar no Site",
"CALL": "Chamada",
"CANCEL": "Cancelar",
"CC": "CC",
"CITY": "Cidade",
"CLEAR": "Limpar",
"CLOSE": "Fechar",
"COLOR": "Cor",
"COLOR_THEME": "Tema de Cores",
"COMING_SOON": "Em Breve",
"CONTACT_METHOD": "Método de Contato",
"CONTACT_NAME": "Nome do Contato",
"CONTENT": "Conteúdo",
"CONTENT_TYPE": "Tipo de Conteúdo",
"COPIED": "Copiado",
"COPY": "Copiar",
"COPY_SECRET_AND_SAVE_BACKUP": "Copiar Segredo e Salvar Backup",
"COPY_TEXT": "Copiar Texto",
"COUNTRY": "País",
"CREATE": "Criar",
"CREATED": "Criado",
"CREATE_QR_CODE": "Criar Código QR",
"DARK": "Escuro",
"DATE_OF_BIRTH": "Data de Nascimento",
"DEBUG_MODE": "Modo de Depuração",
"DECODING": "Decodificando",
"DECRYPTING": "Descriptografando",
"DETAILED": "Detalhado",
"DONE": "Concluído",
"DUCK_DUCK_GO": "DuckDuckGo",
"ECOSIA": "Ecosia",
"EDIT": "Editar",
"EMAIL_ADDRESS": "Endereço de E-mail",
"EMAIL_BODY": "Corpo do E-mail",
"EMAIL_NTT_DOCOMO": "E-mail (NTT Docomo)",
"EMAIL_RECIPIENT": "Destinatário do E-mail",
"EMAIL_SUBJECT": "Assunto do E-mail",
"EMAIL_TO": "Enviar E-mail para",
"EMAIL_W3C_STANDARD": "E-mail (Padrão W3C)",
"ENCRYPTING": "Criptografando",
"ERROR_CORRECTION_LEVEL": "Nível de Correção de Erro",
"EXIT": "Sair",
"EXIT_APP": "Sair do Aplicativo",
"EXPORT": "Exportar",
"EXPORTING": "Exportando",
"EXPORT_TO_CSV": "Exportar para CSV",
"FAX_NUMBER": "Número de Fax",
"FEMALE": "Feminino",
"FIRST_NAME": "Nome Próprio",
"FOLLOW_SYSTEM_SETTINGS": "Seguir Configurações do Sistema",
"FREE_TEXT": "Texto Livre",
"FULL_RESET": "Redefinição Completa",
"FUNCTIONS": "Funções",
"GENDER": "Gênero",
"GEOLOCATION": "Geolocalização",
"GOOGLE_SEARCH": "Busca Google",
"HAPTIC_FEEDBACK_ONLY": "Apenas Feedback Háptico",
"HIDDEN_NETWORK_?": "Rede Oculta?",
"HOME_ADDRESS": "Endereço Residencial",
"HOME_PHONE_NUMBER": "Número de Telefone Residencial",
"ICON_ONLY": "Apenas Ícone",
"IMPORT": "Importar",
"IMPORT_FROM_CSV": "Importar do CSV",
"IMPORT_IMAGE": "Importar Imagem",
"INITIAL_SEGMENT": "Segmento Inicial",
"JOB_TITLE": "Cargo",
"LANGUAGE": "Idioma",
"LAST_NAME": "Sobrenome",
"LATITUDE": "Latitude",
"LEVEL_H": "Nível H",
"LEVEL_L": "Nível L",
"LEVEL_M": "Nível M",
"LEVEL_Q": "Nível Q",
"LIGHT": "Claro",
"LOADING_DATA": "Carregando Dados",
"LOCK_LANDSCAPE": "Travar em Paisagem",
"LOCK_PORTRAIT": "Travar em Retrato",
"LOG": "Registro",
"LOG_BACKUP_AND_RESTORE": "Registro, Backup e Restauração",
"LONGITUDE": "Longitude",
"MALE": "Masculino",
"MANAGE_RECORDS": "Gerenciar Registros",
"MARGIN": "Margem",
"MESSAGE": "Mensagem",
"MESSAGE_CONTENT": "Conteúdo da Mensagem",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "Número de Celular",
"MORE": "Mais",
"NAME": "Nome",
"NO": "Não",
"NONE": "Nenhum",
"NOT_AVAILABLE": "Não Disponível",
"NOT_PROVIDED": "Não Fornecido",
"NOT_TO_DISCLOSE": "Não Divulgar",
"NO_LIMIT": "Sem Limite",
"NUMBER_OF_RECORDS": "Número de Registros",
"OK": "OK",
"ONLY_DELETE_DATA": "Apenas Excluir Dados",
"ONLY_RESET_SETTING": "Apenas Restaurar Configuração",
"OPEN": "Abrir",
"OPEN_URL": "Abrir URL",
"OPEN_WITH_...": "Abrir com...",
"OPTIMIZING_DATA_...": "Otimizando Dados...",
"ORGANIZATION": "Organização",
"ORIGINAL": "Original",
"OTHERS": "Outros",
"PASSWORD": "Senha",
"PATCH_NOTES": "Notas de Atualização",
"PERMISSION_REQUIRED": "Permissão Necessária",
"PERSONAL": "Pessoal",
"PHONE_NO": "Nº de Telefone",
"PHONE_NUMBER": "Número de Telefone",
"PLEASE_WAIT": "Aguarde, por favor",
"POSTAL_CODE": "Código Postal",
"PREPARING": "Preparando",
"PREVIEW": "Pré-visualização",
"PRIVACY_POLICY": "Política de Privacidade",
"QR_CODE": "Código QR",
"QR_CODE_AND_DECODED_RESULT": "Código QR e Resultado Decodificado",
"QR_CODE_CONTENT": "Conteúdo do Código QR",
"QR_CODE_STYLE": "Estilo do Código QR",
"RATE_THE_APP": "Avalie o Aplicativo",
"RECORDS_LIMIT": "Limite de Registros",
"REMOVE_ALL": "Remover Todos",
"REMOVE_BCC": "Remover CCO",
"REMOVE_CC": "Remover CC",
"REMOVE_RECIPIENT": "Remover Destinatário",
"REPORT_ISSUE": "Reportar Problema",
"RESET_APP": "Redefinir o Aplicativo",
"RESET_DEFAULT": "Redefinir para o Padrão",
"RESTORE": "Restaurar",
"RESULT": "Resultado",
"SAVE": "Salvar",
"SAVED": "Salvo",
"SCAN": "Escanear",
"SCANNED": "Escaneado",
"SCANNING_FEEDBACK_ONLY": "Apenas Feedback de Escaneamento",
"SCAN_BY_CAMERA": "Escanear pela Câmera",
"SCREEN_ORIENTATION": "Orientação da Tela",
"SEARCH": "Pesquisa",
"SEARCH_ENGINE": "Mecanismo de Busca",
"SECRET": "Segredo",
"SEND": "Enviar",
"SEND_EMAIL": "Enviar E-mail",
"SEND_MESSAGE": "Enviar Mensagem",
"SETTING": "Configuração",
"SETTINGS": "Configurações",
"SHARE": "Compartilhar",
"SHARING": "Compartilhando",
"SHOW": "Mostrar",
"SHOW_NUMBER_OR_RECORDS": "Mostrar Número de Registros",
"SHOW_QR_CODE": "Mostrar Código QR",
"SIMPLE_QR": "Simple QR",
"STATE": "Estado",
"STREET": "Rua",
"SUCCESS": "Sucesso",
"SUPPORTED_BARCODE_TYPE": "Tipo de Código de Barras Suportado",
"SUPPORTED_TYPE": "Tipo Suportado",
"SYSTEM_DEFAULT": "Padrão do Sistema",
"TASK": "Tarefa",
"TASK_BUTTON_LAYOUT": "Layout dos Botões de Tarefa",
"TURN_OFF": "Desligar",
"TURN_ON": "Ligar",
"TURNED_OFF": "Desligado",
"TURNED_ON": "Ligado",
"TUTORIAL": "Tutorial",
"UNDO": "Desfazer",
"UNKNOWN": "Desconhecido",
"UPDATE_SUCCESSFULLY": "Atualizado com Sucesso",
"URL": "URL",
"VCARD_CONTACT": "Contato vCard",
"VERSION_VERSION": "Versão {version}",
"VIBRATION": "Vibração",
"VIEWED": "Visualizado",
"VIEW_BOOKMARK": "Visualizar Favorito",
"VIEW_GITHUB": "Visualizar GitHub",
"VIEW_LOG": "Visualizar Registro",
"VIEW_STORE_AND_SOURCE_CODE": "Visualizar Loja e Código-fonte",
"VIEW_INSTRUCTIONS": "Visualizar Instruções",
"WEBSITE": "Site",
"WIFI": "Wi-Fi",
"WIFI_ENCRYPTION": "Criptografia do Wi-Fi",
"WIFI_SSID": "SSID do Wi-Fi",
"WORK": "Trabalho",
"WORK_PHONE_NUMBER": "Número de Telefone do Trabalho",
"YAHOO_SEARCH": "Busca Yahoo!",
"YANDEX": "Yandex",
"YES": "Sim",
"MSG": {
"ALREADY_BOOKMARKED": "Falha! Já favoritado anteriormente",
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>Para economizar recursos do sistema e bateria, defina o tempo para encerrar automaticamente o aplicativo quando ele estiver em execução em segundo plano.</p><br><p>Se você escolher <b>Seguir Configurações do Sistema</b>, o aplicativo será totalmente controlado pelo sistema e não será encerrado por si próprio.</p><br><p>Observe que em algumas situações, o sistema pode interromper o aplicativo antecipadamente.</p>",
"AUTO_LOGGING_EXPLAIN": "Cada conteúdo de código QR e código de barras é registrado e armazenado automaticamente depois de escaneado, criado ou visualizado novamente. Você pode visualizá-los na página de Registro.",
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "O brilho da tela é ajustado automaticamente para o máximo ao exibir um código QR.",
"AUTO_OPEN_URL_EXPLAIN": "Quando um código QR é escaneado e o conteúdo é uma URL, a URL será aberta automaticamente.",
"AUTO_SHOW_QR_EXPLAIN": "Pop-up automático de código QR na página de Resultado após as ações a seguir.",
"BACKUP_EXPLAIN": "Você pode fazer backup de todos os registros e favoritos localmente. Você receberá um conjunto de segredos após o backup. Mantenha o segredo com segurança, caso contrário, você não poderá restaurar o backup. Observe que o Simple QR não oferece suporte a backup e restauração entre plataformas diferentes.",
"BACKUP_FAILED": "Falha ao fazer backup",
"BACKUP_FAILED_2": "Falha ao fazer backup. Verifique se a permissão de armazenamento foi concedida.",
"BACKUP_SUCCESSFULLY": "<p>Backup feito com sucesso. Salve o arquivo de backup e mantenha o segunte segredo com segurança</p><p>{secret}</p>",
"BARCODE_TYPE": "Escanear<ul><li>Código QR</li><li>Código de Barras 1D</li><li>Código Azteca</li><li>Matriz de Dados</li><li>PDF417</li></ul>Importar Imagem<ul><li>Código QR</li></ul>Criar<ul><li>Código QR</li></ul>",
"BOOKMARKED": "Favoritado com Sucesso",
"BUTTON_DISPLAY_EXPLAIN": "Mostrar ou ocultar os botões de tarefa.",
"BUTTON_STYLE_EXPLAIN": "Escolha o estilo dos botões de tarefa.",
"CAMERA_PERMISSION": "Para habilitar a digitalização, você deve conceder a permissão de câmera.",
"CONTACT_PERMISSION": "Você deve conceder a permissão de Contatos para salvar o contato.",
"COPIED_SECRET": "Segredo copiado",
"COPY_TEXT": "Qual conteúdo você deseja copiar?",
"CREATE_QRCODE_MAX_LENGTH": "Máx. 1817 caracteres",
"CREATE_QRCODE_MAX_LENGTH_EXPLAIN": "O comprimento do conteúdo gerado do código QR não deve exceder 1817 caracteres.",
"DEBUG_MODE_ON": "Modo de Depuração ativado com sucesso",
"DELETE_OVERFLOWED_RECORDS": "Após sair desta página, os registros excedentes serão excluídos permanentemente.",
"EMAIL_MAX_LENGTH": "Máx. 254 caracteres",
"EMAIL_SUBJECT_MAX_LENGTH": "Máx. 78 caracteres",
"ERROR_CORRECTION_LEVEL_EXPLAIN": "<p>O código QR tem a capacidade de correção de erros para restaurar dados mesmo se o código estiver danificado.</p><br><p>Há 4 níveis disponíveis:</p><p>O nível L restaura 7% dos bytes de dados.</p><p>O nível M restaura 15% dos bytes de dados.</p><p>O nível Q restaura 25% dos bytes de dados.</p><p>O nível H restaura 30% dos bytes de dados.</p><br><p>Por favor, lembre-se de que elevar o nível pode melhorar a capacidade de correção de erros, mas também aumenta o tamanho do código QR. Portanto, para casos gerais, é recomendado o nível M.</p>",
"EXIT_APP": "<p>Tem certeza de que deseja sair do aplicativo?</p><p>Se você gosta do Simple QR, por favor, avalie-o na loja.</p>",
"EXPORT_TO_CSV_EXPLAIN": "Você pode exportar todos os registros e favoritos para um arquivo CSV.",
"FAILED_SAVING_CONTACT": "Falha ao salvar o contato",
"FAIL_PREPARE_SMS": "Falha ao enviar mensagem",
"IMPORT_FAILED": "Falha na importação",
"IMPORT_FROM_CSV_EXPLAIN": "Você pode importar registros e favoritos de um arquivo CSV com o formato definido pelo Simple QR. Se você deseja transferir dados entre Android e iOS, use essa função.",
"INPUT_TAG": "Por favor, dê uma etiqueta ao favorito",
"INVALID_BK_FILE": "Este não é um arquivo de backup válido.",
"INVALID_CSV_FILE": "Este não é um arquivo CSV válido.",
"NOT_BASE64_DE": "Os dados não podem ser decodificados em Base64",
"NOT_BASE64_EN": "Os dados não podem ser codificados em Base64",
"NOT_BASE64_EN_DE": "Os dados não podem ser codificados e decodificados em Base64",
"NO_QR_CODE": "Não é possível detectar o Código QR",
"ONLY_VCARD_3_0": "Apenas vCard 3.0 é suportado",
"PLEASE_INPUT_VALID_SECRET": "Por favor, insira um código válido",
"PORTRAIT_ONLY": "Retrato bloqueado",
"PREPARE_SMS": "Preparando mensagem",
"PREVIOUS_RECORDS": "Registros anteriores de escaneamento, criação ou visualização",
"QR_CODE_VALUE_NOT_EMPTY": "O valor do Código QR não pode estar vazio",
"READ_IMAGE_PERMISSION": "Você deve conceder permissão de Armazenamento para escanear imagem.",
"RECORDS_LIMIT_EXPLAIN": "Limite o número de registros que podem ser armazenados. O registro mais antigo será excluído quando o limite for atingido.",
"REMOVE_ALL_BOOKMARKS": "Tem certeza de que deseja remover todos os textos favoritados? <b>Esta ação não pode ser desfeita.</b>",
"REMOVE_ALL_RECORD": "Tem certeza de que deseja remover todos os registros? <b>Esta ação não pode ser desfeita.</b>",
"RESET_APP": "Tem certeza de que deseja redefinir este aplicativo e excluir todos os dados? <b>Esta ação não pode ser desfeita.</b>",
"RESET_DEFAULT": "Tem certeza de que deseja redefinir para o padrão?",
"RESTORE_EXPLAIN": "Você pode restaurar um backup anterior de registros e favoritos. Os itens do backup serão mesclados aos registros existentes. O tipo de arquivo de backup deve ser TFSQBK.",
"RESTORE_EXPLAIN_IOS": "Você pode restaurar um backup anterior de registros e favoritos. Os itens do backup serão mesclados aos registros existentes. O tipo de arquivo de backup deve ser ISQBK.",
"RESTORE_FAILED": "Falha ao restaurar",
"RESTORE_SECRET": "Por favor, insira o código para restaurar os registros",
"RESTORE_SUCCESSFUL": "Restaurado com sucesso",
"RESTORE_WRONG_SECRET": "Código incorreto",
"SAVED_CONTACT": "Contato salvo",
"SAVING_CONTACT": "Salvando contato",
"SCAN_QR_FROM_IMAGE": "O Simple QR utiliza o módulo \"cozmo/jsQR\" para escanear códigos QR a partir de imagens. Para escanear com sucesso,",
"SCAN_QR_FROM_IMAGE_R1": "Autorize o aplicativo a acessar o Armazenamento ou a Biblioteca de Fotos.",
"SCAN_QR_FROM_IMAGE_R2": "Certifique-se de que o plano de fundo da imagem selecionada não seja transparente. É recomendável escolher uma imagem que não seja capturada pela câmera.",
"SCAN_QR_FROM_IMAGE_R3": "Cancele a edição de fotos se desejar escanear a imagem inteira. (se aplicável)",
"SEARCH": "Qual conteúdo você deseja buscar?",
"SEARCH_ENGINE_EXPLAIN": "Escolha o mecanismo de busca para as pesquisas.",
"SHARE_QR": "Apenas escaneie!\n\nCompartilhado pelo Simple QR",
"SMS_MAX_LENGTH": "Máx. 160 caracteres",
"SSID_MAX_LENGTH": "Máx. 32 caracteres",
"START_PAGE_EXPLAIN": "Escolha a página inicial do aplicativo.",
"START_PAGE_HEADER_EXPLAIN": "Mostrar o cabeçalho do Simple QR na página inicial.",
"TAG_MAX_LENGTH": "Máx. 30 caracteres",
"TAG_MAX_LENGTH_EXPLAIN": "O comprimento da etiqueta não deve exceder 30 caracteres.",
"TUTORIAL_NOT_SHOW_AGAIN": "Não mostrar novamente",
"TUTORIAL_SWIPE_LEFT": "Deslize para a esquerda para excluir o registro correspondente.",
"TUTORIAL_SWIPE_RIGHT": "Deslize para a direita para marcar o texto do registro correspondente / editar a etiqueta do marcador correspondente.",
"UNDO_DELETE": "Você pode desfazer a exclusão",
"VIBRATION_EXPLAIN": "Forneça vibração ou feedback tátil. Observe que nem todos os dispositivos suportam essa funcionalidade."
},
"BARCODE_TYPE": {
"1D": "Código de Barras 1D ",
"AZTEC": "Código Azteca ",
"DATA_MATRIX": "Matriz de Dados ",
"EAN": "Número de Artigo Europeu ",
"MAXICODE": "MaxiCode ",
"PDF_417": "PDF417 ",
"QR_CODE": "Código QR ",
"RSS": "GS1 DataBar ",
"UPC": "Código de Produto Universal "
},
"UPDATE": {
"UPDATE_NOTES_ANDROID": "<p>Esta versão traz várias atualizações e novos recursos. Por favor, verifique o GitHub para obter detalhes.</p>",
"UPDATE_NOTES_IOS": "<p>Esta versão traz várias atualizações e novos recursos. Por favor, verifique o GitHub para obter detalhes.</p>"
}
}

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Полный сброс", "FULL_RESET": "Полный сброс",
"FUNCTIONS": "Функции", "FUNCTIONS": "Функции",
"GENDER": "Пол", "GENDER": "Пол",
"GEOLOCATION": "Геолокация",
"GOOGLE_SEARCH": "Google Search", "GOOGLE_SEARCH": "Google Search",
"HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик", "HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик",
"HIDDEN_NETWORK_?": "Скрытая сеть?", "HIDDEN_NETWORK_?": "Скрытая сеть?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Должность", "JOB_TITLE": "Должность",
"LANGUAGE": "Язык", "LANGUAGE": "Язык",
"LAST_NAME": "Фамилия", "LAST_NAME": "Фамилия",
"LATITUDE": "Широта",
"LEVEL_H": "Уровень H", "LEVEL_H": "Уровень H",
"LEVEL_L": "Уровень L", "LEVEL_L": "Уровень L",
"LEVEL_M": "Уровень M", "LEVEL_M": "Уровень M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Портретная", "LOCK_PORTRAIT": "Портретная",
"LOG": "История", "LOG": "История",
"LOG_BACKUP_AND_RESTORE": "История и восстановление", "LOG_BACKUP_AND_RESTORE": "История и восстановление",
"LONGITUDE": "Долгота",
"MALE": "Мужской", "MALE": "Мужской",
"MANAGE_RECORDS": "Управление записями", "MANAGE_RECORDS": "Управление записями",
"MARGIN": "Отступ", "MARGIN": "Отступ",

View file

@ -92,6 +92,7 @@
"FULL_RESET": "完整重设", "FULL_RESET": "完整重设",
"FUNCTIONS": "功能", "FUNCTIONS": "功能",
"GENDER": "性别", "GENDER": "性别",
"GEOLOCATION": "地理定位",
"GOOGLE_SEARCH": "Google 搜索", "GOOGLE_SEARCH": "Google 搜索",
"HAPTIC_FEEDBACK_ONLY": "仅触感反馈", "HAPTIC_FEEDBACK_ONLY": "仅触感反馈",
"HIDDEN_NETWORK_?": "隐藏的网络?", "HIDDEN_NETWORK_?": "隐藏的网络?",
@ -105,6 +106,7 @@
"JOB_TITLE": "职位名称", "JOB_TITLE": "职位名称",
"LANGUAGE": "语言", "LANGUAGE": "语言",
"LAST_NAME": "姓氏", "LAST_NAME": "姓氏",
"LATITUDE": "纬度",
"LEVEL_H": "H 等级", "LEVEL_H": "H 等级",
"LEVEL_L": "L 等级", "LEVEL_L": "L 等级",
"LEVEL_M": "M 等级", "LEVEL_M": "M 等级",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "锁定纵向", "LOCK_PORTRAIT": "锁定纵向",
"LOG": "记录", "LOG": "记录",
"LOG_BACKUP_AND_RESTORE": "记录、备份与还原", "LOG_BACKUP_AND_RESTORE": "记录、备份与还原",
"LONGITUDE": "经度",
"MALE": "男性", "MALE": "男性",
"MANAGE_RECORDS": "管理记录", "MANAGE_RECORDS": "管理记录",
"MARGIN": "边距", "MARGIN": "边距",

View file

@ -92,6 +92,7 @@
"FULL_RESET": "完整重設", "FULL_RESET": "完整重設",
"FUNCTIONS": "功能", "FUNCTIONS": "功能",
"GENDER": "性別", "GENDER": "性別",
"GEOLOCATION": "地理位置",
"GOOGLE_SEARCH": "Google 搜尋", "GOOGLE_SEARCH": "Google 搜尋",
"HAPTIC_FEEDBACK_ONLY": "僅觸感反饋", "HAPTIC_FEEDBACK_ONLY": "僅觸感反饋",
"HIDDEN_NETWORK_?": "隱藏的網絡?", "HIDDEN_NETWORK_?": "隱藏的網絡?",
@ -105,6 +106,7 @@
"JOB_TITLE": "職位名稱", "JOB_TITLE": "職位名稱",
"LANGUAGE": "語言", "LANGUAGE": "語言",
"LAST_NAME": "姓氏", "LAST_NAME": "姓氏",
"LATITUDE": "緯度",
"LEVEL_H": "H 等級", "LEVEL_H": "H 等級",
"LEVEL_L": "L 等級", "LEVEL_L": "L 等級",
"LEVEL_M": "M 等級", "LEVEL_M": "M 等級",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "鎖定縱向", "LOCK_PORTRAIT": "鎖定縱向",
"LOG": "記錄", "LOG": "記錄",
"LOG_BACKUP_AND_RESTORE": "記錄、備份與還原", "LOG_BACKUP_AND_RESTORE": "記錄、備份與還原",
"LONGITUDE": "經度",
"MALE": "男性", "MALE": "男性",
"MANAGE_RECORDS": "管理記錄", "MANAGE_RECORDS": "管理記錄",
"MARGIN": "邊距", "MARGIN": "邊距",