mirror of
https://github.com/tomfong/simple-qr.git
synced 2025-06-28 12:09:58 +00:00
feat: support geolocation QR code
This commit is contained in:
parent
03c04c94d1
commit
62dda58723
13 changed files with 104 additions and 10 deletions
|
@ -215,6 +215,25 @@
|
|||
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="contentType === 'geo'">
|
||||
<ion-row class="ion-padding-horizontal" [@inAnimation]>
|
||||
<ion-col>
|
||||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'LATITUDE' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="latitude" type="number" #latitudeInput>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
<ion-row class="ion-padding-horizontal" [@inAnimation]>
|
||||
<ion-col>
|
||||
<mat-form-field [class]="ngMatThemeClass" appearance="outline" color="accent">
|
||||
<mat-label>{{ 'LONGITUDE' | translate}}</mat-label>
|
||||
<input matInput [(ngModel)]="longitude" type="number" #longitudeInput>
|
||||
</mat-form-field>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="contentType === 'phone'">
|
||||
<ion-row class="ion-padding-horizontal" [@inAnimation]>
|
||||
<ion-col>
|
||||
|
|
|
@ -5,7 +5,7 @@ import { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics';
|
|||
import { AlertController, LoadingController, ToastController } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { format } from 'date-fns';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { EnvService, QrCreateContentTypeType } from 'src/app/services/env.service';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { fadeIn } from 'src/app/utils/animations';
|
||||
import { SplashScreen } from '@capacitor/splash-screen';
|
||||
|
@ -23,6 +23,7 @@ export class GeneratePage {
|
|||
freeTxtText: string = "Free Text";
|
||||
urlText: string = "URL";
|
||||
contactText: string = "vCard Contact";
|
||||
geolocationText: string = "Geolocation";
|
||||
phoneText: string = "Phone";
|
||||
smsText: string = "Message";
|
||||
emailW3CText: string = "Email (W3C Standard)";
|
||||
|
@ -37,6 +38,9 @@ export class GeneratePage {
|
|||
emailSubject: string = "";
|
||||
emailBody: string = "";
|
||||
|
||||
latitude: number = 0;
|
||||
longitude: number = 0;
|
||||
|
||||
phoneNumber: string = "";
|
||||
|
||||
smsMessage: string = "";
|
||||
|
@ -84,17 +88,18 @@ export class GeneratePage {
|
|||
{ text: this.wpaText, value: "WPA" },
|
||||
]
|
||||
|
||||
contentTypes: { text: string, value: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" }[] = [
|
||||
contentTypes: { text: string, value: QrCreateContentTypeType }[] = [
|
||||
{ text: this.freeTxtText, value: 'freeText' },
|
||||
{ text: this.emailW3CText, value: 'emailW3C' },
|
||||
{ text: this.emailDocomoText, value: 'emailDocomo' },
|
||||
{ text: this.geolocationText, value: 'geo' },
|
||||
{ text: this.phoneText, value: 'phone' },
|
||||
{ text: this.smsText, value: 'sms' },
|
||||
{ text: this.urlText, value: 'url' },
|
||||
{ text: this.contactText, value: 'contact' },
|
||||
{ text: this.wifiText, value: 'wifi' },
|
||||
];
|
||||
contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText";
|
||||
contentType: QrCreateContentTypeType = "freeText";
|
||||
|
||||
constructor(
|
||||
public translate: TranslateService,
|
||||
|
@ -113,6 +118,7 @@ export class GeneratePage {
|
|||
this.freeTxtText = this.translate.instant("FREE_TEXT");
|
||||
this.urlText = this.translate.instant("URL");
|
||||
this.contactText = this.translate.instant("VCARD_CONTACT");
|
||||
this.geolocationText = this.translate.instant("GEOLOCATION");
|
||||
this.phoneText = this.translate.instant("PHONE_NO");
|
||||
this.smsText = this.translate.instant("MESSAGE");
|
||||
this.emailW3CText = this.translate.instant("EMAIL_W3C_STANDARD");
|
||||
|
@ -122,6 +128,7 @@ export class GeneratePage {
|
|||
{ text: this.freeTxtText, value: 'freeText' },
|
||||
{ text: this.emailW3CText, value: 'emailW3C' },
|
||||
{ text: this.emailDocomoText, value: 'emailDocomo' },
|
||||
{ text: this.geolocationText, value: 'geo' },
|
||||
{ text: this.phoneText, value: 'phone' },
|
||||
{ text: this.smsText, value: 'sms' },
|
||||
{ text: this.urlText, value: 'url' },
|
||||
|
@ -195,6 +202,9 @@ export class GeneratePage {
|
|||
this.emailSubject = "";
|
||||
this.emailBody = "";
|
||||
|
||||
this.latitude = 0;
|
||||
this.longitude = 0;
|
||||
|
||||
this.phoneNumber = "";
|
||||
|
||||
this.smsMessage = "";
|
||||
|
@ -263,6 +273,9 @@ export class GeneratePage {
|
|||
this.qrCodeContent = `MATMSG:TO:${this.toEmails[0]};SUB:${this.emailSubject};BODY:${this.emailBody};;`;
|
||||
this.qrCodeContent = encodeURI(this.qrCodeContent);
|
||||
break;
|
||||
case "geo":
|
||||
this.qrCodeContent = `geo:${this.latitude},${this.longitude}`;
|
||||
break;
|
||||
case "phone":
|
||||
this.qrCodeContent = "tel:";
|
||||
this.qrCodeContent += this.phoneNumber;
|
||||
|
@ -348,7 +361,7 @@ export class GeneratePage {
|
|||
return format(new Date(), "yyyy-MM-dd");
|
||||
}
|
||||
|
||||
getIcon(type: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi"): string {
|
||||
getIcon(type: QrCreateContentTypeType): string {
|
||||
switch (type) {
|
||||
case "freeText":
|
||||
return "format_align_left";
|
||||
|
@ -356,6 +369,8 @@ export class GeneratePage {
|
|||
return "link";
|
||||
case "contact":
|
||||
return "contact_phone";
|
||||
case "geo":
|
||||
return "location_on";
|
||||
case "phone":
|
||||
return "call";
|
||||
case "sms":
|
||||
|
@ -371,7 +386,7 @@ export class GeneratePage {
|
|||
}
|
||||
}
|
||||
|
||||
getText(type: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi"): string {
|
||||
getText(type: QrCreateContentTypeType): string {
|
||||
switch (type) {
|
||||
case "freeText":
|
||||
return this.freeTxtText;
|
||||
|
@ -379,6 +394,8 @@ export class GeneratePage {
|
|||
return this.urlText;
|
||||
case "contact":
|
||||
return this.contactText;
|
||||
case "geo":
|
||||
return this.geolocationText;
|
||||
case "phone":
|
||||
return this.phoneText;
|
||||
case "sms":
|
||||
|
|
|
@ -96,6 +96,15 @@
|
|||
[ngTemplateOutletContext]="{ label: 'HIDDEN_NETWORK_?' | translate, content: wifiHidden === true? ('YES' | translate) : ('NO' | translate) }">
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="contentType === 'geo' && qrCodeContent && qrCodeContent.trim().length > 0 && latitude != null"
|
||||
[ngTemplateOutlet]="contentBlock" [ngTemplateOutletContext]="{ label: 'LATITUDE' | translate, content: latitude }">
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="contentType === 'geo' && qrCodeContent && qrCodeContent.trim().length > 0 && longitude != null"
|
||||
[ngTemplateOutlet]="contentBlock"
|
||||
[ngTemplateOutletContext]="{ label: 'LONGITUDE' | translate, content: longitude }">
|
||||
</ng-container>
|
||||
|
||||
<div class="ion-padding-horizontal ion-margin-horizontal ion-padding-bottom">
|
||||
</div>
|
||||
|
||||
|
@ -126,6 +135,13 @@
|
|||
</ion-button>
|
||||
</ion-row>
|
||||
|
||||
<ion-row *ngIf="contentType === 'geo' && env.showOpenUrlButton === 'on'"
|
||||
class="d-flex justify-content-center">
|
||||
<ion-button (click)="tapHaptic(); openLink()" [color]="'primary'" fill="clear">
|
||||
<ion-icon name="map"></ion-icon>
|
||||
</ion-button>
|
||||
</ion-row>
|
||||
|
||||
<ion-row *ngIf="contentType === 'contact' && env.showAddContactButton === 'on'"
|
||||
class="d-flex justify-content-center">
|
||||
<ion-button (click)="tapHaptic(); addContact()" [color]="'primary'" fill="clear">
|
||||
|
@ -245,10 +261,11 @@
|
|||
<ion-icon class="pe-2" name="globe"></ion-icon>
|
||||
<ion-label>{{ 'BROWSE' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pe-1" *ngIf="contentType === 'url' && env.showOpenUrlButton === 'on' && !isHttp"
|
||||
<ion-button class="pe-1"
|
||||
*ngIf="(contentType === 'url' || contentType === 'geo') && env.showOpenUrlButton === 'on' && !isHttp"
|
||||
(click)="tapHaptic(); openLink()" [color]="env.colorTheme === 'light'? 'dark' : 'light'" fill="outline"
|
||||
shape="round" [@inAnimation]>
|
||||
<ion-icon class="pe-2" name="open"></ion-icon>
|
||||
<ion-icon class="pe-2" [name]="contentType === 'geo'? 'map' : 'open'"></ion-icon>
|
||||
<ion-label>{{ 'OPEN' | translate}}</ion-label>
|
||||
</ion-button>
|
||||
<ion-button class="pe-1"
|
||||
|
@ -340,7 +357,8 @@
|
|||
[cdkAutosizeMaxRows]="20" readonly>
|
||||
</textarea>
|
||||
<mat-hint *ngIf="hint && hint != ''" style="opacity: 0.5;">{{ hint }}</mat-hint>
|
||||
<button mat-button color="primary" (click)="editContent()" *ngIf="showEdit" class="m-0 p-0 mt-3" style="background-color: transparent !important; color: var(--ion-color-primary) !important;">
|
||||
<button mat-button color="primary" (click)="editContent()" *ngIf="showEdit" class="m-0 p-0 mt-3"
|
||||
style="background-color: transparent !important; color: var(--ion-color-primary) !important;">
|
||||
{{ 'EDIT' | translate }}
|
||||
</button>
|
||||
</mat-form-field>
|
||||
|
|
|
@ -6,7 +6,7 @@ import { Haptics, ImpactStyle } from '@capacitor/haptics';
|
|||
import { AlertController, LoadingController, ModalController, Platform } from '@ionic/angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { VCardContact } from 'src/app/models/v-card-contact';
|
||||
import { EnvService } from 'src/app/services/env.service';
|
||||
import { EnvService, QrResultContentTypeType } from 'src/app/services/env.service';
|
||||
import { Toast } from '@capacitor/toast';
|
||||
import { MatFormField } from '@angular/material/form-field';
|
||||
import { BarcodeScanner } from '@capacitor-community/barcode-scanner';
|
||||
|
@ -23,7 +23,7 @@ import { QRCodeElementType } from 'angularx-qrcode';
|
|||
})
|
||||
export class ResultPage {
|
||||
|
||||
contentType: "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" = "freeText";
|
||||
contentType: QrResultContentTypeType = "freeText";
|
||||
|
||||
qrCodeContent: string;
|
||||
qrElementType: QRCodeElementType = "canvas";
|
||||
|
@ -45,6 +45,9 @@ export class ResultPage {
|
|||
wifiEncryption: 'NONE' | 'WEP' | 'WPA';
|
||||
wifiHidden: boolean = false;
|
||||
|
||||
latitude: number;
|
||||
longitude: number;
|
||||
|
||||
base64Encoded: boolean = false;
|
||||
base64EncodedText: string = "";
|
||||
base64Decoded: boolean = false;
|
||||
|
@ -138,6 +141,8 @@ export class ResultPage {
|
|||
delete this.wifiPassword
|
||||
delete this.wifiEncryption
|
||||
delete this.wifiHidden
|
||||
delete this.latitude
|
||||
delete this.longitude
|
||||
this.base64Encoded = false;
|
||||
this.base64EncodedText = "";
|
||||
this.base64Decoded = false;
|
||||
|
@ -157,6 +162,7 @@ export class ResultPage {
|
|||
const emailW3CPrefix = "MAILTO:";
|
||||
const emailDoconoPrefix = "MATMSG:";
|
||||
const wifiPrefix = "WIFI:";
|
||||
const geoPrefix = "GEO:";
|
||||
const content0 = this.qrCodeContent.trim();
|
||||
const tContent = this.qrCodeContent.trim().toUpperCase();
|
||||
if (tContent.substr(0, contactPrefix.length) === contactPrefix) {
|
||||
|
@ -183,6 +189,10 @@ export class ResultPage {
|
|||
} else if (tContent.substr(0, wifiPrefix.length) === wifiPrefix) {
|
||||
this.contentType = "wifi";
|
||||
this.prepareWifi();
|
||||
} else if (tContent.substring(0, geoPrefix.length) === geoPrefix) {
|
||||
this.contentType = "geo";
|
||||
this.latitude = +tContent.substring(geoPrefix.length, tContent.indexOf(","));
|
||||
this.longitude = +tContent.substring(tContent.indexOf(",") + 1);
|
||||
} else if (this.isValidUrl(content0)) {
|
||||
this.contentType = "url";
|
||||
} else {
|
||||
|
@ -880,6 +890,8 @@ export class ResultPage {
|
|||
return this.translate.instant("EMAIL_W3C_STANDARD");
|
||||
case 'emailDocomo':
|
||||
return this.translate.instant("EMAIL_NTT_DOCOMO");
|
||||
case 'geo':
|
||||
return this.translate.instant("GEOLOCATION");
|
||||
case 'phone':
|
||||
return this.translate.instant("PHONE_NO");
|
||||
case 'sms':
|
||||
|
@ -901,6 +913,8 @@ export class ResultPage {
|
|||
return "link";
|
||||
case "contact":
|
||||
return "contact_phone";
|
||||
case 'geo':
|
||||
return "location_on";
|
||||
case "phone":
|
||||
return "call";
|
||||
case "sms":
|
||||
|
|
|
@ -25,6 +25,8 @@ export declare type VibrationType = "on" | "off" | 'on-haptic' | 'on-scanned';
|
|||
export declare type OrientationType = 'portrait' | 'landscape';
|
||||
export declare type SearchEngineType = 'google' | 'bing' | 'yahoo' | 'duckduckgo' | 'yandex' | 'ecosia' | 'brave';
|
||||
export declare type ResultPageButtonsType = 'detailed' | 'icon-only';
|
||||
export declare type QrResultContentTypeType = "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" | "geo";
|
||||
export declare type QrCreateContentTypeType = "freeText" | "url" | "contact" | "phone" | "sms" | "emailW3C" | "emailDocomo" | "wifi" | "geo";
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "Voller Reset",
|
||||
"FUNCTIONS": "Funktionen",
|
||||
"GENDER": "Geschlecht",
|
||||
"GEOLOCATION": "Geolokalisierung",
|
||||
"GOOGLE_SEARCH": "Google-Suche",
|
||||
"HAPTIC_FEEDBACK_ONLY": "Nur haptisches Feedback",
|
||||
"HIDDEN_NETWORK_?": "Verstecktes Netzwerk?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "Berufsbezeichnung",
|
||||
"LANGUAGE": "Sprache",
|
||||
"LAST_NAME": "Nachname",
|
||||
"LATITUDE": "Breitengrad",
|
||||
"LEVEL_H": "Level H",
|
||||
"LEVEL_L": "Level L",
|
||||
"LEVEL_M": "Level M",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "Porträt sperren",
|
||||
"LOG": "Protokoll",
|
||||
"LOG_BACKUP_AND_RESTORE": "Protokoll, Sicherung und Wiederherstellung",
|
||||
"LONGITUDE": "Längengrad",
|
||||
"MALE": "Männlich",
|
||||
"MANAGE_RECORDS": "Aufzeichnungen verwalten",
|
||||
"MARGIN": "Rand",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "Full Reset",
|
||||
"FUNCTIONS": "Functions",
|
||||
"GENDER": "Gender",
|
||||
"GEOLOCATION": "Geolocation",
|
||||
"GOOGLE_SEARCH": "Google Search",
|
||||
"HAPTIC_FEEDBACK_ONLY": "Haptic Feedback Only",
|
||||
"HIDDEN_NETWORK_?": "Hidden Network?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "Job Title",
|
||||
"LANGUAGE": "Language",
|
||||
"LAST_NAME": "Last Name",
|
||||
"LATITUDE": "Latitude",
|
||||
"LEVEL_H": "Level H",
|
||||
"LEVEL_L": "Level L",
|
||||
"LEVEL_M": "Level M",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "Lock Portrait",
|
||||
"LOG": "Log",
|
||||
"LOG_BACKUP_AND_RESTORE": "Log, Backup & Restore",
|
||||
"LONGITUDE": "Longitude",
|
||||
"MALE": "Male",
|
||||
"MANAGE_RECORDS": "Manage Records",
|
||||
"MARGIN": "Margin",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "Réinitialiser complètement",
|
||||
"FUNCTIONS": "Fonctions",
|
||||
"GENDER": "Sexe",
|
||||
"GEOLOCATION": "Géolocalisation",
|
||||
"GOOGLE_SEARCH": "Recherche Google",
|
||||
"HAPTIC_FEEDBACK_ONLY": "Retour haptique uniquement",
|
||||
"HIDDEN_NETWORK_?": "Réseau caché ?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "Titre d'emploi",
|
||||
"LANGUAGE": "Langue",
|
||||
"LAST_NAME": "Nom de famille",
|
||||
"LATITUDE": "Latitude",
|
||||
"LEVEL_H": "Niveau H",
|
||||
"LEVEL_L": "Niveau L",
|
||||
"LEVEL_M": "Niveau M",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "Verrouiller le portrait",
|
||||
"LOG": "Registre",
|
||||
"LOG_BACKUP_AND_RESTORE": "Journalisation, sauvegarde et restauration",
|
||||
"LONGITUDE": "Longitude",
|
||||
"MALE": "Mâle",
|
||||
"MANAGE_RECORDS": "Gérer les enregistrements",
|
||||
"MARGIN": "Marge",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "Reset",
|
||||
"FUNCTIONS": "Opzioni",
|
||||
"GENDER": "Sesso",
|
||||
"GEOLOCATION": "Geolocalizzazione",
|
||||
"GOOGLE_SEARCH": "Ricerca con Google",
|
||||
"HAPTIC_FEEDBACK_ONLY": "Feedback disponibile solo tramite Haptic",
|
||||
"HIDDEN_NETWORK_?": "Rete nascosta?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "Titolo di lavoro",
|
||||
"LANGUAGE": "Lingua",
|
||||
"LAST_NAME": "Cognome",
|
||||
"LATITUDE": "Latitudine",
|
||||
"LEVEL_H": "Livello H",
|
||||
"LEVEL_L": "Livello L",
|
||||
"LEVEL_M": "Livello M",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "Blocca vista verticale",
|
||||
"LOG": "Log",
|
||||
"LOG_BACKUP_AND_RESTORE": "Logga, Esegui backup & Ripristina",
|
||||
"LONGITUDE": "Longitudine",
|
||||
"MALE": "Uomo",
|
||||
"MANAGE_RECORDS": "Gestisci record",
|
||||
"MARGIN": "Margine",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"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?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"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",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"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",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "Полный сброс",
|
||||
"FUNCTIONS": "Функции",
|
||||
"GENDER": "Пол",
|
||||
"GEOLOCATION": "Геолокация",
|
||||
"GOOGLE_SEARCH": "Google Search",
|
||||
"HAPTIC_FEEDBACK_ONLY": "Только тактильный отклик",
|
||||
"HIDDEN_NETWORK_?": "Скрытая сеть?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "Должность",
|
||||
"LANGUAGE": "Язык",
|
||||
"LAST_NAME": "Фамилия",
|
||||
"LATITUDE": "Широта",
|
||||
"LEVEL_H": "Уровень H",
|
||||
"LEVEL_L": "Уровень L",
|
||||
"LEVEL_M": "Уровень M",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "Портретная",
|
||||
"LOG": "История",
|
||||
"LOG_BACKUP_AND_RESTORE": "История и восстановление",
|
||||
"LONGITUDE": "Долгота",
|
||||
"MALE": "Мужской",
|
||||
"MANAGE_RECORDS": "Управление записями",
|
||||
"MARGIN": "Отступ",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "完整重设",
|
||||
"FUNCTIONS": "功能",
|
||||
"GENDER": "性别",
|
||||
"GEOLOCATION": "地理定位",
|
||||
"GOOGLE_SEARCH": "Google 搜索",
|
||||
"HAPTIC_FEEDBACK_ONLY": "仅触感反馈",
|
||||
"HIDDEN_NETWORK_?": "隐藏的网络?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "职位名称",
|
||||
"LANGUAGE": "语言",
|
||||
"LAST_NAME": "姓氏",
|
||||
"LATITUDE": "纬度",
|
||||
"LEVEL_H": "H 等级",
|
||||
"LEVEL_L": "L 等级",
|
||||
"LEVEL_M": "M 等级",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "锁定纵向",
|
||||
"LOG": "记录",
|
||||
"LOG_BACKUP_AND_RESTORE": "记录、备份与还原",
|
||||
"LONGITUDE": "经度",
|
||||
"MALE": "男性",
|
||||
"MANAGE_RECORDS": "管理记录",
|
||||
"MARGIN": "边距",
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"FULL_RESET": "完整重設",
|
||||
"FUNCTIONS": "功能",
|
||||
"GENDER": "性別",
|
||||
"GEOLOCATION": "地理位置",
|
||||
"GOOGLE_SEARCH": "Google 搜尋",
|
||||
"HAPTIC_FEEDBACK_ONLY": "僅觸感反饋",
|
||||
"HIDDEN_NETWORK_?": "隱藏的網絡?",
|
||||
|
@ -105,6 +106,7 @@
|
|||
"JOB_TITLE": "職位名稱",
|
||||
"LANGUAGE": "語言",
|
||||
"LAST_NAME": "姓氏",
|
||||
"LATITUDE": "緯度",
|
||||
"LEVEL_H": "H 等級",
|
||||
"LEVEL_L": "L 等級",
|
||||
"LEVEL_M": "M 等級",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"LOCK_PORTRAIT": "鎖定縱向",
|
||||
"LOG": "記錄",
|
||||
"LOG_BACKUP_AND_RESTORE": "記錄、備份與還原",
|
||||
"LONGITUDE": "經度",
|
||||
"MALE": "男性",
|
||||
"MANAGE_RECORDS": "管理記錄",
|
||||
"MARGIN": "邊距",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue