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.
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.
@ -46,11 +46,12 @@ By using the app, you can
* Execute base64 encoding/decoding on it.
* Use it as a content to generate a new shareable QR code.
* Do corresponding tasks if it is a
* URL: Browse website
* URL: Browse website / Open application
* vCard contact: Add contact
* Phone number: Phone call, add contact
* Message: Send message, add contact
* Email: Send email
* Geolocation: Open map
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
* English (en)
* Traditional Chinese (Hong Kong) 中文 (香港) (zh-HK)
* Simplified Chinese 简体中文 (zh-CN)
* Chinese (Hong Kong) 中文 (香港) (zh-HK)
* Chinese (Simplified) 简体中文 (zh-CN)
* German Deutsch (de)
* French Français (fr)
* Italian Italiano (it)
* Portuguese (Brazil) (pt-BR)
* Russian Русский (ru)
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 |
| Valentino Bocchetti | [luftmensch-luftmensch](https://github.com/luftmensch-luftmensch) | Italian 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
```sh
Ionic CLI : 7.1.1
Ionic Framework : @ionic/angular 7.1.3
@angular-devkit/build-angular : 16.1.4
@angular-devkit/schematics : 16.1.4
@angular/cli : 16.1.4
Ionic CLI : 7.2.0
Ionic Framework : @ionic/angular 7.8.2
@angular-devkit/build-angular : 16.2.13
@angular-devkit/schematics : 16.2.13
@angular/cli : 16.2.13
@ionic/angular-toolkit : 9.0.0
Capacitor CLI : 5.2.1
@capacitor/android : 5.2.1
@capacitor/core : 5.2.1
@capacitor/ios : 5.2.1
NodeJS : v18.16.1
npm : 9.5.1
Capacitor CLI : 5.7.4
@capacitor/android : 5.7.4
@capacitor/core : 5.7.4
@capacitor/ios : 5.7.4
```
## Privacy Policy

View file

@ -11,7 +11,7 @@
</map>
</option>
</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" />
</component>
<component name="ProjectType">

View file

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

View file

@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 4000100,
"versionName": "4.0.1",
"versionCode": 4010000,
"versionName": "4.1.0",
"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.
* 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.
* Aufgaben auf dem Ergebnis mit einem Fingertipp zu erledigen, einschließlich, aber nicht beschränkt auf
* Verwenden als Schlüsselwort für die Websuche.
@ -19,5 +19,6 @@ Mit der App ist das möglich
* Telefonnummer: Telefonanruf, Kontakt hinzufügen
* Nachricht: Nachricht senden, Kontakt hinzufügen
* E-Mail: E-Mail senden
* Geolokalisierung: Karte öffnen
* Passen Sie den generierten QR-Code an, z. Fehlerkorrekturstufe, Farbe, Rand und Bildschirmhelligkeit.
* 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.
* 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.
* Do tasks on the result with a tap, including but not limited to
* 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.
* Generate a new shareable QR code by using it as the content.
* Do corresponding tasks if it is a
* URL: Browse website
* URL: Browse website / Open application
* vCard contact: Add contact
* Phone number: Phone call, add contact
* Message: Send message, add contact
* Email: Send email
* Geolocation: Open map
* 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.

View file

@ -399,7 +399,7 @@
INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
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\"";
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
PRODUCT_NAME = "$(TARGET_NAME)";
@ -422,7 +422,7 @@
INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
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_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Simple QR";

View file

@ -1,36 +1,36 @@
PODS:
- Capacitor (5.2.1):
- Capacitor (5.7.4):
- CapacitorCordova
- CapacitorApp (5.0.6):
- CapacitorApp (5.0.7):
- Capacitor
- CapacitorCamera (5.0.6):
- CapacitorCamera (5.0.9):
- Capacitor
- CapacitorClipboard (5.0.6):
- CapacitorClipboard (5.0.7):
- Capacitor
- CapacitorCommunityBarcodeScanner (4.0.1):
- Capacitor
- CapacitorCommunityContacts (5.0.4):
- CapacitorCommunityContacts (5.0.5):
- Capacitor
- CapacitorCommunityScreenBrightness (5.0.0):
- Capacitor
- CapacitorCordova (5.2.1)
- CapacitorDevice (5.0.6):
- CapacitorCordova (5.7.4)
- CapacitorDevice (5.0.7):
- Capacitor
- CapacitorFilesystem (5.1.0):
- CapacitorFilesystem (5.2.1):
- Capacitor
- CapacitorHaptics (5.0.6):
- CapacitorHaptics (5.0.7):
- Capacitor
- CapacitorKeyboard (5.0.6):
- CapacitorKeyboard (5.0.8):
- Capacitor
- CapacitorPreferences (5.0.6):
- CapacitorPreferences (5.0.7):
- Capacitor
- CapacitorSplashScreen (5.0.6):
- CapacitorSplashScreen (5.0.7):
- Capacitor
- CapacitorStatusBar (5.0.6):
- CapacitorStatusBar (5.0.7):
- Capacitor
- CapacitorToast (5.0.6):
- CapacitorToast (5.0.7):
- Capacitor
- CordovaPlugins (5.2.1):
- CordovaPlugins (5.7.4):
- CapacitorCordova
DEPENDENCIES:
@ -89,23 +89,23 @@ EXTERNAL SOURCES:
:path: "../capacitor-cordova-ios-plugins"
SPEC CHECKSUMS:
Capacitor: 36510199454641113344c2e5ef43bf3f54b5af79
CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a
CapacitorCamera: 4a95204d13a05b0b726bf9086b44124349ab1952
CapacitorClipboard: 77edf49827ea21da2a9c05c690a4a6a4d07199c4
Capacitor: 4fe9adf012caceb4c71ffea2f1f4d005cdcbeea7
CapacitorApp: 17fecd0e6cb23feafac7eb0939417389038b0979
CapacitorCamera: 4892c5c392f60039d853dde78bc50ba19fbd113e
CapacitorClipboard: 45e5e25f2271f98712985d422776cdc5a779cca1
CapacitorCommunityBarcodeScanner: 7feb206489c8555a8ca0c74c57ddf49ead774eb8
CapacitorCommunityContacts: 45de2477f7dc6265d267677939a2c75465d2ed87
CapacitorCommunityContacts: e8fbc4d669c9478a29f1e104818b4c16e158b2e0
CapacitorCommunityScreenBrightness: b2d9c6fffee6b684994cd69f727f2090e2f05c6d
CapacitorCordova: d173eeb1635e62aa95a20874a5d5cbbf0aa1e0df
CapacitorDevice: 2c968f98a1ec4d22357418c1521e7ddc46c675e6
CapacitorFilesystem: 071f1ea81928a56c62c231f9f48f96983cf0eada
CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c
CapacitorKeyboard: b978154b024a5f65e044908e37d15b7de58b9d12
CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10
CapacitorSplashScreen: 5fa2ab5e46cf5cc530cf16a51c80c7a986579ccd
CapacitorStatusBar: 565c0a1ebd79bb40d797606a8992b4a105885309
CapacitorToast: bb0d79b78d9c27c0199b57f735dd50b8fc363489
CordovaPlugins: b6cca1806c2470c768387b8e3f0d8193fed80787
CapacitorCordova: a6e87fccc0307dee7aec1560ec9398485f2b0ce7
CapacitorDevice: fc91bdb484dc0e70755e9b621cd557afe642613a
CapacitorFilesystem: 9f3e3c7fea2fff12f46dd5b07a2914f2103e4cfc
CapacitorHaptics: 7c7c206f0c96a628fed073830c96d28c4b2e772e
CapacitorKeyboard: aec619a578235c6ce279075009a2689c2cf5c42c
CapacitorPreferences: 77ac427e98db83bace772455f8ba447430382c4c
CapacitorSplashScreen: dd3de3f3644710fa2a697cfb91ec262eece4d242
CapacitorStatusBar: f390fbb49b82ffb754ea4b3cf71dc8b048baf3e7
CapacitorToast: c8bb89eeb59a23c1fc298f138cc06c8ff4d90ac1
CordovaPlugins: 5495649167d6829fea7bc7eacd2034646aee5bd1
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",
"version": "4.0.1",
"version": "4.1.0",
"author": "Tom Fong",
"scripts": {
"ng": "ng",
@ -20,48 +20,48 @@
"@angular/cdk": "^16.1.3",
"@angular/common": "^16.1.3",
"@angular/core": "^16.1.3",
"@angular/forms": "^16.1.5",
"@angular/localize": "^16.1.5",
"@angular/forms": "^16.2.12",
"@angular/localize": "^16.2.12",
"@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-dynamic": "^16.1.5",
"@angular/router": "^16.1.5",
"@awesome-cordova-plugins/aes-256": "^6.4.0",
"@awesome-cordova-plugins/chooser": "^6.4.0",
"@awesome-cordova-plugins/core": "^6.4.0",
"@awesome-cordova-plugins/screen-orientation": "^6.4.0",
"@awesome-cordova-plugins/sms": "^6.4.0",
"@awesome-cordova-plugins/social-sharing": "^6.4.0",
"@awesome-cordova-plugins/theme-detection": "^6.4.0",
"@angular/platform-browser-dynamic": "^16.2.12",
"@angular/router": "^16.2.12",
"@awesome-cordova-plugins/aes-256": "^6.6.0",
"@awesome-cordova-plugins/chooser": "^6.6.0",
"@awesome-cordova-plugins/core": "^6.6.0",
"@awesome-cordova-plugins/screen-orientation": "^6.6.0",
"@awesome-cordova-plugins/sms": "^6.6.0",
"@awesome-cordova-plugins/social-sharing": "^6.6.0",
"@awesome-cordova-plugins/theme-detection": "^6.6.0",
"@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/android": "^5.2.1",
"@capacitor/app": "^5.0.6",
"@capacitor/camera": "^5.0.6",
"@capacitor/clipboard": "^5.0.6",
"@capacitor/core": "^5.2.1",
"@capacitor/device": "^5.0.6",
"@capacitor/filesystem": "^5.1.0",
"@capacitor/haptics": "^5.0.6",
"@capacitor/ios": "^5.2.1",
"@capacitor/keyboard": "^5.0.6",
"@capacitor/preferences": "^5.0.6",
"@capacitor/splash-screen": "^5.0.6",
"@capacitor/status-bar": "^5.0.6",
"@capacitor/toast": "^5.0.6",
"@ionic/angular": "^7.1.3",
"@capacitor/android": "^5.7.4",
"@capacitor/app": "^5.0.7",
"@capacitor/camera": "^5.0.9",
"@capacitor/clipboard": "^5.0.7",
"@capacitor/core": "^5.7.4",
"@capacitor/device": "^5.0.7",
"@capacitor/filesystem": "^5.2.1",
"@capacitor/haptics": "^5.0.7",
"@capacitor/ios": "^5.7.4",
"@capacitor/keyboard": "^5.0.8",
"@capacitor/preferences": "^5.0.7",
"@capacitor/splash-screen": "^5.0.7",
"@capacitor/status-bar": "^5.0.7",
"@capacitor/toast": "^5.0.7",
"@ionic/angular": "^7.8.2",
"@ionic/storage": "^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/http-loader": "^8.0.0",
"angularx-qrcode": "^16.0.0",
"bootstrap": "^5.3.0",
"angularx-qrcode": "^16.0.2",
"bootstrap": "^5.3.3",
"cordova-plugin-aes256-encryption": "^2.0.1",
"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-x-socialsharing": "^6.0.4",
"cordova-sms-plugin": "^1.0.3",
@ -74,26 +74,26 @@
"properties-parser": "^0.3.1",
"rxjs": "^7.8.1",
"strip-final-newline": "^2.0.0",
"tslib": "^2.6.0",
"tslib": "^2.6.2",
"uuid": "^8.3.2",
"zone.js": "^0.13.1"
"zone.js": "^0.13.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "^16.1.4",
"@angular/cli": "^16.1.4",
"@angular-devkit/build-angular": "^16.2.13",
"@angular/cli": "^16.2.13",
"@angular/compiler": "^16.1.3",
"@angular/compiler-cli": "^16.1.3",
"@angular/language-service": "^16.1.5",
"@capacitor/cli": "^5.2.1",
"@angular/language-service": "^16.2.12",
"@capacitor/cli": "^5.7.4",
"@ionic/angular-toolkit": "^9.0.0",
"@ionic/cli": "^7.1.1",
"@types/jasmine": "^3.10.11",
"@types/jasminewd2": "^2.0.10",
"@ionic/cli": "^7.2.0",
"@types/jasmine": "^3.10.18",
"@types/jasminewd2": "^2.0.13",
"@types/node": "^12.20.55",
"@types/uuid": "^8.3.4",
"jasmine-core": "~3.8.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "^6.4.2",
"karma": "^6.4.3",
"karma-chrome-launcher": "^3.2.0",
"karma-coverage": "~2.0.3",
"karma-coverage-istanbul-reporter": "~3.0.2",

View file

@ -215,6 +215,25 @@
</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'">
<ion-row class="ion-padding-horizontal" [@inAnimation]>
<ion-col>

View file

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

View file

@ -18,7 +18,7 @@
<ion-col>
<ion-badge class="p-2" color="primary">
<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>
<span>{{ contentTypeText }}</span>
</div>
@ -96,6 +96,15 @@
[ngTemplateOutletContext]="{ label: 'HIDDEN_NETWORK_?' | translate, content: wifiHidden === true? ('YES' | translate) : ('NO' | translate) }">
</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>
@ -126,6 +135,13 @@
</ion-button>
</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'"
class="d-flex justify-content-center">
<ion-button (click)="tapHaptic(); addContact()" [color]="'primary'" fill="clear">
@ -245,10 +261,11 @@
<ion-icon class="pe-2" name="globe"></ion-icon>
<ion-label>{{ 'BROWSE' | translate}}</ion-label>
</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"
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-button>
<ion-button class="pe-1"
@ -340,7 +357,8 @@
[cdkAutosizeMaxRows]="20" readonly>
</textarea>
<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 }}
</button>
</mat-form-field>

