Compare commits
52 commits
Author | SHA1 | Date | |
---|---|---|---|
|
e7ba5042ee | ||
|
4e436c70ce | ||
|
350da61d17 | ||
|
f6ab4c1e4e | ||
|
1b0d12eb65 | ||
|
f1244c4fbd | ||
|
62dda58723 | ||
|
03c04c94d1 | ||
|
91b81b1054 | ||
|
84dc016cb4 | ||
|
ca629c760d | ||
|
d11464883c | ||
|
244ee01e2b | ||
|
0a798516d1 | ||
|
311ed12770 | ||
|
10ed53b92f | ||
|
c536146abb | ||
|
691eebd416 | ||
|
e3a1961773 | ||
|
5210141b9c | ||
|
475146a8a0 | ||
|
0fd54cf17f | ||
|
57577d257d | ||
|
8ca3a493c6 | ||
|
b4ada90d22 | ||
|
043d5b3462 | ||
|
4e5134bdaf | ||
|
2128a7b9ae | ||
|
26d28e811f | ||
|
f8bfdcf52e | ||
|
94bd973730 | ||
|
75caab2976 | ||
|
59791dfb42 | ||
|
f5dd413a93 | ||
|
68dbecdbee | ||
|
6812279341 | ||
|
ae1a4847d0 | ||
|
3f4a9220d9 | ||
|
b9d329bd13 | ||
|
90ebc52537 | ||
|
3a42fb84ef | ||
|
01d67ec2a8 | ||
|
493bfd2d64 | ||
|
1575d7ec92 | ||
|
41de9c763e | ||
|
262459f1e1 | ||
|
04949d2bf9 | ||
|
c1c8a2171e | ||
|
7a6c4115f3 | ||
|
fe2833c41b | ||
|
bede343db9 | ||
|
f87717efb2 |
1
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
|
50
README.md
|
@ -20,13 +20,13 @@
|
|||
|
||||
## About
|
||||
|
||||
Simple QR is a FOSS app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.
|
||||
Simple QR is an open-source app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.
|
||||
|
||||
It's now available on the following platforms.
|
||||
|
||||
| App Store | Google Play | GitHub | IzzyOnDroid |
|
||||
|:-:|:-:|:-:|:-:|
|
||||
| [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/appstore-badge.png" height="50">](https://apps.apple.com/us/app/simple-qr-by-tom-fong/id1621121553) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=com.tomfong.simpleqr) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/github-badge.png" height="50">](https://github.com/tomfong/simple-qr/releases/latest) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/IzzyOnDroid-badge.png" height="50">](https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr) |
|
||||
| Google Play | GitHub | IzzyOnDroid |
|
||||
|:-:|:-:|:-:|
|
||||
| [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=com.tomfong.simpleqr) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/github-badge.png" height="50">](https://github.com/tomfong/simple-qr/releases/latest) | [<img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/IzzyOnDroid-badge.png" height="50">](https://apt.izzysoft.de/fdroid/index/apk/com.tomfong.simpleqr) |
|
||||
|
||||
## Features
|
||||
|
||||
|
@ -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,13 @@ 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>)
|
||||
|
||||
|
@ -75,10 +78,8 @@ You are welcomed to help translate the app into more languages (refer to this <a
|
|||
|
||||
* Sponsor the project.
|
||||
|
||||
<div>
|
||||
<a href="https://linktr.ee/tomfonghk"><img src="https://raw.githubusercontent.com/tomfong/simple-qr/main/.github/images/Paypal-badge.png" width="170" alt="tomfong"/></a>
|
||||
<a href="https://www.buymeacoffee.com/tomfong"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" height="50" width="180" alt="tomfong" /></a>
|
||||
</div>
|
||||
[](https://github.com/sponsors/tomfong?frequency=one-time)
|
||||
[](https://www.buymeacoffee.com/tomfong)
|
||||
|
||||
* Star the project.
|
||||
|
||||
|
@ -116,24 +117,23 @@ 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 : 6.20.4
|
||||
Ionic Framework : @ionic/angular 6.3.7
|
||||
@angular-devkit/build-angular : 14.2.10
|
||||
@angular-devkit/schematics : 14.2.10
|
||||
@angular/cli : 14.2.10
|
||||
@ionic/angular-toolkit : 6.1.0
|
||||
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 : 4.5.0
|
||||
@capacitor/android : 4.5.0
|
||||
@capacitor/core : 4.5.0
|
||||
@capacitor/ios : 4.5.0
|
||||
|
||||
NodeJS : v16.15.1
|
||||
npm : 9.1.1
|
||||
Capacitor CLI : 5.7.4
|
||||
@capacitor/android : 5.7.4
|
||||
@capacitor/core : 5.7.4
|
||||
@capacitor/ios : 5.7.4
|
||||
```
|
||||
|
||||
## Privacy Policy
|
||||
|
|
2
android/.idea/compiler.xml
generated
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel target="11" />
|
||||
<bytecodeTargetLevel target="17" />
|
||||
</component>
|
||||
</project>
|
2
android/.idea/misc.xml
generated
|
@ -11,7 +11,7 @@
|
|||
</map>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" 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">
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
namespace "com.tomfong.simpleqr"
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
defaultConfig {
|
||||
applicationId "com.tomfong.simpleqr"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 3020000
|
||||
versionName "3.2.0"
|
||||
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.
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
android {
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
}
|
||||
|
||||
|
|
20
android/app/release/output-metadata.json
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"version": 3,
|
||||
"artifactType": {
|
||||
"type": "APK",
|
||||
"kind": "Directory"
|
||||
},
|
||||
"applicationId": "com.tomfong.simpleqr",
|
||||
"variantName": "release",
|
||||
"elements": [
|
||||
{
|
||||
"type": "SINGLE",
|
||||
"filters": [],
|
||||
"attributes": [],
|
||||
"versionCode": 4010000,
|
||||
"versionName": "4.1.0",
|
||||
"outputFile": "app-release.apk"
|
||||
}
|
||||
],
|
||||
"elementType": "File"
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.tomfong.simpleqr">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" >
|
||||
|
||||
<application
|
||||
android:hardwareAccelerated="true"
|
||||
|
@ -39,8 +39,14 @@
|
|||
</application>
|
||||
|
||||
<!-- Permissions -->
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.camera"
|
||||
android:required="true" />
|
||||
</manifest>
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
},
|
||||
{
|
||||
"pkg": "@capacitor-community/contacts",
|
||||
"classpath": "ch.byrds.capacitor.contacts.Contacts"
|
||||
"classpath": "getcapacitor.community.contacts.ContactsPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor-community/screen-brightness",
|
||||
|
|
6
android/app/src/main/res/values-ru/colors.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<color tools:ignore="UnusedResources" name="colorPrimary">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorPrimaryDark">#00a5aa</color>
|
||||
<color tools:ignore="UnusedResources" name="colorAccent">#00a5aa</color>
|
||||
</resources>
|
7
android/app/src/main/res/values-ru/strings.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="app_name">Simple QR</string>
|
||||
<string name="title_activity_main">Simple QR</string>
|
||||
<string name="package_name">com.tomfong.simpleqr</string>
|
||||
<string name="custom_url_scheme">com.tomfong.simpleqr</string>
|
||||
</resources>
|
22
android/app/src/main/res/values-ru/styles.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:background">@null</item>
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
|
||||
<item name="android:background">@drawable/splash_background</item>
|
||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||
</style>
|
||||
</resources>
|
|
@ -1,14 +1,14 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
|
||||
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.2.1'
|
||||
classpath 'com.google.gms:google-services:4.3.13'
|
||||
classpath 'com.android.tools.build:gradle:8.0.2'
|
||||
classpath 'com.google.gms:google-services:4.3.15'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
|
@ -20,5 +20,4 @@ org.gradle.jvmargs=-Xmx1536m
|
|||
# Android operating system, and which are packaged with your app's APK
|
||||
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
||||
android.useAndroidX=true
|
||||
# Automatically convert third-party libraries to use AndroidX
|
||||
android.enableJetifier=true
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
ext {
|
||||
minSdkVersion = 22
|
||||
compileSdkVersion = 32
|
||||
targetSdkVersion = 32
|
||||
androidxActivityVersion = '1.4.0'
|
||||
androidxAppCompatVersion = '1.4.2'
|
||||
compileSdkVersion = 33
|
||||
targetSdkVersion = 33
|
||||
androidxActivityVersion = '1.7.0'
|
||||
androidxAppCompatVersion = '1.6.1'
|
||||
androidxCoordinatorLayoutVersion = '1.2.0'
|
||||
androidxCoreVersion = '1.8.0'
|
||||
androidxFragmentVersion = '1.4.1'
|
||||
androidxCoreVersion = '1.10.0'
|
||||
androidxFragmentVersion = '1.5.6'
|
||||
junitVersion = '4.13.2'
|
||||
androidxJunitVersion = '1.1.3'
|
||||
androidxEspressoCoreVersion = '3.4.0'
|
||||
androidxJunitVersion = '1.1.5'
|
||||
androidxEspressoCoreVersion = '3.5.1'
|
||||
cordovaAndroidVersion = '10.1.1'
|
||||
coreSplashScreenVersion = '1.0.0-rc01'
|
||||
androidxWebkitVersion = '1.4.0'
|
||||
coreSplashScreenVersion = '1.0.0'
|
||||
androidxWebkitVersion = '1.6.1'
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
1
fastlane/metadata/android/en-US/changelogs/3000100.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Bug fix
|
3
fastlane/metadata/android/en-US/changelogs/3010000.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
* Support Ecosia
|
||||
* Support CSV export
|
||||
* Bug fix
|
2
fastlane/metadata/android/en-US/changelogs/3020000.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
* Support Open Food Facts
|
||||
* Bug fix
|
3
fastlane/metadata/android/en-US/changelogs/3030000.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
* Support Russian language
|
||||
* Allow user to manually save a record if auto logging is off
|
||||
* Minor update on UI
|
4
fastlane/metadata/android/en-US/changelogs/4000000.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
* Upgrade framework, improve performance and fix known bugs
|
||||
* Support Brave Search
|
||||
* Support open URL automatically
|
||||
* Allow user to further edit QR code content
|
1
fastlane/metadata/android/en-US/changelogs/4000100.txt
Normal file
|
@ -0,0 +1 @@
|
|||
* Fix import image issue
|
3
fastlane/metadata/android/en-US/changelogs/4010000.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
* Support geolocation QR code
|
||||
* Support Portuguese (Brazil) language
|
||||
* Disable auto URL opening by default
|
|
@ -1,12 +1,12 @@
|
|||
<i>Simple QR</i> is a FOSS app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.
|
||||
<i>Simple QR</i> is an open-source app to scan, create and store QR codes with a simple UI and experience. No backend service connected. No data collected. No ads.
|
||||
|
||||
English, French, German, Itanlian, Traditional Chinese and Simplified Chinese are supported.
|
||||
English, French, German, Itanlian, Russian, Traditional Chinese and Simplified Chinese are supported.
|
||||
|
||||
By using the app, you can:
|
||||
|
||||
* 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.
|
||||
|
|
2
ios/.gitignore
vendored
|
@ -1,9 +1,9 @@
|
|||
App/build
|
||||
App/Pods
|
||||
App/Podfile.lock
|
||||
App/App/public
|
||||
DerivedData
|
||||
xcuserdata
|
||||
|
||||
# Cordova plugins for Capacitor
|
||||
capacitor-cordova-ios-plugins
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1B75189429375EAB00800D38 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; };
|
||||
50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = "<group>"; };
|
||||
504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
|
@ -160,6 +161,7 @@
|
|||
de,
|
||||
fr,
|
||||
it,
|
||||
ru,
|
||||
);
|
||||
mainGroup = 504EC2FB1FED79650016851F;
|
||||
productRefGroup = 504EC3051FED79650016851F /* Products */;
|
||||
|
@ -268,6 +270,7 @@
|
|||
D26FE7F9283D1E6C002A61AE /* fr */,
|
||||
D26FE7FA283D1E76002A61AE /* de */,
|
||||
D29D2E2A2847C31D00566DFF /* it */,
|
||||
1B75189429375EAB00800D38 /* ru */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
|
@ -396,7 +399,7 @@
|
|||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 3.2.0;
|
||||
MARKETING_VERSION = 4.1.0;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -419,7 +422,7 @@
|
|||
INFOPLIST_FILE = App/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 3.2.0;
|
||||
MARKETING_VERSION = 4.1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.tomfong.simpleqr;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "Simple QR";
|
||||
|
|
Before Width: | Height: | Size: 588 B |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 743 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 2.7 KiB |
|
@ -1,116 +1,14 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@2x-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "AppIcon-512@2x.png",
|
||||
"scale" : "1x"
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "AppIcon-512@2x.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
6
ios/App/App/ru.lproj/InfoPlist.strings
Normal file
|
@ -0,0 +1,6 @@
|
|||
"CFBundleDisplayName" = "Simple QR";
|
||||
"CFBundleName" = "Simple QR";
|
||||
"NSCameraUsageDescription" = "Simple QR использует камеру для сканирования QR-кода и штрих-кодов";
|
||||
"NSContactsUsageDescription" = "Simple QR использует Контакты для добавления контакта";
|
||||
"NSPhotoLibraryAddUsageDescription" = "Simple QR использует библиотеку фотографий для сохранения изображения QR-кода";
|
||||
"NSPhotoLibraryUsageDescription" = "Simple QR использует библиотеку фотографий для импорта изображений и сканирования QR-кода.";
|
112
ios/App/Podfile.lock
Normal file
|
@ -0,0 +1,112 @@
|
|||
PODS:
|
||||
- Capacitor (5.7.4):
|
||||
- CapacitorCordova
|
||||
- CapacitorApp (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorCamera (5.0.9):
|
||||
- Capacitor
|
||||
- CapacitorClipboard (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorCommunityBarcodeScanner (4.0.1):
|
||||
- Capacitor
|
||||
- CapacitorCommunityContacts (5.0.5):
|
||||
- Capacitor
|
||||
- CapacitorCommunityScreenBrightness (5.0.0):
|
||||
- Capacitor
|
||||
- CapacitorCordova (5.7.4)
|
||||
- CapacitorDevice (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorFilesystem (5.2.1):
|
||||
- Capacitor
|
||||
- CapacitorHaptics (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorKeyboard (5.0.8):
|
||||
- Capacitor
|
||||
- CapacitorPreferences (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorSplashScreen (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorStatusBar (5.0.7):
|
||||
- Capacitor
|
||||
- CapacitorToast (5.0.7):
|
||||
- Capacitor
|
||||
- CordovaPlugins (5.7.4):
|
||||
- CapacitorCordova
|
||||
|
||||
DEPENDENCIES:
|
||||
- "Capacitor (from `../../node_modules/@capacitor/ios`)"
|
||||
- "CapacitorApp (from `../../node_modules/@capacitor/app`)"
|
||||
- "CapacitorCamera (from `../../node_modules/@capacitor/camera`)"
|
||||
- "CapacitorClipboard (from `../../node_modules/@capacitor/clipboard`)"
|
||||
- "CapacitorCommunityBarcodeScanner (from `../../node_modules/@capacitor-community/barcode-scanner`)"
|
||||
- "CapacitorCommunityContacts (from `../../node_modules/@capacitor-community/contacts`)"
|
||||
- "CapacitorCommunityScreenBrightness (from `../../node_modules/@capacitor-community/screen-brightness`)"
|
||||
- "CapacitorCordova (from `../../node_modules/@capacitor/ios`)"
|
||||
- "CapacitorDevice (from `../../node_modules/@capacitor/device`)"
|
||||
- "CapacitorFilesystem (from `../../node_modules/@capacitor/filesystem`)"
|
||||
- "CapacitorHaptics (from `../../node_modules/@capacitor/haptics`)"
|
||||
- "CapacitorKeyboard (from `../../node_modules/@capacitor/keyboard`)"
|
||||
- "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)"
|
||||
- "CapacitorSplashScreen (from `../../node_modules/@capacitor/splash-screen`)"
|
||||
- "CapacitorStatusBar (from `../../node_modules/@capacitor/status-bar`)"
|
||||
- "CapacitorToast (from `../../node_modules/@capacitor/toast`)"
|
||||
- CordovaPlugins (from `../capacitor-cordova-ios-plugins`)
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
Capacitor:
|
||||
:path: "../../node_modules/@capacitor/ios"
|
||||
CapacitorApp:
|
||||
:path: "../../node_modules/@capacitor/app"
|
||||
CapacitorCamera:
|
||||
:path: "../../node_modules/@capacitor/camera"
|
||||
CapacitorClipboard:
|
||||
:path: "../../node_modules/@capacitor/clipboard"
|
||||
CapacitorCommunityBarcodeScanner:
|
||||
:path: "../../node_modules/@capacitor-community/barcode-scanner"
|
||||
CapacitorCommunityContacts:
|
||||
:path: "../../node_modules/@capacitor-community/contacts"
|
||||
CapacitorCommunityScreenBrightness:
|
||||
:path: "../../node_modules/@capacitor-community/screen-brightness"
|
||||
CapacitorCordova:
|
||||
:path: "../../node_modules/@capacitor/ios"
|
||||
CapacitorDevice:
|
||||
:path: "../../node_modules/@capacitor/device"
|
||||
CapacitorFilesystem:
|
||||
:path: "../../node_modules/@capacitor/filesystem"
|
||||
CapacitorHaptics:
|
||||
:path: "../../node_modules/@capacitor/haptics"
|
||||
CapacitorKeyboard:
|
||||
:path: "../../node_modules/@capacitor/keyboard"
|
||||
CapacitorPreferences:
|
||||
:path: "../../node_modules/@capacitor/preferences"
|
||||
CapacitorSplashScreen:
|
||||
:path: "../../node_modules/@capacitor/splash-screen"
|
||||
CapacitorStatusBar:
|
||||
:path: "../../node_modules/@capacitor/status-bar"
|
||||
CapacitorToast:
|
||||
:path: "../../node_modules/@capacitor/toast"
|
||||
CordovaPlugins:
|
||||
:path: "../capacitor-cordova-ios-plugins"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Capacitor: 4fe9adf012caceb4c71ffea2f1f4d005cdcbeea7
|
||||
CapacitorApp: 17fecd0e6cb23feafac7eb0939417389038b0979
|
||||
CapacitorCamera: 4892c5c392f60039d853dde78bc50ba19fbd113e
|
||||
CapacitorClipboard: 45e5e25f2271f98712985d422776cdc5a779cca1
|
||||
CapacitorCommunityBarcodeScanner: 7feb206489c8555a8ca0c74c57ddf49ead774eb8
|
||||
CapacitorCommunityContacts: e8fbc4d669c9478a29f1e104818b4c16e158b2e0
|
||||
CapacitorCommunityScreenBrightness: b2d9c6fffee6b684994cd69f727f2090e2f05c6d
|
||||
CapacitorCordova: a6e87fccc0307dee7aec1560ec9398485f2b0ce7
|
||||
CapacitorDevice: fc91bdb484dc0e70755e9b621cd557afe642613a
|
||||
CapacitorFilesystem: 9f3e3c7fea2fff12f46dd5b07a2914f2103e4cfc
|
||||
CapacitorHaptics: 7c7c206f0c96a628fed073830c96d28c4b2e772e
|
||||
CapacitorKeyboard: aec619a578235c6ce279075009a2689c2cf5c42c
|
||||
CapacitorPreferences: 77ac427e98db83bace772455f8ba447430382c4c
|
||||
CapacitorSplashScreen: dd3de3f3644710fa2a697cfb91ec262eece4d242
|
||||
CapacitorStatusBar: f390fbb49b82ffb754ea4b3cf71dc8b048baf3e7
|
||||
CapacitorToast: c8bb89eeb59a23c1fc298f138cc06c8ff4d90ac1
|
||||
CordovaPlugins: 5495649167d6829fea7bc7eacd2034646aee5bd1
|
||||
|
||||
PODFILE CHECKSUM: dc80e3587547d0d302dad43090af30e2a96d6c5a
|
||||
|
||||
COCOAPODS: 1.11.3
|
11586
package-lock.json
generated
125
package.json
|
@ -1,8 +1,7 @@
|
|||
{
|
||||
"name": "simple-qr",
|
||||
"version": "3.2.0",
|
||||
"version": "4.1.0",
|
||||
"author": "Tom Fong",
|
||||
"homepage": "https://tomfong.github.io",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"build:an": "ionic cap build android --prod --no-open",
|
||||
|
@ -17,55 +16,55 @@
|
|||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@angular/animations": "^14.2.3",
|
||||
"@angular/cdk": "^14.2.2",
|
||||
"@angular/common": "^14.2.3",
|
||||
"@angular/core": "^14.2.3",
|
||||
"@angular/forms": "^14.2.11",
|
||||
"@angular/localize": "^14.2.11",
|
||||
"@angular/material": "^14.2.2",
|
||||
"@angular/material-moment-adapter": "^14.2.7",
|
||||
"@angular/platform-browser": "^14.2.3",
|
||||
"@angular/platform-browser-dynamic": "^14.2.11",
|
||||
"@angular/router": "^14.2.11",
|
||||
"@awesome-cordova-plugins/aes-256": "^6.2.0",
|
||||
"@awesome-cordova-plugins/chooser": "^6.2.0",
|
||||
"@awesome-cordova-plugins/core": "^6.2.0",
|
||||
"@awesome-cordova-plugins/screen-orientation": "^6.2.0",
|
||||
"@awesome-cordova-plugins/sms": "^6.2.0",
|
||||
"@awesome-cordova-plugins/social-sharing": "^6.2.0",
|
||||
"@awesome-cordova-plugins/theme-detection": "^6.2.0",
|
||||
"@capacitor-community/barcode-scanner": "^3.0.0",
|
||||
"@capacitor-community/contacts": "^2.0.0-0",
|
||||
"@capacitor-community/screen-brightness": "^4.0.0",
|
||||
"@capacitor/android": "^4.5.0",
|
||||
"@capacitor/app": "^4.1.1",
|
||||
"@capacitor/camera": "^4.1.4",
|
||||
"@capacitor/clipboard": "^4.1.0",
|
||||
"@capacitor/core": "^4.5.0",
|
||||
"@capacitor/device": "^4.1.0",
|
||||
"@capacitor/filesystem": "^4.1.4",
|
||||
"@capacitor/haptics": "^4.1.0",
|
||||
"@capacitor/ios": "^4.5.0",
|
||||
"@capacitor/keyboard": "^4.1.0",
|
||||
"@capacitor/preferences": "^4.0.2",
|
||||
"@capacitor/splash-screen": "^4.1.2",
|
||||
"@capacitor/status-bar": "^4.1.0",
|
||||
"@capacitor/toast": "^4.1.0",
|
||||
"@ionic/angular": "^6.3.7",
|
||||
"@ionic/storage": "^3.0.6",
|
||||
"@ionic/storage-angular": "^3.0.6",
|
||||
"@ng-bootstrap/ng-bootstrap": "^13.1.1",
|
||||
"@ngx-translate/core": "^13.0.0",
|
||||
"@ngx-translate/http-loader": "^6.0.0",
|
||||
"@techiediaries/ngx-qrcode": "^9.1.0",
|
||||
"bootstrap": "^4.6.2",
|
||||
"@angular/animations": "^16.1.3",
|
||||
"@angular/cdk": "^16.1.3",
|
||||
"@angular/common": "^16.1.3",
|
||||
"@angular/core": "^16.1.3",
|
||||
"@angular/forms": "^16.2.12",
|
||||
"@angular/localize": "^16.2.12",
|
||||
"@angular/material": "^16.1.3",
|
||||
"@angular/material-moment-adapter": "^16.2.14",
|
||||
"@angular/platform-browser": "^16.1.3",
|
||||
"@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.5",
|
||||
"@capacitor-community/screen-brightness": "^5.0.0",
|
||||
"@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.2",
|
||||
"@ngx-translate/core": "^15.0.0",
|
||||
"@ngx-translate/http-loader": "^8.0.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.2",
|
||||
"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.2",
|
||||
"cordova-sms-plugin": "^1.0.3",
|
||||
"date-fns": "2.29.3",
|
||||
"es6-promise-plugin": "^4.2.2",
|
||||
"human-signals": "^2.1.0",
|
||||
|
@ -73,34 +72,34 @@
|
|||
"material-design-icons": "^3.0.1",
|
||||
"osenv": "^0.1.5",
|
||||
"properties-parser": "^0.3.1",
|
||||
"rxjs": "^6.6.7",
|
||||
"rxjs": "^7.8.1",
|
||||
"strip-final-newline": "^2.0.0",
|
||||
"tslib": "^2.4.1",
|
||||
"tslib": "^2.6.2",
|
||||
"uuid": "^8.3.2",
|
||||
"zone.js": "^0.11.8"
|
||||
"zone.js": "^0.13.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^14.2.10",
|
||||
"@angular/cli": "^14.2.10",
|
||||
"@angular/compiler": "^14.2.3",
|
||||
"@angular/compiler-cli": "^14.2.3",
|
||||
"@angular/language-service": "^14.2.11",
|
||||
"@capacitor/cli": "^4.5.0",
|
||||
"@ionic/angular-toolkit": "^6.1.0",
|
||||
"@ionic/cli": "6.20.1",
|
||||
"@types/jasmine": "^3.10.6",
|
||||
"@types/jasminewd2": "^2.0.10",
|
||||
"@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.2.12",
|
||||
"@capacitor/cli": "^5.7.4",
|
||||
"@ionic/angular-toolkit": "^9.0.0",
|
||||
"@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.1",
|
||||
"karma-chrome-launcher": "^3.1.1",
|
||||
"karma": "^6.4.3",
|
||||
"karma-chrome-launcher": "^3.2.0",
|
||||
"karma-coverage": "~2.0.3",
|
||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
||||
"karma-jasmine": "^4.0.2",
|
||||
"karma-jasmine-html-reporter": "^1.7.0",
|
||||
"ts-node": "~8.3.0",
|
||||
"typescript": "~4.8.3"
|
||||
"typescript": "^5.1.6"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,6 +48,10 @@ const routes: Routes = [
|
|||
path: 'setting-auto-brightness',
|
||||
loadChildren: () => import('./pages/setting-auto-brightness/setting-auto-brightness.module').then(m => m.SettingAutoBrightnessPageModule)
|
||||
},
|
||||
{
|
||||
path: 'setting-auto-open-url',
|
||||
loadChildren: () => import('./pages/setting-auto-open-url/setting-auto-open-url.module').then(m => m.SettingAutoOpenUrlPageModule)
|
||||
},
|
||||
{
|
||||
path: 'setting-start-page',
|
||||
loadChildren: () => import('./pages/setting-start-page/setting-start-page.module').then(m => m.SettingStartPagePageModule)
|
||||
|
|
|
@ -37,7 +37,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
],
|
||||
imports: [
|
||||
BrowserModule,
|
||||
IonicModule.forRoot(),
|
||||
IonicModule.forRoot({ innerHTMLTemplatesEnabled: true }),
|
||||
AppRoutingModule,
|
||||
HttpClientModule,
|
||||
FormsModule,
|
||||
|
|
|
@ -8,11 +8,7 @@ import { QrCodePage } from './qr-code.page';
|
|||
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { NgxQRCodeModule } from '@techiediaries/ngx-qrcode';
|
||||
import { QRCodeModule } from 'angularx-qrcode';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
|
@ -23,7 +19,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
CommonModule,
|
||||
FormsModule,
|
||||
IonicModule,
|
||||
NgxQRCodeModule,
|
||||
QRCodeModule,
|
||||
TranslateModule.forChild({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
|
|
|
@ -11,10 +11,10 @@
|
|||
<div class="d-flex align-items-center justify-content-top flex-column" style="height: 100%;">
|
||||
<ion-row>
|
||||
<ion-col class="ion-text-center ion-padding" style="max-width: 100% !important;">
|
||||
<ngx-qrcode [elementType]="qrElementType" [value]="qrCodeContent" [width]="defaultWidth"
|
||||
<qrcode [elementType]="qrElementType" [qrdata]="qrCodeContent" [width]="defaultWidth"
|
||||
[errorCorrectionLevel]="errorCorrectionLevel" [colorDark]="qrColorDark" [colorLight]="qrColorLight"
|
||||
[margin]="env.qrCodeMargin" #qrcode [hidden]="isSharing">
|
||||
</ngx-qrcode>
|
||||
</qrcode>
|
||||
<div class="d-flex flex-column align-items-center" *ngIf="isSharing">
|
||||
<ion-spinner class="my-3"></ion-spinner>
|
||||
</div>
|
||||
|
|
|
@ -6,11 +6,11 @@ import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
|||
import { Toast } from '@capacitor/toast';
|
||||
import { LoadingController, ModalController, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { NgxQrcodeElementTypes, NgxQrcodeErrorCorrectionLevels, QrcodeComponent } from '@techiediaries/ngx-qrcode';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { ScreenBrightness } from '@capacitor-community/screen-brightness';
|
||||
import { rgbToHex } from 'src/app/utils/helpers';
|
||||
import { Preferences } from '@capacitor/preferences';
|
||||
import { QRCodeComponent, QRCodeElementType } from 'angularx-qrcode';
|
||||
|
||||
@Component({
|
||||
selector: 'app-qr-code',
|
||||
|
@ -21,11 +21,11 @@ export class QrCodePage {
|
|||
|
||||
modal: HTMLIonModalElement;
|
||||
|
||||
@ViewChild('qrcode') qrcodeElement: QrcodeComponent;
|
||||
@ViewChild('qrcode') qrcodeElement: QRCodeComponent;
|
||||
|
||||
@Input() qrCodeContent: string;
|
||||
qrElementType: NgxQrcodeElementTypes = NgxQrcodeElementTypes.CANVAS;
|
||||
errorCorrectionLevel: NgxQrcodeErrorCorrectionLevels;
|
||||
qrElementType: QRCodeElementType = "canvas";
|
||||
errorCorrectionLevel: 'low' | 'medium' | 'quartile' | 'high' | 'L' | 'M' | 'Q' | 'H';
|
||||
scale: number = 0.8;
|
||||
readonly MAX_WIDTH = 350;
|
||||
defaultWidth: number = window.innerHeight * 0.32 > this.MAX_WIDTH ? this.MAX_WIDTH : window.innerHeight * 0.32;
|
||||
|
@ -64,7 +64,6 @@ export class QrCodePage {
|
|||
if (this.qrcodeElement.width > this.MAX_WIDTH) {
|
||||
this.qrcodeElement.width = this.MAX_WIDTH;
|
||||
}
|
||||
this.qrcodeElement.createQRCode();
|
||||
}, 500)
|
||||
}
|
||||
}
|
||||
|
@ -99,7 +98,6 @@ export class QrCodePage {
|
|||
if (this.qrcodeElement.width > this.MAX_WIDTH) {
|
||||
this.qrcodeElement.width = this.MAX_WIDTH;
|
||||
}
|
||||
this.qrcodeElement.createQRCode();
|
||||
}
|
||||
})
|
||||
this.modal.onDidDismiss().then(
|
||||
|
@ -132,19 +130,19 @@ export class QrCodePage {
|
|||
setErrorCorrectionLevel() {
|
||||
switch (this.env.errorCorrectionLevel) {
|
||||
case 'L':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.LOW;
|
||||
this.errorCorrectionLevel = 'low';
|
||||
break;
|
||||
case 'M':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
this.errorCorrectionLevel = 'medium';
|
||||
break;
|
||||
case 'Q':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.QUARTILE;
|
||||
this.errorCorrectionLevel = 'quartile';
|
||||
break;
|
||||
case 'H':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.HIGH;
|
||||
this.errorCorrectionLevel = 'high';
|
||||
break;
|
||||
default:
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
this.errorCorrectionLevel = 'medium';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,7 +168,6 @@ export class QrCodePage {
|
|||
this.isSharing = true;
|
||||
const currentWidth = this.qrcodeElement.width;
|
||||
this.qrcodeElement.width = 1000;
|
||||
this.qrcodeElement.createQRCode();
|
||||
setTimeout(async () => {
|
||||
const canvases = document.querySelectorAll("canvas") as NodeListOf<HTMLCanvasElement>;
|
||||
const canvas = canvases[canvases.length - 1];
|
||||
|
@ -183,7 +180,6 @@ export class QrCodePage {
|
|||
await this.socialSharing.share(this.translate.instant('MSG.SHARE_QR'), this.translate.instant('SIMPLE_QR'), this.qrImageDataUrl, null).then(
|
||||
_ => {
|
||||
this.qrcodeElement.width = currentWidth;
|
||||
this.qrcodeElement.createQRCode();
|
||||
delete this.qrImageDataUrl;
|
||||
this.isSharing = false;
|
||||
loading2.dismiss();
|
||||
|
@ -194,7 +190,6 @@ export class QrCodePage {
|
|||
this.presentToast("Error when call SocialSharing.share: " + JSON.stringify(err), "long", "top");
|
||||
}
|
||||
this.qrcodeElement.width = currentWidth;
|
||||
this.qrcodeElement.createQRCode();
|
||||
delete this.qrImageDataUrl;
|
||||
this.isSharing = false;
|
||||
loading2.dismiss();
|
||||
|
@ -242,7 +237,7 @@ export class QrCodePage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -25,20 +25,22 @@
|
|||
|
||||
<ion-row class="ion-padding-horizontal">
|
||||
<ion-col>
|
||||
<mat-form-field [class]="ngMatThemeClass" color="accent" appearance="legacy">
|
||||
<mat-form-field [class]="ngMatThemeClass" color="accent" appearance="outline" [floatLabel]="'always'">
|
||||
<mat-label>{{ 'CONTENT_TYPE' | translate}}</mat-label>
|
||||
<mat-select [(ngModel)]="contentType">
|
||||
<mat-select-trigger>
|
||||
<div style="display: flex; align-items: center;">
|
||||
<mat-icon style="margin-right: 16px; vertical-align: middle;">
|
||||
{{ getIcon(contentType) }}
|
||||
<div class="d-flex">
|
||||
<mat-icon class="me-3" [fontIcon]="getIcon(contentType)">
|
||||
</mat-icon>
|
||||
<span>{{ getText(contentType) }}</span>
|
||||
</div>
|
||||
</mat-select-trigger>
|
||||
<mat-option [value]="type.value" *ngFor="let type of contentTypes">
|
||||
<mat-icon>{{ getIcon(type.value) }}</mat-icon>
|
||||
<span>{{ type.text }}</span>
|
||||
<div class="d-flex">
|
||||
<mat-icon class="me-3" [fontIcon]="getIcon(type.value)">
|
||||
</mat-icon>
|
||||
<span>{{ type.text }}</span>
|
||||
</div>
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
@ -69,7 +71,7 @@
|
|||
<mat-label>{{ 'EMAIL_RECIPIENT' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="toEmails[i]" type="email" maxlength="254" #emailToInput>
|
||||
<mat-hint align="end">{{ emailToInput.value?.length || 0 }}/254</mat-hint>
|
||||
<mat-icon matSuffix color="accent">alternate_email</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="alternate_email"></mat-icon>
|
||||
<mat-hint>{{'MSG.EMAIL_MAX_LENGTH' | translate}}</mat-hint>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
|
@ -98,7 +100,7 @@
|
|||
<mat-label>{{ 'CC' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="ccEmails[i]" type="email" maxlength="254" #emailCcInput>
|
||||
<mat-hint align="end">{{ emailCcInput.value?.length || 0 }}/254</mat-hint>
|
||||
<mat-icon matSuffix color="accent">alternate_email</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="alternate_email"></mat-icon>
|
||||
<mat-hint>{{'MSG.EMAIL_MAX_LENGTH' | translate}}</mat-hint>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
|
@ -127,7 +129,7 @@
|
|||
<mat-label>{{ 'BCC' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="bccEmails[i]" type="email" maxlength="254" #emailBccInput>
|
||||
<mat-hint align="end">{{ emailBccInput.value?.length || 0 }}/254</mat-hint>
|
||||
<mat-icon matSuffix color="accent">alternate_email</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="alternate_email"></mat-icon>
|
||||
<mat-hint>{{'MSG.EMAIL_MAX_LENGTH' | translate}}</mat-hint>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
|
@ -182,7 +184,7 @@
|
|||
<mat-label>{{ 'EMAIL_RECIPIENT' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="toEmails[0]" type="email" maxlength="254" #emailToInput>
|
||||
<mat-hint align="end">{{ emailToInput.value?.length || 0 }}/254</mat-hint>
|
||||
<mat-icon matSuffix color="accent">alternate_email</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="alternate_email"></mat-icon>
|
||||
<mat-hint>{{'MSG.EMAIL_MAX_LENGTH' | translate}}</mat-hint>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
|
@ -213,13 +215,32 @@
|
|||
|
||||
</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>
|
||||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'PHONE_NUMBER' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="phoneNumber" type="tel" #phoneNumberInput>
|
||||
<mat-icon matSuffix color="accent">call</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="call"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -231,7 +252,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'PHONE_NUMBER' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="phoneNumber" type="tel" #phoneNumberInput>
|
||||
<mat-icon matSuffix color="accent">call</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="call"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -254,7 +275,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'URL' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="url" type="url" #urlInput maxlength="1817">
|
||||
<mat-icon matSuffix color="accent">link</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="link"></mat-icon>
|
||||
<mat-hint align="end">{{ (urlInput.value?.length) || 0 }}/1817</mat-hint>
|
||||
<mat-hint>{{'MSG.CREATE_QRCODE_MAX_LENGTH' | translate}}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
@ -278,7 +299,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'FIRST_NAME' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="firstName" #firstNameInput />
|
||||
<mat-icon matSuffix color="accent">badge</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="badge"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -287,7 +308,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'LAST_NAME' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="lastName" #lastNameInput />
|
||||
<mat-icon matSuffix color="accent">badge</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="badge"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -306,7 +327,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'MOBILE_PHONE_NUMBER' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="mobilePhoneNumber" #mobilePhoneInput type="tel" />
|
||||
<mat-icon matSuffix color="accent">call</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="call"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -315,7 +336,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'HOME_PHONE_NUMBER' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="homePhoneNumber" #homePhoneInput type="tel" />
|
||||
<mat-icon matSuffix color="accent">call</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="call"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -324,7 +345,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'WORK_PHONE_NUMBER' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="workPhoneNumber" #workPhoneInput type="tel" />
|
||||
<mat-icon matSuffix color="accent">call</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="call"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -333,7 +354,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'FAX_NUMBER' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="faxNumber" #faxInput type="tel" />
|
||||
<mat-icon matSuffix color="accent">print</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="print"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -342,7 +363,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'EMAIL_ADDRESS' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="email" #emailInput type="email" />
|
||||
<mat-icon matSuffix color="accent">alternate_email</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="alternate_email"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -361,7 +382,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'ORGANIZATION' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="organization" #organizationInput type="text" />
|
||||
<mat-icon matSuffix color="accent">business</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="business"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -370,7 +391,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'JOB_TITLE' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="jobTitle" #jobTitleInput type="text" />
|
||||
<mat-icon matSuffix color="accent">business</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="business"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -389,7 +410,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'STREET' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="street" #streetInput type="text" />
|
||||
<mat-icon matSuffix color="accent">home</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="home"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -398,7 +419,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'CITY' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="city" #cityInput type="text" />
|
||||
<mat-icon matSuffix color="accent">home</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="home"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -407,7 +428,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'STATE' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="state" #stateInput type="text" />
|
||||
<mat-icon matSuffix color="accent">home</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="home"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -416,7 +437,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'POSTAL_CODE' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="postalCode" #postalCodeInput type="text" />
|
||||
<mat-icon matSuffix color="accent">home</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="home"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -425,7 +446,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'COUNTRY' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="country" #countryInput type="text" />
|
||||
<mat-icon matSuffix color="accent">home</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="home"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -445,7 +466,7 @@
|
|||
<mat-label>{{ 'DATE_OF_BIRTH' | translate}}</mat-label>
|
||||
<input [ngModel]="birthday | date:'yyyy-MM-dd'" (ngModelChange)="birthday = $event" matInput type="date"
|
||||
[max]="today">
|
||||
<mat-icon matSuffix color="accent">cake</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="cake"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -466,7 +487,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'WEBSITE' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="personalUrl" type="url" #personalUrlInput>
|
||||
<mat-icon matSuffix color="accent">link</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="link"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
@ -478,7 +499,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'WIFI_SSID' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="ssid" #ssidInput maxlength="32">
|
||||
<mat-icon matSuffix color="accent">wifi</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="wifi"></mat-icon>
|
||||
<mat-hint align="end">{{ (ssidInput.value?.length) || 0 }}/32</mat-hint>
|
||||
<mat-hint>{{'MSG.SSID_MAX_LENGTH' | translate}}</mat-hint>
|
||||
</mat-form-field>
|
||||
|
@ -489,7 +510,7 @@
|
|||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'PASSWORD' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="wifiPassword" #wifiPasswordInput type="password">
|
||||
<mat-icon matSuffix color="accent">lock</mat-icon>
|
||||
<mat-icon matSuffix color="accent" fontIcon="lock"></mat-icon>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
|
|
@ -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,
|
||||
|
@ -106,9 +111,14 @@ export class GeneratePage {
|
|||
|
||||
async ionViewDidEnter() {
|
||||
await SplashScreen.hide()
|
||||
if (this.env.editingContent) {
|
||||
this.qrCodeContent = this.env.resultContent;
|
||||
this.env.editingContent = false;
|
||||
}
|
||||
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");
|
||||
|
@ -118,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' },
|
||||
|
@ -191,6 +202,9 @@ export class GeneratePage {
|
|||
this.emailSubject = "";
|
||||
this.emailBody = "";
|
||||
|
||||
this.latitude = 0;
|
||||
this.longitude = 0;
|
||||
|
||||
this.phoneNumber = "";
|
||||
|
||||
this.smsMessage = "";
|
||||
|
@ -259,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;
|
||||
|
@ -344,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";
|
||||
|
@ -352,6 +369,8 @@ export class GeneratePage {
|
|||
return "link";
|
||||
case "contact":
|
||||
return "contact_phone";
|
||||
case "geo":
|
||||
return "location_on";
|
||||
case "phone":
|
||||
return "call";
|
||||
case "sms":
|
||||
|
@ -367,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;
|
||||
|
@ -375,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":
|
||||
|
@ -443,7 +464,7 @@ export class GeneratePage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router';
|
|||
import { AlertController, IonItemSliding, LoadingController, ModalController, PopoverController, ToastController } from '@ionic/angular';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { format, Locale } from 'date-fns';
|
||||
import { de, enUS, fr, it, zhCN, zhHK } from 'date-fns/locale';
|
||||
import { de, enUS, fr, it, 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,12 @@ export class HistoryPage {
|
|||
case "it":
|
||||
locale = it;
|
||||
break;
|
||||
case "pt-BR":
|
||||
locale = ptBR;
|
||||
break;
|
||||
case "ru":
|
||||
locale = ru;
|
||||
break;
|
||||
case "zh-CN":
|
||||
locale = zhCN;
|
||||
break;
|
||||
|
@ -502,7 +508,7 @@ export class HistoryPage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -9,7 +9,6 @@ import { ImportImagePageRoutingModule } from './import-image-routing.module';
|
|||
import { ImportImagePage } from './import-image.page';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
|
@ -29,7 +28,6 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
}
|
||||
}),
|
||||
ImportImagePageRoutingModule,
|
||||
MatButtonModule,
|
||||
],
|
||||
declarations: [ImportImagePage]
|
||||
})
|
||||
|
|
|
@ -96,6 +96,14 @@ export class ImportImagePage {
|
|||
});
|
||||
await alert.present();
|
||||
}
|
||||
},
|
||||
async err => {
|
||||
getPictureLoading.dismiss();
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Camera.requestPermissions: ' + JSON.stringify(err), position: "bottom", duration: "long" })
|
||||
} else {
|
||||
Toast.show({ text: 'Unknown Error', position: "bottom", duration: "short" })
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -196,7 +204,7 @@ export class ImportImagePage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { Preferences } from '@capacitor/preferences';
|
||||
import { AlertController, IonRouterOutlet, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
|
@ -50,26 +51,45 @@ export class LandingPage {
|
|||
}
|
||||
|
||||
async confirmExitApp(): Promise<void> {
|
||||
const alert = await this.alertController.create({
|
||||
header: this.translate.instant('EXIT_APP'),
|
||||
message: this.translate.instant('MSG.EXIT_APP'),
|
||||
cssClass: ['alert-bg'],
|
||||
buttons: [
|
||||
{
|
||||
text: this.translate.instant('EXIT'),
|
||||
handler: () => {
|
||||
navigator['app'].exitApp();
|
||||
if (this.env.showExitAppAlert == "on") {
|
||||
const alert = await this.alertController.create({
|
||||
header: this.translate.instant('EXIT_APP'),
|
||||
message: this.translate.instant('MSG.EXIT_APP'),
|
||||
inputs: [
|
||||
{
|
||||
type: "checkbox",
|
||||
label: this.translate.instant("MSG.TUTORIAL_NOT_SHOW_AGAIN"),
|
||||
checked: false,
|
||||
handler: async (result) => {
|
||||
if (result.checked) {
|
||||
this.env.showExitAppAlert = "off";
|
||||
} else {
|
||||
this.env.showExitAppAlert = "on";
|
||||
}
|
||||
await Preferences.set({ key: this.env.KEY_SHOW_EXIT_APP_ALERT, value: this.env.showExitAppAlert });
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
text: this.translate.instant('RATE_THE_APP'),
|
||||
handler: () => {
|
||||
this.openGooglePlay();
|
||||
],
|
||||
cssClass: ['alert-bg', 'alert-input-no-border'],
|
||||
buttons: [
|
||||
{
|
||||
text: this.translate.instant('EXIT'),
|
||||
handler: () => {
|
||||
navigator['app'].exitApp();
|
||||
}
|
||||
},
|
||||
{
|
||||
text: this.translate.instant('RATE_THE_APP'),
|
||||
handler: () => {
|
||||
this.openGooglePlay();
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
await alert.present();
|
||||
]
|
||||
});
|
||||
await alert.present();
|
||||
} else {
|
||||
navigator['app'].exitApp();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import { IonicModule } from '@ionic/angular';
|
|||
import { ResultPageRoutingModule } from './result-routing.module';
|
||||
|
||||
import { ResultPage } from './result.page';
|
||||
import { NgxQRCodeModule } from '@techiediaries/ngx-qrcode';
|
||||
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
|
|
|
@ -18,8 +18,7 @@
|
|||
<ion-col>
|
||||
<ion-badge class="p-2" color="primary">
|
||||
<div class="d-flex align-items-center">
|
||||
<mat-icon *ngIf="contentTypeIcon != ''" style="margin-right: 16px;">
|
||||
{{ contentTypeIcon }}
|
||||
<mat-icon class="me-2" *ngIf="contentTypeIcon != ''" [fontIcon]="contentTypeIcon">
|
||||
</mat-icon>
|
||||
<span>{{ contentTypeText }}</span>
|
||||
</div>
|
||||
|
@ -28,7 +27,7 @@
|
|||
</ion-row>
|
||||
|
||||
<ng-container *ngIf="qrCodeContent && qrCodeContent.trim().length > 0" [ngTemplateOutlet]="contentBlock"
|
||||
[ngTemplateOutletContext]="{ label: barcodeFormat + ('CONTENT' | translate), content: qrCodeContent, hint: env.resultContentFormat }">
|
||||
[ngTemplateOutletContext]="{ label: barcodeFormat + ('CONTENT' | translate), content: qrCodeContent, hint: env.resultContentFormat, showEdit: true }">
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="base64Encoded && qrCodeContent && qrCodeContent.trim().length > 0"
|
||||
|
@ -97,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>
|
||||
|
||||
|
@ -106,24 +114,34 @@
|
|||
[ngStyle]="env.colorTheme === 'dark'? {'background-color': '#222428'} : (env.colorTheme === 'black'? {'background-color': '#000000'} : {'background-color': '#F0F0F0'})">
|
||||
|
||||
<ng-container *ngIf="env.resultPageButtons === 'icon-only'">
|
||||
<ion-row *ngIf="contentType === 'freeText' && env.showOpenFoodFactsButton === 'on' && isValidEan" class="d-flex justify-content-center">
|
||||
<ion-row *ngIf="contentType === 'freeText' && env.showOpenFoodFactsButton === 'on' && isValidEan"
|
||||
class="d-flex justify-content-center">
|
||||
<ion-button (click)="tapHaptic(); searchOpenFoodFacts()" [color]="'primary'" fill="clear">
|
||||
<ion-icon name="fast-food"></ion-icon>
|
||||
</ion-button>
|
||||
</ion-row>
|
||||
|
||||
<ion-row *ngIf="contentType === 'url' && env.showBrowseButton === 'on' && isHttp" class="d-flex justify-content-center">
|
||||
<ion-row *ngIf="contentType === 'url' && env.showBrowseButton === 'on' && isHttp"
|
||||
class="d-flex justify-content-center">
|
||||
<ion-button (click)="tapHaptic(); browseWebsite()" [color]="'primary'" fill="clear">
|
||||
<ion-icon name="globe"></ion-icon>
|
||||
</ion-button>
|
||||
</ion-row>
|
||||
|
||||
<ion-row *ngIf="contentType === 'url' && env.showOpenUrlButton === 'on' && !isHttp" class="d-flex justify-content-center">
|
||||
<ion-row *ngIf="contentType === 'url' && env.showOpenUrlButton === 'on' && !isHttp"
|
||||
class="d-flex justify-content-center">
|
||||
<ion-button (click)="tapHaptic(); openLink()" [color]="'primary'" fill="clear">
|
||||
<ion-icon name="open"></ion-icon>
|
||||
</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">
|
||||
|
@ -170,134 +188,156 @@
|
|||
</ion-button>
|
||||
</ion-row>
|
||||
|
||||
<ion-row class="ion-padding-horizontal justify-content-around">
|
||||
<ion-button *ngIf="env.showSearchButton === 'on'" (click)="tapHaptic(); webSearch()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon *ngIf="env.searchEngine === 'google'" slot="icon-only" name="logo-google">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'bing'" slot="icon-only" src="assets/icon/microsoft-bing.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'yahoo'" slot="icon-only" src="assets/icon/yahoo.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'duckduckgo'" slot="icon-only" src="assets/icon/duck-duck-go.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'yandex'" slot="icon-only" src="assets/icon/yandex.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'ecosia'" slot="icon-only" src="assets/icon/ecosia.svg">
|
||||
</ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showCopyButton === 'on'" (click)="tapHaptic(); copyText()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="copy"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showBase64Button === 'on'" (click)="tapHaptic(); base64()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="code-working"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showEnlargeButton === 'on'" (click)="tapHaptic(); enlarge()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="qr-code-sharp"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showBookmarkButton === 'on'" (click)="tapHaptic(); handleBookmark()"
|
||||
[color]="!bookmarked? (env.colorTheme === 'light'? 'dark' : 'light') : 'warning'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="bookmark"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-row class="ion-padding-horizontal">
|
||||
<div class="d-flex justify-content-between detailed-action-button-container">
|
||||
<ion-button
|
||||
*ngIf="!resultSaved && this.env.scanRecordLogging == 'off' && this.qrCodeContent != null && this.qrCodeContent != '' "
|
||||
(click)="tapHaptic(); saveRecord()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear">
|
||||
<ion-icon slot="icon-only" src="assets/icon/history.svg"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showSearchButton === 'on'" (click)="tapHaptic(); webSearch()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon *ngIf="env.searchEngine === 'google'" slot="icon-only" name="logo-google">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'bing'" slot="icon-only" src="assets/icon/microsoft-bing.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'yahoo'" slot="icon-only" src="assets/icon/yahoo.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'duckduckgo'" slot="icon-only" src="assets/icon/duck-duck-go.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'yandex'" slot="icon-only" src="assets/icon/yandex.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'ecosia'" slot="icon-only" src="assets/icon/ecosia.svg">
|
||||
</ion-icon>
|
||||
<ion-icon *ngIf="env.searchEngine === 'brave'" slot="icon-only" src="assets/icon/brave-search.svg">
|
||||
</ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showCopyButton === 'on'" (click)="tapHaptic(); copyText()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="copy"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showBase64Button === 'on'" (click)="tapHaptic(); base64()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="code-working"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showEnlargeButton === 'on'" (click)="tapHaptic(); enlarge()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="qr-code-sharp"></ion-icon>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showBookmarkButton === 'on'" (click)="tapHaptic(); handleBookmark()"
|
||||
[color]="!bookmarked? (env.colorTheme === 'light'? 'dark' : 'light') : 'warning'" fill="clear"
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon slot="icon-only" name="bookmark"></ion-icon>
|
||||
</ion-button>
|
||||
</div>
|
||||
|
||||
</ion-row>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="env.resultPageButtons === 'detailed'">
|
||||
<ion-row class="ion-padding-horizontal py-2">
|
||||
<div class="d-flex justify-content-between detailed-action-button-container">
|
||||
<ion-button class="pr-1" *ngIf="contentType === 'freeText' && env.showOpenFoodFactsButton === 'on' && isValidEan"
|
||||
(click)="tapHaptic(); searchOpenFoodFacts()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
<ion-button class="pe-1"
|
||||
*ngIf="!resultSaved && this.env.scanRecordLogging == 'off' && this.qrCodeContent != null && this.qrCodeContent != '' "
|
||||
(click)="tapHaptic(); saveRecord()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pr-2" name="fast-food"></ion-icon>
|
||||
<ion-icon class="pe-2" src="assets/icon/history.svg"></ion-icon>
|
||||
<ion-label>{{ 'SAVE' | translate }}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pe-1"
|
||||
*ngIf="contentType === 'freeText' && env.showOpenFoodFactsButton === 'on' && isValidEan"
|
||||
(click)="tapHaptic(); searchOpenFoodFacts()" [color]="env.colorTheme === 'light'? 'dark' : 'light'"
|
||||
fill="outline" shape="round" [@inAnimation]>
|
||||
<ion-icon class="pe-2" name="fast-food"></ion-icon>
|
||||
<ion-label>Facts</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="contentType === 'url' && env.showBrowseButton === 'on' && isHttp"
|
||||
<ion-button class="pe-1" *ngIf="contentType === 'url' && env.showBrowseButton === 'on' && isHttp"
|
||||
(click)="tapHaptic(); browseWebsite()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pr-2" name="globe"></ion-icon>
|
||||
<ion-icon class="pe-2" name="globe"></ion-icon>
|
||||
<ion-label>{{ 'BROWSE' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-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="pr-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="pr-1"
|
||||
<ion-button class="pe-1"
|
||||
*ngIf="(contentType === 'contact' || contentType === 'phone' || contentType === 'sms') && env.showAddContactButton === 'on'"
|
||||
(click)="tapHaptic(); addContact()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pr-2" name="person-add-sharp"></ion-icon>
|
||||
<ion-icon class="pe-2" name="person-add-sharp"></ion-icon>
|
||||
<ion-label>{{ 'ADD' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="contentType === 'phone' && env.showCallButton === 'on'"
|
||||
<ion-button class="pe-1" *ngIf="contentType === 'phone' && env.showCallButton === 'on'"
|
||||
(click)="tapHaptic(); callPhone()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pr-2" name="call"></ion-icon>
|
||||
<ion-icon class="pe-2" name="call"></ion-icon>
|
||||
<ion-label>{{ 'CALL' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="contentType === 'sms' && smsContent && env.showSendMessageButton === 'on'"
|
||||
<ion-button class="pe-1" *ngIf="contentType === 'sms' && smsContent && env.showSendMessageButton === 'on'"
|
||||
(click)="tapHaptic(); sendSms()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pr-2" name="send"></ion-icon>
|
||||
<ion-icon class="pe-2" name="send"></ion-icon>
|
||||
<ion-label>{{ 'SEND' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1"
|
||||
<ion-button class="pe-1"
|
||||
*ngIf="(contentType === 'emailW3C' || contentType === 'emailDocomo') && env.showSendEmailButton === 'on'"
|
||||
(click)="tapHaptic(); sendEmail()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pr-2" name="mail"></ion-icon>
|
||||
<ion-icon class="pe-2" name="mail"></ion-icon>
|
||||
<ion-label>{{ 'SEND' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="env.showSearchButton === 'on'" (click)="tapHaptic(); webSearch()"
|
||||
<ion-button class="pe-1" *ngIf="env.showSearchButton === 'on'" (click)="tapHaptic(); webSearch()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline" shape="round" [@inAnimation]
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon class="pr-2" *ngIf="env.searchEngine === 'google'" slot="icon-only" name="logo-google">
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'google'" slot="icon-only" name="logo-google">
|
||||
</ion-icon>
|
||||
<ion-icon class="pr-2" *ngIf="env.searchEngine === 'bing'" slot="icon-only"
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'bing'" slot="icon-only"
|
||||
src="assets/icon/microsoft-bing.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="pr-2" *ngIf="env.searchEngine === 'yahoo'" slot="icon-only" src="assets/icon/yahoo.svg">
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'yahoo'" slot="icon-only" src="assets/icon/yahoo.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="pr-2" *ngIf="env.searchEngine === 'duckduckgo'" slot="icon-only"
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'duckduckgo'" slot="icon-only"
|
||||
src="assets/icon/duck-duck-go.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="pr-2" *ngIf="env.searchEngine === 'yandex'" slot="icon-only" src="assets/icon/yandex.svg">
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'yandex'" slot="icon-only" src="assets/icon/yandex.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="pr-2" *ngIf="env.searchEngine === 'ecosia'" slot="icon-only" src="assets/icon/ecosia.svg">
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'ecosia'" slot="icon-only" src="assets/icon/ecosia.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="pe-2" *ngIf="env.searchEngine === 'brave'" slot="icon-only"
|
||||
src="assets/icon/brave-search.svg">
|
||||
</ion-icon>
|
||||
<ion-label>{{ 'SEARCH' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="env.showCopyButton === 'on'" (click)="tapHaptic(); copyText()"
|
||||
<ion-button class="pe-1" *ngIf="env.showCopyButton === 'on'" (click)="tapHaptic(); copyText()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline" shape="round" [@inAnimation]
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon class="pr-2" slot="icon-only" name="copy"></ion-icon>
|
||||
<ion-icon class="pe-2" slot="icon-only" name="copy"></ion-icon>
|
||||
<ion-label>{{ 'COPY' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="env.showBase64Button === 'on'" (click)="tapHaptic(); base64()"
|
||||
<ion-button class="pe-1" *ngIf="env.showBase64Button === 'on'" (click)="tapHaptic(); base64()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline" shape="round" [@inAnimation]
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon class="pr-2" slot="icon-only" name="code-working"></ion-icon>
|
||||
<ion-icon class="pe-2" slot="icon-only" name="code-working"></ion-icon>
|
||||
<ion-label>{{ 'BASE64' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pr-1" *ngIf="env.showEnlargeButton === 'on'" (click)="tapHaptic(); enlarge()"
|
||||
<ion-button class="pe-1" *ngIf="env.showEnlargeButton === 'on'" (click)="tapHaptic(); enlarge()"
|
||||
[color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline" shape="round" [@inAnimation]
|
||||
[disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon class="pr-2" slot="icon-only" name="qr-code-sharp"></ion-icon>
|
||||
<ion-icon class="pe-2" slot="icon-only" name="qr-code-sharp"></ion-icon>
|
||||
<ion-label>{{ 'SHOW' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button *ngIf="env.showBookmarkButton === 'on'" (click)="tapHaptic(); handleBookmark()"
|
||||
[color]="!bookmarked? (env.colorTheme === 'light'? 'dark' : 'light') : 'warning'" fill="outline" shape="round"
|
||||
[@inAnimation] [disabled]="!qrCodeContent || (qrCodeContent && qrCodeContent.trim().length <= 0)">
|
||||
<ion-icon class="pr-2" slot="icon-only" name="bookmark"></ion-icon>
|
||||
<ion-icon class="pe-2" slot="icon-only" name="bookmark"></ion-icon>
|
||||
<ion-label *ngIf="!bookmarked">{{ 'BOOKMARK' | translate}}</ion-label>
|
||||
<ion-label *ngIf="bookmarked">{{ 'BOOKMARKED' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
|
@ -307,7 +347,7 @@
|
|||
|
||||
</ion-footer>
|
||||
|
||||
<ng-template #contentBlock let-label="label" let-content="content" let-hint="hint">
|
||||
<ng-template #contentBlock let-label="label" let-content="content" let-hint="hint" let-showEdit="showEdit">
|
||||
<ion-row class="ion-padding-horizontal" [@inAnimation]>
|
||||
<ion-col>
|
||||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent" [floatLabel]="'always'"
|
||||
|
@ -317,6 +357,10 @@
|
|||
[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;">
|
||||
{{ 'EDIT' | translate }}
|
||||
</button>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
import { Component, QueryList, ViewChildren } from '@angular/core';
|
||||
import { Clipboard } from '@capacitor/clipboard';
|
||||
import { Contacts, ContactType, EmailAddress, NewContact, PhoneNumber } from '@capacitor-community/contacts'
|
||||
import { ContactInput, Contacts, EmailInput, EmailType, PhoneInput, PhoneType } from '@capacitor-community/contacts';
|
||||
import { SMS } from '@awesome-cordova-plugins/sms/ngx';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { AlertController, LoadingController, ModalController, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { NgxQrcodeElementTypes, NgxQrcodeErrorCorrectionLevels } from '@techiediaries/ngx-qrcode';
|
||||
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';
|
||||
import { QrCodePage } from 'src/app/modals/qr-code/qr-code.page';
|
||||
import { fadeIn } from 'src/app/utils/animations';
|
||||
import { Router } from '@angular/router';
|
||||
import { QRCodeElementType } from 'angularx-qrcode';
|
||||
|
||||
@Component({
|
||||
selector: 'app-result',
|
||||
|
@ -23,11 +23,11 @@ import { Router } from '@angular/router';
|
|||
})
|
||||
export class ResultPage {
|
||||
|
||||
contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText";
|
||||
contentType: QrResultContentTypeType = "freeText";
|
||||
|
||||
qrCodeContent: string;
|
||||
qrElementType: NgxQrcodeElementTypes = NgxQrcodeElementTypes.CANVAS;
|
||||
errorCorrectionLevel: NgxQrcodeErrorCorrectionLevels = NgxQrcodeErrorCorrectionLevels.LOW;
|
||||
qrElementType: QRCodeElementType = "canvas";
|
||||
errorCorrectionLevel: 'low' | 'medium' | 'quartile' | 'high' | 'L' | 'M' | 'Q' | 'H' = 'low';
|
||||
qrMargin: number = 3;
|
||||
|
||||
phoneNumber: string;
|
||||
|
@ -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;
|
||||
|
@ -54,6 +57,8 @@ export class ResultPage {
|
|||
|
||||
showQrFirst: boolean = false;
|
||||
|
||||
resultSaved: boolean = false;
|
||||
|
||||
@ViewChildren(MatFormField) formFields: QueryList<MatFormField>;
|
||||
|
||||
constructor(
|
||||
|
@ -86,7 +91,16 @@ export class ResultPage {
|
|||
}
|
||||
|
||||
async ionViewDidEnter(): Promise<void> {
|
||||
if (this.showQrFirst) {
|
||||
if (this.contentType == 'url' && this.env.autoOpenUrl == 'on' && this.env.recordSource == 'scan') {
|
||||
setTimeout(() => {
|
||||
this.presentToast(this.translate.instant("AUTO_OPEN_URL"), "short", "bottom");
|
||||
if (this.isHttp) {
|
||||
this.browseWebsite();
|
||||
} else {
|
||||
this.openLink();
|
||||
}
|
||||
}, 300);
|
||||
} else if (this.showQrFirst) {
|
||||
this.showQrFirst = false;
|
||||
if (this.qrCodeContent && this.qrCodeContent.trim().length > 0) {
|
||||
await this.enlarge();
|
||||
|
@ -104,6 +118,14 @@ export class ResultPage {
|
|||
this.reset();
|
||||
}
|
||||
|
||||
async saveRecord() {
|
||||
if (this.qrCodeContent != null && this.qrCodeContent != "") {
|
||||
await this.env.saveScanRecord(this.qrCodeContent);
|
||||
}
|
||||
this.resultSaved = true;
|
||||
this.presentToast(this.translate.instant("SAVED"), "short", "bottom");
|
||||
}
|
||||
|
||||
reset() {
|
||||
this.contentType = "freeText";
|
||||
delete this.qrCodeContent;
|
||||
|
@ -119,12 +141,15 @@ 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;
|
||||
this.base64DecodedText = "";
|
||||
this.bookmarked = false;
|
||||
this.showQrFirst = false;
|
||||
this.resultSaved = false;
|
||||
delete this.env.recordSource;
|
||||
delete this.env.detailedRecordSource;
|
||||
delete this.env.viewResultFrom;
|
||||
|
@ -137,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) {
|
||||
|
@ -163,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 {
|
||||
|
@ -190,6 +220,11 @@ export class ResultPage {
|
|||
return "#ffffff";
|
||||
}
|
||||
|
||||
editContent() {
|
||||
this.env.editingContent = true;
|
||||
this.router.navigate(['tabs/generate'], { replaceUrl: true });
|
||||
}
|
||||
|
||||
searchOpenFoodFacts() {
|
||||
window.open(`https://world.openfoodfacts.org/product/${this.qrCodeContent}`, '_system', 'location=yes');
|
||||
}
|
||||
|
@ -213,104 +248,130 @@ export class ResultPage {
|
|||
}
|
||||
|
||||
async addContact(): Promise<void> {
|
||||
let newContact = null;
|
||||
let contactInput: ContactInput = {};
|
||||
if (this.contentType === "contact") {
|
||||
const phoneNumbers = [];
|
||||
const phoneNumbers: PhoneInput[] = [];
|
||||
if (this.vCardContact?.defaultPhoneNumber != null) {
|
||||
const phoneNumber = { number: this.vCardContact?.defaultPhoneNumber } as PhoneNumber;
|
||||
const phoneNumber: PhoneInput = {
|
||||
type: PhoneType.Mobile,
|
||||
label: 'mobile',
|
||||
number: this.vCardContact?.defaultPhoneNumber,
|
||||
isPrimary: true,
|
||||
};
|
||||
phoneNumbers.push(phoneNumber);
|
||||
}
|
||||
if (this.vCardContact?.homePhoneNumber != null) {
|
||||
const phoneNumber = { number: this.vCardContact?.homePhoneNumber } as PhoneNumber;
|
||||
const phoneNumber: PhoneInput = {
|
||||
type: PhoneType.Home,
|
||||
label: 'home',
|
||||
number: this.vCardContact?.homePhoneNumber,
|
||||
};
|
||||
phoneNumbers.push(phoneNumber);
|
||||
}
|
||||
if (this.vCardContact?.workPhoneNumber != null) {
|
||||
const phoneNumber = { number: this.vCardContact?.homePhoneNumber } as PhoneNumber;
|
||||
const phoneNumber: PhoneInput = {
|
||||
type: PhoneType.Work,
|
||||
label: 'work',
|
||||
number: this.vCardContact?.workPhoneNumber,
|
||||
};
|
||||
phoneNumbers.push(phoneNumber);
|
||||
}
|
||||
if (this.vCardContact?.mobilePhoneNumber != null) {
|
||||
const phoneNumber = { number: this.vCardContact?.mobilePhoneNumber } as PhoneNumber;
|
||||
const phoneNumber: PhoneInput = {
|
||||
type: PhoneType.Mobile,
|
||||
label: 'mobile',
|
||||
number: this.vCardContact?.mobilePhoneNumber,
|
||||
};
|
||||
phoneNumbers.push(phoneNumber);
|
||||
}
|
||||
const emails = [];
|
||||
const emails: EmailInput[] = [];
|
||||
if (this.vCardContact?.defaultEmail != null) {
|
||||
const address = { address: this.vCardContact?.defaultEmail } as EmailAddress;
|
||||
emails.push(address);
|
||||
const emailInput: EmailInput = {
|
||||
type: EmailType.Home,
|
||||
label: 'home',
|
||||
isPrimary: true,
|
||||
address: this.vCardContact?.defaultEmail,
|
||||
};
|
||||
emails.push(emailInput);
|
||||
}
|
||||
if (this.vCardContact?.homeEmail != null) {
|
||||
const address = { address: this.vCardContact?.homeEmail } as EmailAddress;
|
||||
emails.push(address);
|
||||
const emailInput: EmailInput = {
|
||||
type: EmailType.Home,
|
||||
label: 'home',
|
||||
address: this.vCardContact?.homeEmail,
|
||||
};
|
||||
emails.push(emailInput);
|
||||
}
|
||||
if (this.vCardContact?.workEmail != null) {
|
||||
const address = { address: this.vCardContact?.workEmail } as EmailAddress;
|
||||
emails.push(address);
|
||||
const emailInput: EmailInput = {
|
||||
type: EmailType.Work,
|
||||
label: 'work',
|
||||
address: this.vCardContact?.workEmail,
|
||||
};
|
||||
emails.push(emailInput);
|
||||
}
|
||||
newContact = {
|
||||
contactType: ContactType.Person,
|
||||
givenName: this.vCardContact?.givenName ?? this.vCardContact?.fullName ?? '',
|
||||
familyName: this.vCardContact?.familyName,
|
||||
phoneNumbers: phoneNumbers,
|
||||
emailAddresses: emails
|
||||
} as NewContact;
|
||||
contactInput.phones = phoneNumbers;
|
||||
contactInput.emails = emails;
|
||||
contactInput.name = {
|
||||
given: this.vCardContact?.givenName ?? this.vCardContact?.fullName ?? '',
|
||||
family: this.vCardContact?.familyName,
|
||||
};
|
||||
} else if (this.contentType === "sms" || this.contentType === "phone") {
|
||||
const phoneNumbers = [];
|
||||
const phoneNumber = { number: this.phoneNumber } as PhoneNumber;
|
||||
phoneNumbers.push(phoneNumber);
|
||||
newContact = {
|
||||
contactType: ContactType.Person,
|
||||
phoneNumbers: phoneNumbers
|
||||
} as NewContact;
|
||||
const phones: PhoneInput[] = [
|
||||
{
|
||||
type: PhoneType.Mobile,
|
||||
label: 'mobile',
|
||||
number: this.phoneNumber,
|
||||
isPrimary: true,
|
||||
}
|
||||
];
|
||||
contactInput.phones = phones;
|
||||
}
|
||||
if (newContact != null) {
|
||||
if (this.platform.is('ios')) {
|
||||
await Contacts.getPermissions().then(
|
||||
async permission => {
|
||||
if (permission.granted) {
|
||||
await this.saveContact(newContact);
|
||||
} else {
|
||||
const alert = await this.alertController.create({
|
||||
header: this.translate.instant("PERMISSION_REQUIRED"),
|
||||
message: this.translate.instant("MSG.CONTACT_PERMISSION"),
|
||||
buttons: [
|
||||
{
|
||||
text: this.translate.instant("SETTING"),
|
||||
handler: () => {
|
||||
BarcodeScanner.openAppSettings();
|
||||
return true;
|
||||
}
|
||||
},
|
||||
{
|
||||
text: this.translate.instant("CLOSE"),
|
||||
handler: () => {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
],
|
||||
cssClass: ['alert-bg']
|
||||
});
|
||||
await alert.present();
|
||||
}
|
||||
}
|
||||
);
|
||||
} else { // Android doesn't need to get permission
|
||||
await this.saveContact(newContact);
|
||||
}
|
||||
if (this.platform.is('ios')) {
|
||||
// TODO: iOS contact handling
|
||||
// await Contacts.checkPermissions().then(
|
||||
// async permission => {
|
||||
// if (permission.contacts == 'granted') {
|
||||
// await this.saveContact(newContact);
|
||||
// } else {
|
||||
// const alert = await this.alertController.create({
|
||||
// header: this.translate.instant("PERMISSION_REQUIRED"),
|
||||
// message: this.translate.instant("MSG.CONTACT_PERMISSION"),
|
||||
// buttons: [
|
||||
// {
|
||||
// text: this.translate.instant("SETTING"),
|
||||
// handler: () => {
|
||||
// BarcodeScanner.openAppSettings();
|
||||
// return true;
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// text: this.translate.instant("CLOSE"),
|
||||
// handler: () => {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
// ],
|
||||
// cssClass: ['alert-bg']
|
||||
// });
|
||||
// await alert.present();
|
||||
// }
|
||||
// }
|
||||
// );
|
||||
} else { // Android doesn't need to get permission
|
||||
await this.saveContact(contactInput);
|
||||
}
|
||||
}
|
||||
|
||||
private async saveContact(newContact: any) {
|
||||
await Contacts.saveContact(newContact).then(
|
||||
private async saveContact(contactInput: ContactInput) {
|
||||
await Contacts.createContact({ contact: contactInput }).then(
|
||||
_ => {
|
||||
if (this.isIOS) {
|
||||
this.presentToast(this.translate.instant('MSG.SAVED_CONTACT'), "short", "bottom");
|
||||
} else {
|
||||
this.presentToast(this.translate.instant('MSG.SAVING_CONTACT'), "short", "bottom");
|
||||
}
|
||||
this.presentToast(this.translate.instant('MSG.SAVED_CONTACT'), "short", "bottom");
|
||||
}
|
||||
).catch(
|
||||
err => {
|
||||
if (this.env.isDebugging) {
|
||||
this.presentToast("Error when call Contacts.saveContact: " + JSON.stringify(err), "long", "top");
|
||||
this.presentToast("Error when call Contacts.createContact: " + JSON.stringify(err), "long", "top");
|
||||
} else {
|
||||
this.presentToast(this.translate.instant('MSG.FAILED_SAVING_CONTACT'), "short", "bottom");
|
||||
}
|
||||
|
@ -404,6 +465,9 @@ export class ResultPage {
|
|||
case 'ecosia':
|
||||
searchUrl = this.env.ECOSIA_SEARCH_URL;
|
||||
break;
|
||||
case 'brave':
|
||||
searchUrl = this.env.BRAVE_SEARCH_URL;
|
||||
break;
|
||||
default:
|
||||
searchUrl = this.env.GOOGLE_SEARCH_URL;
|
||||
break;
|
||||
|
@ -585,7 +649,7 @@ export class ResultPage {
|
|||
} else if (!failEncoded && failDecoded) {
|
||||
await this.presentToast(this.translate.instant('MSG.NOT_BASE64_DE'), "short", "center");
|
||||
}
|
||||
setTimeout(() => this.formFields?.forEach(ff => ff.updateOutlineGap()), 100);
|
||||
// setTimeout(() => this.formFields?.forEach(ff => ff.updateOutlineGap()), 100);
|
||||
}
|
||||
|
||||
generateVCardContact(): void {
|
||||
|
@ -826,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':
|
||||
|
@ -847,6 +913,8 @@ export class ResultPage {
|
|||
return "link";
|
||||
case "contact":
|
||||
return "contact_phone";
|
||||
case 'geo':
|
||||
return "location_on";
|
||||
case "phone":
|
||||
return "call";
|
||||
case "sms":
|
||||
|
@ -991,7 +1059,7 @@ export class ResultPage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -205,7 +205,7 @@ export class ScanPage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -15,10 +15,6 @@ export class SettingAutoBrightnessPage {
|
|||
public env: EnvService,
|
||||
) { }
|
||||
|
||||
async saveAutoMaxBrightness() {
|
||||
await Preferences.set({ key: this.env.KEY_AUTO_MAX_BRIGHTNESS, value: this.env.autoMaxBrightness });
|
||||
}
|
||||
|
||||
async onAutoMaxBrightnessChange(ev: any) {
|
||||
this.env.autoMaxBrightness = ev ? 'on' : 'off';
|
||||
await Preferences.set({ key: this.env.KEY_AUTO_MAX_BRIGHTNESS, value: this.env.autoMaxBrightness });
|
||||
|
@ -27,7 +23,7 @@ export class SettingAutoBrightnessPage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { Routes, RouterModule } from '@angular/router';
|
||||
|
||||
import { SettingAutoOpenUrlPage } from './setting-auto-open-url.page';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
path: '',
|
||||
component: SettingAutoOpenUrlPage
|
||||
}
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule],
|
||||
})
|
||||
export class SettingAutoOpenUrlPageRoutingModule {}
|
|
@ -0,0 +1,30 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
|
||||
import { IonicModule } from '@ionic/angular';
|
||||
|
||||
import { SettingAutoOpenUrlPageRoutingModule } from './setting-auto-open-url-routing.module';
|
||||
|
||||
import { SettingAutoOpenUrlPage } from './setting-auto-open-url.page';
|
||||
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { HttpLoaderFactory } from 'src/app/utils/helpers';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
FormsModule,
|
||||
IonicModule,
|
||||
TranslateModule.forChild({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
useFactory: HttpLoaderFactory,
|
||||
deps: [HttpClient]
|
||||
}
|
||||
}),
|
||||
SettingAutoOpenUrlPageRoutingModule
|
||||
],
|
||||
declarations: [SettingAutoOpenUrlPage]
|
||||
})
|
||||
export class SettingAutoOpenUrlPageModule {}
|
|
@ -0,0 +1,37 @@
|
|||
<ion-header>
|
||||
<ion-toolbar [color]="env.colorTheme === 'black'? 'black' : 'dark'">
|
||||
<ion-buttons slot="start">
|
||||
<ion-back-button text="" defaultHref="tabs/setting">
|
||||
</ion-back-button>
|
||||
</ion-buttons>
|
||||
<ion-title>{{ 'AUTO_OPEN_URL' | translate }}</ion-title>
|
||||
</ion-toolbar>
|
||||
</ion-header>
|
||||
|
||||
<ion-content>
|
||||
|
||||
<ion-item class="ion-no-padding" lines="none">
|
||||
<ion-label class="ion-padding-start">
|
||||
<p class="ion-padding-top ion-padding-horizontal">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
|
||||
<div [innerHTML]="'MSG.AUTO_OPEN_URL_EXPLAIN' | translate">
|
||||
</div>
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</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;">
|
||||
{{ (env.autoOpenUrl == 'on'? 'TURNED_ON' : 'TURNED_OFF') | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.autoOpenUrl == 'on'? true : false"
|
||||
(ngModelChange)="onAutoOpenUrlChange($event)">
|
||||
</ion-toggle>
|
||||
</ion-item>
|
||||
|
||||
</ion-content>
|
|
@ -0,0 +1,34 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { Preferences } from '@capacitor/preferences';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-setting-auto-open-url',
|
||||
templateUrl: './setting-auto-open-url.page.html',
|
||||
styleUrls: ['./setting-auto-open-url.page.scss'],
|
||||
})
|
||||
export class SettingAutoOpenUrlPage {
|
||||
|
||||
constructor(
|
||||
public env: EnvService,
|
||||
) { }
|
||||
|
||||
async onAutoOpenUrlChange(ev: any) {
|
||||
this.env.autoOpenUrl = ev ? 'on' : 'off';
|
||||
await Preferences.set({ key: this.env.KEY_AUTO_OPEN_URL, value: this.env.autoOpenUrl });
|
||||
await this.tapHaptic();
|
||||
}
|
||||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
|
@ -19,8 +19,7 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'default'"
|
||||
[color]="'primary'">
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'default'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
|
@ -31,8 +30,7 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'de'"
|
||||
[color]="'primary'">
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'de'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
|
@ -43,8 +41,7 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'en'"
|
||||
[color]="'primary'">
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'en'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
|
@ -55,8 +52,7 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'fr'"
|
||||
[color]="'primary'">
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'fr'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
|
@ -67,8 +63,29 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<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-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">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
Русский (ru)
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'ru'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
|
@ -79,8 +96,7 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'zh-HK'"
|
||||
[color]="'primary'">
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'zh-HK'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
|
@ -91,8 +107,7 @@
|
|||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'zh-CN'"
|
||||
[color]="'primary'">
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'zh-CN'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
|
|
|
@ -10,7 +10,7 @@ import { SettingQrPage } from './setting-qr.page';
|
|||
import { HttpClient } from '@angular/common/http';
|
||||
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
|
||||
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
||||
import { NgxQRCodeModule } from '@techiediaries/ngx-qrcode';
|
||||
import { QRCodeModule } from 'angularx-qrcode';
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
|
@ -21,7 +21,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|||
CommonModule,
|
||||
FormsModule,
|
||||
IonicModule,
|
||||
NgxQRCodeModule,
|
||||
QRCodeModule,
|
||||
TranslateModule.forChild({
|
||||
loader: {
|
||||
provide: TranslateLoader,
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
<div class="d-flex align-items-center justify-content-top flex-column ion-padding-bottom" slot="content">
|
||||
<ion-row class="ion-padding-vertical">
|
||||
<ion-col class="ion-text-center" style="max-width: 100% !important;">
|
||||
<ngx-qrcode [elementType]="qrElementType" [value]="qrCodeContent" [width]="defaultWidth"
|
||||
<qrcode [elementType]="qrElementType" [qrdata]="qrCodeContent" [width]="defaultWidth"
|
||||
[errorCorrectionLevel]="errorCorrectionLevel" [colorDark]="qrColorDark" [colorLight]="qrColorLight"
|
||||
[margin]="env.qrCodeMargin" #qrcode>
|
||||
</ngx-qrcode>
|
||||
</qrcode>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
<ion-row>
|
||||
|
|
|
@ -4,7 +4,7 @@ import { Preferences } from '@capacitor/preferences';
|
|||
import { Toast } from '@capacitor/toast';
|
||||
import { AlertController, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { NgxQrcodeElementTypes, NgxQrcodeErrorCorrectionLevels } from '@techiediaries/ngx-qrcode';
|
||||
import { QRCodeElementType } from 'angularx-qrcode';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { rgbToHex } from 'src/app/utils/helpers';
|
||||
|
||||
|
@ -16,8 +16,8 @@ import { rgbToHex } from 'src/app/utils/helpers';
|
|||
export class SettingQrPage {
|
||||
|
||||
qrCodeContent: string = 'https://github.com/tomfong/simple-qr';
|
||||
qrElementType: NgxQrcodeElementTypes = NgxQrcodeElementTypes.CANVAS;
|
||||
errorCorrectionLevel: NgxQrcodeErrorCorrectionLevels;
|
||||
qrElementType: QRCodeElementType = "canvas";
|
||||
errorCorrectionLevel: 'low' | 'medium' | 'quartile' | 'high' | 'L' | 'M' | 'Q' | 'H';
|
||||
readonly MAX_WIDTH = 300;
|
||||
defaultWidth: number = window.innerWidth * 0.4 > this.MAX_WIDTH ? this.MAX_WIDTH : window.innerWidth * 0.4;
|
||||
|
||||
|
@ -51,19 +51,19 @@ export class SettingQrPage {
|
|||
setErrorCorrectionLevel() {
|
||||
switch (this.env.errorCorrectionLevel) {
|
||||
case 'L':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.LOW;
|
||||
this.errorCorrectionLevel = 'low';
|
||||
break;
|
||||
case 'M':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
this.errorCorrectionLevel = 'medium';
|
||||
break;
|
||||
case 'Q':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.QUARTILE;
|
||||
this.errorCorrectionLevel = 'quartile';
|
||||
break;
|
||||
case 'H':
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.HIGH;
|
||||
this.errorCorrectionLevel = 'high';
|
||||
break;
|
||||
default:
|
||||
this.errorCorrectionLevel = NgxQrcodeErrorCorrectionLevels.MEDIUM;
|
||||
this.errorCorrectionLevel = 'medium';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,7 @@ export class SettingQrPage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
<ion-modal #tutorialModal trigger="open-tutorial-modal" [initialBreakpoint]="0.8" [breakpoints]="[0, 0.8]">
|
||||
<ng-template>
|
||||
<ion-content [color]="color">
|
||||
<ion-list-header class="mt-4 ml-3" style="font-size: x-large;">{{ 'TUTORIAL' | translate }}</ion-list-header>
|
||||
<ion-list-header class="mt-4 ms-3" style="font-size: x-large;">{{ 'TUTORIAL' | translate }}</ion-list-header>
|
||||
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
|
||||
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-left.svg" [color]="'primary'"></ion-icon>
|
||||
<ion-label>
|
||||
|
|
|
@ -13,7 +13,7 @@ import { Bookmark } from 'src/app/models/bookmark';
|
|||
import { SocialSharing } from '@awesome-cordova-plugins/social-sharing/ngx';
|
||||
import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
||||
import { Preferences } from '@capacitor/preferences';
|
||||
import { de, enUS, fr, it, zhCN, zhHK } from 'date-fns/locale';
|
||||
import { de, enUS, fr, it, ptBR, ru, zhCN, zhHK } from 'date-fns/locale';
|
||||
|
||||
@Component({
|
||||
selector: 'app-setting-record',
|
||||
|
@ -169,7 +169,7 @@ export class SettingRecordPage {
|
|||
}
|
||||
const loading2 = await this.presentLoading(this.translate.instant("PLEASE_WAIT"));
|
||||
await Filesystem.readFile({
|
||||
path: value.uri,
|
||||
path: value['uri'],
|
||||
encoding: Encoding.UTF8
|
||||
}).then(
|
||||
async value => {
|
||||
|
@ -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,12 @@ 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;
|
||||
case "zh-CN":
|
||||
rawCsvData = "ID,内容,建立于,来源,条码类型,已书签?,标签\r\n";
|
||||
break;
|
||||
|
@ -471,6 +481,12 @@ export class SettingRecordPage {
|
|||
case "it":
|
||||
locale = it;
|
||||
break;
|
||||
case "pt-BR":
|
||||
locale = ptBR;
|
||||
break;
|
||||
case "ru":
|
||||
locale = ru;
|
||||
break;
|
||||
case "zh-CN":
|
||||
locale = zhCN;
|
||||
break;
|
||||
|
@ -501,6 +517,12 @@ export class SettingRecordPage {
|
|||
case "it":
|
||||
locale = it;
|
||||
break;
|
||||
case "pt-BR":
|
||||
locale = ptBR;
|
||||
break;
|
||||
case "ru":
|
||||
locale = ru;
|
||||
break;
|
||||
case "zh-CN":
|
||||
locale = zhCN;
|
||||
break;
|
||||
|
|
|
@ -75,6 +75,9 @@
|
|||
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" *ngIf="env.searchEngine === 'ecosia'"
|
||||
src="assets/icon/ecosia.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" *ngIf="env.searchEngine === 'brave'"
|
||||
src="assets/icon/brave-search.svg">
|
||||
</ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
|
|
|
@ -44,6 +44,17 @@
|
|||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none" (click)="setAutoOpenUrl()">
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" name="open">
|
||||
</ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'AUTO_OPEN_URL' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
|
||||
<ion-list-header class="ion-margin-start ion-padding-horizontal mt-3">{{ 'TASK' | translate }}</ion-list-header>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none" (click)="setResultPageButtons()">
|
||||
|
@ -76,6 +87,9 @@
|
|||
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" *ngIf="env.searchEngine === 'ecosia'"
|
||||
src="assets/icon/ecosia.svg">
|
||||
</ion-icon>
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" *ngIf="env.searchEngine === 'brave'"
|
||||
src="assets/icon/brave-search.svg">
|
||||
</ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
|
|
|
@ -22,6 +22,10 @@ export class SettingResultPage {
|
|||
this.router.navigate(['setting-auto-brightness']);
|
||||
}
|
||||
|
||||
setAutoOpenUrl() {
|
||||
this.router.navigate(['setting-auto-open-url']);
|
||||
}
|
||||
|
||||
setQrStyle() {
|
||||
this.router.navigate(['setting-qr']);
|
||||
}
|
||||
|
|
|
@ -99,6 +99,19 @@
|
|||
<ion-radio class="ion-margin-end" slot="end" [value]="'ecosia'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
<ion-item class="ion-no-padding ripple-parent" detail="false" lines="none">
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" src="assets/icon/brave-search.svg">
|
||||
</ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'BRAVE_SEARCH' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
<ion-radio class="ion-margin-end" slot="end" [value]="'brave'" [color]="'primary'">
|
||||
</ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
|
||||
</ion-content>
|
|
@ -134,7 +134,29 @@
|
|||
</ion-label>
|
||||
</ion-item>
|
||||
<ion-item *ngIf="isAndroid" class="ion-no-padding ripple-parent" detail="false" lines="none"
|
||||
(click)="confirmExitApp()">
|
||||
(click)="rateAndroidApp()">
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" color="primary" name="logo-google-playstore"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'RATE_THE_APP' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<ion-item *ngIf="isIos" class="ion-no-padding ripple-parent" detail="false" lines="none"
|
||||
(click)="rateIosApp()">
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" color="primary" name="logo-apple-appstore"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
|
||||
{{ 'RATE_THE_APP' | translate }}
|
||||
</ion-text>
|
||||
</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<ion-item *ngIf="isAndroid" class="ion-no-padding ripple-parent" detail="false" lines="none"
|
||||
(click)="exitApp()">
|
||||
<ion-icon class="ion-margin-start ion-padding-horizontal" color="danger" name="exit"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="ion-padding pre-line">
|
||||
|
|
|
@ -28,10 +28,22 @@ export class SettingPage {
|
|||
await SplashScreen.hide()
|
||||
}
|
||||
|
||||
get isIos(): boolean {
|
||||
return this.platform.is('ios');
|
||||
}
|
||||
|
||||
get isAndroid(): boolean {
|
||||
return this.platform.is('android');
|
||||
}
|
||||
|
||||
rateAndroidApp() {
|
||||
window.open(this.env.GOOGLE_PLAY_URL, '_system');
|
||||
}
|
||||
|
||||
rateIosApp() {
|
||||
window.open(this.env.APP_STORE_URL, '_system');
|
||||
}
|
||||
|
||||
setLanguage() {
|
||||
this.router.navigate(['setting-language']);
|
||||
}
|
||||
|
@ -127,27 +139,8 @@ export class SettingPage {
|
|||
alert.present();
|
||||
}
|
||||
|
||||
async confirmExitApp(): Promise<void> {
|
||||
const alert = await this.alertController.create({
|
||||
header: this.translate.instant('EXIT_APP'),
|
||||
message: this.translate.instant('MSG.EXIT_APP'),
|
||||
cssClass: ['alert-bg'],
|
||||
buttons: [
|
||||
{
|
||||
text: this.translate.instant('EXIT'),
|
||||
handler: () => {
|
||||
navigator['app'].exitApp();
|
||||
}
|
||||
},
|
||||
{
|
||||
text: this.translate.instant('RATE_THE_APP'),
|
||||
handler: () => {
|
||||
this.openGooglePlay();
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
await alert.present();
|
||||
exitApp() {
|
||||
navigator['app'].exitApp();
|
||||
}
|
||||
|
||||
openGooglePlay(): void {
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
@ -137,7 +136,7 @@ export class TabsPage {
|
|||
|
||||
async tapHaptic() {
|
||||
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
|
||||
await Haptics.impact({ style: ImpactStyle.Medium })
|
||||
await Haptics.impact({ style: ImpactStyle.Light })
|
||||
.catch(async err => {
|
||||
if (this.env.debugMode === 'on') {
|
||||
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
|
||||
|
|
|
@ -15,7 +15,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|||
import { Preferences } from '@capacitor/preferences';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | 'zh-CN' | 'zh-HK';
|
||||
export declare type LanguageType = 'de' | 'en' | 'fr' | 'it' | '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";
|
||||
|
@ -23,20 +23,22 @@ export declare type ColorThemeType = 'light' | 'dark' | 'black';
|
|||
export declare type ErrorCorrectionLevelType = 'L' | 'M' | 'Q' | 'H';
|
||||
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';
|
||||
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 = '3.2.0';
|
||||
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';
|
||||
|
@ -44,7 +46,8 @@ export class EnvService {
|
|||
public scanRecordLogging: OnOffType = 'on';
|
||||
public recordsLimit: 30 | 50 | 100 | -1 = -1;
|
||||
public showNumberOfRecords: OnOffType = 'on';
|
||||
public autoMaxBrightness: OnOffType = 'on';
|
||||
public autoMaxBrightness: OnOffType = 'off';
|
||||
public autoOpenUrl: OnOffType = 'off';
|
||||
public errorCorrectionLevel: ErrorCorrectionLevelType = 'M';
|
||||
public qrCodeLightR: number = 255;
|
||||
public qrCodeLightG: number = 255;
|
||||
|
@ -75,6 +78,7 @@ export class EnvService {
|
|||
public showSendMessageButton: OnOffType = 'on';
|
||||
public showSendEmailButton: OnOffType = 'on';
|
||||
public showOpenFoodFactsButton: OnOffType = 'on';
|
||||
public showExitAppAlert: OnOffType = "on";
|
||||
public debugMode: OnOffType = 'off';
|
||||
public autoExitAppMin: 1 | 3 | 5 | -1 = -1;
|
||||
|
||||
|
@ -86,6 +90,7 @@ export class EnvService {
|
|||
public readonly KEY_LANGUAGE = "language";
|
||||
public readonly KEY_COLOR = "color";
|
||||
public readonly KEY_DEBUG_MODE = "debug-mode-on";
|
||||
public readonly KEY_SHOW_EXIT_APP_ALERT = "showExitAppAlert";
|
||||
public readonly KEY_ORIENTATION = "orientation";
|
||||
public readonly KEY_SCAN_RECORD_LOGGING = "scan-record-logging";
|
||||
public readonly KEY_RECORDS_LIMIT = "recordsLimit";
|
||||
|
@ -100,6 +105,7 @@ export class EnvService {
|
|||
public readonly KEY_QR_CODE_DARK_B = "qrCodeDarkB";
|
||||
public readonly KEY_QR_CODE_MARGIN = "qrCodeMargin";
|
||||
public readonly KEY_AUTO_MAX_BRIGHTNESS = "auto-max-brightness";
|
||||
public readonly KEY_AUTO_OPEN_URL = "auto-open-url";
|
||||
public readonly KEY_SEARCH_ENGINE = "search-engine";
|
||||
public readonly KEY_RESULT_PAGE_BUTTONS = "result-page-buttons";
|
||||
public readonly KEY_SHOW_QR_AFTER_CAMERA_SCAN = "show-qr-after-camera-scan";
|
||||
|
@ -121,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-v30200";
|
||||
public readonly KEY_IOS_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30200";
|
||||
public readonly KEY_ANDROID_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30100";
|
||||
public readonly KEY_IOS_PREV_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-v30100";
|
||||
public readonly KEY_ANDROID_NOT_SHOW_UPDATE_NOTES = "not-show-update-notes-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';
|
||||
|
||||
|
@ -134,6 +140,7 @@ export class EnvService {
|
|||
public readonly DUCK_DUCK_GO_SEARCH_URL: string = "https://duckduckgo.com/?q=";
|
||||
public readonly YANDEX_SEARCH_URL: string = "https://yandex.com/search/?text=";
|
||||
public readonly ECOSIA_SEARCH_URL: string = "https://www.ecosia.org/search?method=index&q=";
|
||||
public readonly BRAVE_SEARCH_URL: string = "https://search.brave.com/search?q=";
|
||||
|
||||
public readonly GITHUB_REPO_URL: string = "https://github.com/tomfong/simple-qr";
|
||||
public readonly GOOGLE_PLAY_URL: string = "https://play.google.com/store/apps/details?id=com.tomfong.simpleqr";
|
||||
|
@ -142,6 +149,7 @@ export class EnvService {
|
|||
public readonly PRIVACY_POLICY: string = "https://www.privacypolicies.com/live/771b1123-99bb-4bfe-815e-1046c0437a0f";
|
||||
|
||||
resultContent: string = '';
|
||||
editingContent: boolean = false;
|
||||
resultContentFormat: string = '';
|
||||
scanRecords: ScanRecord[] = [];
|
||||
bookmarks: Bookmark[] = [];
|
||||
|
@ -498,7 +506,7 @@ export class EnvService {
|
|||
if (value != null) {
|
||||
this.autoMaxBrightness = value;
|
||||
} else {
|
||||
this.autoMaxBrightness = 'on';
|
||||
this.autoMaxBrightness = 'off';
|
||||
}
|
||||
await Preferences.set({
|
||||
key: this.KEY_AUTO_MAX_BRIGHTNESS,
|
||||
|
@ -852,6 +860,15 @@ export class EnvService {
|
|||
await this.toggleColorTheme();
|
||||
}
|
||||
);
|
||||
await Preferences.get({ key: this.KEY_SHOW_EXIT_APP_ALERT }).then(
|
||||
async result => {
|
||||
if (result.value != null) {
|
||||
this.showExitAppAlert = result.value as OnOffType;
|
||||
} else {
|
||||
this.showExitAppAlert = 'on';
|
||||
}
|
||||
}
|
||||
);
|
||||
await Preferences.get({ key: this.KEY_DEBUG_MODE }).then(
|
||||
async result => {
|
||||
if (result.value != null) {
|
||||
|
@ -984,7 +1001,16 @@ export class EnvService {
|
|||
if (result.value != null) {
|
||||
this.autoMaxBrightness = result.value as OnOffType;
|
||||
} else {
|
||||
this.autoMaxBrightness = 'on';
|
||||
this.autoMaxBrightness = 'off';
|
||||
}
|
||||
}
|
||||
);
|
||||
await Preferences.get({ key: this.KEY_AUTO_OPEN_URL }).then(
|
||||
async result => {
|
||||
if (result.value != null) {
|
||||
this.autoOpenUrl = result.value as OnOffType;
|
||||
} else {
|
||||
this.autoOpenUrl = 'off';
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -1182,7 +1208,8 @@ export class EnvService {
|
|||
this.scanRecordLogging = 'on';
|
||||
this.recordsLimit = -1;
|
||||
this.showNumberOfRecords = 'on';
|
||||
this.autoMaxBrightness = 'on';
|
||||
this.autoMaxBrightness = 'off';
|
||||
this.autoOpenUrl = 'off';
|
||||
this.errorCorrectionLevel = 'M';
|
||||
this.qrCodeLightR = 255;
|
||||
this.qrCodeLightG = 255;
|
||||
|
@ -1216,6 +1243,7 @@ export class EnvService {
|
|||
this.showOpenFoodFactsButton = 'on';
|
||||
this.scanRecords = [];
|
||||
this.bookmarks = [];
|
||||
this.showExitAppAlert = 'on';
|
||||
this.debugMode = 'off';
|
||||
this.autoExitAppMin = -1;
|
||||
}
|
||||
|
@ -1252,9 +1280,12 @@ export class EnvService {
|
|||
this.showNumberOfRecords = 'on';
|
||||
await Preferences.set({ key: this.KEY_SHOW_NUMBER_OF_RECORDS, value: this.showNumberOfRecords });
|
||||
|
||||
this.autoMaxBrightness = 'on';
|
||||
this.autoMaxBrightness = 'off';
|
||||
await Preferences.set({ key: this.KEY_AUTO_MAX_BRIGHTNESS, value: this.autoMaxBrightness });
|
||||
|
||||
this.autoOpenUrl = 'off';
|
||||
await Preferences.set({ key: this.KEY_AUTO_OPEN_URL, value: this.autoOpenUrl });
|
||||
|
||||
this.errorCorrectionLevel = 'M';
|
||||
await Preferences.set({ key: this.KEY_ERROR_CORRECTION_LEVEL, value: this.errorCorrectionLevel });
|
||||
|
||||
|
@ -1349,6 +1380,9 @@ export class EnvService {
|
|||
this.showOpenFoodFactsButton = 'on';
|
||||
await Preferences.set({ key: this.KEY_SHOW_OPEN_FOOD_FACTS_BUTTON, value: this.showOpenFoodFactsButton });
|
||||
|
||||
this.showExitAppAlert = 'on';
|
||||
await Preferences.set({ key: this.KEY_SHOW_EXIT_APP_ALERT, value: this.showExitAppAlert });
|
||||
|
||||
this.debugMode = 'off';
|
||||
await Preferences.set({ key: this.KEY_DEBUG_MODE, value: this.debugMode });
|
||||
|
||||
|
@ -1600,6 +1634,12 @@ export class EnvService {
|
|||
case "it":
|
||||
language = "it"
|
||||
break;
|
||||
case "pt":
|
||||
language = "pt-BR";
|
||||
break;
|
||||
case "ru":
|
||||
language = "ru"
|
||||
break;
|
||||
case "zh":
|
||||
if (browserCultureLang == 'zh-CN' || browserCultureLang == 'zh-SG') {
|
||||
language = 'zh-CN';
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
import { HttpClient } from "@angular/common/http";
|
||||
import { TranslateHttpLoader } from "@ngx-translate/http-loader";
|
||||
|
||||
function componentToHex(c: number) {
|
||||
var hex = c.toString(16);
|
||||
return hex.length == 1 ? "0" + hex : hex;
|
||||
|
@ -5,4 +8,8 @@ function componentToHex(c: number) {
|
|||
|
||||
export function rgbToHex(r: number, g: number, b: number) {
|
||||
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
|
||||
}
|
||||
}
|
||||
|
||||
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
||||
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"AUTO_KILL_BACKGROUND": "Auto Kill Hintergrund",
|
||||
"AUTO_LOGGING": "Automatische Protokollierung",
|
||||
"AUTO_MAX_BRIGHTNESS": "Auto Maximale Helligkeit",
|
||||
"AUTO_OPEN_URL": "URL automatisch öffnen",
|
||||
"AUTO_QR_CODE_POPUP": "Automatisches QR Code Pop-up",
|
||||
"BACKGROUND_COLOR": "Hintergrundfarbe",
|
||||
"BACKING_UP": "Sichern",
|
||||
|
@ -34,6 +35,7 @@
|
|||
"BOOKMARKED": "Lesezeichen",
|
||||
"BOOKMARKED_TEXTS": "Texte mit Lesezeichen",
|
||||
"BOOKMARKS": "Lesezeichen",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "Durchsuchen",
|
||||
"BROWSER": "Browser",
|
||||
"BROWSE_WEBSITE": "Website durchsuchen",
|
||||
|
@ -90,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?",
|
||||
|
@ -103,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",
|
||||
|
@ -113,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",
|
||||
|
@ -165,6 +170,8 @@
|
|||
"RESET_DEFAULT": "Standard zurücksetzen",
|
||||
"RESTORE": "Wiederherstellen",
|
||||
"RESULT": "Ergebnis",
|
||||
"SAVE": "Speichern",
|
||||
"SAVED": "Gespeichert",
|
||||
"SCAN": "Scannen",
|
||||
"SCANNED": "Gescannt",
|
||||
"SCANNING_FEEDBACK_ONLY": "Nur Feedback scannen",
|
||||
|
@ -224,6 +231,7 @@
|
|||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>Um Systemressourcen und Akku zu sparen, lege die Zeit fest, zu der die Anwendung automatisch beendet wird, wenn sie im Hintergrund läuft.</p><br><p>Wenn Du gewählt hast <b>Systemeinstellung folgens</b>, die Anwendung wird vollständig vom System kontrolliert und kann nicht von selbst beendet werden.</p><br><p>Bitte beachte, dass in manchen Situationen, könnte das System die Anwendung im Voraus stoppen.</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "Jeder QR-Code und Barcode-Inhalt wird protokolliert und automatisch gespeichert, nachdem Du ihn gescannt, erstellt oder erneut angezeigt hast. Du kannst sie auf der Seite Log einsehen.",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "Die Bildschirmhelligkeit wird automatisch auf das Maximum eingestellt, wenn ein QR-Code angezeigt wird..",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "Wenn der QR-Code gescannt wird und der Inhalt eine URL ist, wird die URL automatisch geöffnet.",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "Nach den folgenden Aktionen wird automatisch ein QR-Code auf der Ergebnisseite angezeigt.",
|
||||
"BACKUP_EXPLAIN": "Du kannst alle Datensätze und Lesezeichen lokal sichern. Nach der Sicherung erhältst du eine Reihe von Geheimnissen. Bewahre das Geheimnis sicher auf, sonst kannst du die Sicherung nicht wiederherstellen. Bitte beachte, dass Simple QR keine plattformübergreifende Sicherung und Wiederherstellung unterstützt.",
|
||||
"BACKUP_FAILED": "Sicherung fehlgeschlagen",
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"AUTO_KILL_BACKGROUND": "Auto Kill Background",
|
||||
"AUTO_LOGGING": "Auto Logging",
|
||||
"AUTO_MAX_BRIGHTNESS": "Auto Max Brightness",
|
||||
"AUTO_OPEN_URL": "Auto Open URL",
|
||||
"AUTO_QR_CODE_POPUP": "Auto QR Code Pop-up",
|
||||
"BACKGROUND_COLOR": "Background Color",
|
||||
"BACKING_UP": "Backing Up",
|
||||
|
@ -34,6 +35,7 @@
|
|||
"BOOKMARKED": "Bookmarked",
|
||||
"BOOKMARKED_TEXTS": "Bookmarked texts",
|
||||
"BOOKMARKS": "Bookmarks",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "Browse",
|
||||
"BROWSER": "Browser",
|
||||
"BROWSE_WEBSITE": "Browse Website",
|
||||
|
@ -90,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?",
|
||||
|
@ -103,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",
|
||||
|
@ -113,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",
|
||||
|
@ -165,6 +170,8 @@
|
|||
"RESET_DEFAULT": "Reset Default",
|
||||
"RESTORE": "Restore",
|
||||
"RESULT": "Result",
|
||||
"SAVE": "Save",
|
||||
"SAVED": "Saved",
|
||||
"SCAN": "Scan",
|
||||
"SCANNED": "Scanned",
|
||||
"SCANNING_FEEDBACK_ONLY": "Scanning Feedback Only",
|
||||
|
@ -224,6 +231,7 @@
|
|||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>To save system resources and battery, set the time to automatically kill the app when it is running in the background.</p><br><p>If you choose <b>Follow System Settings</b>, the app will be fully controlled by system and won't be killed by itself.</p><br><p>Please note that in some situations, the system might stop the app in advance.</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "Every QR code and barcode content are logged and stored automatically after you scan, create or view it again. You can view them on the Log page.",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "The screen brightness is automatically adjusted to the maximum when displaying QR code.",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "When the QR code is scanned and the content is a URL, the URL will be opened automatically.",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "Automatically pop up QR code on the Result page after the following actions.",
|
||||
"BACKUP_EXPLAIN": "You can back up all records and bookmarks locally. You will be given a set of secret after backing up. Keep the secret securely, otherwise you cannot restore the backup. Please note that Simple QR does not support cross-platform backup and restore.",
|
||||
"BACKUP_FAILED": "Failed to back up",
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"AUTO_KILL_BACKGROUND": "Arrière-plan de mise à mort automatique",
|
||||
"AUTO_LOGGING": "Journalisation automatique",
|
||||
"AUTO_MAX_BRIGHTNESS": "Luminosité max automatique",
|
||||
"AUTO_OPEN_URL": "Ouvrir l'URL automatique",
|
||||
"AUTO_QR_CODE_POPUP": "Fenêtre pop-up de code QR automatique",
|
||||
"BACKGROUND_COLOR": "Couleur de l'arrière plan",
|
||||
"BACKING_UP": "Sauvegarde",
|
||||
|
@ -34,6 +35,7 @@
|
|||
"BOOKMARKED": "Mis en signet",
|
||||
"BOOKMARKED_TEXTS": "Textes marqués d'un signet",
|
||||
"BOOKMARKS": "Signets",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "Parcourir",
|
||||
"BROWSER": "Navigateur",
|
||||
"BROWSE_WEBSITE": "Parcourir le site Web",
|
||||
|
@ -90,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é ?",
|
||||
|
@ -103,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",
|
||||
|
@ -113,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",
|
||||
|
@ -165,6 +170,8 @@
|
|||
"RESET_DEFAULT": "Réinitialiser par défaut",
|
||||
"RESTORE": "Restaurer",
|
||||
"RESULT": "Résultat",
|
||||
"SAVE": "Enregistrer",
|
||||
"SAVED": "Enregistrée",
|
||||
"SCAN": "Scanner",
|
||||
"SCANNED": "Scanné",
|
||||
"SCANNING_FEEDBACK_ONLY": "Vibrer lors de la numérisation uniquement",
|
||||
|
@ -224,6 +231,7 @@
|
|||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>Pour économiser les ressources système et la batterie, définissez l'heure pour arrêter automatiquement l'application lorsqu'elle s'exécute en arrière-plan.</p><br><p>Si vous choisissez <b>Suivre les paramètres du système</b>, l'application sera entièrement contrôlée par le système et ne sera pas tuée d'elle-même.</p><br><p>Veuillez noter que dans certaines situations, le système peut arrêter l'application à l'avance.</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "Chaque contenu de code QR et de code-barres est enregistré et stocké automatiquement après que vous l'avez numérisé, créé ou visualisé à nouveau. Vous pouvez les afficher sur la page Registre.",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "La luminosité de l'écran est automatiquement ajustée au maximum lors de l'affichage du code QR.",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "Lorsque le code QR est scanné et que le contenu est une URL, l'URL s'ouvre automatiquement.",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "Afficher automatiquement le code QR sur la page de résultat après les actions suivantes.",
|
||||
"BACKUP_EXPLAIN": "Vous pouvez sauvegarder tous les enregistrements et signets localement. Vous recevrez un ensemble de code secret après la sauvegarde. Conservez le secret en toute sécurité, sinon vous ne pourrez pas restaurer la sauvegarde. Veuillez noter que Simple QR ne prend pas en charge la sauvegarde et la restauration multiplateforme.",
|
||||
"BACKUP_FAILED": "Échec de la sauvegarde",
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"AUTO_KILL_BACKGROUND": "Eliminazione background automatica",
|
||||
"AUTO_LOGGING": "Logging automatico",
|
||||
"AUTO_MAX_BRIGHTNESS": "Luminosità massima automatica",
|
||||
"AUTO_OPEN_URL": "Apri URL automaticamente",
|
||||
"AUTO_QR_CODE_POPUP": "Codice QR Pop-up automatico",
|
||||
"BACKGROUND_COLOR": "Colore di sfondo",
|
||||
"BACKING_UP": "Eseguendo il backup",
|
||||
|
@ -34,6 +35,7 @@
|
|||
"BOOKMARKED": "Aggiunto ai preferiti",
|
||||
"BOOKMARKED_TEXTS": "Testi preferiti",
|
||||
"BOOKMARKS": "Segnalibri",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "Naviga",
|
||||
"BROWSER": "Browser",
|
||||
"BROWSE_WEBSITE": "Sfoglia il sito web",
|
||||
|
@ -90,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?",
|
||||
|
@ -103,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",
|
||||
|
@ -113,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",
|
||||
|
@ -165,6 +170,8 @@
|
|||
"RESET_DEFAULT": "Ripristina predefinito",
|
||||
"RESTORE": "Ripristina",
|
||||
"RESULT": "Risultato",
|
||||
"SAVE": "Salva",
|
||||
"SAVED": "Salvato",
|
||||
"SCAN": "Scannerizza",
|
||||
"SCANNED": "Scannerizzato",
|
||||
"SCANNING_FEEDBACK_ONLY": "Scansione esclusivamente del feedback",
|
||||
|
@ -224,6 +231,7 @@
|
|||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>Per salvare risorse e batteria, setta automaticamente la durata massima per killare l'app automaticamente quando viene eseguita in background.</p><br><p>Se selezioni <b>Segui le impostazioni di sistema</b>, l'app verrà controllata dal sistema e non sarà possibile killarla in autonomia.</p><br><p>Considera che in alcune situazioni, il sistema potrebbe interrompere l'app in anticipo..</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "Qualsiasi contenuto dei codici QR e a barre vengono loggate e salvate automaticamente in seguito alla scannerizzazione, creazione o successiva visualizzazione. Puoi rivederla nella pagina di Log.",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "La luminosità dello schermo è settata automaticamente al massimo quando si visualizza un codice QR.",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "Quando il codice QR viene scansionato e il contenuto è un URL, l'URL verrà aperto automaticamente.",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "Visualizza automaticamente il codice QR nella pagina dei risultati dopo le seguenti azioni.",
|
||||
"BACKUP_EXPLAIN": "È possibile eseguire il backup di tutti i record e i segnalibri localmente. Ti verrà fornita una serie di chiavi segrete dopo il backup. Salvale in modo sicuro, altrimenti non sarà possibile ripristinare il backup. Si prega di notare che Simple QR non supporta il backup e il ripristino multipiattaforma.",
|
||||
"BACKUP_FAILED": "Tentativo di backup fallito",
|
||||
|
|
322
src/assets/i18n/pt-BR.json
Normal 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>"
|
||||
}
|
||||
}
|
322
src/assets/i18n/ru.json
Normal file
|
@ -0,0 +1,322 @@
|
|||
{
|
||||
"100_RECORDS": "100 записей",
|
||||
"30_RECORDS": "30 записей",
|
||||
"49_DIGIT": "49-значный",
|
||||
"50_RECORDS": "50 записей",
|
||||
"ABOUT": "О приложении",
|
||||
"ABOUT_SIMPLE_QR": "О Simple QR",
|
||||
"ADD": "Добавить",
|
||||
"ADD_BCC": "Добавить BCC",
|
||||
"ADD_CC": "Добавить CC",
|
||||
"ADD_CONTACT": "Добавить контакт",
|
||||
"ADD_RECIPIENT": "Добавить получателя",
|
||||
"APP": "Приложение",
|
||||
"APPEARANCE_AND_EFFECTS": "Внешний вид и эффекты",
|
||||
"APP_INITIAL_PAGE": "Стартовая страница",
|
||||
"APP_VERSION": "Версия приложения",
|
||||
"AT": "в",
|
||||
"AT_LEAST_1_MINUTE_LATER": "Как минимум через минуту",
|
||||
"AT_LEAST_3_MINUTES_LATER": "Как минимум через 3 минуты",
|
||||
"AT_LEAST_5_MINUTES_LATER": "Как минимум через 5 минут",
|
||||
"AUTO_KILL_BACKGROUND": "Фоновая активность",
|
||||
"AUTO_LOGGING": "Автоматическое добавление в историю",
|
||||
"AUTO_MAX_BRIGHTNESS": "Максимальная яркость",
|
||||
"AUTO_OPEN_URL": "Открывать URL автоматически",
|
||||
"AUTO_QR_CODE_POPUP": "Показывать QR-Код",
|
||||
"BACKGROUND_COLOR": "Цвет фона",
|
||||
"BACKING_UP": "Сохранение резервной копии",
|
||||
"BACKUP": "Резервное копирование",
|
||||
"BASE64": "Base64",
|
||||
"BASE64_DECODED": "Декодировано из Base64",
|
||||
"BASE64_ENCODED": "Закодировано в Base64",
|
||||
"BCC": "BCC",
|
||||
"BLACK": "Черная",
|
||||
"BOOKMARK": "Закладки",
|
||||
"BOOKMARKED": "Добавлено в закладки",
|
||||
"BOOKMARKED_TEXTS": "Сохраненные тексты",
|
||||
"BOOKMARKS": "Закладки",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "Просмотреть",
|
||||
"BROWSER": "Браузер",
|
||||
"BROWSE_WEBSITE": "Посетить веб-сайт",
|
||||
"CALL": "Позвонить",
|
||||
"CANCEL": "Отмена",
|
||||
"CC": "CC",
|
||||
"CITY": "Город",
|
||||
"CLEAR": "Очистить",
|
||||
"CLOSE": "Закрыть",
|
||||
"COLOR": "Цвет",
|
||||
"COLOR_THEME": "Тема",
|
||||
"COMING_SOON": "Скоро...",
|
||||
"CONTACT_METHOD": "Метод связи",
|
||||
"CONTACT_NAME": "Имя контакта",
|
||||
"CONTENT": "Содержание",
|
||||
"CONTENT_TYPE": "Тип содержания",
|
||||
"COPIED": "Скопировано",
|
||||
"COPY": "Скопировать",
|
||||
"COPY_SECRET_AND_SAVE_BACKUP": "Скопировать ключ и сохранить резервную копию",
|
||||
"COPY_TEXT": "Скопировать текст",
|
||||
"COUNTRY": "Страна",
|
||||
"CREATE": "Создать",
|
||||
"CREATED": "Создано",
|
||||
"CREATE_QR_CODE": "Создать QR-Код",
|
||||
"DARK": "Тёмная",
|
||||
"DATE_OF_BIRTH": "Дата рождения",
|
||||
"DEBUG_MODE": "Режим отладки",
|
||||
"DECODING": "Декодирование",
|
||||
"DECRYPTING": "Расшифровка",
|
||||
"DETAILED": "Подробнее",
|
||||
"DONE": "Готово",
|
||||
"DUCK_DUCK_GO": "DuckDuckGo",
|
||||
"ECOSIA": "Ecosia",
|
||||
"EDIT": "Редактировать",
|
||||
"EMAIL_ADDRESS": "Адрес электронной почты",
|
||||
"EMAIL_BODY": "Содержание электронного письма",
|
||||
"EMAIL_NTT_DOCOMO": "Электронное письмо (NTT Docomo)",
|
||||
"EMAIL_RECIPIENT": "Получатель",
|
||||
"EMAIL_SUBJECT": "Тема",
|
||||
"EMAIL_TO": "Отправить по электронной почте",
|
||||
"EMAIL_W3C_STANDARD": "Электронное письмо (стандарт W3C)",
|
||||
"ENCRYPTING": "Шифрование",
|
||||
"ERROR_CORRECTION_LEVEL": "Уровень коррекции ошибок",
|
||||
"EXIT": "Выйти",
|
||||
"EXIT_APP": "Выйти из приложения",
|
||||
"EXPORT": "Экспорт",
|
||||
"EXPORTING": "Экспортирование",
|
||||
"EXPORT_TO_CSV": "Экспортировать в CSV",
|
||||
"FAX_NUMBER": "Номер Fax",
|
||||
"FEMALE": "Женский",
|
||||
"FIRST_NAME": "Имя",
|
||||
"FOLLOW_SYSTEM_SETTINGS": "Как в системе",
|
||||
"FREE_TEXT": "Текст",
|
||||
"FULL_RESET": "Полный сброс",
|
||||
"FUNCTIONS": "Функции",
|
||||
"GENDER": "Пол",
|
||||
"GEOLOCATION": "Геолокация",
|
||||
"GOOGLE_SEARCH": "Google Search",
|
||||
"HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик",
|
||||
"HIDDEN_NETWORK_?": "Скрытая сеть?",
|
||||
"HOME_ADDRESS": "Домашний адрес",
|
||||
"HOME_PHONE_NUMBER": "Номер домашнего телефона",
|
||||
"ICON_ONLY": "Только иконка",
|
||||
"IMPORT": "Импорт",
|
||||
"IMPORT_FROM_CSV": "Импортировать из CSV",
|
||||
"IMPORT_IMAGE": "Импорт изображения",
|
||||
"INITIAL_SEGMENT": "Стартовая страница",
|
||||
"JOB_TITLE": "Должность",
|
||||
"LANGUAGE": "Язык",
|
||||
"LAST_NAME": "Фамилия",
|
||||
"LATITUDE": "Широта",
|
||||
"LEVEL_H": "Уровень H",
|
||||
"LEVEL_L": "Уровень L",
|
||||
"LEVEL_M": "Уровень M",
|
||||
"LEVEL_Q": "Уровень Q",
|
||||
"LIGHT": "Светлая",
|
||||
"LOADING_DATA": "Загрузка информации",
|
||||
"LOCK_LANDSCAPE": "Альбомная",
|
||||
"LOCK_PORTRAIT": "Портретная",
|
||||
"LOG": "История",
|
||||
"LOG_BACKUP_AND_RESTORE": "История и восстановление",
|
||||
"LONGITUDE": "Долгота",
|
||||
"MALE": "Мужской",
|
||||
"MANAGE_RECORDS": "Управление записями",
|
||||
"MARGIN": "Отступ",
|
||||
"MESSAGE": "Сообщение",
|
||||
"MESSAGE_CONTENT": "Содержание сообщения",
|
||||
"MICROSOFT_BING": "Microsoft Bing",
|
||||
"MOBILE_PHONE_NUMBER": "Номер мобильного телефона",
|
||||
"MORE": "Подробнее",
|
||||
"NAME": "Имя",
|
||||
"NO": "Нет",
|
||||
"NONE": "None",
|
||||
"NOT_AVAILABLE": "Нет доступа",
|
||||
"NOT_PROVIDED": "Не предоставлено",
|
||||
"NOT_TO_DISCLOSE": "Не указан",
|
||||
"NO_LIMIT": "Нет ограничений",
|
||||
"NUMBER_OF_RECORDS": "Количество записей",
|
||||
"OK": "ОК",
|
||||
"ONLY_DELETE_DATA": "Только удалить информацию",
|
||||
"ONLY_RESET_SETTING": "Только сбросить настройки",
|
||||
"OPEN": "Открыть",
|
||||
"OPEN_URL": "Открыть URL",
|
||||
"OPEN_WITH_...": "Открыть с помощью...",
|
||||
"OPTIMIZING_DATA_...": "Оптимизация информации...",
|
||||
"ORGANIZATION": "Организация",
|
||||
"ORIGINAL": "Оригинал",
|
||||
"OTHERS": "Другое",
|
||||
"PASSWORD": "Пароль",
|
||||
"PATCH_NOTES": "Нововведения",
|
||||
"PERMISSION_REQUIRED": "Необходимо разрешение",
|
||||
"PERSONAL": "Персональные данные",
|
||||
"PHONE_NO": "Номер телефона",
|
||||
"PHONE_NUMBER": "Номер телефона",
|
||||
"PLEASE_WAIT": "Пожалуйста, подождите",
|
||||
"POSTAL_CODE": "Почтовый индекс",
|
||||
"PREPARING": "Подготовка",
|
||||
"PREVIEW": "Предпросмотр",
|
||||
"PRIVACY_POLICY": "Политика конфиденциальности",
|
||||
"QR_CODE": "QR-Код",
|
||||
"QR_CODE_AND_DECODED_RESULT": "QR-Код и результат",
|
||||
"QR_CODE_CONTENT": "Содержание QR-Кода",
|
||||
"QR_CODE_STYLE": "Стиль QR-Кода",
|
||||
"RATE_THE_APP": "Оценить приложение",
|
||||
"RECORDS_LIMIT": "Ограничение количества записей",
|
||||
"REMOVE_ALL": "Удалить все",
|
||||
"REMOVE_BCC": "Убрать BCC",
|
||||
"REMOVE_CC": "Убрать CC",
|
||||
"REMOVE_RECIPIENT": "Убрать получателя",
|
||||
"REPORT_ISSUE": "Сообщить о проблеме",
|
||||
"RESET_APP": "Сброс приложения",
|
||||
"RESET_DEFAULT": "Настройки по умолчанию",
|
||||
"RESTORE": "Восстановление",
|
||||
"RESULT": "Результат",
|
||||
"SAVE": "Сохранять",
|
||||
"SAVED": "Сохранено",
|
||||
"SCAN": "Сканировать",
|
||||
"SCANNED": "Просканировано",
|
||||
"SCANNING_FEEDBACK_ONLY": "Только отклик сканирования",
|
||||
"SCAN_BY_CAMERA": "Сканирование с помощью камеры",
|
||||
"SCREEN_ORIENTATION": "Ориентация экрана",
|
||||
"SEARCH": "Поиск",
|
||||
"SEARCH_ENGINE": "Поисковая система",
|
||||
"SECRET": "Ключ",
|
||||
"SEND": "Отправить",
|
||||
"SEND_EMAIL": "Отправить электронное письмо",
|
||||
"SEND_MESSAGE": "Отправить сообщение",
|
||||
"SETTING": "Настройки",
|
||||
"SETTINGS": "Настройки",
|
||||
"SHARE": "Поделиться",
|
||||
"SHARING": "Отправка",
|
||||
"SHOW": "Показать",
|
||||
"SHOW_NUMBER_OR_RECORDS": "Показывать количество записей",
|
||||
"SHOW_QR_CODE": "Показать QR-Код",
|
||||
"SIMPLE_QR": "Simple QR",
|
||||
"STATE": "Округ",
|
||||
"STREET": "Улица",
|
||||
"SUCCESS": "Успешно",
|
||||
"SUPPORTED_BARCODE_TYPE": "Поддерживаемые операции",
|
||||
"SUPPORTED_TYPE": "Поддерживаемые операции",
|
||||
"SYSTEM_DEFAULT": "Как в системе",
|
||||
"TASK": "Задача",
|
||||
"TASK_BUTTON_LAYOUT": "Кнопки действия",
|
||||
"TURN_OFF": "Выключить",
|
||||
"TURN_ON": "Включить",
|
||||
"TURNED_OFF": "Выключено",
|
||||
"TURNED_ON": "Включено",
|
||||
"TUTORIAL": "Обучение",
|
||||
"UNDO": "Отменить",
|
||||
"UNKNOWN": "Неизвестно",
|
||||
"UPDATE_SUCCESSFULLY": "Успешно обновлено",
|
||||
"URL": "URL",
|
||||
"VCARD_CONTACT": "Контакт vCard",
|
||||
"VERSION_VERSION": "Версия {version}",
|
||||
"VIBRATION": "Вибрация",
|
||||
"VIEWED": "Просмотрено",
|
||||
"VIEW_BOOKMARK": "Просмотр закладки",
|
||||
"VIEW_GITHUB": "Посетить GitHub",
|
||||
"VIEW_LOG": "Просмотр истории",
|
||||
"VIEW_STORE_AND_SOURCE_CODE": "Посетить магазин и репозиторий с исходным кодом ",
|
||||
"VIEW_INSTRUCTIONS": "Посмотреть обучение",
|
||||
"WEBSITE": "Веб-сайт",
|
||||
"WIFI": "WiFi",
|
||||
"WIFI_ENCRYPTION": "Шифрование WiFi",
|
||||
"WIFI_SSID": "WiFi SSID",
|
||||
"WORK": "Место работы",
|
||||
"WORK_PHONE_NUMBER": "Номер рабочего телефона",
|
||||
"YAHOO_SEARCH": "Yahoo! Search",
|
||||
"YANDEX": "Yandex",
|
||||
"YES": "Да",
|
||||
"MSG": {
|
||||
"ALREADY_BOOKMARKED": "Ошибка! Уже добавлено в закладки ранее",
|
||||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>Чтобы использовать меньше системных ресурсов и батареи, выставьте количество времени, спустя которое приложение будет автоматически остановлено, если оно работает в фоне.</p><br><p>Если вы выберете опцию <b>Как в системе</b>, фоновая активность приложения будет полностью контролироваться системой, приложение не будет приостанавливать свою работу самостоятельно.</p><br><p>Заметьте, что в некоторых ситуациях система может останавливать приложение заблаговременно.</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "Содержание каждого QR-Кода и Бар-Кода автоматически сохраняется после сканирования. Вы можете повторно обращаться к этим записям в разделе Истории.",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "Автоматически увеличивать яркость экрана до максимального значения во время просмотра QR-Кода.",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "Когда QR-код сканируется, а содержимое представляет собой URL-адрес, URL-адрес будет открыт автоматически.",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "Автоматически показывать QR-Код на странице результата после этих действий.",
|
||||
"BACKUP_EXPLAIN": "Вы можете создать локальную резервную копию всех записей истории и закладок. Вам будет выдан набор ключей после резервного копирования. Сохраняйте эти ключи, иначе вы не сможете восстановить созданную резервную копию. Заметьте, что Simple QR не поддерживает резервное копирование между разными платформами.",
|
||||
"BACKUP_FAILED": "Не удалось создать резервную копию",
|
||||
"BACKUP_FAILED_2": "Не удалось создать резервную копию. Пожалуйста, убедитесь, что приложению выдано разрешение на взаимодействие с файлами.",
|
||||
"BACKUP_SUCCESSFULLY": "<p>Резервное копирование успешно завершено. Пожалуйста, сохраните файл резервной копии и следующий ключ</p><p>{secret}</p>",
|
||||
"BARCODE_TYPE": "Сканирование<ul><li>QR-Код</li><li>Бар-Код</li><li>Код Aztec</li><li>Data Matrix</li><li>PDF417</li></ul>Импорт изображения<ul><li>QR-Код</li></ul>Создание<ul><li>QR-Код</li></ul>",
|
||||
"BOOKMARKED": "Успешно добавлено в закладки",
|
||||
"BUTTON_DISPLAY_EXPLAIN": "Показать или скрыть кнопки действий.",
|
||||
"BUTTON_STYLE_EXPLAIN": "Выберите стиль кнопок действий.",
|
||||
"CAMERA_PERMISSION": "Чтобы приложение могло осуществлять сканирование, предоставьте доступ к Камере.",
|
||||
"CONTACT_PERMISSION": "Для сохранения контакта, необходимо предоставить доступ к Контактам.",
|
||||
"COPIED_SECRET": "Ключ скопирован",
|
||||
"COPY_TEXT": "Какую часть контента вы бы хотели скопировать?",
|
||||
"CREATE_QRCODE_MAX_LENGTH": "Максимум 1817 символов",
|
||||
"CREATE_QRCODE_MAX_LENGTH_EXPLAIN": "Длина содержания сгенерированного QR-Кода не должна превышать 1817 символов.",
|
||||
"DEBUG_MODE_ON": "Режим Отладки успешно активирован",
|
||||
"DELETE_OVERFLOWED_RECORDS": "После того, как вы покинете эту страницу, лишние записи будут безвозвратно удалены.",
|
||||
"EMAIL_MAX_LENGTH": "Максимум 254 символа",
|
||||
"EMAIL_SUBJECT_MAX_LENGTH": "Максимум 78 символов",
|
||||
"ERROR_CORRECTION_LEVEL_EXPLAIN": "<p>В структуру QR-Кодов заложена способность восстановления информации, даже если Код поврежден.</p><p>Существует 4 уровня такой защиты:</p><p>Уровень L восстанавливает 7% байт информации.</p><p>Уровень M восстанавливает 15% байт информации.</p><p>Уровень Q восстанавливает 25% байт информации.</p><p>Уровень H восстанавливает 30% байт информации.</p><br><p>Заметьте, что увеличение уровня защиты может увеличить вероятность восстановления информации, но также увеличивает размер QR-Кода. Поэтому, при обычных условиях рекомендуем использовать уровень M.</p>",
|
||||
"EXIT_APP": "<p>Уверены, что хотите покинуть приложение?</p><p>Если вам нравится Simple QR, пожалуйста, оцените его в магазине приложений.</p>",
|
||||
"EXPORT_TO_CSV_EXPLAIN": "Вы можете экспортировать все записи истории и закладки в CSV файл.",
|
||||
"FAILED_SAVING_CONTACT": "Не удалось сохранить контакт",
|
||||
"FAIL_PREPARE_SMS": "Не удалось отправить сообщение",
|
||||
"IMPORT_FAILED": "Не удалось импортировать",
|
||||
"IMPORT_FROM_CSV_EXPLAIN": "Вы можете импортировать записи истории и закладки из CSV файла в формате, заданном Simple QR. Если вы желаете переместить информацию между Android и iOS, воспользуйтесь этой функцией.",
|
||||
"INPUT_TAG": "Пожалуйста, дайте закладке имя",
|
||||
"INVALID_BK_FILE": "Это несовместимый файл резервной копии.",
|
||||
"INVALID_CSV_FILE": "Это несовместимый CSV файл.",
|
||||
"NOT_BASE64_DE": "Невозможно декодировать информацию из Base64",
|
||||
"NOT_BASE64_EN": "Невозможно закодировать информацию в Base64",
|
||||
"NOT_BASE64_EN_DE": "Невозможно закодировать или декодировать информацию Base64",
|
||||
"NO_QR_CODE": "Не удалось распознать QR-Код",
|
||||
"ONLY_VCARD_3_0": "Поддерживается только формат vCard 3.0",
|
||||
"PLEASE_INPUT_VALID_SECRET": "Пожалуйста, введите правильный ключ",
|
||||
"PORTRAIT_ONLY": "Портретная",
|
||||
"PREPARE_SMS": "Подготовка сообщения",
|
||||
"PREVIOUS_RECORDS": "Записи предыдущих действий: сканирования, создания или просмотра",
|
||||
"QR_CODE_VALUE_NOT_EMPTY": "Содержание QR-Кода не может быть пустым",
|
||||
"READ_IMAGE_PERMISSION": "Необходимо предоставить разрешение взаимодействовать с файлами, чтобы просканировать изображение.",
|
||||
"RECORDS_LIMIT_EXPLAIN": "Укажите максимальное количество записей истории. Старые записи будут автоматически удалены при достижении указанного лимита.",
|
||||
"REMOVE_ALL_BOOKMARKS": "Уверены, что хотите <b>безвозвратно</b> удалить все закладки?",
|
||||
"REMOVE_ALL_RECORD": "Уверены, что хотите <b>безвозвратно</b> удалить все записи истории?",
|
||||
"RESET_APP": "Уверены, что хотите вернуться к настройкам по умолчанию и удалить все данные приложения? <b>Это действие необратимо.</b>",
|
||||
"RESET_DEFAULT": "Уверены, что хотите вернуться к настройкам по умолчанию?",
|
||||
"RESTORE_EXPLAIN": "Вы можете восстановить закладки и записи истории из резервной копии. Полученные данные будут совмещены с текущими данными приложения. Файл резервной копии должен иметь тип TFSQBK.",
|
||||
"RESTORE_EXPLAIN_IOS": "Вы можете восстановить закладки и записи истории из резервной копии. Полученные данные будут совмещены с текущими данными приложения. Файл резервной копии должен иметь тип ISQBK.",
|
||||
"RESTORE_FAILED": "Не удалось восстановить",
|
||||
"RESTORE_SECRET": "Пожалуйста, введите ключ для восстановления данных",
|
||||
"RESTORE_SUCCESSFUL": "Восстановление успешно завершено",
|
||||
"RESTORE_WRONG_SECRET": "Неверный ключ",
|
||||
"SAVED_CONTACT": "Контакт сохранен",
|
||||
"SAVING_CONTACT": "Идет сохранение контакта",
|
||||
"SCAN_QR_FROM_IMAGE": "Simple QR использует модуль \"cozmo/jsQR\", чтобы сканировать QR-Код из изображение. Чтобы успешно осуществить сканирование",
|
||||
"SCAN_QR_FROM_IMAGE_R1": "Дайте приложению разрешение на доступ к Памяти устройства или Фото на нем.",
|
||||
"SCAN_QR_FROM_IMAGE_R2": "Убедитесь, что фон изображения не прозрачный. Не рекомендовано использовать изображение, полученные не при помощи камеры.",
|
||||
"SCAN_QR_FROM_IMAGE_R3": "Отмените редактирование фото, если вы хотите просканировать изображение целиком (по ситуации).",
|
||||
"SEARCH": "Что конкретно вы хотите найти?",
|
||||
"SEARCH_ENGINE_EXPLAIN": "Выберите поисковую систему для осуществления поиска после получения результата.",
|
||||
"SHARE_QR": "Скорее сканируй!\n\nОтправлено при помощи Simple QR",
|
||||
"SMS_MAX_LENGTH": "Максимум 160 символов",
|
||||
"SSID_MAX_LENGTH": "Максимум 32 символа",
|
||||
"START_PAGE_EXPLAIN": "Выберете стартовую страницу приложения.",
|
||||
"START_PAGE_HEADER_EXPLAIN": "Показывать заголовок Simple QR на стартовой странице.",
|
||||
"TAG_MAX_LENGTH": "Максимум 30 символов",
|
||||
"TAG_MAX_LENGTH_EXPLAIN": "Длина имени не должна превышать 30 символов..",
|
||||
"TUTORIAL_NOT_SHOW_AGAIN": "Не показывать снова",
|
||||
"TUTORIAL_SWIPE_LEFT": "Смахните влево, чтобы удалить соответствующую запись.",
|
||||
"TUTORIAL_SWIPE_RIGHT": "Смахните вправо, чтобы добавить текст соответствующей записи в закладки / редактировать имя соответствующей закладки.",
|
||||
"UNDO_DELETE": "Вы можете отменить удаление",
|
||||
"VIBRATION_EXPLAIN": "Использовать вибрацию или тактильный отклик. Заметьте, что не все устройства поддерживают эту функцию."
|
||||
},
|
||||
"BARCODE_TYPE": {
|
||||
"1D": "Бар-Код ",
|
||||
"AZTEC": "Код Aztec ",
|
||||
"DATA_MATRIX": "Data Matrix ",
|
||||
"EAN": "European Article Number ",
|
||||
"MAXICODE": "MaxiCode ",
|
||||
"PDF_417": "PDF417 ",
|
||||
"QR_CODE": "QR-Код ",
|
||||
"RSS": "GS1 DataBar ",
|
||||
"UPC": "Universal Product Code "
|
||||
},
|
||||
"UPDATE": {
|
||||
"UPDATE_NOTES_ANDROID": "<p>В этом релизе вас ждет несколько обновлений и новых функций. Посетите GitHub проекта, чтобы узнать детали.</p>",
|
||||
"UPDATE_NOTES_IOS": "<p>В этом релизе вас ждет несколько обновлений и новых функций. Посетите GitHub проекта, чтобы узнать детали.</p>"
|
||||
}
|
||||
}
|
|
@ -21,6 +21,7 @@
|
|||
"AUTO_KILL_BACKGROUND": "自动停止背景执行",
|
||||
"AUTO_LOGGING": "自动记录",
|
||||
"AUTO_MAX_BRIGHTNESS": "自动最大亮度",
|
||||
"AUTO_OPEN_URL": "自动打开网址",
|
||||
"AUTO_QR_CODE_POPUP": "自动弹出 QR 码",
|
||||
"BACKGROUND_COLOR": "背景颜色",
|
||||
"BACKING_UP": "备份中",
|
||||
|
@ -34,6 +35,7 @@
|
|||
"BOOKMARKED": "已书签",
|
||||
"BOOKMARKED_TEXTS": "已收藏的书签",
|
||||
"BOOKMARKS": "书签",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "浏览",
|
||||
"BROWSER": "浏览器",
|
||||
"BROWSE_WEBSITE": "浏览网站",
|
||||
|
@ -90,6 +92,7 @@
|
|||
"FULL_RESET": "完整重设",
|
||||
"FUNCTIONS": "功能",
|
||||
"GENDER": "性别",
|
||||
"GEOLOCATION": "地理定位",
|
||||
"GOOGLE_SEARCH": "Google 搜索",
|
||||
"HAPTIC_FEEDBACK_ONLY": "仅触感反馈",
|
||||
"HIDDEN_NETWORK_?": "隐藏的网络?",
|
||||
|
@ -103,6 +106,7 @@
|
|||
"JOB_TITLE": "职位名称",
|
||||
"LANGUAGE": "语言",
|
||||
"LAST_NAME": "姓氏",
|
||||
"LATITUDE": "纬度",
|
||||
"LEVEL_H": "H 等级",
|
||||
"LEVEL_L": "L 等级",
|
||||
"LEVEL_M": "M 等级",
|
||||
|
@ -113,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "锁定纵向",
|
||||
"LOG": "记录",
|
||||
"LOG_BACKUP_AND_RESTORE": "记录、备份与还原",
|
||||
"LONGITUDE": "经度",
|
||||
"MALE": "男性",
|
||||
"MANAGE_RECORDS": "管理记录",
|
||||
"MARGIN": "边距",
|
||||
|
@ -165,6 +170,8 @@
|
|||
"RESET_DEFAULT": "还原预设值",
|
||||
"RESTORE": "还原",
|
||||
"RESULT": "结果",
|
||||
"SAVE": "储存",
|
||||
"SAVED": "已储存",
|
||||
"SCAN": "扫描",
|
||||
"SCANNED": "扫描",
|
||||
"SCANNING_FEEDBACK_ONLY": "仅扫描反馈",
|
||||
|
@ -224,6 +231,7 @@
|
|||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>为节省系统资源及减低耗电,当程序进入背景执行时,设定自动停止执行程序及所有背景活动的时间。</p><br><p>若选择<b>由系统控制</b>,程序本身将不会干预其运作及资源占用,全由系统控制。</p><br><p>请注意,在某些情况下系统可能会提前停止程序的背景运作。</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "在您扫描、建立或查看记录时,条码内容会自动被记录并储存在本地储存空间。您可在「记录」页面浏览所有记录。",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "当显示 QR 码时,自动调校萤幕亮度到最大。",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "扫描QR码且内容为URL时,会自动打开该URL。",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "在进行以下已选择的动作后,自动弹出 QR 码。",
|
||||
"BACKUP_EXPLAIN": "您可以为现有的扫描记录及书签进行本地备份。备份后,您会得到一组密码。请妥善保存密码,否则您无法还原此备份。请注意,简易QR并不支援跨平台备份与还原。",
|
||||
"BACKUP_FAILED": "备份失败",
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"AUTO_KILL_BACKGROUND": "自動停止背景執行",
|
||||
"AUTO_LOGGING": "自動記錄",
|
||||
"AUTO_MAX_BRIGHTNESS": "自動最大亮度",
|
||||
"AUTO_OPEN_URL": "自動打開網址",
|
||||
"AUTO_QR_CODE_POPUP": "自動彈出 QR 碼",
|
||||
"BACKGROUND_COLOR": "背景顏色",
|
||||
"BACKING_UP": "備份中",
|
||||
|
@ -34,6 +35,7 @@
|
|||
"BOOKMARKED": "已書籤",
|
||||
"BOOKMARKED_TEXTS": "已收藏的書籤會在這裡顯示",
|
||||
"BOOKMARKS": "書籤",
|
||||
"BRAVE_SEARCH": "Brave Search",
|
||||
"BROWSE": "瀏覽",
|
||||
"BROWSER": "瀏覽器",
|
||||
"BROWSE_WEBSITE": "瀏覽網站",
|
||||
|
@ -90,6 +92,7 @@
|
|||
"FULL_RESET": "完整重設",
|
||||
"FUNCTIONS": "功能",
|
||||
"GENDER": "性別",
|
||||
"GEOLOCATION": "地理位置",
|
||||
"GOOGLE_SEARCH": "Google 搜尋",
|
||||
"HAPTIC_FEEDBACK_ONLY": "僅觸感反饋",
|
||||
"HIDDEN_NETWORK_?": "隱藏的網絡?",
|
||||
|
@ -103,6 +106,7 @@
|
|||
"JOB_TITLE": "職位名稱",
|
||||
"LANGUAGE": "語言",
|
||||
"LAST_NAME": "姓氏",
|
||||
"LATITUDE": "緯度",
|
||||
"LEVEL_H": "H 等級",
|
||||
"LEVEL_L": "L 等級",
|
||||
"LEVEL_M": "M 等級",
|
||||
|
@ -113,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "鎖定縱向",
|
||||
"LOG": "記錄",
|
||||
"LOG_BACKUP_AND_RESTORE": "記錄、備份與還原",
|
||||
"LONGITUDE": "經度",
|
||||
"MALE": "男性",
|
||||
"MANAGE_RECORDS": "管理記錄",
|
||||
"MARGIN": "邊距",
|
||||
|
@ -165,6 +170,8 @@
|
|||
"RESET_DEFAULT": "還原預設值",
|
||||
"RESTORE": "還原",
|
||||
"RESULT": "結果",
|
||||
"SAVE": "儲存",
|
||||
"SAVED": "已儲存",
|
||||
"SCAN": "掃描",
|
||||
"SCANNED": "掃描",
|
||||
"SCANNING_FEEDBACK_ONLY": "僅掃描反饋",
|
||||
|
@ -224,6 +231,7 @@
|
|||
"AUTO_KILL_BACKGROUND_EXPLAIN": "<p>為節省系統資源及減低耗電,當程式進入背景執行時,設定自動停止執行程式及所有背景活動的時間。</p><br><p>若選擇<b>由系統控制</b>,程式本身將不會干預其運作及資源佔用,全由系統控制。</p><br><p>請注意,在某些情況下系統可能會提前停止程式的背景運作。</p>",
|
||||
"AUTO_LOGGING_EXPLAIN": "在您掃描、建立或查看記錄時,條碼內容會自動被記錄並儲存在本地儲存空間。您可在「記錄」頁面瀏覽所有記錄。",
|
||||
"AUTO_MAX_BRIGHTNESS_EXPLAIN": "當顯示 QR 碼時,自動調校螢幕亮度到最大。",
|
||||
"AUTO_OPEN_URL_EXPLAIN": "掃描QR碼且內容為URL時,會自動打開該URL。",
|
||||
"AUTO_SHOW_QR_EXPLAIN": "在進行以下已選擇的動作後,自動彈出 QR 碼。",
|
||||
"BACKUP_EXPLAIN": "您可以為現有的掃描記錄及書籤進行本地備份。備份後,您會得到一組密碼。請妥善保存密碼,否則您無法還原此備份。請注意,簡易QR並不支援跨平台備份與還原。",
|
||||
"BACKUP_FAILED": "備份失敗",
|
||||
|
|
5
src/assets/icon/brave-search.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px">
|
||||
<path
|
||||
d="M46,11l-2.96-3.96c-1.22-1.22-3.08-1.52-4.62-0.75L37,7l-5-5H18l-5,5l-1.42-0.71c-1.54-0.77-3.4-0.47-4.62,0.75L4,11l2,3 l-2,4l5.77,17.47c0.79,2.28,2.38,4.19,4.47,5.38L25,47l10.76-6.15c2.09-1.19,3.68-3.1,4.47-5.38L46,18l-2-4L46,11z M25,40l-6-6 c0,0,5-3,6-3s6,3,6,3L25,40z M38.68,18.76L34,25l0.57,0.85c0.41,0.61,0.61,1.32,0.61,2.02c0,0.78-0.24,1.55-0.73,2.19 c-0.52,0.7-1.29,1.26-2.04,1.59C31.9,31.88,31.4,32,31,32c-0.9,0-2.617-1.621-5-3.331v-1.102l4.515-2.709 c0.369-0.221,0.555-0.654,0.462-1.074l-1.459-6.566c0.174-0.406,0.444-0.744,0.845-0.964L36,14l-3-1h-2l-0.014,0.014 c-0.1,0.002-0.202,0.004-0.303,0.038l-3,1c-0.486,0.162-0.771,0.666-0.66,1.166l1.844,8.296L25,25.834l-3.868-2.321l1.844-8.296 c0.111-0.5-0.174-1.003-0.66-1.166l-3-1c-0.101-0.034-0.202-0.036-0.303-0.038L19,13h-2l-3,1l5.638,2.253 c0.401,0.22,0.671,0.558,0.845,0.964l-1.459,6.566c-0.093,0.42,0.092,0.853,0.461,1.074L24,27.566v1.126 C21.553,30.436,19.884,32,19,32c-0.4,0-0.9-0.12-1.41-0.35c-0.75-0.33-1.52-0.89-2.04-1.59c-0.93-1.23-0.98-2.92-0.12-4.21L16,25 l-4.68-6.24c-0.79-1.05-0.8-2.48-0.04-3.55L15,9l2.73,0.55c0.38,0.08,0.77,0.11,1.16,0.11c1.08,0,2.16-0.29,3.1-0.85 c0.93-0.56,1.97-0.84,3.01-0.84s2.08,0.28,3.01,0.84c1.28,0.76,2.8,1.03,4.26,0.74L35,9l3.72,6.21 C39.48,16.28,39.47,17.71,38.68,18.76z" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -1,5 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "Duckduckgo Icon by Icons8 on Iconscout" "https://iconscout.com/icons/duckduckgo">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50">
|
||||
<path d="M25 2C12.309 2 2 12.309 2 25s10.309 23 23 23 23-10.309 23-23S37.691 2 25 2zm-9.313 7.313c1.399 0 2.918.382 4.72 1.28 1.8.9 3.105 1.805 3.905 2.907 1.301.3 2.387.8 3.188 1.5 1 .898 1.793 2.293 2.594 4.094.699 1.8 1.093 3.508 1.093 4.906 0 .398-.085.805-.187 1.406.3-.101 1-.293 2-.593 1-.301 1.887-.614 2.688-.813.8-.2 1.406-.313 1.906-.313s1 .118 1.5.22c.5.1.812.382.812.78 0 .602-1.414 1.399-4.312 2.5-2.899 1.102-4.696 1.625-5.594 1.625-.2 0-.594-.023-1.094-.125-.5-.101-.918-.093-1.218-.093h-1.094c-.102 0-.188.093-.188.093 0 .102-.093.211-.093.313 0 .7.476 1.29 1.375 1.688.898.398 1.824.625 2.625.625.8 0 1.882-.114 3.28-.313 1.4-.2 2.614-.313 3.313-.313.5 0 .782.227.782.625 0 .602-.883 1.188-2.782 1.688-1.8.5-3.195.813-4.093.813-1.7 0-3.825-.7-6.625-2-.102.398-.094.882-.094 1.28 0 1.602.418 3.4 1.218 5.5h.188c.398-.1.688.102.688.5 2.101-1.6 3.613-2.406 4.312-2.406.5 0 .813 1.426.813 4.126 0 1.5-.22 2.187-.72 2.187-.698 0-1.882-.387-3.78-1.188.3.602.8 1.399 1.5 2.5.343.493.64.891.875 1.25A21.148 21.148 0 0125 46c-2.59 0-5.055-.488-7.344-1.344-.273-1.277-.613-2.988-1.156-5.468-1.602-7-2.688-12.274-3.188-15.876-.101-.699-.218-1.417-.218-2.218 0-2.301.613-4.106 1.812-5.407 1.2-1.3 2.98-2.074 5.281-2.374-.699-.2-1.488-.313-2.687-.313-.8 0-2.086.113-3.688.313 0-.2.083-.399.282-.5l.594-.313c.199 0 .511-.094.812-.094.3 0 .492-.094.594-.094.601-.101 1.32-.414 2.218-.812-1.3-.398-2.5-.594-3.5-.594-.199 0-.5-.008-1 .094-.398.102-.699.094-1 .094H12.5l1-1.406c.102 0 .5-.086 1-.188.5-.102.988-.188 1.188-.188zm12.126 8.093c-.899 0-1.426.395-1.625 1.094.199-.398.824-.594 1.625-.594.398 0 .898.106 1.5.407-.2-.5-.801-.907-1.5-.907zm-10.5.5c-.372.043-.7.18-1 .407-.5.3-.72.687-.72 1.187 0 .2-.007.398.095.5 0-.5.21-.887.812-1.188.602-.398 1.094-.5 1.594-.5.199 0 .508.086.906.188-.3-.398-.71-.594-1.313-.594-.125 0-.25-.015-.375 0zm11.28 2.782c-.3 0-.605.105-.905.406-.301.3-.375.605-.375.906 0 .3.074.605.375.906.3.301.605.407.906.407.398 0 .707-.106.906-.407.3-.3.406-.605.406-.906 0-.398-.105-.707-.406-.906-.3-.301-.605-.407-.906-.407zm.5.625c.2 0 .407.082.407.28 0 .2-.105.407-.406.407-.2 0-.282-.105-.282-.406 0-.2.083-.282.282-.282zm-10.593.093c-.398 0-.7.2-1 .5-.3.301-.5.7-.5 1 0 .399.2.7.5 1 .3.301.602.5 1 .5s.7-.199 1-.5c.3-.3.5-.699.5-1 0-.398-.2-.699-.5-1-.3-.3-.7-.5-1-.5zm.688.594c.3 0 .406.105.406.406 0 .2-.106.407-.407.407-.3 0-.375-.106-.375-.407 0-.3.075-.406.375-.406z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.5 KiB |
|
@ -109,6 +109,15 @@ ion-tab-button:not(.tab-selected)::part(native):hover {
|
|||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.alert-input-no-border .alert-checkbox-group {
|
||||
border: 0px !important;
|
||||
}
|
||||
|
||||
.alert-input-no-border .alert-checkbox-label {
|
||||
overflow: auto !important;
|
||||
white-space: pre-line !important;
|
||||
}
|
||||
|
||||
.alert-can-copy {
|
||||
user-select: text !important;
|
||||
}
|
||||
|
@ -124,4 +133,9 @@ ion-tab-button:not(.tab-selected)::part(native):hover {
|
|||
|
||||
.pre-line {
|
||||
white-space: pre-line !important;
|
||||
}
|
||||
|
||||
.mat-icon {
|
||||
height: 28px !important;
|
||||
width: 28px !important;
|
||||
}
|
11
src/test.ts
|
@ -7,13 +7,6 @@ import {
|
|||
platformBrowserDynamicTesting
|
||||
} from '@angular/platform-browser-dynamic/testing';
|
||||
|
||||
declare const require: {
|
||||
context(path: string, deep?: boolean, filter?: RegExp): {
|
||||
keys(): string[];
|
||||
<T>(id: string): T;
|
||||
};
|
||||
};
|
||||
|
||||
// First, initialize the Angular testing environment.
|
||||
getTestBed().initTestEnvironment(
|
||||
BrowserDynamicTestingModule,
|
||||
|
@ -21,7 +14,3 @@ getTestBed().initTestEnvironment(
|
|||
teardown: { destroyAfterEach: false }
|
||||
}
|
||||
);
|
||||
// Then we find all the tests.
|
||||
const context = require.context('./', true, /\.spec\.ts$/);
|
||||
// And load the modules.
|
||||
context.keys().map(context);
|
||||
|
|
|
@ -1,6 +1,17 @@
|
|||
@use "@angular/material" as mat;
|
||||
@import "@angular/material/theming";
|
||||
// TODO(v15): As of v15 mat.legacy-core no longer includes default typography styles.
|
||||
// The following line adds:
|
||||
// 1. Default typography styles for all components
|
||||
// 2. Styles for typography hierarchy classes (e.g. .mat-headline-1)
|
||||
// If you specify typography styles for the components you use elsewhere, you should delete this line.
|
||||
// If you don't need the default component typographies but still want the hierarchy styles,
|
||||
// you can delete this line and instead use:
|
||||
// `@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());`
|
||||
@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());
|
||||
@include mat.legacy-core();
|
||||
@include mat.core();
|
||||
|
||||
$app-primary: mat.define-palette(mat.$cyan-palette, 600);
|
||||
$app-warn: mat.define-palette(mat.$red-palette);
|
||||
$app-light-theme: mat.define-light-theme(
|
||||
|
@ -27,7 +38,7 @@ $app-black-theme: mat.define-dark-theme(
|
|||
primary: $app-primary,
|
||||
accent: $app-primary,
|
||||
warn: $app-warn,
|
||||
),
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
|
@ -41,6 +52,9 @@ $app-black-theme: mat.define-dark-theme(
|
|||
|
||||
.ng-mat-black {
|
||||
@include mat.all-component-themes($app-black-theme);
|
||||
.mdc-menu-surface {
|
||||
background-color: #0f0f0f !important;
|
||||
}
|
||||
}
|
||||
|
||||
:root {
|
||||
|
@ -715,4 +729,4 @@ body {
|
|||
}
|
||||
|
||||
/* Importing Bootstrap SCSS file. */
|
||||
@import "~bootstrap/scss/bootstrap";
|
||||
@import "bootstrap/scss/bootstrap";
|
||||
|
|
|
@ -10,9 +10,13 @@
|
|||
"experimentalDecorators": true,
|
||||
"moduleResolution": "node",
|
||||
"importHelpers": true,
|
||||
"target": "es2020",
|
||||
"target": "ES2022",
|
||||
"module": "es2020",
|
||||
"lib": ["es2018", "dom"]
|
||||
"lib": [
|
||||
"es2018",
|
||||
"dom"
|
||||
],
|
||||
"useDefineForClassFields": false
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"enableI18nLegacyMessageIdFormat": false,
|
||||
|
|