style: change presentation of tutorials

This commit is contained in:
Tom Fong 2022-10-03 22:11:23 +08:00
parent 53034c6077
commit df225cc67e
21 changed files with 297 additions and 626 deletions

View file

@ -19,14 +19,12 @@ import { ScreenOrientation } from '@awesome-cordova-plugins/screen-orientation/n
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatFormFieldModule } from '@angular/material/form-field';
import { HistoryTutorialPageModule } from './modals/history-tutorial/history-tutorial.module';
import { DatePipe } from '@angular/common';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatButtonModule } from '@angular/material/button';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { EnvService } from './services/env.service';
import { FormsModule } from '@angular/forms';
import { BookmarkTutorialPageModule } from './modals/bookmark-tutorial/bookmark-tutorial.module';
import { QrCodePageModule } from './modals/qr-code/qr-code.module';
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
@ -51,8 +49,6 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
}
}),
IonicStorageModule.forRoot(),
HistoryTutorialPageModule,
BookmarkTutorialPageModule,
QrCodePageModule,
BrowserAnimationsModule,
MatFormFieldModule,

View file

@ -1,40 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { BookmarkTutorialPage } from './bookmark-tutorial.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';
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
MatFormFieldModule,
MatIconModule,
MatInputModule,
MatSelectModule,
TranslateModule.forChild({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}),
],
declarations: [BookmarkTutorialPage]
})
export class BookmarkTutorialPageModule {}

View file

@ -1,57 +0,0 @@
<ion-header class="ion-no-border">
<ion-toolbar [color]="color">
</ion-toolbar>
</ion-header>
<ion-content [color]="color" #content>
<ion-list-header class="mt-4 ml-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>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_SWIPE_LEFT' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-right.svg"
[color]="'primary'"></ion-icon>
<ion-label>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.BOOKMARK_TUTORIAL_SWIPE_RIGHT' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
</ion-content>
<ion-footer>
<ion-item lines="none" [color]="color" style="--ripple-color: transparent;">
<ion-checkbox class="ion-margin-horizontal" [(ngModel)]="env.notShowBookmarkTutorial"
[color]="'primary'" (ionChange)="saveBookmarkTutorialShowing()"></ion-checkbox>
<ion-label>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_NOT_SHOW_AGAIN' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-toolbar [color]="color" style="border: none;">
<ion-row class="d-flex align-items-center justify-content-end">
<ion-button class="ion-margin-horizontal ion-margin-bottom" fill="clear" (click)="tapHaptic(); closeModal()" color="primary">
{{ 'OK' | translate }}
</ion-button>
</ion-row>
</ion-toolbar>
</ion-footer>

View file

@ -1,18 +0,0 @@
mat-form-field {
width: 100%;
}
.content-item {
padding-left: 16px;
padding-right: 16px;
}
ion-footer {
&.footer-md::before {
background-image: none;
}
}
.footer-ios ion-toolbar:first-of-type {
--border-width: 0 !important;
}

View file

@ -1,65 +0,0 @@
import { Component, ViewChild } from '@angular/core';
import { Haptics, ImpactStyle } from '@capacitor/haptics';
import { Toast } from '@capacitor/toast';
import { ModalController } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core';
import { EnvService } from 'src/app/services/env.service';
@Component({
selector: 'app-bookmark-tutorial',
templateUrl: './bookmark-tutorial.page.html',
styleUrls: ['./bookmark-tutorial.page.scss'],
})
export class BookmarkTutorialPage {
@ViewChild('content') contentEl: HTMLIonContentElement;
constructor(
public modalController: ModalController,
public translate: TranslateService,
public env: EnvService,
) {
setTimeout(
() => {
this.contentEl.scrollToBottom(500);
}, 750
);
}
async saveBookmarkTutorialShowing() {
if (this.env.notShowBookmarkTutorial === true) {
await this.env.storageSet("not-show-bookmark-tutorial", 'yes');
} else {
await this.env.storageSet("not-show-bookmark-tutorial", 'no');
}
}
async tapHaptic() {
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
await Haptics.impact({ style: ImpactStyle.Medium })
.catch(async err => {
if (this.env.debugMode === 'on') {
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
}
})
}
}
closeModal(): void {
this.modalController.dismiss();
}
get color() {
switch (this.env.colorTheme) {
case 'dark':
return 'dark';
case 'light':
return 'white';
case 'black':
return 'black';
default:
return 'white';
}
}
}

View file

@ -1,39 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { HistoryTutorialPage } from './history-tutorial.page';
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 { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { HttpClient } from '@angular/common/http';
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
MatFormFieldModule,
MatIconModule,
MatInputModule,
MatSelectModule,
TranslateModule.forChild({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}),
],
declarations: [HistoryTutorialPage]
})
export class HistoryTutorialPageModule {}

View file