View file

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

View file

@ -66,6 +66,17 @@
<ion-radio class="ion-margin-end" slot="end" [value]="'it'" [color]="'primary'">
</ion-radio>
</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-label class="ion-padding-start">
<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 { Haptics, ImpactStyle } from '@capacitor/haptics';
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({
selector: 'app-setting-record',
@ -196,7 +196,11 @@ export class SettingRecordPage {
handler: async data => {
alert.dismiss();
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 {
this.presentToast(this.translate.instant("MSG.PLEASE_INPUT_VALID_SECRET"), "short", "bottom");
}
@ -316,6 +320,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 "pt-BR":
rawCsvData = "ID,Conteúdo,Criado em,Origem,Tipo de código de barras,Marcado como favorito?,Tag\r\n";
break;
case "ru":
rawCsvData = "ID,Содержание,Создано в,Источник,Тип штрих-кода,В закладках?,Ярлык\r\n";
break;
@ -474,6 +481,9 @@ export class SettingRecordPage {
case "it":
locale = it;
break;
case "pt-BR":
locale = ptBR;
break;
case "ru":
locale = ru;
break;
@ -507,6 +517,9 @@ export class SettingRecordPage {
case "it":
locale = it;
break;
case "pt-BR":
locale = ptBR;
break;
case "ru":
locale = ru;
break;

View file

@ -86,7 +86,6 @@ export class TabsPage {
await Preferences.set({ key: storageKey, value: 'yes' });
if (!this.env.notShowUpdateNotes) {
this.env.notShowUpdateNotes = true;
await this.showUpdateNotes();
const versionWording = this.translate.instant("VERSION_VERSION") as string;
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 { 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 HistoryPageSegmentType = 'history' | 'bookmarks';
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 SearchEngineType = 'google' | 'bing' | 'yahoo' | 'duckduckgo' | 'yandex' | 'ecosia' | 'brave';
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({
providedIn: 'root'
})
export class EnvService {
public appVersionNumber: string = '4.0.1';
public appVersionNumber: string = '4.1.0';
public startPage: TabPageType = "/tabs/scan";
public historyPageStartSegment: HistoryPageSegmentType = 'history';
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 selectedLanguage: 'default' | LanguageType = 'default';
public colorTheme: ColorThemeType = 'light';
@ -45,7 +47,7 @@ export class EnvService {
public recordsLimit: 30 | 50 | 100 | -1 = -1;
public showNumberOfRecords: OnOffType = 'on';
public autoMaxBrightness: OnOffType = 'off';
public autoOpenUrl: OnOffType = 'on';
public autoOpenUrl: OnOffType = 'off';
public errorCorrectionLevel: ErrorCorrectionLevelType = 'M';
public qrCodeLightR: 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_AUTO_EXIT_MIN = "autoExitAppMin";
public readonly KEY_ANDROID_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40001";
public readonly KEY_IOS_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40001";
public readonly KEY_ANDROID_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40000";
public readonly KEY_IOS_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v40000";
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-v40100";
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-v40001";
public readonly APP_FOLDER_NAME: string = 'SimpleQR';
@ -1008,7 +1010,7 @@ export class EnvService {
if (result.value != null) {
this.autoOpenUrl = result.value as OnOffType;
} else {
this.autoOpenUrl = 'on';
this.autoOpenUrl = 'off';
}
}
);
@ -1207,7 +1209,7 @@ export class EnvService {
this.recordsLimit = -1;
this.showNumberOfRecords = 'on';
this.autoMaxBrightness = 'off';
this.autoOpenUrl = 'on';
this.autoOpenUrl = 'off';
this.errorCorrectionLevel = 'M';
this.qrCodeLightR = 255;
this.qrCodeLightG = 255;
@ -1281,7 +1283,7 @@ export class EnvService {
this.autoMaxBrightness = 'off';
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 });
this.errorCorrectionLevel = 'M';
@ -1632,6 +1634,9 @@ export class EnvService {
case "it":
language = "it"
break;
case "pt":
language = "pt-BR";
break;
case "ru":
language = "ru"
break;

View file

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

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Full Reset",
"FUNCTIONS": "Functions",
"GENDER": "Gender",
"GEOLOCATION": "Geolocation",
"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": "Latitude",
"LEVEL_H": "Level H",
"LEVEL_L": "Level L",
"LEVEL_M": "Level M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Lock Portrait",
"LOG": "Log",
"LOG_BACKUP_AND_RESTORE": "Log, Backup & Restore",
"LONGITUDE": "Longitude",
"MALE": "Male",
"MANAGE_RECORDS": "Manage Records",
"MARGIN": "Margin",

View file

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

View file

@ -92,6 +92,7 @@
"FULL_RESET": "Reset",
"FUNCTIONS": "Opzioni",
"GENDER": "Sesso",
"GEOLOCATION": "Geolocalizzazione",
"GOOGLE_SEARCH": "Ricerca con Google",
"HAPTIC_FEEDBACK_ONLY": "Feedback disponibile solo tramite Haptic",
"HIDDEN_NETWORK_?": "Rete nascosta?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Titolo di lavoro",
"LANGUAGE": "Lingua",
"LAST_NAME": "Cognome",
"LATITUDE": "Latitudine",
"LEVEL_H": "Livello H",
"LEVEL_L": "Livello L",
"LEVEL_M": "Livello M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Blocca vista verticale",
"LOG": "Log",
"LOG_BACKUP_AND_RESTORE": "Logga, Esegui backup & Ripristina",
"LONGITUDE": "Longitudine",
"MALE": "Uomo",
"MANAGE_RECORDS": "Gestisci record",
"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": "Полный сброс",
"FUNCTIONS": "Функции",
"GENDER": "Пол",
"GEOLOCATION": "Геолокация",
"GOOGLE_SEARCH": "Google Search",
"HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик",
"HIDDEN_NETWORK_?": "Скрытая сеть?",
@ -105,6 +106,7 @@
"JOB_TITLE": "Должность",
"LANGUAGE": "Язык",
"LAST_NAME": "Фамилия",
"LATITUDE": "Широта",
"LEVEL_H": "Уровень H",
"LEVEL_L": "Уровень L",
"LEVEL_M": "Уровень M",
@ -115,6 +117,7 @@
"LOCK_PORTRAIT": "Портретная",
"LOG": "История",
"LOG_BACKUP_AND_RESTORE": "История и восстановление",
"LONGITUDE": "Долгота",
"MALE": "Мужской",
"MANAGE_RECORDS": "Управление записями",
"MARGIN": "Отступ",

View file

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

View file

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