diff --git a/admin/website-angular/src/app/@core/data/fakeDataServices/carriers.ts b/admin/website-angular/src/app/@core/data/fakeDataServices/carriers.ts index bcd01d67f..8a6b7398b 100644 --- a/admin/website-angular/src/app/@core/data/fakeDataServices/carriers.ts +++ b/admin/website-angular/src/app/@core/data/fakeDataServices/carriers.ts @@ -24,7 +24,7 @@ export default class FakeDataCarriers { return { carrier: { isDeleted: false, - firstName, + firstName: faker.name.firstName(), lastName: faker.name.lastName(), status: faker.random.number({ min: 0, @@ -56,7 +56,8 @@ export default class FakeDataCarriers { this.getCloseCoordinate(lng), this.getCloseCoordinate(lat) ] - } + }, + default: false } }, password: '123456' @@ -93,7 +94,8 @@ export default class FakeDataCarriers { this.getCloseCoordinate(lng), this.getCloseCoordinate(lat) ] - } + }, + default: false } }, password: '123456' @@ -129,7 +131,8 @@ export default class FakeDataCarriers { this.getCloseCoordinate(lng), this.getCloseCoordinate(lat) ] - } + }, + default: false } }, password: '123456' @@ -164,7 +167,8 @@ export default class FakeDataCarriers { this.getCloseCoordinate(lng), this.getCloseCoordinate(lat) ] - } + }, + default: false } }, password: '123456' diff --git a/admin/website-angular/src/app/@core/data/fakeDataServices/invites.ts b/admin/website-angular/src/app/@core/data/fakeDataServices/invites.ts index b4dc0156d..40c38fb04 100644 --- a/admin/website-angular/src/app/@core/data/fakeDataServices/invites.ts +++ b/admin/website-angular/src/app/@core/data/fakeDataServices/invites.ts @@ -23,7 +23,8 @@ export default class FakeDataInvites { loc: { type: 'Point', coordinates: [lng + 0.05, lat - 0.01] - } + }, + default: false }, apartment: '3' }; @@ -38,7 +39,8 @@ export default class FakeDataInvites { loc: { type: 'Point', coordinates: [lng + 0.09, lat - 0.1] - } + }, + default: false }, apartment: '2' }; @@ -53,7 +55,8 @@ export default class FakeDataInvites { loc: { type: 'Point', coordinates: [lng, lat - 0.01] - } + }, + default: false }, apartment: '6' }; @@ -68,7 +71,8 @@ export default class FakeDataInvites { loc: { type: 'Point', coordinates: [lng + 0.06, lat] - } + }, + default: false }, apartment: '6' }; @@ -92,7 +96,8 @@ export default class FakeDataInvites { loc: { type: 'Point', coordinates: [lng, lat] - } + }, + default: false }, apartment: faker.random.number(199).toString() }; diff --git a/admin/website-angular/src/app/@core/data/fakeDataServices/storageService.ts b/admin/website-angular/src/app/@core/data/fakeDataServices/storageService.ts index a42490bf5..3c37f4f56 100644 --- a/admin/website-angular/src/app/@core/data/fakeDataServices/storageService.ts +++ b/admin/website-angular/src/app/@core/data/fakeDataServices/storageService.ts @@ -29,7 +29,8 @@ export class AdminStorageService extends StorageService { loc: { type: 'Point', coordinates: [lng, lat] - } + }, + default: false }) : null; } diff --git a/admin/website-angular/src/app/@core/data/fakeDataServices/users.ts b/admin/website-angular/src/app/@core/data/fakeDataServices/users.ts index 0c8fb86a5..50155c57a 100644 --- a/admin/website-angular/src/app/@core/data/fakeDataServices/users.ts +++ b/admin/website-angular/src/app/@core/data/fakeDataServices/users.ts @@ -17,20 +17,23 @@ export default class FakeDataUsers { phone: faker.phone.phoneNumber(), image: faker.image.avatar(), apartment: faker.random.number(199).toString(), - geoLocation: { - countryId: faker.random.number(200) as Country, - city: faker.address.city(), - postcode: faker.address.zipCode(), - streetAddress: faker.address.streetAddress(), - house: faker.random.number(199).toString(), - loc: { - type: 'Point', - coordinates: [ - environment.DEFAULT_LONGITUDE, - environment.DEFAULT_LATITUDE - ] + geoLocation: [ + { + countryId: faker.random.number(200) as Country, + city: faker.address.city(), + postcode: faker.address.zipCode(), + streetAddress: faker.address.streetAddress(), + house: faker.random.number(199).toString(), + loc: { + type: 'Point', + coordinates: [ + environment.DEFAULT_LONGITUDE, + environment.DEFAULT_LATITUDE + ] + }, + default: true } - }, + ], isBanned: Math.random() < 0.01 }, password: '123456' diff --git a/admin/website-angular/src/app/@core/data/fakeDataServices/warehouses.ts b/admin/website-angular/src/app/@core/data/fakeDataServices/warehouses.ts index c85bf7e0a..442c48b5e 100644 --- a/admin/website-angular/src/app/@core/data/fakeDataServices/warehouses.ts +++ b/admin/website-angular/src/app/@core/data/fakeDataServices/warehouses.ts @@ -55,7 +55,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng, lat] - } + }, + default: false }, _createdAt: this._getRandomDateRange() }, @@ -90,7 +91,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng + 0.05, lat + 0.09] - } + }, + default: false }, _createdAt: this._getRandomDateRange() }, @@ -124,7 +126,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng - 0.05, lat - 0.09] - } + }, + default: false }, _createdAt: this._getRandomDateRange() }, @@ -158,7 +161,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng + 0.08, lat + 0.07] - } + }, + default: false }, _createdAt: this._getRandomDateRange() } as any, @@ -192,7 +196,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng - 0.08, lat - 0.07] - } + }, + default: false }, _createdAt: this._getRandomDateRange() } as any, @@ -212,7 +217,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng, lat] - } + }, + default: false }; } else { console.warn(NEED_DEFAULT_SETTINGS_MESSAGE); @@ -231,7 +237,8 @@ export default class FakeDataWarehouses { loc: { type: 'Point', coordinates: [lng + 0.05, lat - 0.08] - } + }, + default: false }; } else { console.warn(NEED_DEFAULT_SETTINGS_MESSAGE); diff --git a/admin/website-angular/src/app/@core/data/invites-requests.service.ts b/admin/website-angular/src/app/@core/data/invites-requests.service.ts index 9173e65c8..ca80d6b85 100644 --- a/admin/website-angular/src/app/@core/data/invites-requests.service.ts +++ b/admin/website-angular/src/app/@core/data/invites-requests.service.ts @@ -188,7 +188,8 @@ export class InvitesRequestsService { loc: { coordinates: [Number(lng), Number(lat)], type: 'Point' - } + }, + default: false }; const inviteRequest: IInviteRequestCreateObject = { diff --git a/admin/website-angular/src/app/@core/data/invites.service.ts b/admin/website-angular/src/app/@core/data/invites.service.ts index a62aa5a4a..5de1918fb 100644 --- a/admin/website-angular/src/app/@core/data/invites.service.ts +++ b/admin/website-angular/src/app/@core/data/invites.service.ts @@ -170,7 +170,8 @@ export class InvitesService { loc: { coordinates: [Number(lng), Number(lat)], type: 'Point' - } + }, + default: false }; const invite: IInviteCreateObject = { diff --git a/admin/website-angular/src/app/@shared/invite/by-code/by-code-modal.component.ts b/admin/website-angular/src/app/@shared/invite/by-code/by-code-modal.component.ts index 80f6222be..6aae9c07d 100644 --- a/admin/website-angular/src/app/@shared/invite/by-code/by-code-modal.component.ts +++ b/admin/website-angular/src/app/@shared/invite/by-code/by-code-modal.component.ts @@ -39,12 +39,12 @@ export class ByCodeModalComponent { const user = await this.userAuthRouter.register({ user: { apartment: invite.apartment, - geoLocation: invite.geoLocation + geoLocation: [invite.geoLocation] } }); this.toasterService.pop( 'success', - `Successful logen with code` + `Successful login with code` ); this.activeModal.close(user); } else { diff --git a/admin/website-angular/src/app/@shared/order/order-map/carreir-location/carreir-location.ts b/admin/website-angular/src/app/@shared/order/order-map/carreir-location/carreir-location.ts index 7a56a2a16..fe93960cc 100644 --- a/admin/website-angular/src/app/@shared/order/order-map/carreir-location/carreir-location.ts +++ b/admin/website-angular/src/app/@shared/order/order-map/carreir-location/carreir-location.ts @@ -27,7 +27,6 @@ export class CarrierLocationComponent implements OnInit, OnDestroy { ngOnInit(): void { this.loadMap(); - this.loadRoot(); } @@ -50,9 +49,12 @@ export class CarrierLocationComponent implements OnInit, OnDestroy { const [carrierLng, carrierLat] = this.order.carrier[ 'geoLocation' ].loc.coordinates; - const [userLng, userLat] = this.order.user[ - 'geoLocation' - ].loc.coordinates; + // for a user, we need to load default address + const [ + userLng, + userLat + ] = this.order.user.getDefaultGeolocation().loc.coordinates; + const origin = new google.maps.LatLng(carrierLat, carrierLng); const destination = new google.maps.LatLng(userLat, userLng); diff --git a/admin/website-angular/src/app/@shared/order/order-map/user-warehouse-map/user-warehouse-map.ts b/admin/website-angular/src/app/@shared/order/order-map/user-warehouse-map/user-warehouse-map.ts index d6aaa1c41..3b0fba215 100644 --- a/admin/website-angular/src/app/@shared/order/order-map/user-warehouse-map/user-warehouse-map.ts +++ b/admin/website-angular/src/app/@shared/order/order-map/user-warehouse-map/user-warehouse-map.ts @@ -66,7 +66,7 @@ export class UserWarehouseLocationComponent const warehouse = this.order.warehouse; this.userMarker = this.addMarker( - user['geoLocation'], + user.getDefaultGeolocation(), this.map, userIcon ); diff --git a/admin/website-angular/src/app/@shared/user/user-mutation/user-mutation.component.ts b/admin/website-angular/src/app/@shared/user/user-mutation/user-mutation.component.ts index 9709db525..8b1e1fc55 100644 --- a/admin/website-angular/src/app/@shared/user/user-mutation/user-mutation.component.ts +++ b/admin/website-angular/src/app/@shared/user/user-mutation/user-mutation.component.ts @@ -82,7 +82,7 @@ export class UserMutationComponent { const user = await this.userAuthRouter.register({ user: { ...this.basicInfoForm.getValue(), - geoLocation: location, + geoLocation: [location], apartment: this.locationForm.getApartment() } }); diff --git a/admin/website-angular/src/app/pages/+customers/+customer/+customer-edit/customer-edit.component.ts b/admin/website-angular/src/app/pages/+customers/+customer/+customer-edit/customer-edit.component.ts index 3f1bc4b61..509342929 100644 --- a/admin/website-angular/src/app/pages/+customers/+customer/+customer-edit/customer-edit.component.ts +++ b/admin/website-angular/src/app/pages/+customers/+customer/+customer-edit/customer-edit.component.ts @@ -68,14 +68,14 @@ export class CustomerEditComponent implements OnInit { this._currentCustomer = customer; // GeoJSON use reversed order of lat => lng - const geoLocationInput = customer.geoLocation; + const geoLocationInput = customer.getDefaultGeolocation(); geoLocationInput.loc.coordinates.reverse(); this.basicInfoForm.setValue(customer); this.locationForm.setValue(geoLocationInput); this._emitMapCoordinates([ - customer.geoLocation.coordinates.lat, - customer.geoLocation.coordinates.lng + customer.getDefaultGeolocation().coordinates.lat, + customer.getDefaultGeolocation().coordinates.lng ]); }); } @@ -99,13 +99,15 @@ export class CustomerEditComponent implements OnInit { protected async updateCustomer() { const geoLocationInput = this.locationForm.getValue(); geoLocationInput.loc.coordinates.reverse(); + this._currentCustomer.setDefaultLocation(geoLocationInput); + const allCustomerAddresses = this._currentCustomer.customerAddress; try { this.loading = true; const customer = await this._customerRouter.updateUser( this._currentCustomer.id, { ...this.basicInfoForm.getValue(), - geoLocation: geoLocationInput as IGeoLocation + geoLocation: allCustomerAddresses } ); this.loading = false; diff --git a/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-location/ea-customer-location.component.ts b/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-location/ea-customer-location.component.ts index 88f2cea4c..2c1a8393e 100644 --- a/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-location/ea-customer-location.component.ts +++ b/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-location/ea-customer-location.component.ts @@ -28,8 +28,8 @@ export class CustomerLocationComponent implements OnDestroy, OnInit { .pipe(first()) .toPromise(); const coordinates = new google.maps.LatLng( - user['geoLocation'].coordinates.lat, - user['geoLocation'].coordinates.lng + user.getDefaultGeolocation().coordinates.lat, + user.getDefaultGeolocation().coordinates.lng ); this.showMap(coordinates); this.marker = this.addMarker(coordinates, this.map); diff --git a/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-products/ea-customer-products.component.ts b/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-products/ea-customer-products.component.ts index 29a9890e1..b9cfa39e9 100644 --- a/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-products/ea-customer-products.component.ts +++ b/admin/website-angular/src/app/pages/+customers/+customer/ea-customer-products/ea-customer-products.component.ts @@ -61,7 +61,7 @@ export class CustomerProductsComponent implements OnDestroy, OnInit { } this.availableProductsSubscription$ = this.geoLocationProductService - .getGeoLocationProducts(user.geoLocation) + .getGeoLocationProducts(user.getDefaultGeolocation()) .subscribe((products) => { this.availableProducts = products; this.sourceSmartTable.load(products); diff --git a/backend/api/src/app.module.ts b/backend/api/src/app.module.ts index 84c12518e..3f11352fe 100644 --- a/backend/api/src/app.module.ts +++ b/backend/api/src/app.module.ts @@ -156,10 +156,12 @@ export class ApplicationModule implements NestModule, OnModuleInit { server.applyMiddleware({app, path: graphqlPath}); */ - log.info( `GraphQL playground available at http://localhost:${port}/graphql` ); + console.log( + `GraphQL playground available at http://localhost:${port}/graphql` + ); } /* diff --git a/backend/api/src/services/invites/InvitesRequestsService.ts b/backend/api/src/services/invites/InvitesRequestsService.ts index a775299ee..c2ec2a385 100644 --- a/backend/api/src/services/invites/InvitesRequestsService.ts +++ b/backend/api/src/services/invites/InvitesRequestsService.ts @@ -358,7 +358,8 @@ export class InvitesRequestsService extends DBService type: 'Point', coordinates: [defaultLng, defaultLat] }, - streetAddress: faker.address.streetAddress() + streetAddress: faker.address.streetAddress(), + default: true }; return GeoLocation; } diff --git a/backend/api/src/services/users/UsersAuthService.ts b/backend/api/src/services/users/UsersAuthService.ts index 5ce5778ba..0059df452 100644 --- a/backend/api/src/services/users/UsersAuthService.ts +++ b/backend/api/src/services/users/UsersAuthService.ts @@ -15,6 +15,7 @@ import IUserAuthRouter, { import { inject, injectable } from 'inversify'; import { AuthService, AuthServiceFactory } from '../auth'; import { env } from '../../env'; +import { IGeoLocationCreateObject } from '@modules/server.common/interfaces/IGeoLocation'; /** * Customers Authentication Service @@ -200,22 +201,28 @@ export class UsersAuthService extends EntityService private async _isInvited( userCreateObject: IUserCreateObject ): Promise { - const inviteFindObject = { - 'geoLocation.countryId': userCreateObject.geoLocation.countryId, - 'geoLocation.city': userCreateObject.geoLocation.city, - 'geoLocation.streetAddress': - userCreateObject.geoLocation.streetAddress, - 'geoLocation.house': userCreateObject.geoLocation.house, - apartment: userCreateObject.apartment - }; - - if (userCreateObject.geoLocation.postcode) { - inviteFindObject['geoLocation.postcode'] = - userCreateObject.geoLocation.postcode; - } + const defaultAddress = userCreateObject.geoLocation.filter( + (currentLoc: IGeoLocationCreateObject) => { + return currentLoc.default === true; + } + ); + if (defaultAddress.length > 0) { + const inviteFindObject = { + 'geoLocation.countryId': defaultAddress[0].countryId, + 'geoLocation.city': defaultAddress[0].city, + 'geoLocation.streetAddress': defaultAddress[0].streetAddress, + 'geoLocation.house': defaultAddress[0].house, + apartment: userCreateObject.apartment + }; + + if (defaultAddress[0].postcode) { + inviteFindObject['geoLocation.postcode'] = + defaultAddress[0].postcode; + } - const invite = await this.invitesService.findOne(inviteFindObject); + const invite = await this.invitesService.findOne(inviteFindObject); - return invite != null; + return invite != null; + } } } diff --git a/backend/api/src/services/users/UsersService.ts b/backend/api/src/services/users/UsersService.ts index 34a45b50f..2b35098d2 100644 --- a/backend/api/src/services/users/UsersService.ts +++ b/backend/api/src/services/users/UsersService.ts @@ -464,7 +464,8 @@ export class UsersService extends DBService type: 'Point', coordinates: [defaultLng, defaultLat] }, - streetAddress: faker.address.streetAddress() + streetAddress: faker.address.streetAddress(), + default: true }; if (!existingEmails.includes(email)) { diff --git a/backend/api/src/test/integration/GeoLocationWarehouses.spec.ts b/backend/api/src/test/integration/GeoLocationWarehouses.spec.ts index 56c890d2c..cf29c7ecd 100644 --- a/backend/api/src/test/integration/GeoLocationWarehouses.spec.ts +++ b/backend/api/src/test/integration/GeoLocationWarehouses.spec.ts @@ -33,7 +33,8 @@ function geoLocationFixture([lng, lat]: [number, number]): GeoLocation { loc: { type: 'Point', coordinates: [lng, lat] - } + }, + default: true }); } diff --git a/shared/core-angular/services/googleMapsLoader.ts b/shared/core-angular/services/googleMapsLoader.ts index de81a1307..41eb84ac0 100644 --- a/shared/core-angular/services/googleMapsLoader.ts +++ b/shared/core-angular/services/googleMapsLoader.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; @Injectable() export class GoogleMapsLoader { - constructor() {} + constructor() { } load(googleMapsApiKey: string) { const src = `https://maps.googleapis.com/maps/api/js?key=${googleMapsApiKey}&libraries=places,drawing&callback=__onGoogleLoaded`; diff --git a/shared/core/@pyro/db/db-object.ts b/shared/core/@pyro/db/db-object.ts index 2a89d89d4..b45d001e5 100644 --- a/shared/core/@pyro/db/db-object.ts +++ b/shared/core/@pyro/db/db-object.ts @@ -14,7 +14,7 @@ export interface DBObjectClass extends Function { export abstract class DBObject< RawObject extends CreateObject & DBRawObject, CreateObject extends DBCreateObject -> implements DBRawObject { + > implements DBRawObject { // to allow inferring the generic args types readonly CreateObjectTYPE: CreateObject; diff --git a/shared/core/entities/Address.ts b/shared/core/entities/Address.ts new file mode 100644 index 000000000..27e294007 --- /dev/null +++ b/shared/core/entities/Address.ts @@ -0,0 +1,97 @@ +import { DBObject, ModelName, Schema, Types } from '../@pyro/db'; +import IProduct, { + IProductCreateObject, + IProductDescription, + IProductDescriptionHTML, + IProductDetails, + IProductDetailsHTML, + IProductImage, + IProductTitle +} from '../interfaces/IProduct'; +import ProductsCategory from './ProductsCategory'; +import { IProductsCategory } from '../interfaces/IProductsCategory'; +import { Entity, Column } from 'typeorm'; + +/** + * Product Information (organized as a global Products Catalog) + * + * Note: Products in specific warehouse are stored as a WarehouseProduct records instead + * (in MongoDB as sub-documents of the Warehouse document) + * + * @class Product + * @extends {DBObject} + * @implements {IProduct} + */ +@ModelName('Product') +@Entity({ name: 'products' }) +class Product extends DBObject + implements IProduct { + /** + * Title of Product (normally short and display as a bold text) + * + * @type {IProductTitle[]} + * @memberof Product + */ + @Schema({ type: Array }) + title: IProductTitle[]; + + /** + * Short description of the product (normally longer than title) + * + * @type {IProductDescription[]} + * @memberof Product + */ + @Schema({ type: Array }) + description: IProductDescription[]; + + /** + * HTML content for Short description of the product (normally longer than title) + * + * @type {IProductDescriptionHTML[]} + * @memberof Product + */ + @Schema({ type: Array }) + descriptionHTML: IProductDescriptionHTML[]; + + /** + * Long description of the product (normally longer than product description) + * + * @type {IProductDetails[]} + * @memberof Product + */ + @Schema({ type: Array }) + details: IProductDetails[]; + + /** + * HTML content for Long description of the product (normally longer than product description) + * + * @type {IProductDetailsHTML[]} + * @memberof Product + */ + @Schema({ type: Array }) + detailsHTML: IProductDetailsHTML[]; + + /** + * Product Images + * + * @type {IProductImage[]} + * @memberof Product + */ + @Schema({ type: Array }) + images: IProductImage[]; + + /** + * Categories to which product belong + * + * @type {IProductsCategory[]} + * @memberof Product + */ + @Types.Ref([ProductsCategory]) + categories: IProductsCategory[]; + + @Types.Boolean(false) + @Column() + isDeleted: boolean; +} + +export default Product; diff --git a/shared/core/entities/GeoLocation.ts b/shared/core/entities/GeoLocation.ts index 38f66b334..e65bcdcaa 100644 --- a/shared/core/entities/GeoLocation.ts +++ b/shared/core/entities/GeoLocation.ts @@ -47,6 +47,10 @@ class GeoLocation extends DBObject @Column() house: string | null; + @Schema({ type: Boolean, required: false }) + @Column() + default: boolean | null; + @Index('2dsphere') @Schema(locationPreSchema) loc: ILocation; diff --git a/shared/core/entities/User.ts b/shared/core/entities/User.ts index e8abea8a2..95de76265 100644 --- a/shared/core/entities/User.ts +++ b/shared/core/entities/User.ts @@ -2,6 +2,9 @@ import GeoLocation from './GeoLocation'; import { DBObject, getSchema, ModelName, Schema, Types } from '../@pyro/db'; import IUser, { IUserCreateObject } from '../interfaces/IUser'; import { Entity, Column } from 'typeorm'; +import IGeoLocation, { + IGeoLocationCreateObject +} from '../interfaces/IGeoLocation'; /** * Customer who make orders @@ -18,7 +21,9 @@ class User extends DBObject implements IUser { super(user); if (user && user.geoLocation) { - this.geoLocation = new GeoLocation(user.geoLocation); + user.geoLocation.forEach((location: IGeoLocation) => { + this.geoLocation.push(new GeoLocation(location)); + }); } } @@ -89,7 +94,7 @@ class User extends DBObject implements IUser { * @memberof User */ @Schema(getSchema(GeoLocation)) - geoLocation: GeoLocation; + geoLocation: Array; /** * Apartment (stored separately from geolocation/address for efficiency) @@ -171,10 +176,40 @@ class User extends DBObject implements IUser { * @memberof User */ get fullAddress(): string { - return ( - `${this.geoLocation.city}, ${this.geoLocation.streetAddress} ` + - `${this.apartment}/${this.geoLocation.house}` + const address = this.getDefaultGeolocation(); + if (address) { + return ( + `${address.city}, ${address.streetAddress} ` + + `${address.apartment}/${address.house}` + ); + } else { + return ''; + } + } + + get customerAddress(): Array { + return this.geoLocation; + } + + getDefaultGeolocation(): GeoLocation | null { + const defaultLocation = this.geoLocation.filter( + (location: GeoLocation) => { + return location.default; + } ); + if (defaultLocation) { + return defaultLocation[0]; + } else { + return null; + } + } + + setDefaultLocation(input: IGeoLocationCreateObject) { + this.customerAddress.forEach((address: GeoLocation) => { + address.default = false; + }); + input.default = true; + this.customerAddress.push(input); } } diff --git a/shared/core/entities/UserOrder.ts b/shared/core/entities/UserOrder.ts index 9d1fd2dbf..87d36bdb0 100644 --- a/shared/core/entities/UserOrder.ts +++ b/shared/core/entities/UserOrder.ts @@ -1,7 +1,8 @@ import GeoLocation from './GeoLocation'; import { DBObject, getSchema, ModelName, Schema } from '../@pyro/db'; import IUserOrder, { IUserOrderCreateObject } from '../interfaces/IUserOrder'; -import { Column } from 'typeorm'; +import { Column, GeoNearOptions } from 'typeorm'; +import IGeoLocation from '../interfaces/IGeoLocation'; /** * Store information about Customer inside (embeded into) Order @@ -19,7 +20,13 @@ class UserOrder extends DBObject super(userOrder); if (userOrder && userOrder.geoLocation) { - this.geoLocation = new GeoLocation(userOrder.geoLocation); + this.defaultAddress = this.geoLocation.filter( + (address: GeoLocation) => address.default === true + ); + userOrder.geoLocation.forEach((location: IGeoLocation) => { + this.geoLocation.push(new GeoLocation(location)); + }); + // this.geoLocation = new GeoLocation(userOrder.geoLocation); } } @@ -85,7 +92,16 @@ class UserOrder extends DBObject * @memberof UserOrder */ @Schema(getSchema(GeoLocation)) - geoLocation: GeoLocation; + geoLocation: Array; + + /** + * Current customer location (customer address, last known location of the customer) + * + * @type {GeoLocation} + * @memberof UserOrder + */ + @Schema(getSchema(GeoLocation)) + defaultAddress: Array; /** * Apartment (stored separately from geolocation/address for efficiency) @@ -144,19 +160,40 @@ class UserOrder extends DBObject @Schema(Boolean) @Column() isRegistrationCompleted: boolean; - /** * Get full address of customer (including apartment) * Note: does not include country * * @readonly - * @memberof UserOrder + * @memberof User */ get fullAddress(): string { - return ( - `${this.geoLocation.city}, ${this.geoLocation.streetAddress} ` + - `${this.apartment}/${this.geoLocation.house}` + const address = this.getDefaultGeolocation(); + if (address) { + return ( + `${address.city}, ${address.streetAddress} ` + + `${address.apartment}/${address.house}` + ); + } else { + return ''; + } + } + + get customerAddress(): Array { + return this.geoLocation; + } + + getDefaultGeolocation(): GeoLocation | null { + const defaultLocation = this.geoLocation.filter( + (location: GeoLocation) => { + return location.default; + } ); + if (defaultLocation) { + return defaultLocation[0]; + } else { + return null; + } } } diff --git a/shared/core/entities/index.ts b/shared/core/entities/index.ts index 75c497cf1..58aeda64f 100644 --- a/shared/core/entities/index.ts +++ b/shared/core/entities/index.ts @@ -13,3 +13,4 @@ export * from './User'; export * from './UserOrder'; export * from './Warehouse'; export * from './WarehouseProduct'; +export * from './Address'; diff --git a/shared/core/interfaces/IGeoLocation.ts b/shared/core/interfaces/IGeoLocation.ts index 5b2a11020..77f36401d 100644 --- a/shared/core/interfaces/IGeoLocation.ts +++ b/shared/core/interfaces/IGeoLocation.ts @@ -1,5 +1,6 @@ import { DBCreateObject, DBRawObject, PyroObjectId } from '../@pyro/db'; import { Country } from '../entities/GeoLocation'; +import { Address } from 'cluster'; export interface ILocation { type: 'Point'; @@ -12,6 +13,7 @@ export interface IAddress { postcode?: string | null; streetAddress: string | null; house: string | null; + default: boolean; } export function getEmptyAddress(): IAddress { @@ -20,7 +22,8 @@ export function getEmptyAddress(): IAddress { city: '', postcode: '', streetAddress: '', - house: '' + house: '', + default: false }; } @@ -35,6 +38,7 @@ export interface IGeolocationUpdateObject { streetAddress?: string | null; house?: string | null; loc?: ILocation; + default?: boolean; } interface IGeoLocation extends DBRawObject, IGeoLocationCreateObject { diff --git a/shared/core/interfaces/IUser.ts b/shared/core/interfaces/IUser.ts index e819d53da..e7dfd8dc5 100644 --- a/shared/core/interfaces/IUser.ts +++ b/shared/core/interfaces/IUser.ts @@ -14,7 +14,7 @@ export interface IUserInitializeObject extends DBCreateObject { } export interface IUserCreateObject extends IUserInitializeObject { - geoLocation: IGeoLocationCreateObject; + geoLocation: Array; devicesIds?: string[]; apartment?: string; stripeCustomerId?: string; @@ -27,7 +27,7 @@ export interface IResponseGenerate1000Customers { interface IUser extends IUserCreateObject, IUserInitializeObject, DBRawObject { _id: PyroObjectId; - geoLocation: IGeoLocation; + geoLocation: Array; devicesIds: string[]; readonly fullAddress: string; } diff --git a/shared/core/interfaces/IUserOrder.ts b/shared/core/interfaces/IUserOrder.ts index 7312acaa1..893959e5c 100644 --- a/shared/core/interfaces/IUserOrder.ts +++ b/shared/core/interfaces/IUserOrder.ts @@ -12,7 +12,7 @@ export interface IUserOrderInitializeObject extends DBCreateObject { } export interface IUserOrderCreateObject extends IUserOrderInitializeObject { - geoLocation: IGeoLocationCreateObject; + geoLocation: Array; devicesIds?: string[]; apartment?: string; stripeCustomerId?: string; @@ -23,7 +23,7 @@ interface IUserOrder IUserOrderInitializeObject, DBRawObject { _id: PyroObjectId; - geoLocation: IGeoLocation; + geoLocation: Array; devicesIds: string[]; readonly fullAddress: string; } diff --git a/shop/mobile-ionic/src/app/components/menu/menu.component.html b/shop/mobile-ionic/src/app/components/menu/menu.component.html index 36e05b29f..e782ebae6 100644 --- a/shop/mobile-ionic/src/app/components/menu/menu.component.html +++ b/shop/mobile-ionic/src/app/components/menu/menu.component.html @@ -9,22 +9,25 @@ - + + + + {{'sidemenu.settings.location.title' | translate }} + + + + + + + + {{ 'SIDE_MENU.GROUPS.NO_TITLE.ITEMS.PRODUCTS' | translate }} - + {{ 'SIDE_MENU.GROUPS.NO_TITLE.ITEMS.ORDER_HISTORY' @@ -53,12 +56,10 @@ - {{ + {{ 'SIDE_MENU.GROUPS.STORE.ITEMS.ABOUT' | translate }} - {{ merchant.name }} + {{ merchant.name }} @@ -72,11 +73,7 @@ - + {{ 'SIDE_MENU.GROUPS.SETTINGS.ITEMS.LANGUAGE' @@ -93,11 +90,7 @@ - + {{ 'SIDE_MENU.GROUPS.INFO.ITEMS.FAQ' | translate @@ -110,11 +103,7 @@ | translate }} - + {{ 'SIDE_MENU.GROUPS.INFO.ITEMS.ABOUT_US' | translate @@ -131,21 +120,13 @@ - + {{ 'SIDE_MENU.GROUPS.LEGALS.ITEMS.PRIVACY' | translate }} - + {{ 'SIDE_MENU.GROUPS.LEGALS.ITEMS.TERMS_OF_USE' diff --git a/shop/mobile-ionic/src/app/pages/+products/+order/+order-info/order-info.page.ts b/shop/mobile-ionic/src/app/pages/+products/+order/+order-info/order-info.page.ts index 65a9e793d..1182e81d7 100644 --- a/shop/mobile-ionic/src/app/pages/+products/+order/+order-info/order-info.page.ts +++ b/shop/mobile-ionic/src/app/pages/+products/+order/+order-info/order-info.page.ts @@ -238,9 +238,9 @@ export class OrderInfoPage implements OnInit, OnDestroy { return result.replace( '%s', `${ - this.order - ? (this.order).totalPrice.toFixed(2) - : '00.00' + this.order + ? (this.order).totalPrice.toFixed(2) + : '00.00' }$` ); }; diff --git a/shop/mobile-ionic/src/app/pages/pages.module.ts b/shop/mobile-ionic/src/app/pages/pages.module.ts index 6f58f7de4..1e0112f9a 100644 --- a/shop/mobile-ionic/src/app/pages/pages.module.ts +++ b/shop/mobile-ionic/src/app/pages/pages.module.ts @@ -15,6 +15,11 @@ const routes: Routes = [ loadChildren: './+products/products.module#ProductsPageModule', canLoad: [ProductsModuleGuard] }, + { + path: 'user-addresses', + loadChildren: './user-locations/user-locations.module#UserLocationsPageModule', + canLoad: [ProductsModuleGuard] + }, { path: 'products/product-details/:id', loadChildren: @@ -83,4 +88,4 @@ const routes: Routes = [ ], exports: [RouterModule] }) -export class PagesModule {} +export class PagesModule { } diff --git a/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.module.ts b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.module.ts new file mode 100644 index 000000000..ed668aadf --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { Routes, RouterModule } from '@angular/router'; + +import { IonicModule } from '@ionic/angular'; + +import { CurrentAddressesPage } from './current-addresses.page'; + +const routes: Routes = [ + { + path: '', + component: CurrentAddressesPage + } +]; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + RouterModule.forChild(routes) + ], + declarations: [CurrentAddressesPage] +}) +export class CurrentAddressesPageModule {} diff --git a/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.css b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.css new file mode 100644 index 000000000..f4bfdf874 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.css @@ -0,0 +1,13 @@ +ion-button { + margin-left: 16px; +} + +div#checker { + display: flex; + justify-content: space-between; +} + +ion-card-content { + padding-top: 0px !important; + padding-bottom: 0px !important; +} diff --git a/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.html b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.html new file mode 100644 index 000000000..5b2914915 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.html @@ -0,0 +1,28 @@ + + + + + + Current Addresses + + + + +
+ + + Set a different location + +
+ + + + {{location.house}} + + + +
{{location.street}}, apartment {{location.apartment}}
+
+
+
+
diff --git a/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.spec.ts b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.spec.ts new file mode 100644 index 000000000..0d0437566 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.spec.ts @@ -0,0 +1,27 @@ +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CurrentAddressesPage } from './current-addresses.page'; + +describe('CurrentAddressesPage', () => { + let component: CurrentAddressesPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CurrentAddressesPage ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CurrentAddressesPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.ts b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.ts new file mode 100644 index 000000000..025f95cd3 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/current-addresses/current-addresses.page.ts @@ -0,0 +1,47 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'e-cu-current-addresses', + templateUrl: './current-addresses.page.html', + styleUrls: ['./current-addresses.page.css'], +}) +export class CurrentAddressesPage implements OnInit { + + public currentAddresses = [ + { + house: 'sarez aparments', + apartment: '12', + default: 'true', + street: 'seasons roads kasarani', + }, + { + house: 'giona', + apartment: '12 B', + default: 'false', + street: 'likoni road', + }, + { + house: 'blue house', + apartment: '12', + default: 'false', + street: '14 street msa', + }, + { + house: 'blue house', + apartment: '12', + default: 'false', + street: '14 street msa', + }, + { + house: 'blue house', + apartment: '12', + default: 'false', + street: '14 street msa', + } + ]; + constructor(private router: Router) { } + + ngOnInit() { + } +} diff --git a/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.module.ts b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.module.ts new file mode 100644 index 000000000..9180397f7 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { Routes, RouterModule } from '@angular/router'; +import { ReactiveFormsModule } from '@angular/forms'; +import { IonicModule } from '@ionic/angular'; +import { NewAddressPage } from './new-address.page'; +import { Geolocation } from '@ionic-native/geolocation/ngx'; + +const routes: Routes = [ + { + path: '', + component: NewAddressPage + } +]; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + RouterModule.forChild(routes), + ReactiveFormsModule + ], + declarations: [NewAddressPage], + providers: [Geolocation] +}) +export class NewAddressPageModule { } diff --git a/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.css b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.css new file mode 100644 index 000000000..4ff87fa11 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.css @@ -0,0 +1,23 @@ +ion-card { + position: absolute; + top: 0px; + background-color: #fff; +} + +ion-content { + height: 100%; +} + +ion-card-content { + height: 100%; +} + +ion-searchbar { + margin-bottom: 10px; + position: relative; +} + +div#map-container { + position: relative; + height: 100%; +} diff --git a/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.html b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.html new file mode 100644 index 000000000..4ef60e8cc --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.html @@ -0,0 +1,51 @@ + + + + + + Location Settings + + + + +
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + Save Address + +
+
+
+
diff --git a/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.spec.ts b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.spec.ts new file mode 100644 index 000000000..c3f97792a --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.spec.ts @@ -0,0 +1,27 @@ +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NewAddressPage } from './new-address.page'; + +describe('NewAddressPage', () => { + let component: NewAddressPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NewAddressPage ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NewAddressPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.ts b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.ts new file mode 100644 index 000000000..6719f0880 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/new-address/new-address.page.ts @@ -0,0 +1,105 @@ +import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; +import { Geolocation } from '@ionic-native/geolocation/ngx'; +declare var google: any; +import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; +import { IonSearchbar } from '@ionic/angular'; + +const MAP_ZOOM = 17; + +@Component({ + selector: 'e-cu-new-address', + templateUrl: './new-address.page.html', + styleUrls: ['./new-address.page.css'], +}) +export class NewAddressPage implements OnInit { + + @ViewChild('container', { static: false }) container: ElementRef; + @ViewChild(IonSearchbar, { static: false }) locationInput: IonSearchbar; + public latitude: number; + public longitude: number; + public map: google.maps.Map; + public addressForm: FormGroup; + public searchForm: FormGroup; + public service; + + constructor(private geolocation: Geolocation, private formBuilder: FormBuilder) { } + + ngOnInit() { + this.createAddressForm(); + this.createSearchForm(); + this.geolocation.getCurrentPosition().then(_res => { + this.latitude = _res.coords.latitude; + this.longitude = _res.coords.longitude; + this.loadMap(); + }); + } + + watchUserSearch() { + this.service = new google.maps.places.PlacesService(this.map); + this.searchForm.get('searchLocation').valueChanges.subscribe(value => { + this.service.findPlaceFromQuery({ + query: this.searchForm.get('searchLocation').value, + fields: ['name', 'geometry'] + }, (res, status) => { + this.map.setCenter(res[0].geometry.location); + }); + }); + } + + createSearchForm() { + this.searchForm = this.formBuilder.group({ + searchLocation: new FormControl() + }); + } + + createAddressForm() { + this.addressForm = this.formBuilder.group({ + locality: new FormControl('', [Validators.required]), + street_number: new FormControl('', [Validators.required]), + house: new FormControl('', [Validators.required]), + apartment: new FormControl('', [Validators.required]), + }); + } + + loadMap() { + const settings = this.configureMapSettings(); + this.map = new google.maps.Map(this.container.nativeElement, this.configureMapSettings()); + new google.maps.Marker({ position: settings.center, map: this.map }) + this.watchUserSearch(); + this.configureAutoComplete(); + } + + configureAutoComplete() { + this.locationInput.getInputElement().then(el => { + const options = { types: ['geocode'] }; + const autocomplete = new google.maps.places.Autocomplete(el, options); + autocomplete.setFields(['address_components', 'geometry', 'formatted_address']); + autocomplete.addListener('place_changed', () => { + const place = autocomplete.getPlace(); + if (!place.geometry) { return; } + this.map.setCenter(place.geometry.location); + this.map.setZoom(MAP_ZOOM) + if (place.formatted_address) { + this.searchForm.controls.searchLocation.setValue(place.formatted_address); + } + if (place.address_components) { + for (let i = 0; i < place.address_components.length; i++) { + const addressType = place.address_components[i].types[0]; + if (this.addressForm.controls[addressType]) { + this.addressForm.controls[addressType].setValue(place.address_components[i]['long_name']); + } + } + } + }); + }) + } + + configureMapSettings() { + return { + zoom: MAP_ZOOM, + center: { lat: this.latitude, lng: this.longitude }, + mapTypeControl: false, + streetViewControl: false + }; + } +} diff --git a/shop/mobile-ionic/src/app/pages/user-locations/user-locations.module.ts b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.module.ts new file mode 100644 index 000000000..ceef3163a --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Routes, RouterModule } from '@angular/router'; +import { IonicModule } from '@ionic/angular'; +import { UserLocationsPage } from './user-locations.page'; + +const routes: Routes = [ + { path: 'current', loadChildren: './pages/user-locations/current-addresses/current-addresses.module#CurrentAddressesPageModule' }, + { path: 'new', loadChildren: './pages/user-locations/new-address/new-address.module#NewAddressPageModule' }, + { path: '**', redirectTo: 'current', pathMatch: 'full' }, +]; + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild(routes), + ], + declarations: [UserLocationsPage], +}) +export class UserLocationsPageModule { } diff --git a/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.css b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.css @@ -0,0 +1 @@ + diff --git a/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.html b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.html new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.html @@ -0,0 +1 @@ + diff --git a/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.spec.ts b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.spec.ts new file mode 100644 index 000000000..c7fe8725e --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.spec.ts @@ -0,0 +1,27 @@ +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UserLocationsPage } from './user-locations.page'; + +describe('UserLocationsPage', () => { + let component: UserLocationsPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UserLocationsPage ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserLocationsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.ts b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.ts new file mode 100644 index 000000000..5e97a0ea4 --- /dev/null +++ b/shop/mobile-ionic/src/app/pages/user-locations/user-locations.page.ts @@ -0,0 +1,11 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'e-cu-user-locations', + templateUrl: './user-locations.page.html', + styleUrls: ['./user-locations.page.css'], +}) +export class UserLocationsPage implements OnInit { + + ngOnInit() { } +} diff --git a/shop/mobile-ionic/src/assets/i18n/bg-BG.json b/shop/mobile-ionic/src/assets/i18n/bg-BG.json index b4291021d..3d7863bc0 100644 --- a/shop/mobile-ionic/src/assets/i18n/bg-BG.json +++ b/shop/mobile-ionic/src/assets/i18n/bg-BG.json @@ -1,232 +1,232 @@ { - "LANGUAGE": { - "ID": "bg-BG", - "NAME": "Bulgarian" - }, - "CURRENT_DIRECTION": "ltr", - "SIDEBAR_SIDE": "left", - "INVITE_VIEW": { - "WELCOME_TO": "Добре дошли", - "EVER": "Евър", - "INFO_MISSING": "Част от информацията липсва!", - "YOUR_INVITE_CODE": "Вашият поканен код", - "INVITED_TEXT": { - "TITLE": "Благодарим Ви, че се регистрирате!", - "DETAILS": "Ще ви изпратим известие с код за покана, когато стартираме:" - }, - "NOT_INVITED_BY_CODE": { - "TITLE": "Грешен код!", - "DETAILS": "Моля, уверете се, че сте на мястото, където сте получили кода си." - }, - "CANT_ACCESS_LOCATION": "Няма достъп до местоположението ви.", - "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "Нямате достъп до местоположението си. Моля, опитайте да влезете по адрес.", - "GET_IN_BY_ADDRESS": "Регистрирайте се по адрес", - "GET_IN": "Влез вътре!", - "YOUR_ADDRESS": "Уведомете Вашия адрес", - "LAUNCH_NOTIFICATION": "Обещаваме да показваме само подходящи продукти според вашия адрес", - "BY_CODE": { - "OR_WHAT": "Регистрирайте се чрез покана", - "INVITED": "Влезте с Invite Code", - "LOGO": { - "DETAILS": "Доставка и вземане на храна" - }, - "INVITE_CODE": "Код за покана" - }, - "DETECTING_LOCATION": "Моля, изчакайте, опитваме се да открием настоящия си адрес ..." - }, - "PRODUCTS_VIEW": { - "TITLE": "Продукти", - "BUY_BUTTON": { - "PRE": "Купи за", - "SUF": "" - }, - "NOT_AVAILABLE": "Продуктът не е наличен", - "MINUTES": "мин", - "DELIVERY": "Доставка", - "TAKEAWAY": "За вкъщи", - "READYFOR": "Готов за", - "DETAILS": { - "DETAILS": "Детайли", - "BACK": "Обратно", - "INCLUDES": "Включва", - "BUY_FOR": "Купи за" - } - }, - "HELP_VIEW": { - "TITLE": "Помощ" - }, - "ORDER_HISTORY_VIEW": { - "TITLE": "История на поръчките", - "DETAILS": "Детайли" - }, - "LAST_PURCHASES_VIEW": { - "TITLE": "Последни покупки", - "NOTHING_ORDERED": "Все още няма поръчки", - "TO_PRODUCTS": "Към продукти" - }, - "ABOUT_VIEW": { - "TITLE": "За нас" - }, - "TERMS_OF_USE_VIEW": { - "TITLE": "Условия за ползване" - }, - "PRIVACY_VIEW": { - "TITLE": "Поверителност" - }, - "LANGUAGE_VIEW": { - "TITLE": "Избери език" - }, - "BUY_POPUP": { - "ORDER_PAID": "Поръчката е платена $", - "STATUSES": [ - { - "TITLE": "Подготвяме поръчката!", - "DETAILS": "Ще я получите между %t минути.", - "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." - }, - { - "TITLE": "Доставчика е в движение!", - "DETAILS": "Ще получите реда в %t min.", - "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." - }, - { - "TITLE": "Проверете си вратата!", - "DETAILS": "Ще получите реда в секунди.", - "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." - }, - { - "TITLE": "Поръчка завършена!", - "DETAILS": "Благодарим Ви, че използвате Ever", - "NOT_PAID_NOTE": "" - } - ], - "STATUSES_TAKEAWAY": { - "TITLE": "Подготвяме поръчката!", - "DETAILS": "Можете да го получите между %t минути.", - "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." - }, - "DELIVERY_STATUS": { - "WE": "Ние", - "CARRIER": "Доставчик", - "YOU": "Вие" - }, - "DELIVERY_WRONG": { - "DELIVERY_WRONG": "Доставката не беше правилно!", - "PROCESSING_WRONG": "Обработката не беше правилно!", - "TRY_AGAIN": "Моля, опитайте отново.", - "CALL_FOR_DETAILS": "Обадете се за подробности" - }, - "ELAPSED_TIME": { - "TITLE": "Изминалото време" - }, - "BUTTONS": { - "UNDO": "Отмяна", - "PAY_NOW": "Плащане с карта", - "PAY_X": "Платете {{ сума }}", - "PAY_WITH_FIXED_CARD": "Плати с", - "PAID": "Платено", - "END": "Добър апетит!", - "CANCEL": "Отказ", - "GOT_IT": "Схванах го", - "IM_HERE": "Тук съм", - "SHOW_QR_CODE": "Показване на QR код", - "SHOW_PRODUCTS": "Показване на продукти" - }, - "UNDO_POPUP": { - "TITLE": "Сигурни ли сте?", - "DETAILS": [ - "Отмяната ще Ви върне парите, но вие ще", - "загубите", - "поръчката!" - ] - } - }, - "SIDE_MENU": { - "TITLE": "Ever", - "GROUPS": { - "NO_TITLE": { - "DIVER_TITLE": "", - "ITEMS": { - "PRODUCTS": "Продукти", - "LAST_PURCHASES": "Последни покупки", - "CALL_US": "Обадете ни се", - "ORDER_HISTORY": "История на поръчките" - } - }, - "STORE": { - "STORE_TITLE": "Магазин", - "ITEMS": { - "CALL_WAITER": "Обадете се на сервитьор", - "ABOUT": "Относно" - } - }, - "SETTINGS": { - "DIVER_TITLE": "Настройки", - "ITEMS": { - "LANGUAGE": "Език" - } - }, - "INFO": { - "DIVER_TITLE": "Информация", - "ITEMS": { - "FAQ": "Помогне", - "ABOUT_US": "За нас", - "TERMS_OF_USE": "Условия за ползване", - "PRIVACY": "Поверителност" - } - }, - "LEGALS": { - "DIVER_TITLE": "Юридически", - "ITEMS": { - "TERMS_OF_USE": "Условия за ползване", - "PRIVACY": "Поверителност" - } - } - } - }, - "TIMER": { - "MINUTES": "Минути", - "SECONDS": "Секунди" - }, - "CONNECTION_ERROR_VIEW": { - "TITLE": "Няма връзка с Ever", - "DESCRIPTION": [ - "Моля, уверете се, че сте", - "свързани с интернет", - "или опитайте по-късно." - ] - }, - "MERCHANTS_VIEW": { - "CLOSE_TO_YOU": "Търговци близо до вас", - "NAME": "Име на търговеца", - "WITH_NAME": "Търговци с име" - }, - "NO_SERVER_VIEW": { - "NO_SERVER": "Няма връзка със сървъра" - }, - "OR": "Или", - "OR_LOWERCASE": "или", - "YES": "Да", - "NO": "Не", - "OK": "Добре", - "CITY": "Сити", - "STREET": "Улица", - "HOUSE": "Къща", - "APARTMENT": "Апартамент", - "BACK": "Обратно", - "MORE": "повече", - "TO": "До", - "STORE_INFO": "Информация за магазина", - "MAP": "Карта", - "ORDER_INFO": "Информация за поръчката", - "CLOSE": "Затворен", - "SCAN": "Търсене", - "MERCHANTS": "Купечество", - "NOT_FOUND": "Няма резултати!", - "IN_STORE": "В магазина", - "EXIT_STORE": "Излезте от магазина", - "FAILED": "Се провали", - "CANCELED": "Отменен", - "IN_DELIVERY": "При доставка", - "COMPLETED": "Завършен" + "LANGUAGE": { + "ID": "bg-BG", + "NAME": "Bulgarian" + }, + "CURRENT_DIRECTION": "ltr", + "SIDEBAR_SIDE": "left", + "INVITE_VIEW": { + "WELCOME_TO": "Добре дошли", + "EVER": "Евър", + "INFO_MISSING": "Част от информацията липсва!", + "YOUR_INVITE_CODE": "Вашият поканен код", + "INVITED_TEXT": { + "TITLE": "Благодарим Ви, че се регистрирате!", + "DETAILS": "Ще ви изпратим известие с код за покана, когато стартираме:" + }, + "NOT_INVITED_BY_CODE": { + "TITLE": "Грешен код!", + "DETAILS": "Моля, уверете се, че сте на мястото, където сте получили кода си." + }, + "CANT_ACCESS_LOCATION": "Няма достъп до местоположението ви.", + "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "Нямате достъп до местоположението си. Моля, опитайте да влезете по адрес.", + "GET_IN_BY_ADDRESS": "Регистрирайте се по адрес", + "GET_IN": "Влез вътре!", + "YOUR_ADDRESS": "Уведомете Вашия адрес", + "LAUNCH_NOTIFICATION": "Обещаваме да показваме само подходящи продукти според вашия адрес", + "BY_CODE": { + "OR_WHAT": "Регистрирайте се чрез покана", + "INVITED": "Влезте с Invite Code", + "LOGO": { + "DETAILS": "Доставка и вземане на храна" + }, + "INVITE_CODE": "Код за покана" + }, + "DETECTING_LOCATION": "Моля, изчакайте, опитваме се да открием настоящия си адрес ..." + }, + "PRODUCTS_VIEW": { + "TITLE": "Продукти", + "BUY_BUTTON": { + "PRE": "Купи за", + "SUF": "" + }, + "NOT_AVAILABLE": "Продуктът не е наличен", + "MINUTES": "мин", + "DELIVERY": "Доставка", + "TAKEAWAY": "За вкъщи", + "READYFOR": "Готов за", + "DETAILS": { + "DETAILS": "Детайли", + "BACK": "Обратно", + "INCLUDES": "Включва", + "BUY_FOR": "Купи за" + } + }, + "HELP_VIEW": { + "TITLE": "Помощ" + }, + "ORDER_HISTORY_VIEW": { + "TITLE": "История на поръчките", + "DETAILS": "Детайли" + }, + "LAST_PURCHASES_VIEW": { + "TITLE": "Последни покупки", + "NOTHING_ORDERED": "Все още няма поръчки", + "TO_PRODUCTS": "Към продукти" + }, + "ABOUT_VIEW": { + "TITLE": "За нас" + }, + "TERMS_OF_USE_VIEW": { + "TITLE": "Условия за ползване" + }, + "PRIVACY_VIEW": { + "TITLE": "Поверителност" + }, + "LANGUAGE_VIEW": { + "TITLE": "Избери език" + }, + "BUY_POPUP": { + "ORDER_PAID": "Поръчката е платена $", + "STATUSES": [{ + "TITLE": "Подготвяме поръчката!", + "DETAILS": "Ще я получите между %t минути.", + "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." + }, + { + "TITLE": "Доставчика е в движение!", + "DETAILS": "Ще получите реда в %t min.", + "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." + }, + { + "TITLE": "Проверете си вратата!", + "DETAILS": "Ще получите реда в секунди.", + "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." + }, + { + "TITLE": "Поръчка завършена!", + "DETAILS": "Благодарим Ви, че използвате Ever", + "NOT_PAID_NOTE": "" + } + ], + "STATUSES_TAKEAWAY": { + "TITLE": "Подготвяме поръчката!", + "DETAILS": "Можете да го получите между %t минути.", + "NOT_PAID_NOTE": "Подгответе портфейла си (%s в брой)." + }, + "DELIVERY_STATUS": { + "WE": "Ние", + "CARRIER": "Доставчик", + "YOU": "Вие" + }, + "DELIVERY_WRONG": { + "DELIVERY_WRONG": "Доставката не беше правилно!", + "PROCESSING_WRONG": "Обработката не беше правилно!", + "TRY_AGAIN": "Моля, опитайте отново.", + "CALL_FOR_DETAILS": "Обадете се за подробности" + }, + "ELAPSED_TIME": { + "TITLE": "Изминалото време" + }, + "BUTTONS": { + "UNDO": "Отмяна", + "PAY_NOW": "Плащане с карта", + "PAY_X": "Платете {{ сума }}", + "PAY_WITH_FIXED_CARD": "Плати с", + "PAID": "Платено", + "END": "Добър апетит!", + "CANCEL": "Отказ", + "GOT_IT": "Схванах го", + "IM_HERE": "Тук съм", + "SHOW_QR_CODE": "Показване на QR код", + "SHOW_PRODUCTS": "Показване на продукти" + }, + "UNDO_POPUP": { + "TITLE": "Сигурни ли сте?", + "DETAILS": [ + "Отмяната ще Ви върне парите, но вие ще", + "загубите", + "поръчката!" + ] + } + }, + "sidemenu.settings.location.title": "BG - Your Location", + "SIDE_MENU": { + "TITLE": "Ever", + "GROUPS": { + "NO_TITLE": { + "DIVER_TITLE": "", + "ITEMS": { + "PRODUCTS": "Продукти", + "LAST_PURCHASES": "Последни покупки", + "CALL_US": "Обадете ни се", + "ORDER_HISTORY": "История на поръчките" + } + }, + "STORE": { + "STORE_TITLE": "Магазин", + "ITEMS": { + "CALL_WAITER": "Обадете се на сервитьор", + "ABOUT": "Относно" + } + }, + "SETTINGS": { + "DIVER_TITLE": "Настройки", + "ITEMS": { + "LANGUAGE": "Език" + } + }, + "INFO": { + "DIVER_TITLE": "Информация", + "ITEMS": { + "FAQ": "Помогне", + "ABOUT_US": "За нас", + "TERMS_OF_USE": "Условия за ползване", + "PRIVACY": "Поверителност" + } + }, + "LEGALS": { + "DIVER_TITLE": "Юридически", + "ITEMS": { + "TERMS_OF_USE": "Условия за ползване", + "PRIVACY": "Поверителност" + } + } + } + }, + "TIMER": { + "MINUTES": "Минути", + "SECONDS": "Секунди" + }, + "CONNECTION_ERROR_VIEW": { + "TITLE": "Няма връзка с Ever", + "DESCRIPTION": [ + "Моля, уверете се, че сте", + "свързани с интернет", + "или опитайте по-късно." + ] + }, + "MERCHANTS_VIEW": { + "CLOSE_TO_YOU": "Търговци близо до вас", + "NAME": "Име на търговеца", + "WITH_NAME": "Търговци с име" + }, + "NO_SERVER_VIEW": { + "NO_SERVER": "Няма връзка със сървъра" + }, + "OR": "Или", + "OR_LOWERCASE": "или", + "YES": "Да", + "NO": "Не", + "OK": "Добре", + "CITY": "Сити", + "STREET": "Улица", + "HOUSE": "Къща", + "APARTMENT": "Апартамент", + "BACK": "Обратно", + "MORE": "повече", + "TO": "До", + "STORE_INFO": "Информация за магазина", + "MAP": "Карта", + "ORDER_INFO": "Информация за поръчката", + "CLOSE": "Затворен", + "SCAN": "Търсене", + "MERCHANTS": "Купечество", + "NOT_FOUND": "Няма резултати!", + "IN_STORE": "В магазина", + "EXIT_STORE": "Излезте от магазина", + "FAILED": "Се провали", + "CANCELED": "Отменен", + "IN_DELIVERY": "При доставка", + "COMPLETED": "Завършен" } diff --git a/shop/mobile-ionic/src/assets/i18n/en-US.json b/shop/mobile-ionic/src/assets/i18n/en-US.json index b57142579..913d70cf8 100644 --- a/shop/mobile-ionic/src/assets/i18n/en-US.json +++ b/shop/mobile-ionic/src/assets/i18n/en-US.json @@ -1,232 +1,232 @@ { - "LANGUAGE": { - "ID": "en-US", - "NAME": "English" - }, - "CURRENT_DIRECTION": "ltr", - "SIDEBAR_SIDE": "left", - "INVITE_VIEW": { - "WELCOME_TO": "Welcome to", - "EVER": "Ever", - "INFO_MISSING": "Some of the information missing!", - "YOUR_INVITE_CODE": "Your invite code", - "INVITED_TEXT": { - "TITLE": "Thank you for sign up!", - "DETAILS": "We will send you a notification with an invite code when we launch at:" - }, - "NOT_INVITED_BY_CODE": { - "TITLE": "Wrong code!", - "DETAILS": "Please make sure you at the place that came with your code." - }, - "CANT_ACCESS_LOCATION": "Can't access your location.", - "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "Can't access your location, please try to get in by address.", - "GET_IN_BY_ADDRESS": "Sign up by Address", - "GET_IN": "Get inside!", - "YOUR_ADDRESS": "Let us know your Address", - "LAUNCH_NOTIFICATION": "We promise to show only relevant products according to your address", - "BY_CODE": { - "OR_WHAT": "sign up by Invite", - "INVITED": "Sign in with Invite Code", - "LOGO": { - "DETAILS": "Food Delivery & Takeout" - }, - "INVITE_CODE": "Invite Code" - }, - "DETECTING_LOCATION": "Please wait, we attempting to detect your current address..." - }, - "PRODUCTS_VIEW": { - "TITLE": "Products", - "BUY_BUTTON": { - "PRE": "Buy for ", - "SUF": "" - }, - "NOT_AVAILABLE": "Product not available", - "MINUTES": "min", - "DELIVERY": "Delivery", - "TAKEAWAY": "Takeout", - "READYFOR": "Ready for", - "DETAILS": { - "DETAILS": "Details", - "BACK": "Back", - "INCLUDES": "Includes", - "BUY_FOR": "Buy for" - } - }, - "HELP_VIEW": { - "TITLE": "Help" - }, - "ORDER_HISTORY_VIEW": { - "TITLE": "Order history", - "DETAILS": "Details" - }, - "LAST_PURCHASES_VIEW": { - "TITLE": "Last Purchases", - "NOTHING_ORDERED": "No orders yet", - "TO_PRODUCTS": "To Products" - }, - "ABOUT_VIEW": { - "TITLE": "About Us" - }, - "TERMS_OF_USE_VIEW": { - "TITLE": "Terms of Use" - }, - "PRIVACY_VIEW": { - "TITLE": "Privacy" - }, - "LANGUAGE_VIEW": { - "TITLE": "Select Language" - }, - "BUY_POPUP": { - "ORDER_PAID": "The order is paid $", - "STATUSES": [ - { - "TITLE": "We're preparing the order!", - "DETAILS": "You will get it in %t minutes.", - "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." - }, - { - "TITLE": "Carrier on the way!", - "DETAILS": "You will get the order in %t min.", - "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." - }, - { - "TITLE": "Check your door!", - "DETAILS": "You will get the order in seconds.", - "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." - }, - { - "TITLE": "Order Completed!", - "DETAILS": "Thanks for using Ever", - "NOT_PAID_NOTE": "" - } - ], - "STATUSES_TAKEAWAY": { - "TITLE": "We're preparing the order!", - "DETAILS": "You can get it in %t minutes.", - "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." - }, - "DELIVERY_STATUS": { - "WE": "We", - "CARRIER": "Carrier", - "YOU": "You" - }, - "DELIVERY_WRONG": { - "DELIVERY_WRONG": "The Delivery Went Wrong!", - "PROCESSING_WRONG": "Processing Went Wrong!", - "TRY_AGAIN": "Please try again.", - "CALL_FOR_DETAILS": "Call for details" - }, - "ELAPSED_TIME": { - "TITLE": "Elapsed time" - }, - "BUTTONS": { - "UNDO": "Undo", - "PAY_NOW": "Pay with Card", - "PAY_X": "Pay {{amount}}", - "PAY_WITH_FIXED_CARD": "Pay with", - "PAID": "Paid", - "END": "Bon appetit!", - "CANCEL": "Cancel", - "GOT_IT": "Got It!", - "IM_HERE": "I'm here", - "SHOW_QR_CODE": "Show QR Code", - "SHOW_PRODUCTS": "Show Products" - }, - "UNDO_POPUP": { - "TITLE": "Are you sure?", - "DETAILS": [ - "Undo will return you the money, but you will", - "lose", - "the order!" - ] - } - }, - "SIDE_MENU": { - "TITLE": "Ever", - "GROUPS": { - "NO_TITLE": { - "DIVER_TITLE": "", - "ITEMS": { - "PRODUCTS": "Products", - "LAST_PURCHASES": "Last Purchases", - "CALL_US": "Call Us", - "ORDER_HISTORY": "Order history" - } - }, - "STORE": { - "STORE_TITLE": "Store", - "ITEMS": { - "CALL_WAITER": "Call Waiter", - "ABOUT": "About" - } - }, - "SETTINGS": { - "DIVER_TITLE": "Settings", - "ITEMS": { - "LANGUAGE": "Language" - } - }, - "INFO": { - "DIVER_TITLE": "Information", - "ITEMS": { - "FAQ": "Help", - "ABOUT_US": "About Us", - "TERMS_OF_USE": "Terms of Use", - "PRIVACY": "Privacy" - } - }, - "LEGALS": { - "DIVER_TITLE": "LEGALS", - "ITEMS": { - "TERMS_OF_USE": "Terms of Use", - "PRIVACY": "Privacy" - } - } - } - }, - "TIMER": { - "MINUTES": "Minutes", - "SECONDS": "Seconds" - }, - "CONNECTION_ERROR_VIEW": { - "TITLE": "No connection to Ever", - "DESCRIPTION": [ - "Please make sure you are", - "connected to the internet", - "or try Ever app later." - ] - }, - "MERCHANTS_VIEW": { - "CLOSE_TO_YOU": "MERCHANTS CLOSE TO YOU", - "NAME": "Merchant name", - "WITH_NAME": "Merchants with name" - }, - "NO_SERVER_VIEW": { - "NO_SERVER": "Server connection is lost" - }, - "OR": "Or", - "OR_LOWERCASE": "or", - "YES": "Yes", - "NO": "No", - "OK": "Ok", - "CITY": "City", - "STREET": "Street", - "HOUSE": "House", - "APARTMENT": "Apartment", - "BACK": "Back", - "MORE": "more", - "TO": "To", - "STORE_INFO": "Store Info", - "MAP": "Map", - "ORDER_INFO": "Order Info", - "CLOSE": "Close", - "SCAN": "Scan", - "MERCHANTS": "Merchants", - "NOT_FOUND": "Not Found!", - "IN_STORE": "In Store", - "EXIT_STORE": "Exit Store", - "FAILED": "Failed", - "CANCELED": "Canceled", - "IN_DELIVERY": "In Delivery", - "COMPLETED": "Completed" + "LANGUAGE": { + "ID": "en-US", + "NAME": "English" + }, + "CURRENT_DIRECTION": "ltr", + "SIDEBAR_SIDE": "left", + "INVITE_VIEW": { + "WELCOME_TO": "Welcome to", + "EVER": "Ever", + "INFO_MISSING": "Some of the information missing!", + "YOUR_INVITE_CODE": "Your invite code", + "INVITED_TEXT": { + "TITLE": "Thank you for sign up!", + "DETAILS": "We will send you a notification with an invite code when we launch at:" + }, + "NOT_INVITED_BY_CODE": { + "TITLE": "Wrong code!", + "DETAILS": "Please make sure you at the place that came with your code." + }, + "CANT_ACCESS_LOCATION": "Can't access your location.", + "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "Can't access your location, please try to get in by address.", + "GET_IN_BY_ADDRESS": "Sign up by Address", + "GET_IN": "Get inside!", + "YOUR_ADDRESS": "Let us know your Address", + "LAUNCH_NOTIFICATION": "We promise to show only relevant products according to your address", + "BY_CODE": { + "OR_WHAT": "sign up by Invite", + "INVITED": "Sign in with Invite Code", + "LOGO": { + "DETAILS": "Food Delivery & Takeout" + }, + "INVITE_CODE": "Invite Code" + }, + "DETECTING_LOCATION": "Please wait, we attempting to detect your current address..." + }, + "PRODUCTS_VIEW": { + "TITLE": "Products", + "BUY_BUTTON": { + "PRE": "Buy for ", + "SUF": "" + }, + "NOT_AVAILABLE": "Product not available", + "MINUTES": "min", + "DELIVERY": "Delivery", + "TAKEAWAY": "Takeout", + "READYFOR": "Ready for", + "DETAILS": { + "DETAILS": "Details", + "BACK": "Back", + "INCLUDES": "Includes", + "BUY_FOR": "Buy for" + } + }, + "HELP_VIEW": { + "TITLE": "Help" + }, + "ORDER_HISTORY_VIEW": { + "TITLE": "Order history", + "DETAILS": "Details" + }, + "LAST_PURCHASES_VIEW": { + "TITLE": "Last Purchases", + "NOTHING_ORDERED": "No orders yet", + "TO_PRODUCTS": "To Products" + }, + "ABOUT_VIEW": { + "TITLE": "About Us" + }, + "TERMS_OF_USE_VIEW": { + "TITLE": "Terms of Use" + }, + "PRIVACY_VIEW": { + "TITLE": "Privacy" + }, + "LANGUAGE_VIEW": { + "TITLE": "Select Language" + }, + "BUY_POPUP": { + "ORDER_PAID": "The order is paid $", + "STATUSES": [{ + "TITLE": "We're preparing the order!", + "DETAILS": "You will get it in %t minutes.", + "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." + }, + { + "TITLE": "Carrier on the way!", + "DETAILS": "You will get the order in %t min.", + "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." + }, + { + "TITLE": "Check your door!", + "DETAILS": "You will get the order in seconds.", + "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." + }, + { + "TITLE": "Order Completed!", + "DETAILS": "Thanks for using Ever", + "NOT_PAID_NOTE": "" + } + ], + "STATUSES_TAKEAWAY": { + "TITLE": "We're preparing the order!", + "DETAILS": "You can get it in %t minutes.", + "NOT_PAID_NOTE": "Prepare your wallet (%s in cash)." + }, + "DELIVERY_STATUS": { + "WE": "We", + "CARRIER": "Carrier", + "YOU": "You" + }, + "DELIVERY_WRONG": { + "DELIVERY_WRONG": "The Delivery Went Wrong!", + "PROCESSING_WRONG": "Processing Went Wrong!", + "TRY_AGAIN": "Please try again.", + "CALL_FOR_DETAILS": "Call for details" + }, + "ELAPSED_TIME": { + "TITLE": "Elapsed time" + }, + "BUTTONS": { + "UNDO": "Undo", + "PAY_NOW": "Pay with Card", + "PAY_X": "Pay {{amount}}", + "PAY_WITH_FIXED_CARD": "Pay with", + "PAID": "Paid", + "END": "Bon appetit!", + "CANCEL": "Cancel", + "GOT_IT": "Got It!", + "IM_HERE": "I'm here", + "SHOW_QR_CODE": "Show QR Code", + "SHOW_PRODUCTS": "Show Products" + }, + "UNDO_POPUP": { + "TITLE": "Are you sure?", + "DETAILS": [ + "Undo will return you the money, but you will", + "lose", + "the order!" + ] + } + }, + "sidemenu.settings.location.title": "Your Location", + "SIDE_MENU": { + "TITLE": "Ever", + "GROUPS": { + "NO_TITLE": { + "DIVER_TITLE": "", + "ITEMS": { + "PRODUCTS": "Products", + "LAST_PURCHASES": "Last Purchases", + "CALL_US": "Call Us", + "ORDER_HISTORY": "Order history" + } + }, + "STORE": { + "STORE_TITLE": "Store", + "ITEMS": { + "CALL_WAITER": "Call Waiter", + "ABOUT": "About" + } + }, + "SETTINGS": { + "DIVER_TITLE": "Settings", + "ITEMS": { + "LANGUAGE": "Language" + } + }, + "INFO": { + "DIVER_TITLE": "Information", + "ITEMS": { + "FAQ": "Help", + "ABOUT_US": "About Us", + "TERMS_OF_USE": "Terms of Use", + "PRIVACY": "Privacy" + } + }, + "LEGALS": { + "DIVER_TITLE": "LEGALS", + "ITEMS": { + "TERMS_OF_USE": "Terms of Use", + "PRIVACY": "Privacy" + } + } + } + }, + "TIMER": { + "MINUTES": "Minutes", + "SECONDS": "Seconds" + }, + "CONNECTION_ERROR_VIEW": { + "TITLE": "No connection to Ever", + "DESCRIPTION": [ + "Please make sure you are", + "connected to the internet", + "or try Ever app later." + ] + }, + "MERCHANTS_VIEW": { + "CLOSE_TO_YOU": "MERCHANTS CLOSE TO YOU", + "NAME": "Merchant name", + "WITH_NAME": "Merchants with name" + }, + "NO_SERVER_VIEW": { + "NO_SERVER": "Server connection is lost" + }, + "OR": "Or", + "OR_LOWERCASE": "or", + "YES": "Yes", + "NO": "No", + "OK": "Ok", + "CITY": "City", + "STREET": "Street", + "HOUSE": "House", + "APARTMENT": "Apartment", + "BACK": "Back", + "MORE": "more", + "TO": "To", + "STORE_INFO": "Store Info", + "MAP": "Map", + "ORDER_INFO": "Order Info", + "CLOSE": "Close", + "SCAN": "Scan", + "MERCHANTS": "Merchants", + "NOT_FOUND": "Not Found!", + "IN_STORE": "In Store", + "EXIT_STORE": "Exit Store", + "FAILED": "Failed", + "CANCELED": "Canceled", + "IN_DELIVERY": "In Delivery", + "COMPLETED": "Completed" } diff --git a/shop/mobile-ionic/src/assets/i18n/he-IL.json b/shop/mobile-ionic/src/assets/i18n/he-IL.json index 020f719bd..24366370b 100644 --- a/shop/mobile-ionic/src/assets/i18n/he-IL.json +++ b/shop/mobile-ionic/src/assets/i18n/he-IL.json @@ -1,232 +1,232 @@ { - "LANGUAGE": { - "ID": "he-IL", - "NAME": "עברית" - }, - "CURRENT_DIRECTION": "rtl", - "SIDEBAR_SIDE": "right", - "INVITE_VIEW": { - "WELCOME_TO": "ברוך הבא ל-", - "EVER": "Ever", - "INFO_MISSING": "אנא מלא את המידע החסר.", - "YOUR_INVITE_CODE": "קוד ההזמנה שלך", - "INVITED_TEXT": { - "TITLE": "תודה על ההרשמה!", - "DETAILS": "אנחנו נשלח לך הודעה ברגע שנתחיל לפעול בכתובת שלך:" - }, - "NOT_INVITED_BY_CODE": { - "TITLE": "קוד שגוי!", - "DETAILS": "תוודא בבקשה שאתה במקום שמצורף לקוד שלך!" - }, - "CANT_ACCESS_LOCATION": "אין גישה למיקום שלך.", - "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "אין גישה למיקום שלך, אנא נסה להיכנס באמצעות הכתובת.", - "GET_IN_BY_ADDRESS": "הירשם עם כתובת", - "GET_IN": "כנס", - "YOUR_ADDRESS": "מה הכתובת שלך?", - "LAUNCH_NOTIFICATION": "אנחנו מבטיחים להראות רק מוצרים רלוונטיים בהתאם לכתובת שהוכנסה", - "BY_CODE": { - "OR_WHAT": "הירשם באמצעות הזמנה", - "INVITED": "היכנס עם הזמנה לאפליקציה", - "LOGO": { - "DETAILS": "משלוחי אוכל וטייק אווי" - }, - "INVITE_CODE": "קוד הזמנה" - }, - "DETECTING_LOCATION": "רק רגע... אנחנו מנסים לזהות את הכתובת שלך." - }, - "PRODUCTS_VIEW": { - "TITLE": "המוצרים שלנו", - "BUY_BUTTON": { - "PRE": "", - "SUF": "-קנה ב" - }, - "NOT_AVAILABLE": "המוצר אינו זמין", - "MINUTES": "דקות", - "DELIVERY": "משלוח", - "TAKEAWAY": "Takeaway", - "READYFOR": "מוכן ל-", - "DETAILS": { - "DETAILS": "פרטים", - "BACK": "חזרה", - "INCLUDES": "כולל", - "BUY_FOR": "קנה עבור" - } - }, - "HELP_VIEW": { - "TITLE": "עֶזרָה" - }, - "ORDER_HISTORY_VIEW": { - "TITLE": "היסטוריית הזמנות", - "DETAILS": "פרטים" - }, - "LAST_PURCHASES_VIEW": { - "TITLE": "רכישות אחרונות", - "NOTHING_ORDERED": "עדיין לא הזמנת שום דבר", - "TO_PRODUCTS": "למוצרים" - }, - "ABOUT_VIEW": { - "TITLE": "עלינו" - }, - "TERMS_OF_USE_VIEW": { - "TITLE": "תנאי שימוש" - }, - "PRIVACY_VIEW": { - "TITLE": "פרטיות" - }, - "LANGUAGE_VIEW": { - "TITLE": "בחירת שפה" - }, - "BUY_POPUP": { - "ORDER_PAID": "ההזמנה משולמת $", - "STATUSES": [ - { - "TITLE": "אנחנו מכינים את ההזמנה!", - "DETAILS": "ההזמנה תהיה בידך בעוד %t דקות.", - "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." - }, - { - "TITLE": "השליח בדרך!", - "DETAILS": "ההזמנה תהיה בידך בעוד %t דקות.", - "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." - }, - { - "TITLE": "בדוק את הדלת שלך!", - "DETAILS": "ההזמנה תהיה בידך בעוד רגע.", - "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." - }, - { - "TITLE": "ההזמנה הושלמה!", - "DETAILS": "תודה על השימוש ב-Ever", - "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." - } - ], - "STATUSES_TAKEAWAY": { - "TITLE": "אנחנו מכינים את ההזמנה!", - "DETAILS": "אתה יכול להכניס אותו %t דקות.", - "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." - }, - "DELIVERY_STATUS": { - "WE": "אנחנו", - "CARRIER": "השליח", - "YOU": "אתה" - }, - "DELIVERY_WRONG": { - "DELIVERY_WRONG": "המסירה השתבשה!", - "PROCESSING_WRONG": "עיבוד התבצעה טעות!", - "TRY_AGAIN": "בבקשה נסה שוב.", - "CALL_FOR_DETAILS": "התקשר לקבלת פרטים" - }, - "ELAPSED_TIME": { - "TITLE": "הזמן שחלף" - }, - "BUTTONS": { - "UNDO": "ביטול", - "PAY_NOW": "תשלום באשראי", - "PAY_WITH_FIXED_CARD": "שלם בעזרת", - "PAY_X": "לשלם {{amount}}", - "PAID": "שולם באשראי", - "END": "בתאבון!", - "CANCEL": "בטל", - "GOT_IT": "הבנתי", - "IM_HERE": "אני כאן", - "SHOW_QR_CODE": "הצג קוד QR", - "SHOW_PRODUCTS": "הצג מוצרים" - }, - "UNDO_POPUP": { - "TITLE": "אתה בטוח?", - "DETAILS": [ - "החזרת הכסף אולי תחזיר לך את כספך, אבל תנפץ את", - "ההזמנה שלך!", - "" - ] - } - }, - "SIDE_MENU": { - "TITLE": "Ever", - "GROUPS": { - "NO_TITLE": { - "DIVER_TITLE": "", - "ITEMS": { - "PRODUCTS": "מוצרים", - "LAST_PURCHASES": "רכישות אחרונות", - "CALL_US": "התקשר אלינו", - "ORDER_HISTORY": "היסטוריית הזמנות" - } - }, - "STORE": { - "STORE_TITLE": "חנות", - "ITEMS": { - "CALL_WAITER": "התקשר למלצר", - "ABOUT": "על אודות" - } - }, - "SETTINGS": { - "DIVER_TITLE": "הגדרות", - "ITEMS": { - "LANGUAGE": "(Language) שפה" - } - }, - "INFO": { - "DIVER_TITLE": "מידע", - "ITEMS": { - "FAQ": "עזרה", - "ABOUT_US": "עלינו", - "TERMS_OF_USE": "תנאי שימוש", - "PRIVACY": "פרטיות" - } - }, - "LEGALS": { - "DIVER_TITLE": "אלמוגים", - "ITEMS": { - "TERMS_OF_USE": "תנאי שימוש", - "PRIVACY": "פרטיות" - } - } - } - }, - "TIMER": { - "MINUTES": "דקות", - "SECONDS": "שניות" - }, - "CONNECTION_ERROR_VIEW": { - "TITLE": "אין חיבור ל-Ever", - "DESCRIPTION": [ - "בבקשה תוודא שאתה", - "מחובר לאינטרנט או תנסה", - "את האפליקציה מאוחר יותר." - ] - }, - "MERCHANTS_VIEW": { - "CLOSE_TO_YOU": "סוחרים קרובים אליך", - "NAME": "שם סוחר", - "WITH_NAME": "סוחרים עם שם" - }, - "NO_SERVER_VIEW": { - "NO_SERVER": "השרת נפל" - }, - "OR": "או", - "OR_LOWERCASE": "או", - "YES": "כן", - "NO": "לא", - "OK": "אוקי", - "CITY": "עיר", - "STREET": "רחוב", - "HOUSE": "בית", - "APARTMENT": "דירה", - "BACK": "לחזור", - "MORE": "יותר", - "TO": "ל", - "STORE_INFO": "מידע חנות", - "MAP": "מפה", - "ORDER_INFO": "פרטי הזמנה", - "CLOSE": "סגור", - "SCAN": "סרוק", - "MERCHANTS": "סוחרים", - "NOT_FOUND": "אין תוצאות!", - "IN_STORE": "בחנות", - "EXIT_STORE": "צא מהחנות", - "FAILED": "נכשל", - "CANCELED": "מבוטל", - "IN_DELIVERY": "במשלוח", - "COMPLETED": "הושלם" + "LANGUAGE": { + "ID": "he-IL", + "NAME": "עברית" + }, + "CURRENT_DIRECTION": "rtl", + "SIDEBAR_SIDE": "right", + "INVITE_VIEW": { + "WELCOME_TO": "ברוך הבא ל-", + "EVER": "Ever", + "INFO_MISSING": "אנא מלא את המידע החסר.", + "YOUR_INVITE_CODE": "קוד ההזמנה שלך", + "INVITED_TEXT": { + "TITLE": "תודה על ההרשמה!", + "DETAILS": "אנחנו נשלח לך הודעה ברגע שנתחיל לפעול בכתובת שלך:" + }, + "NOT_INVITED_BY_CODE": { + "TITLE": "קוד שגוי!", + "DETAILS": "תוודא בבקשה שאתה במקום שמצורף לקוד שלך!" + }, + "CANT_ACCESS_LOCATION": "אין גישה למיקום שלך.", + "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "אין גישה למיקום שלך, אנא נסה להיכנס באמצעות הכתובת.", + "GET_IN_BY_ADDRESS": "הירשם עם כתובת", + "GET_IN": "כנס", + "YOUR_ADDRESS": "מה הכתובת שלך?", + "LAUNCH_NOTIFICATION": "אנחנו מבטיחים להראות רק מוצרים רלוונטיים בהתאם לכתובת שהוכנסה", + "BY_CODE": { + "OR_WHAT": "הירשם באמצעות הזמנה", + "INVITED": "היכנס עם הזמנה לאפליקציה", + "LOGO": { + "DETAILS": "משלוחי אוכל וטייק אווי" + }, + "INVITE_CODE": "קוד הזמנה" + }, + "DETECTING_LOCATION": "רק רגע... אנחנו מנסים לזהות את הכתובת שלך." + }, + "PRODUCTS_VIEW": { + "TITLE": "המוצרים שלנו", + "BUY_BUTTON": { + "PRE": "", + "SUF": "-קנה ב" + }, + "NOT_AVAILABLE": "המוצר אינו זמין", + "MINUTES": "דקות", + "DELIVERY": "משלוח", + "TAKEAWAY": "Takeaway", + "READYFOR": "מוכן ל-", + "DETAILS": { + "DETAILS": "פרטים", + "BACK": "חזרה", + "INCLUDES": "כולל", + "BUY_FOR": "קנה עבור" + } + }, + "HELP_VIEW": { + "TITLE": "עֶזרָה" + }, + "ORDER_HISTORY_VIEW": { + "TITLE": "היסטוריית הזמנות", + "DETAILS": "פרטים" + }, + "LAST_PURCHASES_VIEW": { + "TITLE": "רכישות אחרונות", + "NOTHING_ORDERED": "עדיין לא הזמנת שום דבר", + "TO_PRODUCTS": "למוצרים" + }, + "ABOUT_VIEW": { + "TITLE": "עלינו" + }, + "TERMS_OF_USE_VIEW": { + "TITLE": "תנאי שימוש" + }, + "PRIVACY_VIEW": { + "TITLE": "פרטיות" + }, + "LANGUAGE_VIEW": { + "TITLE": "בחירת שפה" + }, + "BUY_POPUP": { + "ORDER_PAID": "ההזמנה משולמת $", + "STATUSES": [{ + "TITLE": "אנחנו מכינים את ההזמנה!", + "DETAILS": "ההזמנה תהיה בידך בעוד %t דקות.", + "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." + }, + { + "TITLE": "השליח בדרך!", + "DETAILS": "ההזמנה תהיה בידך בעוד %t דקות.", + "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." + }, + { + "TITLE": "בדוק את הדלת שלך!", + "DETAILS": "ההזמנה תהיה בידך בעוד רגע.", + "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." + }, + { + "TITLE": "ההזמנה הושלמה!", + "DETAILS": "תודה על השימוש ב-Ever", + "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." + } + ], + "STATUSES_TAKEAWAY": { + "TITLE": "אנחנו מכינים את ההזמנה!", + "DETAILS": "אתה יכול להכניס אותו %t דקות.", + "NOT_PAID_NOTE": "תכין/י את הארנק (%s במזומן)." + }, + "DELIVERY_STATUS": { + "WE": "אנחנו", + "CARRIER": "השליח", + "YOU": "אתה" + }, + "DELIVERY_WRONG": { + "DELIVERY_WRONG": "המסירה השתבשה!", + "PROCESSING_WRONG": "עיבוד התבצעה טעות!", + "TRY_AGAIN": "בבקשה נסה שוב.", + "CALL_FOR_DETAILS": "התקשר לקבלת פרטים" + }, + "ELAPSED_TIME": { + "TITLE": "הזמן שחלף" + }, + "BUTTONS": { + "UNDO": "ביטול", + "PAY_NOW": "תשלום באשראי", + "PAY_WITH_FIXED_CARD": "שלם בעזרת", + "PAY_X": "לשלם {{amount}}", + "PAID": "שולם באשראי", + "END": "בתאבון!", + "CANCEL": "בטל", + "GOT_IT": "הבנתי", + "IM_HERE": "אני כאן", + "SHOW_QR_CODE": "הצג קוד QR", + "SHOW_PRODUCTS": "הצג מוצרים" + }, + "UNDO_POPUP": { + "TITLE": "אתה בטוח?", + "DETAILS": [ + "החזרת הכסף אולי תחזיר לך את כספך, אבל תנפץ את", + "ההזמנה שלך!", + "" + ] + } + }, + "sidemenu.settings.location.title": "HE - Your Location", + "SIDE_MENU": { + "TITLE": "Ever", + "GROUPS": { + "NO_TITLE": { + "DIVER_TITLE": "", + "ITEMS": { + "PRODUCTS": "מוצרים", + "LAST_PURCHASES": "רכישות אחרונות", + "CALL_US": "התקשר אלינו", + "ORDER_HISTORY": "היסטוריית הזמנות" + } + }, + "STORE": { + "STORE_TITLE": "חנות", + "ITEMS": { + "CALL_WAITER": "התקשר למלצר", + "ABOUT": "על אודות" + } + }, + "SETTINGS": { + "DIVER_TITLE": "הגדרות", + "ITEMS": { + "LANGUAGE": "(Language) שפה" + } + }, + "INFO": { + "DIVER_TITLE": "מידע", + "ITEMS": { + "FAQ": "עזרה", + "ABOUT_US": "עלינו", + "TERMS_OF_USE": "תנאי שימוש", + "PRIVACY": "פרטיות" + } + }, + "LEGALS": { + "DIVER_TITLE": "אלמוגים", + "ITEMS": { + "TERMS_OF_USE": "תנאי שימוש", + "PRIVACY": "פרטיות" + } + } + } + }, + "TIMER": { + "MINUTES": "דקות", + "SECONDS": "שניות" + }, + "CONNECTION_ERROR_VIEW": { + "TITLE": "אין חיבור ל-Ever", + "DESCRIPTION": [ + "בבקשה תוודא שאתה", + "מחובר לאינטרנט או תנסה", + "את האפליקציה מאוחר יותר." + ] + }, + "MERCHANTS_VIEW": { + "CLOSE_TO_YOU": "סוחרים קרובים אליך", + "NAME": "שם סוחר", + "WITH_NAME": "סוחרים עם שם" + }, + "NO_SERVER_VIEW": { + "NO_SERVER": "השרת נפל" + }, + "OR": "או", + "OR_LOWERCASE": "או", + "YES": "כן", + "NO": "לא", + "OK": "אוקי", + "CITY": "עיר", + "STREET": "רחוב", + "HOUSE": "בית", + "APARTMENT": "דירה", + "BACK": "לחזור", + "MORE": "יותר", + "TO": "ל", + "STORE_INFO": "מידע חנות", + "MAP": "מפה", + "ORDER_INFO": "פרטי הזמנה", + "CLOSE": "סגור", + "SCAN": "סרוק", + "MERCHANTS": "סוחרים", + "NOT_FOUND": "אין תוצאות!", + "IN_STORE": "בחנות", + "EXIT_STORE": "צא מהחנות", + "FAILED": "נכשל", + "CANCELED": "מבוטל", + "IN_DELIVERY": "במשלוח", + "COMPLETED": "הושלם" } diff --git a/shop/mobile-ionic/src/assets/i18n/ru-RU.json b/shop/mobile-ionic/src/assets/i18n/ru-RU.json index 22b49a6bc..2851735dc 100644 --- a/shop/mobile-ionic/src/assets/i18n/ru-RU.json +++ b/shop/mobile-ionic/src/assets/i18n/ru-RU.json @@ -1,231 +1,231 @@ { - "LANGUAGE": { - "ID": "ru-RU", - "NAME": "Русский" - }, - "CURRENT_DIRECTION": "ltr", - "SIDEBAR_SIDE": "left", - "INVITE_VIEW": { - "WELCOME_TO": "Добро Пожаловать в", - "EVER": "Ever", - "INFO_MISSING": "Некоторая информация отсутствует!", - "YOUR_INVITE_CODE": "Ваш код приглашения", - "INVITED_TEXT": { - "TITLE": "Спасибо за запрос на приглашение!", - "DETAILS": "Мы вышлем Вам уведомление когда мы будем обслуживать Ваш адрес:" - }, - "NOT_INVITED_BY_CODE": { - "TITLE": "Неверный код!", - "DETAILS": "Пожулуйста убедитесь что Вы находитесь по адресу, который был использован для получения Вашего Кода приглашения в наш сервис." - }, - "CANT_ACCESS_LOCATION": "Не возможно получить Ваше местонахождение. Попробуйте зарегистрироваться используя Ваш адрес.", - "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "Не возможно получить Ваше местонахождение.", - "GET_IN_BY_ADDRESS": "Зарегистрироваться", - "GET_IN": "Зарегистрироваться", - "YOUR_ADDRESS": "Пожалуйста введите Адрес", - "LAUNCH_NOTIFICATION": "Мы обещаем предлагать Вам только продукты, доступные по указанному адресу", - "BY_CODE": { - "OR_WHAT": "войти по приглашению", - "INVITED": "Войти по приглашению", - "LOGO": { - "DETAILS": "Доставка Еды & Takeaway" - }, - "INVITE_CODE": "Код приглашения" - }, - "DETECTING_LOCATION": "Пожалуйста подождите, мы пытаемся определить Ваш текущий адрес..." - }, - "PRODUCTS_VIEW": { - "TITLE": "Наши Продукты", - "BUY_BUTTON": { - "PRE": "Купить за ", - "SUF": "" - }, - "NOT_AVAILABLE": "Товар недоступен", - "MINUTES": "мин", - "DELIVERY": "Доставка", - "TAKEAWAY": "Takeaway", - "READYFOR": "Готово для", - "DETAILS": { - "DETAILS": "Детали", - "BACK": "Назад", - "INCLUDES": "Включает", - "BUY_FOR": "Купить для" - } - }, - "HELP_VIEW": { - "TITLE": "Помогите" - }, - "ORDER_HISTORY_VIEW": { - "TITLE": "История заказов", - "DETAILS": "Детали" - }, - "LAST_PURCHASES_VIEW": { - "TITLE": "Недавние Покупки", - "NOTHING_ORDERED": "Вы еще ничего не заказывали", - "TO_PRODUCTS": "К Продуктам" - }, - "ABOUT_VIEW": { - "TITLE": "О Нас" - }, - "TERMS_OF_USE_VIEW": { - "TITLE": "Правила Использования" - }, - "PRIVACY_VIEW": { - "TITLE": "Конфиденциальность" - }, - "LANGUAGE_VIEW": { - "TITLE": "Выбор Языка" - }, - "BUY_POPUP": { - "ORDER_PAID": "Заказ оплачен $", - "STATUSES": [ - { - "TITLE": "Мы готовим Ваш заказ!", - "DETAILS": "Вы должны получить его в течении %t минут.", - "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." - }, - { - "TITLE": "Курьер по дороге к Вам!", - "DETAILS": "Вы должны получить заказ в течении %t минут.", - "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." - }, - { - "TITLE": "Курьер уже практически у Вас!", - "DETAILS": "Вы получите заказ через несколько секунд.", - "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." - }, - { - "TITLE": "Заказ доставлен!", - "DETAILS": "Спасибо за использование Ever" - } - ], - "STATUSES_TAKEAWAY": { - "TITLE": "Мы готовим Ваш заказ!", - "DETAILS": "Вы можете получить это в течении %t минут.", - "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." - }, - "DELIVERY_STATUS": { - "WE": "Мы", - "CARRIER": "Курьер", - "YOU": "Вы" - }, - "DELIVERY_WRONG": { - "DELIVERY_WRONG": "Доставка прошла неправильно!", - "PROCESSING_WRONG": "Произошла ошибка!", - "TRY_AGAIN": "Пожалуйста, попробуйте еще раз.", - "CALL_FOR_DETAILS": "Призыв к деталям" - }, - "ELAPSED_TIME": { - "TITLE": "Пройденное время" - }, - "BUTTONS": { - "UNDO": "Отменить", - "PAY_NOW": "Оплатить Кредиткой", - "PAY_X": "Оплатить {{amount}}", - "PAY_WITH_FIXED_CARD": "Оплатить с", - "PAID": "Оплачено", - "END": "Наслаждайтесь покупкой!", - "CANCEL": "Отменить", - "GOT_IT": "Понял", - "IM_HERE": "Я здесь", - "SHOW_QR_CODE": "Показать QR-код", - "SHOW_PRODUCTS": "Показать продукты" - }, - "UNDO_POPUP": { - "TITLE": "Вы уверены?", - "DETAILS": [ - "Отмена приведёт в возврату уплаченной суммы, но Вы", - "не получите", - "заказ!" - ] - } - }, - "SIDE_MENU": { - "TITLE": "ever.co", - "GROUPS": { - "NO_TITLE": { - "DIVER_TITLE": "", - "ITEMS": { - "PRODUCTS": "Продукты", - "LAST_PURCHASES": "Недавние Покупки", - "CALL_US": "Позвонить Клиенту", - "ORDER_HISTORY": "История заказов" - } - }, - "STORE": { - "STORE_TITLE": "Хранить", - "ITEMS": { - "CALL_WAITER": "Вызов официанта", - "ABOUT": "Около" - } - }, - "SETTINGS": { - "DIVER_TITLE": "Настройки", - "ITEMS": { - "LANGUAGE": "Язык" - } - }, - "INFO": { - "DIVER_TITLE": "Информация", - "ITEMS": { - "FAQ": "Помощь", - "ABOUT_US": "О Нас", - "TERMS_OF_USE": "Правила Использования", - "PRIVACY": "Конфиденциальность" - } - }, - "LEGALS": { - "DIVER_TITLE": "Юридические дела", - "ITEMS": { - "TERMS_OF_USE": "Правила Использования", - "PRIVACY": "Конфиденциальность" - } - } - } - }, - "TIMER": { - "MINUTES": "Минут", - "SECONDS": "Секунд" - }, - "CONNECTION_ERROR_VIEW": { - "TITLE": "Не удалось подключиться к Ever", - "DESCRIPTION": [ - "Проверьте подключение к", - "Интернету и повторите попытку.", - "" - ] - }, - "MERCHANTS_VIEW": { - "CLOSE_TO_YOU": "Торговцы рядом с вами", - "NAME": "Имя продавца", - "WITH_NAME": "Торговцы с именем" - }, - "NO_SERVER_VIEW": { - "NO_SERVER": "Сервер упал" - }, - "OR": "Или", - "OR_LOWERCASE": "или", - "YES": "Да", - "NO": "Нет", - "OK": "Ok", - "CITY": "Город", - "STREET": "Улица", - "HOUSE": "Дом", - "APARTMENT": "Квартира", - "BACK": "Назад", - "MORE": "Больше", - "TO": "До", - "STORE_INFO": "Информация о магазине", - "MAP": "Карта", - "ORDER_INFO": "Информация о заказе", - "CLOSE": "заканчиваться", - "SCAN": "Поиск", - "MERCHANTS": "Купечество", - "NOT_FOUND": "Нет результатов!", - "IN_STORE": "В магазине", - "EXIT_STORE": "Выход из магазина", - "FAILED": "Не удалось", - "CANCELED": "Отменен", - "IN_DELIVERY": "В доставке", - "COMPLETED": "Завершенный" + "LANGUAGE": { + "ID": "ru-RU", + "NAME": "Русский" + }, + "CURRENT_DIRECTION": "ltr", + "SIDEBAR_SIDE": "left", + "INVITE_VIEW": { + "WELCOME_TO": "Добро Пожаловать в", + "EVER": "Ever", + "INFO_MISSING": "Некоторая информация отсутствует!", + "YOUR_INVITE_CODE": "Ваш код приглашения", + "INVITED_TEXT": { + "TITLE": "Спасибо за запрос на приглашение!", + "DETAILS": "Мы вышлем Вам уведомление когда мы будем обслуживать Ваш адрес:" + }, + "NOT_INVITED_BY_CODE": { + "TITLE": "Неверный код!", + "DETAILS": "Пожулуйста убедитесь что Вы находитесь по адресу, который был использован для получения Вашего Кода приглашения в наш сервис." + }, + "CANT_ACCESS_LOCATION": "Не возможно получить Ваше местонахождение. Попробуйте зарегистрироваться используя Ваш адрес.", + "CANT_ACCESS_LOCATION_GET_IN_BY_ADDRESS": "Не возможно получить Ваше местонахождение.", + "GET_IN_BY_ADDRESS": "Зарегистрироваться", + "GET_IN": "Зарегистрироваться", + "YOUR_ADDRESS": "Пожалуйста введите Адрес", + "LAUNCH_NOTIFICATION": "Мы обещаем предлагать Вам только продукты, доступные по указанному адресу", + "BY_CODE": { + "OR_WHAT": "войти по приглашению", + "INVITED": "Войти по приглашению", + "LOGO": { + "DETAILS": "Доставка Еды & Takeaway" + }, + "INVITE_CODE": "Код приглашения" + }, + "DETECTING_LOCATION": "Пожалуйста подождите, мы пытаемся определить Ваш текущий адрес..." + }, + "PRODUCTS_VIEW": { + "TITLE": "Наши Продукты", + "BUY_BUTTON": { + "PRE": "Купить за ", + "SUF": "" + }, + "NOT_AVAILABLE": "Товар недоступен", + "MINUTES": "мин", + "DELIVERY": "Доставка", + "TAKEAWAY": "Takeaway", + "READYFOR": "Готово для", + "DETAILS": { + "DETAILS": "Детали", + "BACK": "Назад", + "INCLUDES": "Включает", + "BUY_FOR": "Купить для" + } + }, + "HELP_VIEW": { + "TITLE": "Помогите" + }, + "ORDER_HISTORY_VIEW": { + "TITLE": "История заказов", + "DETAILS": "Детали" + }, + "LAST_PURCHASES_VIEW": { + "TITLE": "Недавние Покупки", + "NOTHING_ORDERED": "Вы еще ничего не заказывали", + "TO_PRODUCTS": "К Продуктам" + }, + "ABOUT_VIEW": { + "TITLE": "О Нас" + }, + "TERMS_OF_USE_VIEW": { + "TITLE": "Правила Использования" + }, + "PRIVACY_VIEW": { + "TITLE": "Конфиденциальность" + }, + "LANGUAGE_VIEW": { + "TITLE": "Выбор Языка" + }, + "BUY_POPUP": { + "ORDER_PAID": "Заказ оплачен $", + "STATUSES": [{ + "TITLE": "Мы готовим Ваш заказ!", + "DETAILS": "Вы должны получить его в течении %t минут.", + "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." + }, + { + "TITLE": "Курьер по дороге к Вам!", + "DETAILS": "Вы должны получить заказ в течении %t минут.", + "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." + }, + { + "TITLE": "Курьер уже практически у Вас!", + "DETAILS": "Вы получите заказ через несколько секунд.", + "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." + }, + { + "TITLE": "Заказ доставлен!", + "DETAILS": "Спасибо за использование Ever" + } + ], + "STATUSES_TAKEAWAY": { + "TITLE": "Мы готовим Ваш заказ!", + "DETAILS": "Вы можете получить это в течении %t минут.", + "NOT_PAID_NOTE": "Вам будет необходимо оплатить %s (наличными курьеру)." + }, + "DELIVERY_STATUS": { + "WE": "Мы", + "CARRIER": "Курьер", + "YOU": "Вы" + }, + "DELIVERY_WRONG": { + "DELIVERY_WRONG": "Доставка прошла неправильно!", + "PROCESSING_WRONG": "Произошла ошибка!", + "TRY_AGAIN": "Пожалуйста, попробуйте еще раз.", + "CALL_FOR_DETAILS": "Призыв к деталям" + }, + "ELAPSED_TIME": { + "TITLE": "Пройденное время" + }, + "BUTTONS": { + "UNDO": "Отменить", + "PAY_NOW": "Оплатить Кредиткой", + "PAY_X": "Оплатить {{amount}}", + "PAY_WITH_FIXED_CARD": "Оплатить с", + "PAID": "Оплачено", + "END": "Наслаждайтесь покупкой!", + "CANCEL": "Отменить", + "GOT_IT": "Понял", + "IM_HERE": "Я здесь", + "SHOW_QR_CODE": "Показать QR-код", + "SHOW_PRODUCTS": "Показать продукты" + }, + "UNDO_POPUP": { + "TITLE": "Вы уверены?", + "DETAILS": [ + "Отмена приведёт в возврату уплаченной суммы, но Вы", + "не получите", + "заказ!" + ] + } + }, + "SIDE_MENU": { + "sidemenu.settings.location.title": "RU - Your Location", + "TITLE": "ever.co", + "GROUPS": { + "NO_TITLE": { + "DIVER_TITLE": "", + "ITEMS": { + "PRODUCTS": "Продукты", + "LAST_PURCHASES": "Недавние Покупки", + "CALL_US": "Позвонить Клиенту", + "ORDER_HISTORY": "История заказов" + } + }, + "STORE": { + "STORE_TITLE": "Хранить", + "ITEMS": { + "CALL_WAITER": "Вызов официанта", + "ABOUT": "Около" + } + }, + "SETTINGS": { + "DIVER_TITLE": "Настройки", + "ITEMS": { + "LANGUAGE": "Язык" + } + }, + "INFO": { + "DIVER_TITLE": "Информация", + "ITEMS": { + "FAQ": "Помощь", + "ABOUT_US": "О Нас", + "TERMS_OF_USE": "Правила Использования", + "PRIVACY": "Конфиденциальность" + } + }, + "LEGALS": { + "DIVER_TITLE": "Юридические дела", + "ITEMS": { + "TERMS_OF_USE": "Правила Использования", + "PRIVACY": "Конфиденциальность" + } + } + } + }, + "TIMER": { + "MINUTES": "Минут", + "SECONDS": "Секунд" + }, + "CONNECTION_ERROR_VIEW": { + "TITLE": "Не удалось подключиться к Ever", + "DESCRIPTION": [ + "Проверьте подключение к", + "Интернету и повторите попытку.", + "" + ] + }, + "MERCHANTS_VIEW": { + "CLOSE_TO_YOU": "Торговцы рядом с вами", + "NAME": "Имя продавца", + "WITH_NAME": "Торговцы с именем" + }, + "NO_SERVER_VIEW": { + "NO_SERVER": "Сервер упал" + }, + "OR": "Или", + "OR_LOWERCASE": "или", + "YES": "Да", + "NO": "Нет", + "OK": "Ok", + "CITY": "Город", + "STREET": "Улица", + "HOUSE": "Дом", + "APARTMENT": "Квартира", + "BACK": "Назад", + "MORE": "Больше", + "TO": "До", + "STORE_INFO": "Информация о магазине", + "MAP": "Карта", + "ORDER_INFO": "Информация о заказе", + "CLOSE": "заканчиваться", + "SCAN": "Поиск", + "MERCHANTS": "Купечество", + "NOT_FOUND": "Нет результатов!", + "IN_STORE": "В магазине", + "EXIT_STORE": "Выход из магазина", + "FAILED": "Не удалось", + "CANCELED": "Отменен", + "IN_DELIVERY": "В доставке", + "COMPLETED": "Завершенный" }