@ -1,57 +0,0 @@
<ion-header class="ion-no-border">
<ion-toolbar [color]="color">
</ion-toolbar>
</ion-header>
<ion-content [color]="color" #content>
<ion-list-header class="mt-4 ml-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>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_SWIPE_LEFT' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-right.svg"
[color]="'primary'"></ion-icon>
<ion-label>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_SWIPE_RIGHT' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
</ion-content>
<ion-footer>
<ion-item lines="none" [color]="color" style="--ripple-color: transparent;">
<ion-checkbox class="ion-margin-horizontal" [(ngModel)]="env.notShowHistoryTutorial"
[color]="'primary'" (ionChange)="saveHistoryTutorialShowing()"></ion-checkbox>
<ion-label>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_NOT_SHOW_AGAIN' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-toolbar [color]="color" style="border: none;">
<ion-row class="d-flex align-items-center justify-content-end">
<ion-button class="ion-margin-horizontal ion-margin-bottom" fill="clear" (click)="tapHaptic(); closeModal()" color="primary">
{{ 'OK' | translate }}
</ion-button>
</ion-row>
</ion-toolbar>
</ion-footer>

View file

@ -1,18 +0,0 @@
mat-form-field {
width: 100%;
}
.content-item {
padding-left: 16px;
padding-right: 16px;
}
ion-footer {
&.footer-md::before {
background-image: none;
}
}
.footer-ios ion-toolbar:first-of-type {
--border-width: 0 !important;
}

View file

@ -1,65 +0,0 @@
import { Component, ViewChild } from '@angular/core';
import { Haptics, ImpactStyle } from '@capacitor/haptics';
import { Toast } from '@capacitor/toast';
import { ModalController, ToastController } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core';
import { EnvService } from 'src/app/services/env.service';
@Component({
selector: 'app-history-tutorial',
templateUrl: './history-tutorial.page.html',
styleUrls: ['./history-tutorial.page.scss'],
})
export class HistoryTutorialPage {
@ViewChild('content') contentEl: HTMLIonContentElement;
constructor(
public modalController: ModalController,
public translate: TranslateService,
public env: EnvService,
) {
setTimeout(
() => {
this.contentEl.scrollToBottom(500);
}, 750
);
}
async saveHistoryTutorialShowing() {
if (this.env.notShowHistoryTutorial === true) {
await this.env.storageSet("not-show-history-tutorial", 'yes');
} else {
await this.env.storageSet("not-show-history-tutorial", 'no');
}
}
async tapHaptic() {
if (this.env.vibration === 'on' || this.env.vibration === 'on-haptic') {
await Haptics.impact({ style: ImpactStyle.Medium })
.catch(async err => {
if (this.env.debugMode === 'on') {
await Toast.show({ text: 'Err when Haptics.impact: ' + JSON.stringify(err), position: "top", duration: "long" })
}
})
}
}
closeModal(): void {
this.modalController.dismiss();
}
get color() {
switch (this.env.colorTheme) {
case 'dark':
return 'dark';
case 'light':
return 'white';
case 'black':
return 'black';
default:
return 'white';
}
}
}

View file

@ -6,7 +6,7 @@
<ion-title>{{ 'SIMPLE_QR' | translate}}</ion-title>
<ion-buttons slot="end">
<ion-button (click)="tapHaptic(); goSetting()" fill="clear">
{{ 'SETTING' | translate }}
{{ 'MORE' | translate }}
</ion-button>
</ion-buttons>
</ion-toolbar>
@ -17,7 +17,7 @@
<ion-title *ngIf="segmentModel === 'bookmarks'">{{ 'BOOKMARKS' | translate }}</ion-title>
<ion-buttons slot="end">
<ion-button (click)="tapHaptic(); goSetting()" fill="clear" color="primary">
{{ 'SETTING' | translate }}
{{ 'MORE' | translate }}
</ion-button>
</ion-buttons>
</ion-toolbar>

View file

@ -7,10 +7,8 @@ import { de, enUS, fr, it, 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';
import { HistoryTutorialPage } from 'src/app/modals/history-tutorial/history-tutorial.page';
import { Haptics, ImpactStyle } from '@capacitor/haptics';
import { Toast } from '@capacitor/toast';
import { BookmarkTutorialPage } from 'src/app/modals/bookmark-tutorial/bookmark-tutorial.page';
import { fastFadeIn, flyOut } from 'src/app/utils/animations';
import { SplashScreen } from '@capacitor/splash-screen';
@ -100,19 +98,6 @@ export class HistoryPage {
async ionViewDidEnter() {
await SplashScreen.hide()
this.segmentModel = this.env.historyPageStartSegment;
if (this.segmentModel == 'history') {
if (this.env.notShowHistoryTutorial === false) {
this.env.notShowHistoryTutorial = true;
this.env.storageSet("not-show-history-tutorial", 'yes');
await this.showHistoryTutorial();
}
} else if (this.segmentModel == 'bookmarks') {
if (this.env.notShowBookmarkTutorial === false) {
this.env.notShowBookmarkTutorial = true;
this.env.storageSet("not-show-bookmark-tutorial", 'yes');
await this.showBookmarkTutorial();
}
}
}
ionViewWillLeave() {
@ -135,24 +120,6 @@ export class HistoryPage {
return bookmark.id;
}
async showHistoryTutorial() {
const modal = await this.modalController.create({
component: HistoryTutorialPage,
componentProps: {
}
});
modal.present();
}
async showBookmarkTutorial() {
const modal = await this.modalController.create({
component: BookmarkTutorialPage,
componentProps: {
}
});
modal.present();
}
maskDatetimeAndSource(date: Date, source: 'create' | 'view' | 'scan' | undefined): string {
if (!date) {
return "-";
@ -256,19 +223,6 @@ export class HistoryPage {
}
async segmentChanged(ev: any) {
if (ev?.detail?.value == 'history') {
if (this.env.notShowHistoryTutorial === false) {
this.env.notShowHistoryTutorial = true;
this.env.storageSet("not-show-history-tutorial", 'yes');
await this.showHistoryTutorial();
}
} else if (ev?.detail?.value == 'bookmarks') {
if (this.env.notShowBookmarkTutorial === false) {
this.env.notShowBookmarkTutorial = true;
this.env.storageSet("not-show-bookmark-tutorial", 'yes');
await this.showBookmarkTutorial();
}
}
this.firstLoadItems();
}

View file

@ -1,177 +1,234 @@
<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>{{ 'LOG_BACKUP_AND_RESTORE' | translate }}</ion-title>
</ion-toolbar>
</ion-header>
<div class="ion-page">
<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>{{ 'LOG_BACKUP_AND_RESTORE' | translate }}</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-content>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'INITIAL_SEGMENT' | translate }}</ion-list-header>
<ion-radio-group [(ngModel)]="env.historyPageStartSegment" (ionChange)="saveHistoryPageStartSegment()">
<ion-item class="ion-no-padding ripple-parent py-1 mt-2" detail="false" lines="none">
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" src="assets/icon/history.svg">
</ion-icon>
<ion-label>
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'LOG' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="'history'" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" name="bookmark">
</ion-icon>
<ion-label>
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'BOOKMARK' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="'bookmarks'" [color]="'primary'">
</ion-radio>
</ion-item>
</ion-radio-group>
</div>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'AUTO_LOGGING' | translate }}</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.AUTO_LOGGING_EXPLAIN' | translate }}
</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.scanRecordLogging == 'on'? 'TURNED_ON' : 'TURNED_OFF') | translate }}
</ion-text>
</p>
</ion-label>
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.scanRecordLogging == 'on'? true : false"
(ngModelChange)="onScanRecordLoggingChange($event)">
</ion-toggle>
</ion-item>
</div>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'RECORDS_LIMIT' | translate }}</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.RECORDS_LIMIT_EXPLAIN' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-radio-group [(ngModel)]="env.recordsLimit" (ionChange)="saveRecordsLimit()">
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ '30_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="30" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ '50_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="50" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ '100_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="100" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'NO_LIMIT' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="-1" [color]="'primary'">
</ion-radio>
</ion-item>
</ion-radio-group>
<ion-item class="ion-no-padding ripple-parent py-1 pt-2" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'SHOW_NUMBER_OR_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.showNumberOfRecords == 'on'? true : false"
(ngModelChange)="onShowNumberOfRecordsChange($event)">
</ion-toggle>
</ion-item>
</div>
<div class="ion-padding-vertical mb-2">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'BACKUP' | translate }}</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.BACKUP_EXPLAIN' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<div class="ion-padding-horizontal pt-3 d-flex justify-content-center align-content-start flex-column">
<ion-button class="ion-padding-horizontal" color="primary" (click)="onBackup()">
{{ 'BACKUP' | translate }}
</ion-button>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'INITIAL_SEGMENT' | translate }}
</ion-list-header>
<ion-radio-group [(ngModel)]="env.historyPageStartSegment" (ionChange)="saveHistoryPageStartSegment()">
<ion-item class="ion-no-padding ripple-parent py-1 mt-2" detail="false" lines="none">
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" src="assets/icon/history.svg">
</ion-icon>
<ion-label>
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'LOG' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="'history'" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-icon class="ion-margin-start ion-padding-horizontal" [color]="'primary'" name="bookmark">
</ion-icon>
<ion-label>
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'BOOKMARK' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="'bookmarks'" [color]="'primary'">
</ion-radio>
</ion-item>
</ion-radio-group>
</div>
</div>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'RESTORE' | translate }}</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ (isIOS? 'MSG.RESTORE_EXPLAIN_IOS' : 'MSG.RESTORE_EXPLAIN') | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<div class="ion-padding-horizontal pt-3 d-flex justify-content-center align-content-start flex-column">
<ion-button class="ion-padding-horizontal" color="primary" (click)="onRestore()">
{{ 'RESTORE' | translate }}
</ion-button>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'MANAGE_RECORDS' | translate }}
</ion-list-header>
<div class="ion-padding-horizontal pt-3 d-flex justify-content-center align-content-start flex-column">
<ion-button id="open-tutorial-modal" class="ion-padding-horizontal" color="primary">
{{ 'VIEW_INSTRUCTIONS' | translate }}
</ion-button>
</div>
</div>
</div>
</ion-content>
<ion-modal #tutorialModal trigger="open-tutorial-modal" [presentingElement]="presentingElement" [initialBreakpoint]="0.7" [breakpoints]="[0, 0.7]">
<ng-template>
<ion-header>
<ion-toolbar>
<ion-buttons slot="end">
<ion-button (click)="tapHaptic(); tutorialModal.dismiss();" color="primary">
{{ 'OK' | translate }}
</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>
<ion-content [color]="color">
<ion-list-header class="mt-4 ml-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>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_SWIPE_LEFT' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-item class="content-item ion-no-padding" lines="none" [color]="color">
<ion-icon class="ion-padding-horizontal" src="assets/icon/swipe-right.svg"
[color]="'primary'"></ion-icon>
<ion-label>
<p class="ion-padding">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.TUTORIAL_SWIPE_RIGHT' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
</ion-content>
</ng-template>
</ion-modal>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'AUTO_LOGGING' | translate }}
</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.AUTO_LOGGING_EXPLAIN' | translate }}
</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.scanRecordLogging == 'on'? 'TURNED_ON' : 'TURNED_OFF') | translate }}
</ion-text>
</p>
</ion-label>
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.scanRecordLogging == 'on'? true : false"
(ngModelChange)="onScanRecordLoggingChange($event)">
</ion-toggle>
</ion-item>
</div>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'RECORDS_LIMIT' | translate }}
</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.RECORDS_LIMIT_EXPLAIN' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<ion-radio-group [(ngModel)]="env.recordsLimit" (ionChange)="saveRecordsLimit()">
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ '30_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="30" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ '50_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="50" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ '100_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="100" [color]="'primary'">
</ion-radio>
</ion-item>
<ion-item class="ion-no-padding ripple-parent py-1" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'NO_LIMIT' | translate }}
</ion-text>
</p>
</ion-label>
<ion-radio class="ion-margin-end" slot="end" [value]="-1" [color]="'primary'">
</ion-radio>
</ion-item>
</ion-radio-group>
<ion-item class="ion-no-padding ripple-parent py-1 pt-2" detail="false" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal pre-line">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="font-size: large;">
{{ 'SHOW_NUMBER_OR_RECORDS' | translate }}
</ion-text>
</p>
</ion-label>
<ion-toggle class="ion-padding-end" slot="end" [ngModel]="env.showNumberOfRecords == 'on'? true : false"
(ngModelChange)="onShowNumberOfRecordsChange($event)">
</ion-toggle>
</ion-item>
</div>
<div class="ion-padding-vertical mb-2">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'BACKUP' | translate }}</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ 'MSG.BACKUP_EXPLAIN' | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<div class="ion-padding-horizontal pt-3 d-flex justify-content-center align-content-start flex-column">
<ion-button class="ion-padding-horizontal" color="primary" (click)="onBackup()">
{{ 'BACKUP' | translate }}
</ion-button>
</div>
</div>
<div class="ion-padding-vertical">
<ion-list-header class="ion-margin-start ion-padding-horizontal">{{ 'RESTORE' | translate }}</ion-list-header>
<ion-item class="ion-no-padding" lines="none">
<ion-label class="ion-padding-start">
<p class="ion-padding-horizontal">
<ion-text [color]="env.colorTheme === 'light'? 'dark' : 'light'" style="white-space: normal;">
{{ (isIOS? 'MSG.RESTORE_EXPLAIN_IOS' : 'MSG.RESTORE_EXPLAIN') | translate }}
</ion-text>
</p>
</ion-label>
</ion-item>
<div class="ion-padding-horizontal pt-3 d-flex justify-content-center align-content-start flex-column">
<ion-button class="ion-padding-horizontal" color="primary" (click)="onRestore()">
{{ 'RESTORE' | translate }}
</ion-button>
</div>
</div>
</ion-content>
</div>

View file

@ -0,0 +1,8 @@
mat-form-field {
width: 100%;
}
.content-item {
padding-left: 16px;
padding-right: 16px;
}

View file

@ -1,5 +1,5 @@
import { Component } from '@angular/core';
import { AlertController, LoadingController, Platform } from '@ionic/angular';
import { Component, OnInit } from '@angular/core';
import { AlertController, LoadingController, ModalController, Platform } from '@ionic/angular';
import { TranslateService } from '@ngx-translate/core';
import { EnvService } from 'src/app/services/env.service';
import { Clipboard } from '@capacitor/clipboard';
@ -18,10 +18,12 @@ import { Haptics, ImpactStyle } from '@capacitor/haptics';
templateUrl: './setting-record.page.html',
styleUrls: ['./setting-record.page.scss'],
})
export class SettingRecordPage {
export class SettingRecordPage implements OnInit {
preventRecordsLimitToast: boolean = true;
presentingElement = null;
constructor(
public translate: TranslateService,
public env: EnvService,
@ -30,9 +32,14 @@ export class SettingRecordPage {
private loadingController: LoadingController,
private chooser: Chooser,
private socialSharing: SocialSharing,
private platform: Platform
private platform: Platform,
private modalController: ModalController,
) { }
ngOnInit() {
this.presentingElement = document.querySelector('.ion-page');
}
ionViewDidEnter() {
setTimeout(() => this.preventRecordsLimitToast = false, 100);
}
@ -41,6 +48,15 @@ export class SettingRecordPage {
this.preventRecordsLimitToast = true;
}
// async showTutorial() {
// const modal = await this.modalController.create({
// component: HistoryTutorialPage,
// componentProps: {
// }
// });
// modal.present();
// }
async saveHistoryPageStartSegment() {
await this.env.storageSet("history-page-start-segment", this.env.historyPageStartSegment);
}
@ -322,6 +338,19 @@ export class SettingRecordPage {
}
}
get color() {
switch (this.env.colorTheme) {
case 'dark':
return 'dark';
case 'light':
return 'white';
case 'black':
return 'black';
default:
return 'white';
}
}
get isIOS() {
return this.platform.is('ios');
}

View file

@ -44,8 +44,8 @@ export class EnvService {
public qrCodeMargin: number = 3;
public vibration: 'on' | 'on-haptic' | 'on-scanned' | 'off' = 'on';
public orientation: 'default' | 'portrait' | 'landscape' = 'default';
public notShowHistoryTutorial: boolean = false;
public notShowBookmarkTutorial: boolean = false;
// public notShowHistoryTutorial: boolean = false;
// public notShowBookmarkTutorial: boolean = false;
public notShowUpdateNotes: boolean = false;
public searchEngine: 'google' | 'bing' | 'yahoo' | 'duckduckgo' | 'yandex' = 'google';
public resultPageButtons: 'detailed' | 'icon-only' = 'detailed';
@ -193,24 +193,6 @@ export class EnvService {
}
}
)
this._storage.get("not-show-history-tutorial").then(
value => {
if (value !== null && value !== undefined) {
this.notShowHistoryTutorial = (value === 'yes' ? true : false);
} else {
this.notShowHistoryTutorial = false;
}
}
);
this._storage.get("not-show-bookmark-tutorial").then(
value => {
if (value !== null && value !== undefined) {
this.notShowBookmarkTutorial = (value === 'yes' ? true : false);
} else {
this.notShowBookmarkTutorial = false;
}
}
);
this._storage.get("language").then(
async value => {
if (value !== null && value !== undefined) {
@ -585,8 +567,6 @@ export class EnvService {
this.vibration = 'on';
this.orientation = 'default';
await this.toggleOrientationChange();
this.notShowHistoryTutorial = false;
this.notShowBookmarkTutorial = false;
this.notShowUpdateNotes = false;
this.searchEngine = 'google';
this.resultPageButtons = 'detailed';
@ -678,12 +658,6 @@ export class EnvService {
await this.toggleOrientationChange();
await this.storageSet("orientation", this.orientation);
this.notShowHistoryTutorial = false;
await this.storageSet("not-show-history-tutorial", 'no');
this.notShowBookmarkTutorial = false;
await this.storageSet("not-show-bookmark-tutorial", 'no');
this.notShowUpdateNotes = false;
if (this.platform.is('ios')) {
await this.storageSet(this.IOS_PATCH_NOTE_STORAGE_KEY, 'no');

View file

@ -108,11 +108,13 @@
"LOG": "Protokoll",
"LOG_BACKUP_AND_RESTORE": "Protokoll, Sicherung und Wiederherstellung",
"MALE": "Männlich",
"MANAGE_RECORDS": "Aufzeichnungen verwalten",
"MARGIN": "Rand",
"MESSAGE": "Nachricht",
"MESSAGE_CONTENT": "Inhalt der Nachricht",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "Mobiltelefon Nummer",
"MORE": "Mehr",
"NAME": "Name",
"NO": "Nein",
"NONE": "Keine",
@ -200,6 +202,7 @@
"VIEW_GITHUB": "GitHub anzeigen",
"VIEW_LOG": "Protokoll anzeigen",
"VIEW_STORE_AND_SOURCE_CODE": "Store und Quellcode anzeigen",
"VIEW_INSTRUCTIONS": "Anweisungen anzeigen",
"WEBSITE": "Website",
"WIFI": "WiFi",
"WIFI_ENCRYPTION": "WiFi Verschlüsselung",
@ -221,7 +224,6 @@
"BACKUP_SUCCESSFULLY": "<p>Die Sicherung wurde erfolgreich durchgeführt. Bitte speichere die Sicherungsdatei und bewahre das folgende Geheimnis sicher auf</p><p>{secret}</p>",
"BARCODE_TYPE": "Scanne<ul><li>QR Code</li><li>1D Barcode</li><li>Aztec Code</li><li>Data Matrix</li><li>PDF417</li></ul>Bild importieren<ul><li>QR Code</li></ul>Erstelle<ul><li>QR Code</li></ul>",
"BOOKMARKED": "Erfolgreich mit Lesezeichen versehen",
"BOOKMARK_TUTORIAL_SWIPE_RIGHT": "Wische nach rechts, um das Tag des entsprechenden Lesezeichens zu bearbeiten.",
"BUTTON_DISPLAY_EXPLAIN": "Ein- und Ausblenden der Aufgabenschaltflächen.",
"BUTTON_STYLE_EXPLAIN": "Wähle den Stil der Aufgabenschaltflächen.",
"CAMERA_PERMISSION": "Um das Scannen zu aktivieren, muss man der Kamera die Erlaubnis erteilen.",
@ -279,7 +281,7 @@
"TAG_MAX_LENGTH_EXPLAIN": "Die Länge des Tags darf 30 Zeichen nicht überschreiten.",
"TUTORIAL_NOT_SHOW_AGAIN": "Nicht wieder zeigen",
"TUTORIAL_SWIPE_LEFT": "Wische nach links, um den entsprechenden Datensatz zu löschen.",
"TUTORIAL_SWIPE_RIGHT": "Wische nach rechts, um den Text des entsprechenden Datensatzes mit einem Lesezeichen zu versehen.",
"TUTORIAL_SWIPE_RIGHT": "Wische nach rechts, um den Text des entsprechenden Datensatzes mit einem Lesezeichen zu versehen / Bearbeiten Sie das Label des entsprechenden Lesezeichens.",
"UNDO_DELETE": "Du kannst die Löschung rückgängig machen",
"VIBRATION_EXPLAIN": "Vibration oder haptisches Feedback geben. Bitte beachte, dass nicht alle Geräte diese Funktion unterstützen."
},

View file

@ -108,11 +108,13 @@
"LOG": "Log",
"LOG_BACKUP_AND_RESTORE": "Log, Backup & Restore",
"MALE": "Male",
"MANAGE_RECORDS": "Manage Records",
"MARGIN": "Margin",
"MESSAGE": "Message",
"MESSAGE_CONTENT": "Message Content",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "Mobile Phone Number",
"MORE": "More",
"NAME": "Name",
"NO": "No",
"NONE": "None",
@ -200,6 +202,7 @@
"VIEW_GITHUB": "View GitHub",
"VIEW_LOG": "View Log",
"VIEW_STORE_AND_SOURCE_CODE": "View Store & Source Code",
"VIEW_INSTRUCTIONS": "View Instructions",
"WEBSITE": "Website",
"WIFI": "WiFi",
"WIFI_ENCRYPTION": "WiFi Encryption",
@ -221,7 +224,6 @@
"BACKUP_SUCCESSFULLY": "<p>Successfully backed up. Please save the backup file and keep the following secret securely</p><p>{secret}</p>",
"BARCODE_TYPE": "Scan<ul><li>QR Code</li><li>1D Barcode</li><li>Aztec Code</li><li>Data Matrix</li><li>PDF417</li></ul>Import Image<ul><li>QR Code</li></ul>Create<ul><li>QR Code</li></ul>",
"BOOKMARKED": "Bookmarked Successfully",
"BOOKMARK_TUTORIAL_SWIPE_RIGHT": "Swipe right to edit the tag of corresponding bookmark.",
"BUTTON_DISPLAY_EXPLAIN": "Show or hide the task buttons.",
"BUTTON_STYLE_EXPLAIN": "Choose the style of the task buttons.",
"CAMERA_PERMISSION": "To enable scanning, you must grant Camera permission.",
@ -279,7 +281,7 @@
"TAG_MAX_LENGTH_EXPLAIN": "The length of the tag must not exceed 30 characters.",
"TUTORIAL_NOT_SHOW_AGAIN": "Do not show again",
"TUTORIAL_SWIPE_LEFT": "Swipe left to delete corresponding record.",
"TUTORIAL_SWIPE_RIGHT": "Swipe right to bookmark the text of corresponding record.",
"TUTORIAL_SWIPE_RIGHT": "Swipe right to bookmark the text of corresponding record / edit the tag of corresponding bookmark.",
"UNDO_DELETE": "You can undo the deletion",
"VIBRATION_EXPLAIN": "Provide vibration or haptic feedback. Please note that not all devices support this feature."
},

View file

@ -108,11 +108,13 @@
"LOG": "Registre",
"LOG_BACKUP_AND_RESTORE": "Journalisation, sauvegarde et restauration",
"MALE": "Mâle",
"MANAGE_RECORDS": "Gérer les enregistrements",
"MARGIN": "Marge",
"MESSAGE": "Message",
"MESSAGE_CONTENT": "Contenu du message",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "Numéro de portable",
"MORE": "Plus",
"NAME": "Nom",
"NO": "Non",
"NONE": "Aucun",
@ -200,6 +202,7 @@
"VIEW_GITHUB": "Afficher le GitHub",
"VIEW_LOG": "Afficher le journal",
"VIEW_STORE_AND_SOURCE_CODE": "Afficher le magasin et le code source",
"VIEW_INSTRUCTIONS": "Afficher les instructions",
"WEBSITE": "Site Web",
"WIFI": "Wi-Fi",
"WIFI_ENCRYPTION": "Cryptage Wi-Fi",
@ -221,7 +224,6 @@
"BACKUP_SUCCESSFULLY": "<p>Sauvegarde réussie. Veuillez enregistrer le fichier de sauvegarde et conserver le secret suivant en toute sécurité</p><p>{secret}</p>",
"BARCODE_TYPE": "Scanner<ul><li>Code QR</li><li>Code-barres 1D</li><li>Code aztèque</li><li>Data Matrix</li><li>PDF417</li></ul>Importer une image<ul><li>Code QR</li></ul>Créer<ul><li>Code QR</li></ul>",
"BOOKMARKED": "Mis en signet avec succès",
"BOOKMARK_TUTORIAL_SWIPE_RIGHT": "Balayez vers la droite pour modifier la balise du signet correspondant.",
"BUTTON_DISPLAY_EXPLAIN": "Afficher ou masquer les boutons de tâche.",
"BUTTON_STYLE_EXPLAIN": "Choisissez le style des boutons de tâche.",
"CAMERA_PERMISSION": "Pour activer la numérisation, vous devez accorder l'autorisation Caméra.",
@ -279,7 +281,7 @@
"TAG_MAX_LENGTH_EXPLAIN": "La longueur de la balise ne doit pas dépasser 30 caractères.",
"TUTORIAL_NOT_SHOW_AGAIN": "Ne pas montrer de nouveau",
"TUTORIAL_SWIPE_LEFT": "Balayez vers la gauche pour supprimer l'enregistrement correspondant.",
"TUTORIAL_SWIPE_RIGHT": "Balayez vers la droite pour mettre en signet le texte de l'enregistrement correspondant.",
"TUTORIAL_SWIPE_RIGHT": "Balayez vers la droite pour mettre en signet le texte de l'enregistrement / modifier la balise du signet correspondant.",
"UNDO_DELETE": "Vous pouvez annuler la suppression",
"VIBRATION_EXPLAIN": "Fournir des vibrations ou un retour haptique. Veuillez noter que tous les appareils ne prennent pas en charge cette fonctionnalité."
},

View file

@ -108,11 +108,13 @@
"LOG": "Log",
"LOG_BACKUP_AND_RESTORE": "Logga, Esegui backup & Ripristina",
"MALE": "Uomo",
"MANAGE_RECORDS": "Gestisci record",
"MARGIN": "Margine",
"MESSAGE": "Messaggio",
"MESSAGE_CONTENT": "Contenuto del messaggio",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "Numero di telefono cellulare",
"MORE": "Più",
"NAME": "Nome",
"NO": "No",
"NONE": "Nessuno",
@ -200,6 +202,7 @@
"VIEW_GITHUB": "Visualizza GitHub",
"VIEW_LOG": "Visualizza Log",
"VIEW_STORE_AND_SOURCE_CODE": "Visualizza Store & Codice Sorgente",
"VIEW_INSTRUCTIONS": "Visualizza le istruzioni",
"WEBSITE": "Sito Web",
"WIFI": "WiFi",
"WIFI_ENCRYPTION": "Crittografia WiFi",
@ -221,7 +224,6 @@
"BACKUP_SUCCESSFULLY": "<p>Backup riuscito. Si prega di salvare il file di backup e salvare la seguente chiave segreta in modo sicuro</p><p>{secret}</p>",
"BARCODE_TYPE": "Scannerizzazione<ul><li>Codice QR</li><li>Codice a barre 1D</li><li>Codice Aztec</li><li>Matrice di Dati</li><li>PDF417</li></ul>Importa Immagine<ul><li>Codice QR</li></ul>Crea<ul><li>Codice QR</li></ul>",
"BOOKMARKED": "Segnalibro salvato con successo",
"BOOKMARK_TUTORIAL_SWIPE_RIGHT": "Scorri verso destra per modificare il tag del segnalibro corrispondente.",
"BUTTON_DISPLAY_EXPLAIN": "Mostra o nascondi il pulsante operazione.",
"BUTTON_STYLE_EXPLAIN": "Scegli lo stile del pulsante operazione.",
"CAMERA_PERMISSION": "Per abilitare la scansione, è necessario concedere l'autorizzazione Fotocamera.",
@ -279,7 +281,7 @@
"TAG_MAX_LENGTH_EXPLAIN": "La lunghezza del tag non deve superare i 30 caratteri.",
"TUTORIAL_NOT_SHOW_AGAIN": "Non mostrare di nuovo",
"TUTORIAL_SWIPE_LEFT": "Scorri verso sinistra per eliminare il record corrispondente.",
"TUTORIAL_SWIPE_RIGHT": "Scorri verso destra per aggiungere ai segnalibri il testo del record corrispondente.",
"TUTORIAL_SWIPE_RIGHT": "Scorri verso destra per aggiungere ai segnalibri il testo del record / modificare il tag del segnalibro corrispondente.",
"UNDO_DELETE": "È possibile annullare l'eliminazione",
"VIBRATION_EXPLAIN": "Fornire vibrazioni o feedback tattile. Tieni presente che non tutti i dispositivi supportano questa funzione."
},

View file

@ -108,11 +108,13 @@
"LOG": "记录",
"LOG_BACKUP_AND_RESTORE": "记录、备份与还原",
"MALE": "男性",
"MANAGE_RECORDS": "管理记录",
"MARGIN": "边距",
"MESSAGE": "信息",
"MESSAGE_CONTENT": "信息内容",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "手提电话号码",
"MORE": "更多",
"NAME": "姓名",
"NO": "否",
"NONE": "没有",
@ -200,6 +202,7 @@
"VIEW_GITHUB": "查看 GitHub",
"VIEW_LOG": "查看记录",
"VIEW_STORE_AND_SOURCE_CODE": "查看商店及源代码",
"VIEW_INSTRUCTIONS": "查看说明",
"WEBSITE": "网站",
"WIFI": "WiFi",
"WIFI_ENCRYPTION": "安全性",
@ -221,7 +224,6 @@
"BACKUP_SUCCESSFULLY": "<p>成功备份。请妥善保存备份档及以下密码</p><p>{secret}</p>",
"BARCODE_TYPE": "扫描<ul><li>QR 码</li><li>一维条码</li><li>Aztec 码</li><li>数据矩阵码</li><li>PDF417 条码</li></ul>汇入图片<ul><li>QR 码</li></ul>建立<ul><li>QR 码</li></ul>",
"BOOKMARKED": "成功加入书签",
"BOOKMARK_TUTORIAL_SWIPE_RIGHT": "向右划项目可修改标签",
"BUTTON_DISPLAY_EXPLAIN": "显示或隐藏行动按键。",
"BUTTON_STYLE_EXPLAIN": "选择行动按键的样式。",
"CAMERA_PERMISSION": "要使用扫描功能您必须授权「简易QR」使用相机。 ",
@ -279,7 +281,7 @@
"TAG_MAX_LENGTH_EXPLAIN": "标签长度不能多于 30 个字元。",
"TUTORIAL_NOT_SHOW_AGAIN": "下次不再提醒",
"TUTORIAL_SWIPE_LEFT": "向左划项目可删除相关记录",
"TUTORIAL_SWIPE_RIGHT": "向右划项目可将相关记录的文字加入书签",
"TUTORIAL_SWIPE_RIGHT": "向右划项目可将相关记录的文字加入书签 / 修改标签",
"UNDO_DELETE": "您可在数秒内复原记录",
"VIBRATION_EXPLAIN": "提供震动或触感反馈。请注意,并非所有设备皆支援此功能。"
},

View file

@ -108,11 +108,13 @@
"LOG": "記錄",
"LOG_BACKUP_AND_RESTORE": "記錄、備份與還原",
"MALE": "男性",
"MANAGE_RECORDS": "管理記錄",
"MARGIN": "邊距",
"MESSAGE": "信息",
"MESSAGE_CONTENT": "信息內容",
"MICROSOFT_BING": "Microsoft Bing",
"MOBILE_PHONE_NUMBER": "手提電話號碼",
"MORE": "更多",
"NAME": "姓名",
"NO": "否",
"NONE": "沒有",
@ -200,6 +202,7 @@
"VIEW_GITHUB": "查看 GitHub",
"VIEW_LOG": "查看記錄",
"VIEW_STORE_AND_SOURCE_CODE": "查看商店及源代碼",
"VIEW_INSTRUCTIONS": "查看說明",
"WEBSITE": "網站",
"WIFI": "WiFi",
"WIFI_ENCRYPTION": "安全性",
@ -221,7 +224,6 @@
"BACKUP_SUCCESSFULLY": "<p>成功備份。請妥善保存備份檔及以下密碼</p><p>{secret}</p>",
"BARCODE_TYPE": "掃描<ul><li>QR 碼</li><li>一維條碼</li><li>Aztec 碼</li><li>數據矩陣碼</li><li>PDF417 條碼</li></ul>匯入圖片<ul><li>QR 碼</li></ul>建立<ul><li>QR 碼</li></ul>",
"BOOKMARKED": "成功加入書籤",
"BOOKMARK_TUTORIAL_SWIPE_RIGHT": "向右劃項目可修改標籤",
"BUTTON_DISPLAY_EXPLAIN": "顯示或隱藏行動按鍵。",
"BUTTON_STYLE_EXPLAIN": "選擇行動按鍵的樣式。",
"CAMERA_PERMISSION": "要使用掃描功能您必須授權「簡易QR」使用相機。",
@ -279,7 +281,7 @@
"TAG_MAX_LENGTH_EXPLAIN": "標籤長度不能多於 30 個字元。",
"TUTORIAL_NOT_SHOW_AGAIN": "下次不再提醒",
"TUTORIAL_SWIPE_LEFT": "向左劃項目可刪除相關記錄",
"TUTORIAL_SWIPE_RIGHT": "向右劃項目可將相關記錄的文字加入書籤",
"TUTORIAL_SWIPE_RIGHT": "向右劃項目可將相關記錄的文字加入書籤 / 修改標籤",
"UNDO_DELETE": "您可在數秒內還原記錄",
"VIBRATION_EXPLAIN": "提供震動或觸感反饋。請注意,並非所有設備皆支援此功能。"
},