8317 lines
236 KiB
XML
8317 lines
236 KiB
XML
This file is a merged representation of the entire codebase, combined into a single document by Repomix.
|
|
The content has been processed where comments have been removed, empty lines have been removed, line numbers have been added.
|
|
|
|
<file_summary>
|
|
This section contains a summary of this file.
|
|
|
|
<purpose>
|
|
This file contains a packed representation of the entire repository's contents.
|
|
It is designed to be easily consumable by AI systems for analysis, code review,
|
|
or other automated processes.
|
|
</purpose>
|
|
|
|
<file_format>
|
|
The content is organized as follows:
|
|
1. This summary section
|
|
2. Repository information
|
|
3. Directory structure
|
|
4. Repository files (if enabled)
|
|
5. Multiple file entries, each consisting of:
|
|
- File path as an attribute
|
|
- Full contents of the file
|
|
</file_format>
|
|
|
|
<usage_guidelines>
|
|
- This file should be treated as read-only. Any changes should be made to the
|
|
original repository files, not this packed version.
|
|
- When processing this file, use the file path to distinguish
|
|
between different files in the repository.
|
|
- Be aware that this file may contain sensitive information. Handle it with
|
|
the same level of security as you would the original repository.
|
|
</usage_guidelines>
|
|
|
|
<notes>
|
|
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
|
|
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
|
|
- Files matching patterns in .gitignore are excluded
|
|
- Files matching default ignore patterns are excluded
|
|
- Code comments have been removed from supported file types
|
|
- Empty lines have been removed from all files
|
|
- Line numbers have been added to the beginning of each line
|
|
- Files are sorted by Git change count (files with more changes are at the bottom)
|
|
</notes>
|
|
|
|
</file_summary>
|
|
|
|
<directory_structure>
|
|
database/index.ts
|
|
database/relations/address-predefined.relations.ts
|
|
database/relations/address.relations.ts
|
|
database/relations/attribute.relations.ts
|
|
database/relations/brand.relations.ts
|
|
database/relations/campaign.relations.ts
|
|
database/relations/category.relations.ts
|
|
database/relations/country.relations.ts
|
|
database/relations/index.ts
|
|
database/relations/option.relations.ts
|
|
database/relations/price-history.relations.ts
|
|
database/relations/product-attribute.relations.ts
|
|
database/relations/product-variant-option.relations.ts
|
|
database/relations/product-variant.relations.ts
|
|
database/relations/product.relations.ts
|
|
database/relations/stock-movement.relations.ts
|
|
database/relations/upload.relations.ts
|
|
database/relations/user-avatar.relations.ts
|
|
database/relations/user.relations.ts
|
|
database/schemas/address-predefined.schema.ts
|
|
database/schemas/address.schema.ts
|
|
database/schemas/attribute.schema.ts
|
|
database/schemas/base.schema.ts
|
|
database/schemas/brand.schema.ts
|
|
database/schemas/campaign-product.schema.ts
|
|
database/schemas/campaign.schema.ts
|
|
database/schemas/category.schema.ts
|
|
database/schemas/country.schema.ts
|
|
database/schemas/index.ts
|
|
database/schemas/option.schema.ts
|
|
database/schemas/otp.schema.ts
|
|
database/schemas/price-history.schema.ts
|
|
database/schemas/product-attribute.schema.ts
|
|
database/schemas/product-image.schema.ts
|
|
database/schemas/product-variant-option.schema.ts
|
|
database/schemas/product-variant.schema.ts
|
|
database/schemas/product.schema.ts
|
|
database/schemas/stock-movement.schema.ts
|
|
database/schemas/upload.schema.ts
|
|
database/schemas/user-avatar.schema.ts
|
|
database/schemas/user.schema.ts
|
|
database/seeders/address-predefined.seeder.ts
|
|
database/seeders/country.seeder.ts
|
|
database/seeders/data/address-predefined.de.seed.json
|
|
database/seeders/data/address-predefined.ir.seed.json
|
|
database/seeders/data/countries.seed.json
|
|
database/seeders/index.ts
|
|
database/seeders/schemas.ts
|
|
database/seeders/truncate.ts
|
|
infra/postgres.ts
|
|
infra/redis.ts
|
|
services/auth/backoffice/auth.service.ts
|
|
services/auth/backoffice/constants.ts
|
|
services/auth/credentials.service.ts
|
|
services/session/session.service.ts
|
|
services/translation/load.ts
|
|
services/translation/types.ts
|
|
services/translation/watch.ts
|
|
services/upload/upload.errors.ts
|
|
services/upload/upload.helpers.ts
|
|
services/upload/upload.service.ts
|
|
services/upload/upload.types.ts
|
|
tests/setup/db.ts
|
|
tests/setup/global.ts
|
|
tests/setup/reset.ts
|
|
validators/auth.validator.ts
|
|
</directory_structure>
|
|
|
|
<files>
|
|
This section contains the contents of the repository's files.
|
|
|
|
<file path="database/index.ts">
|
|
1: import {postgres} from "@/server/infra/postgres";
|
|
2: export const db = postgres
|
|
</file>
|
|
|
|
<file path="database/relations/address-predefined.relations.ts">
|
|
1: import { defineRelationsPart } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const addressPredefinedValueRelations = defineRelationsPart(schema, (r) => ({
|
|
4: addressPredefined: {
|
|
5: country: r.one.countries({
|
|
6: from: r.addressPredefined.countryCode,
|
|
7: to: r.countries.code,
|
|
8: }),
|
|
9: parent: r.one.addressPredefined({
|
|
10: from: r.addressPredefined.parentId,
|
|
11: to: r.addressPredefined.id,
|
|
12: alias: 'address_predefined_value_hierarchy',
|
|
13: }),
|
|
14: children: r.many.addressPredefined({
|
|
15: from: r.addressPredefined.id,
|
|
16: to: r.addressPredefined.parentId,
|
|
17: alias: 'address_predefined_value_hierarchy',
|
|
18: }),
|
|
19: },
|
|
20: }));
|
|
</file>
|
|
|
|
<file path="database/relations/address.relations.ts">
|
|
1: import { defineRelationsPart } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const addressRelations = defineRelationsPart(schema, (r) => ({
|
|
4: addresses: {
|
|
5: user: r.one.users({
|
|
6: from: r.addresses.userId,
|
|
7: to: r.users.id,
|
|
8: }),
|
|
9: country: r.one.countries({
|
|
10: from: r.addresses.countryCode,
|
|
11: to: r.countries.code,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/relations/attribute.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const attributeRelations = defineRelations(schema, (r) => ({
|
|
4: attributes: {
|
|
5: options: r.many.options({
|
|
6: from: r.attributes.id,
|
|
7: to: r.options.attributeId,
|
|
8: }),
|
|
9: productAttributes: r.many.productAttributes({
|
|
10: from: r.attributes.id,
|
|
11: to: r.productAttributes.attributeId,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/relations/brand.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const brandRelations = defineRelations(schema, (r) => ({
|
|
4: brands: {
|
|
5: country: r.one.countries({
|
|
6: from: r.brands.countryCode,
|
|
7: to: r.countries.code,
|
|
8: }),
|
|
9: logo: r.one.uploads({
|
|
10: from: r.brands.logoUploadId,
|
|
11: to: r.uploads.id,
|
|
12: }),
|
|
13: products: r.many.products({
|
|
14: from: r.brands.id,
|
|
15: to: r.products.brandId,
|
|
16: }),
|
|
17: },
|
|
18: }));
|
|
</file>
|
|
|
|
<file path="database/relations/campaign.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const campaignRelations = defineRelations(schema, (r) => ({
|
|
4: campaigns: {
|
|
5: campaignProducts: r.many.campaignProducts({
|
|
6: from: r.campaigns.id,
|
|
7: to: r.campaignProducts.campaignId,
|
|
8: }),
|
|
9: },
|
|
10: campaignProducts: {
|
|
11: campaign: r.one.campaigns({
|
|
12: from: r.campaignProducts.campaignId,
|
|
13: to: r.campaigns.id,
|
|
14: }),
|
|
15: variant: r.one.productVariants({
|
|
16: from: r.campaignProducts.variantId,
|
|
17: to: r.productVariants.id,
|
|
18: }),
|
|
19: },
|
|
20: }));
|
|
</file>
|
|
|
|
<file path="database/relations/category.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const categoryRelations = defineRelations(schema, (r) => ({
|
|
4: categories: {
|
|
5: parent: r.one.categories({
|
|
6: from: r.categories.parentId,
|
|
7: to: r.categories.id,
|
|
8: }),
|
|
9: children: r.many.categories({
|
|
10: from: r.categories.id,
|
|
11: to: r.categories.parentId,
|
|
12: }),
|
|
13: products: r.many.products({
|
|
14: from: r.categories.id,
|
|
15: to: r.products.categoryId,
|
|
16: }),
|
|
17: },
|
|
18: }));
|
|
</file>
|
|
|
|
<file path="database/relations/country.relations.ts">
|
|
1: import { defineRelationsPart } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const countryRelations = defineRelationsPart(schema, (r) => ({
|
|
4: countries: {
|
|
5: addresses: r.many.addresses({
|
|
6: from: r.countries.code,
|
|
7: to: r.addresses.countryCode,
|
|
8: }),
|
|
9: addressPredefined: r.many.addressPredefined({
|
|
10: from: r.countries.code,
|
|
11: to: r.addressPredefined.countryCode,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/relations/index.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: import { userRelations } from './user.relations';
|
|
4: import { countryRelations } from './country.relations';
|
|
5: import { addressRelations } from './address.relations';
|
|
6: import { addressPredefinedValueRelations } from './address-predefined.relations';
|
|
7: import { uploadsRelations } from './upload.relations';
|
|
8: import { userAvatarRelations } from './user-avatar.relations';
|
|
9: import { productRelations } from './product.relations';
|
|
10: import { productVariantOptionRelations } from './product-variant-option.relations';
|
|
11: import { categoryRelations } from './category.relations';
|
|
12: import { brandRelations } from './brand.relations';
|
|
13: import { attributeRelations } from './attribute.relations';
|
|
14: import { optionRelations } from './option.relations';
|
|
15: import { productAttributeRelations } from './product-attribute.relations';
|
|
16: import {priceHistoryRelations} from "./price-history.relations";
|
|
17: import {stockMovementRelations} from "./stock-movement.relations";
|
|
18: import {campaignRelations} from "./campaign.relations";
|
|
19: const mainRelations = defineRelations(schema, () => ({}));
|
|
20: export const relations = {
|
|
21: ...mainRelations,
|
|
22: ...uploadsRelations,
|
|
23: ...userRelations,
|
|
24: ...userAvatarRelations,
|
|
25: ...countryRelations,
|
|
26: ...addressRelations,
|
|
27: ...addressPredefinedValueRelations,
|
|
28: ...productRelations,
|
|
29: ...productVariantOptionRelations,
|
|
30: ...categoryRelations,
|
|
31: ...brandRelations,
|
|
32: ...attributeRelations,
|
|
33: ...optionRelations,
|
|
34: ...productAttributeRelations,
|
|
35: ...priceHistoryRelations,
|
|
36: ...stockMovementRelations,
|
|
37: ...campaignRelations,
|
|
38: };
|
|
</file>
|
|
|
|
<file path="database/relations/option.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const optionRelations = defineRelations(schema, (r) => ({
|
|
4: options: {
|
|
5: attribute: r.one.attributes({
|
|
6: from: r.options.attributeId,
|
|
7: to: r.attributes.id,
|
|
8: }),
|
|
9: productAttributes: r.many.productAttributes({
|
|
10: from: r.options.id,
|
|
11: to: r.productAttributes.optionId,
|
|
12: }),
|
|
13: variantOptions: r.many.productVariantOptions({
|
|
14: from: r.options.id,
|
|
15: to: r.productVariantOptions.optionId,
|
|
16: }),
|
|
17: },
|
|
18: }));
|
|
</file>
|
|
|
|
<file path="database/relations/price-history.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const priceHistoryRelations = defineRelations(schema, (r) => ({
|
|
4: priceHistory: {
|
|
5: variant: r.one.productVariants({ from: r.priceHistory.variantId, to: r.productVariants.id }),
|
|
6: changedByUser: r.one.users({ from: r.priceHistory.changedBy, to: r.users.id }),
|
|
7: },
|
|
8: }));
|
|
</file>
|
|
|
|
<file path="database/relations/product-attribute.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const productAttributeRelations = defineRelations(schema, (r) => ({
|
|
4: productAttributes: {
|
|
5: product: r.one.products({
|
|
6: from: r.productAttributes.productId,
|
|
7: to: r.products.id,
|
|
8: }),
|
|
9: attribute: r.one.attributes({
|
|
10: from: r.productAttributes.attributeId,
|
|
11: to: r.attributes.id,
|
|
12: }),
|
|
13: option: r.one.options({
|
|
14: from: r.productAttributes.optionId,
|
|
15: to: r.options.id,
|
|
16: }),
|
|
17: },
|
|
18: }));
|
|
</file>
|
|
|
|
<file path="database/relations/product-variant-option.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const productVariantOptionRelations = defineRelations(schema, (r) => ({
|
|
4: productVariantOptions: {
|
|
5: variant: r.one.productVariants({
|
|
6: from: r.productVariantOptions.variantId,
|
|
7: to: r.productVariants.id,
|
|
8: }),
|
|
9: option: r.one.options({
|
|
10: from: r.productVariantOptions.optionId,
|
|
11: to: r.options.id,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/relations/product-variant.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const productVariantRelations = defineRelations(schema, (r) => ({
|
|
4: products: {
|
|
5: variants: r.many.productVariants({
|
|
6: from: r.products.id,
|
|
7: to: r.productVariants.productId,
|
|
8: }),
|
|
9: },
|
|
10: productVariants: {
|
|
11: product: r.one.products({
|
|
12: from: r.productVariants.productId,
|
|
13: to: r.products.id,
|
|
14: }),
|
|
15: variantOptions: r.many.productVariantOptions({
|
|
16: from: r.productVariants.id,
|
|
17: to: r.productVariantOptions.variantId,
|
|
18: }),
|
|
19: },
|
|
20: }));
|
|
</file>
|
|
|
|
<file path="database/relations/product.relations.ts">
|
|
1: import {defineRelations} from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const productRelations = defineRelations(schema, (r) => ({
|
|
4: products: {
|
|
5: category: r.one.categories({
|
|
6: from: r.products.categoryId,
|
|
7: to: r.categories.id,
|
|
8: }),
|
|
9: brand: r.one.brands({
|
|
10: from: r.products.brandId,
|
|
11: to: r.brands.id,
|
|
12: }),
|
|
13: images: r.many.productImages({
|
|
14: from: r.products.id,
|
|
15: to: r.productImages.productId,
|
|
16: }),
|
|
17: attributes: r.many.productAttributes({
|
|
18: from: r.products.id,
|
|
19: to: r.productAttributes.productId,
|
|
20: }),
|
|
21: variants: r.many.productVariants({
|
|
22: from: r.products.id,
|
|
23: to: r.productVariants.productId,
|
|
24: }),
|
|
25: },
|
|
26: productVariants: {
|
|
27: product: r.one.products({
|
|
28: from: r.productVariants.productId,
|
|
29: to: r.products.id,
|
|
30: }),
|
|
31: variantOptions: r.many.productVariantOptions({
|
|
32: from: r.productVariants.id,
|
|
33: to: r.productVariantOptions.variantId,
|
|
34: }),
|
|
35: priceHistory: r.many.priceHistory({
|
|
36: from: r.productVariants.id,
|
|
37: to: r.priceHistory.variantId
|
|
38: }),
|
|
39: stockMovements: r.many.stockMovements({
|
|
40: from: r.productVariants.id,
|
|
41: to: r.stockMovements.variantId
|
|
42: }),
|
|
43: campaignProducts: r.many.campaignProducts({
|
|
44: from: r.productVariants.id,
|
|
45: to: r.campaignProducts.variantId
|
|
46: }),
|
|
47: },
|
|
48: }));
|
|
</file>
|
|
|
|
<file path="database/relations/stock-movement.relations.ts">
|
|
1: import { defineRelations } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const stockMovementRelations = defineRelations(schema, (r) => ({
|
|
4: stockMovements: {
|
|
5: variant: r.one.productVariants({
|
|
6: from: r.stockMovements.variantId,
|
|
7: to: r.productVariants.id,
|
|
8: }),
|
|
9: createdByUser: r.one.users({
|
|
10: from: r.stockMovements.createdBy,
|
|
11: to: r.users.id,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/relations/upload.relations.ts">
|
|
1: import { defineRelationsPart } from "drizzle-orm";
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const uploadsRelations = defineRelationsPart(schema, (r) => ({
|
|
4: uploads: {
|
|
5: uploadedByUser: r.one.users({
|
|
6: from: r.uploads.uploadedBy,
|
|
7: to: r.users.id,
|
|
8: }),
|
|
9: },
|
|
10: }));
|
|
</file>
|
|
|
|
<file path="database/relations/user-avatar.relations.ts">
|
|
1: import { defineRelationsPart } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const userAvatarRelations = defineRelationsPart(schema, (r) => ({
|
|
4: userAvatars: {
|
|
5: user: r.one.users({
|
|
6: from: r.userAvatars.userId,
|
|
7: to: r.users.id,
|
|
8: }),
|
|
9: upload: r.one.uploads({
|
|
10: from: r.userAvatars.uploadId,
|
|
11: to: r.uploads.id,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/relations/user.relations.ts">
|
|
1: import { defineRelationsPart } from 'drizzle-orm';
|
|
2: import * as schema from '@/server/database/schemas';
|
|
3: export const userRelations = defineRelationsPart(schema, (r) => ({
|
|
4: users: {
|
|
5: addresses: r.many.addresses({
|
|
6: from: r.users.id,
|
|
7: to: r.addresses.userId,
|
|
8: }),
|
|
9: avatar: r.one.userAvatars({
|
|
10: from: r.users.id,
|
|
11: to: r.userAvatars.userId,
|
|
12: }),
|
|
13: },
|
|
14: }));
|
|
</file>
|
|
|
|
<file path="database/schemas/address-predefined.schema.ts">
|
|
1: import { sql } from 'drizzle-orm';
|
|
2: import { pgEnum, uuid, varchar, jsonb, char, uniqueIndex } from 'drizzle-orm/pg-core';
|
|
3: import type { AnyPgColumn } from 'drizzle-orm/pg-core';
|
|
4: import {baseTable, LocalizedLabel} from './base.schema';
|
|
5: import { countries } from './country.schema';
|
|
6: export const addressFieldEnum = pgEnum('address_field', [
|
|
7: 'administrative_area',
|
|
8: 'locality',
|
|
9: 'dependent_locality',
|
|
10: ]);
|
|
11: export const addressPredefined = baseTable(
|
|
12: 'address_predefined',
|
|
13: {
|
|
14: parentId: uuid('parent_id').references((): AnyPgColumn => addressPredefined.id),
|
|
15: field: addressFieldEnum('field').notNull(),
|
|
16: key: varchar('key', { length: 255 }).notNull(),
|
|
17: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
18: countryCode: char('country_code', { length: 2 })
|
|
19: .notNull()
|
|
20: .references(() => countries.code),
|
|
21: },
|
|
22: (table) => [
|
|
23: uniqueIndex('address_predefined_scope_key_idx').on(
|
|
24: table.countryCode,
|
|
25: table.field,
|
|
26: table.parentId,
|
|
27: table.key
|
|
28: ),
|
|
29: uniqueIndex('address_predefined_values_root_key_idx')
|
|
30: .on(table.countryCode, table.field, table.key)
|
|
31: .where(sql`${table.parentId} IS NULL`),
|
|
32: ]
|
|
33: );
|
|
34: export type AddressPredefined = typeof addressPredefined.$inferSelect;
|
|
35: export type NewAddressPredefined = typeof addressPredefined.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/address.schema.ts">
|
|
1: import { boolean, char, decimal, text, uuid, varchar } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { users } from './user.schema';
|
|
4: import { countries } from './country.schema';
|
|
5: export const addresses = baseTable('addresses', {
|
|
6: userId: uuid('user_id').references(() => users.id),
|
|
7: countryCode: char('country_code', { length: 2 })
|
|
8: .notNull()
|
|
9: .references(() => countries.code),
|
|
10: recipientName: varchar('recipient_name', { length: 255 }),
|
|
11: organization: varchar('organization', { length: 255 }),
|
|
12: addressLine1: varchar('address_line1', { length: 255 }),
|
|
13: addressLine2: varchar('address_line2', { length: 255 }),
|
|
14: dependentLocality: varchar('dependent_locality', { length: 255 }),
|
|
15: locality: varchar('locality', { length: 255 }),
|
|
16: administrativeArea: varchar('administrative_area', { length: 255 }),
|
|
17: postalCode: varchar('postal_code', { length: 20 }),
|
|
18: sortingCode: varchar('sorting_code', { length: 20 }),
|
|
19: formattedAddress: text('formatted_address'),
|
|
20: latitude: decimal('latitude', { precision: 10, scale: 7 }),
|
|
21: longitude: decimal('longitude', { precision: 10, scale: 7 }),
|
|
22: phone: varchar('phone', { length: 30 }),
|
|
23: email: varchar('email', { length: 255 }),
|
|
24: label: varchar('label', { length: 50 }),
|
|
25: isVerified: boolean('is_verified').default(false),
|
|
26: isDefault: boolean('is_default').default(false).notNull(),
|
|
27: });
|
|
28: export type Address = typeof addresses.$inferSelect;
|
|
29: export type NewAddress = typeof addresses.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/attribute.schema.ts">
|
|
1: import { jsonb } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable, type LocalizedLabel } from './base.schema';
|
|
3: export const attributes = baseTable('attributes', {
|
|
4: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
5: });
|
|
6: export type Attribute = typeof attributes.$inferSelect;
|
|
7: export type NewAttribute = typeof attributes.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/base.schema.ts">
|
|
1: import { pgTable } from 'drizzle-orm/pg-core';
|
|
2: import type { AnyPgColumnBuilder } from 'drizzle-orm/pg-core';
|
|
3: import { uuidv7 } from 'uuidv7';
|
|
4: import { uuid, timestamp } from 'drizzle-orm/pg-core';
|
|
5: export const idColumn = {
|
|
6: id: uuid('id').primaryKey().$defaultFn(() => uuidv7()),
|
|
7: };
|
|
8: export const timestampColumns = {
|
|
9: createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
10: updatedAt: timestamp('updated_at', { withTimezone: true })
|
|
11: .defaultNow()
|
|
12: .notNull()
|
|
13: .$onUpdate(() => new Date()),
|
|
14: deletedAt: timestamp('deleted_at', { withTimezone: true }),
|
|
15: };
|
|
16: export function baseTable<T extends Record<string, AnyPgColumnBuilder>>(
|
|
17: name: string,
|
|
18: columns: T,
|
|
19: extraConfig?: (table: ReturnType<typeof pgTable<string, T & typeof idColumn & typeof timestampColumns>>) => unknown
|
|
20: ) {
|
|
21: return pgTable(
|
|
22: name,
|
|
23: {
|
|
24: ...idColumn,
|
|
25: ...columns,
|
|
26: ...timestampColumns,
|
|
27: },
|
|
28: extraConfig as never
|
|
29: );
|
|
30: }
|
|
31: export type LocalizedLabel = Record<string, string>;
|
|
</file>
|
|
|
|
<file path="database/schemas/brand.schema.ts">
|
|
1: import {jsonb, char, uuid} from 'drizzle-orm/pg-core';
|
|
2: import { baseTable, type LocalizedLabel } from './base.schema';
|
|
3: import { countries } from './country.schema';
|
|
4: import {uploads} from "@/server/database/schemas/upload.schema";
|
|
5: export const brands = baseTable('brands', {
|
|
6: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
7: description: jsonb('description').$type<LocalizedLabel>(),
|
|
8: countryCode: char('country_code', { length: 2 }).references(() => countries.code, {
|
|
9: onDelete: 'set null',
|
|
10: }),
|
|
11: logoUploadId: uuid("logo_upload_id").references(() => uploads.id),
|
|
12: });
|
|
13: export type Brand = typeof brands.$inferSelect;
|
|
14: export type NewBrand = typeof brands.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/campaign-product.schema.ts">
|
|
1: import { uuid, varchar, integer, unique } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { campaigns } from './campaign.schema';
|
|
4: import { productVariants } from './product-variant.schema';
|
|
5: import { type DiscountType } from './campaign.schema';
|
|
6: export const campaignProducts = baseTable(
|
|
7: 'campaign_products',
|
|
8: {
|
|
9: campaignId: uuid('campaign_id').notNull().references(() => campaigns.id),
|
|
10: variantId: uuid('variant_id').notNull().references(() => productVariants.id),
|
|
11: discountType: varchar('discount_type', { length: 20 }).$type<DiscountType>(),
|
|
12: discountValue: integer('discount_value'),
|
|
13: },
|
|
14: (table) => [
|
|
15: unique('campaign_variant_unique').on(table.campaignId, table.variantId),
|
|
16: ]
|
|
17: );
|
|
18: export type CampaignProduct = typeof campaignProducts.$inferSelect;
|
|
19: export type NewCampaignProduct = typeof campaignProducts.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/campaign.schema.ts">
|
|
1: import { varchar, timestamp, integer, boolean, jsonb } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable, type LocalizedLabel } from './base.schema';
|
|
3: export const discountTypeValues = ["percentage", "fixed_amount"] as const;
|
|
4: export type DiscountType = (typeof discountTypeValues)[number];
|
|
5: export const campaigns = baseTable('campaigns', {
|
|
6: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
7: slug: varchar('slug', { length: 255 }).notNull().unique(),
|
|
8: startsAt: timestamp('starts_at', { withTimezone: true }).notNull(),
|
|
9: endsAt: timestamp('ends_at', { withTimezone: true }).notNull(),
|
|
10: isActive: boolean('is_active').notNull().default(true),
|
|
11: defaultDiscountType: varchar('default_discount_type', { length: 20 }).$type<DiscountType>(),
|
|
12: defaultDiscountValue: integer('default_discount_value'),
|
|
13: });
|
|
14: export type Campaign = typeof campaigns.$inferSelect;
|
|
15: export type NewCampaign = typeof campaigns.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/category.schema.ts">
|
|
1: import { varchar, jsonb, uuid, index, unique } from 'drizzle-orm/pg-core';
|
|
2: import type { AnyPgColumn } from 'drizzle-orm/pg-core';
|
|
3: import { baseTable, type LocalizedLabel } from './base.schema';
|
|
4: export const categories = baseTable(
|
|
5: 'categories',
|
|
6: {
|
|
7: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
8: parentId: uuid('parent_id').references((): AnyPgColumn => categories.id),
|
|
9: slug: varchar('slug', { length: 255 }).notNull().unique(),
|
|
10: },
|
|
11: (table) => [
|
|
12: index('categories_parent_id_idx').on(table.parentId),
|
|
13: unique('categories_id_parent_id_unique').on(table.id, table.parentId),
|
|
14: ]
|
|
15: );
|
|
16: export type Category = typeof categories.$inferSelect;
|
|
17: export type NewCategory = typeof categories.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/country.schema.ts">
|
|
1: import { pgTable, char, varchar, jsonb, uniqueIndex } from 'drizzle-orm/pg-core';
|
|
2: import { sql } from 'drizzle-orm';
|
|
3: import type { LocalizedLabel } from './base.schema';
|
|
4: export type AddressFieldLabels = {
|
|
5: administrativeArea?: LocalizedLabel;
|
|
6: locality?: LocalizedLabel;
|
|
7: dependentLocality?: LocalizedLabel;
|
|
8: postalCode?: LocalizedLabel;
|
|
9: sortingCode?: LocalizedLabel;
|
|
10: };
|
|
11: export const countries = pgTable(
|
|
12: 'countries',
|
|
13: {
|
|
14: code: char('code', { length: 2 }).primaryKey(),
|
|
15: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
16: phoneCode: varchar('phone_code', { length: 5 }).notNull(),
|
|
17: addressLabels: jsonb('address_labels').$type<AddressFieldLabels>(),
|
|
18: },
|
|
19: (table) => [uniqueIndex('countries_name_en_idx').on(sql`(${table.name}->>'en')`)]
|
|
20: );
|
|
21: export type Country = typeof countries.$inferSelect;
|
|
22: export type NewCountry = typeof countries.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/index.ts">
|
|
1: export * from './base.schema';
|
|
2: export * from './user.schema';
|
|
3: export * from './upload.schema';
|
|
4: export * from './user-avatar.schema';
|
|
5: export * from './country.schema';
|
|
6: export * from './address.schema';
|
|
7: export * from './address-predefined.schema';
|
|
8: export * from './category.schema';
|
|
9: export * from './brand.schema';
|
|
10: export * from './product.schema';
|
|
11: export * from './product-image.schema';
|
|
12: export * from './attribute.schema';
|
|
13: export * from './option.schema';
|
|
14: export * from './product-attribute.schema';
|
|
15: export * from './product-variant.schema';
|
|
16: export * from './product-variant-option.schema';
|
|
17: export * from './price-history.schema';
|
|
18: export * from './stock-movement.schema';
|
|
19: export * from './campaign.schema';
|
|
20: export * from './campaign-product.schema';
|
|
</file>
|
|
|
|
<file path="database/schemas/option.schema.ts">
|
|
1: import { jsonb, uuid } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable, type LocalizedLabel } from './base.schema';
|
|
3: import { attributes } from './attribute.schema';
|
|
4: export const options = baseTable('options', {
|
|
5: attributeId: uuid('attribute_id')
|
|
6: .notNull()
|
|
7: .references(() => attributes.id),
|
|
8: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
9: });
|
|
10: export type Option = typeof options.$inferSelect;
|
|
11: export type NewOption = typeof options.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/otp.schema.ts">
|
|
1: import { pgEnum, uuid, varchar, integer, timestamp, index } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { users } from './user.schema';
|
|
4: export const otpChannelEnum = pgEnum('otp_channel', ['email', 'phone']);
|
|
5: export const otpPurposeEnum = pgEnum('otp_purpose', [
|
|
6: 'email_verification',
|
|
7: 'phone_verification',
|
|
8: 'password_reset',
|
|
9: ]);
|
|
10: export const otps = baseTable(
|
|
11: 'otps',
|
|
12: {
|
|
13: userId: uuid('user_id').references(() => users.id),
|
|
14: identifier: varchar('identifier', { length: 255 }).notNull(),
|
|
15: channel: otpChannelEnum('channel').notNull(),
|
|
16: purpose: otpPurposeEnum('purpose').notNull(),
|
|
17: codeHash: varchar('code_hash', { length: 255 }).notNull(),
|
|
18: attempts: integer('attempts').notNull().default(0),
|
|
19: expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
|
|
20: consumedAt: timestamp('consumed_at', { withTimezone: true }),
|
|
21: },
|
|
22: (table) => [
|
|
23: index('otps_lookup_idx').on(table.identifier, table.channel, table.purpose),
|
|
24: ]
|
|
25: );
|
|
26: export type Otp = typeof otps.$inferSelect;
|
|
27: export type NewOtp = typeof otps.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/price-history.schema.ts">
|
|
1: import { bigint, uuid } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { productVariants } from './product-variant.schema';
|
|
4: import { users } from './user.schema';
|
|
5: export const priceHistory = baseTable('price_history', {
|
|
6: variantId: uuid('variant_id')
|
|
7: .notNull()
|
|
8: .references(() => productVariants.id),
|
|
9: oldPrice: bigint('old_price', { mode: 'number' }).notNull(),
|
|
10: newPrice: bigint('new_price', { mode: 'number' }).notNull(),
|
|
11: changedBy: uuid('changed_by').references(() => users.id),
|
|
12: });
|
|
13: export type PriceHistory = typeof priceHistory.$inferSelect;
|
|
14: export type NewPriceHistory = typeof priceHistory.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/product-attribute.schema.ts">
|
|
1: import { varchar, uuid } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { products } from './product.schema';
|
|
4: import { attributes } from './attribute.schema';
|
|
5: import { options } from './option.schema';
|
|
6: export const productAttributes = baseTable('product_attributes', {
|
|
7: productId: uuid('product_id')
|
|
8: .notNull()
|
|
9: .references(() => products.id),
|
|
10: attributeId: uuid('attribute_id')
|
|
11: .notNull()
|
|
12: .references(() => attributes.id),
|
|
13: optionId: uuid('option_id').references(() => options.id),
|
|
14: value: varchar('value', { length: 255 }),
|
|
15: });
|
|
16: export type ProductAttribute = typeof productAttributes.$inferSelect;
|
|
17: export type NewProductAttribute = typeof productAttributes.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/product-image.schema.ts">
|
|
1: import {boolean, uuid, integer} from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { products } from './product.schema';
|
|
4: import {uploads} from "@/server/database/schemas/upload.schema";
|
|
5: export const productImages = baseTable('product_images', {
|
|
6: productId: uuid('product_id')
|
|
7: .notNull()
|
|
8: .references(() => products.id),
|
|
9: uploadId: uuid("upload_id").notNull().references(() => uploads.id),
|
|
10: position: integer("position").notNull().default(0),
|
|
11: isMain: boolean('is_main').notNull().default(false),
|
|
12: });
|
|
13: export type ProductImage = typeof productImages.$inferSelect;
|
|
14: export type NewProductImage = typeof productImages.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/product-variant-option.schema.ts">
|
|
1: import { uuid, unique } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { productVariants } from './product-variant.schema';
|
|
4: import { options } from './option.schema';
|
|
5: export const productVariantOptions = baseTable(
|
|
6: 'product_variant_options',
|
|
7: {
|
|
8: variantId: uuid('variant_id')
|
|
9: .notNull()
|
|
10: .references(() => productVariants.id),
|
|
11: optionId: uuid('option_id')
|
|
12: .notNull()
|
|
13: .references(() => options.id),
|
|
14: },
|
|
15: (table) => [
|
|
16: unique('variant_option_unique').on(table.variantId, table.optionId),
|
|
17: ]
|
|
18: );
|
|
19: export type ProductVariantOption = typeof productVariantOptions.$inferSelect;
|
|
20: export type NewProductVariantOption = typeof productVariantOptions.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/product-variant.schema.ts">
|
|
1: import { varchar, bigint, uuid } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { products } from './product.schema';
|
|
4: export const productVariants = baseTable('product_variants', {
|
|
5: productId: uuid('product_id')
|
|
6: .notNull()
|
|
7: .references(() => products.id),
|
|
8: sku: varchar('sku', { length: 100 }).notNull().unique(),
|
|
9: price: bigint('price', { mode: 'number' }).notNull(),
|
|
10: stock: bigint('stock', { mode: 'number' }).notNull().default(0),
|
|
11: });
|
|
12: export type ProductVariant = typeof productVariants.$inferSelect;
|
|
13: export type NewProductVariant = typeof productVariants.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/product.schema.ts">
|
|
1: import { jsonb, bigint, uuid } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable, type LocalizedLabel } from './base.schema';
|
|
3: import { categories } from './category.schema';
|
|
4: import { brands } from './brand.schema';
|
|
5: export const products = baseTable('products', {
|
|
6: code: bigint('code', { mode: 'number' }).notNull(),
|
|
7: name: jsonb('name').$type<LocalizedLabel>().notNull(),
|
|
8: description: jsonb('description').$type<LocalizedLabel>(),
|
|
9: categoryId: uuid('category_id')
|
|
10: .notNull()
|
|
11: .references(() => categories.id),
|
|
12: brandId: uuid('brand_id').references(() => brands.id),
|
|
13: });
|
|
14: export type Product = typeof products.$inferSelect;
|
|
15: export type NewProduct = typeof products.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/stock-movement.schema.ts">
|
|
1: import { integer, uuid, varchar } from 'drizzle-orm/pg-core';
|
|
2: import { baseTable } from './base.schema';
|
|
3: import { productVariants } from './product-variant.schema';
|
|
4: import { users } from './user.schema';
|
|
5: export const stockMovementReasonValues = [
|
|
6: "sale",
|
|
7: "restock",
|
|
8: "damaged",
|
|
9: "returned",
|
|
10: "manual_adjustment",
|
|
11: ] as const;
|
|
12: export type StockMovementReason = (typeof stockMovementReasonValues)[number];
|
|
13: export const stockMovements = baseTable('stock_movements', {
|
|
14: variantId: uuid('variant_id')
|
|
15: .notNull()
|
|
16: .references(() => productVariants.id),
|
|
17: quantity: integer('quantity').notNull(),
|
|
18: balanceAfter: integer('balance_after').notNull(),
|
|
19: reason: varchar('reason', { length: 30 }).$type<StockMovementReason>().notNull(),
|
|
20: referenceId: uuid('reference_id'),
|
|
21: createdBy: uuid('created_by').references(() => users.id),
|
|
22: });
|
|
23: export type StockMovement = typeof stockMovements.$inferSelect;
|
|
24: export type NewStockMovement = typeof stockMovements.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/upload.schema.ts">
|
|
1: import {varchar, bigint, uuid} from "drizzle-orm/pg-core";
|
|
2: import {baseTable} from "./base.schema";
|
|
3: import {users} from "./user.schema";
|
|
4: export const uploadStatusValues = ["pending", "completed", "failed"] as const;
|
|
5: export type UploadStatus = (typeof uploadStatusValues)[number];
|
|
6: export const uploads = baseTable("uploads",
|
|
7: {
|
|
8: bucket: varchar("bucket", {length: 100}).notNull().default("shop-storage"),
|
|
9: storageKey: varchar("storage_key", {length: 500}).notNull(),
|
|
10: checksum: varchar("checksum", {length: 64}),
|
|
11: originalName: varchar("original_name", {length: 255}).notNull(),
|
|
12: mimeType: varchar("mime_type", {length: 100}).notNull(),
|
|
13: sizeBytes: bigint("size_bytes", {mode: "number"}).notNull(),
|
|
14: status: varchar("status", {length: 20})
|
|
15: .$type<UploadStatus>()
|
|
16: .notNull()
|
|
17: .default("pending"),
|
|
18: uploadedBy: uuid('uploaded_by')
|
|
19: .notNull()
|
|
20: .references(() => users.id),
|
|
21: }
|
|
22: );
|
|
23: export type Upload = typeof uploads.$inferSelect;
|
|
24: export type NewUpload = typeof uploads.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/user-avatar.schema.ts">
|
|
1: import {uuid, uniqueIndex} from "drizzle-orm/pg-core";
|
|
2: import {baseTable} from "./base.schema";
|
|
3: import {users} from "./user.schema";
|
|
4: import {uploads} from "./upload.schema";
|
|
5: export const userAvatars = baseTable("user_avatars",
|
|
6: {
|
|
7: userId: uuid("user_id")
|
|
8: .notNull()
|
|
9: .references(() => users.id),
|
|
10: uploadId: uuid("upload_id")
|
|
11: .notNull()
|
|
12: .references(() => uploads.id),
|
|
13: },
|
|
14: (table) => [
|
|
15: uniqueIndex('user_avatars_user_id_idx').on(table.userId),
|
|
16: ]
|
|
17: );
|
|
18: export type UserAvatar = typeof userAvatars.$inferSelect;
|
|
19: export type NewUserAvatar = typeof userAvatars.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/schemas/user.schema.ts">
|
|
1: import {varchar, timestamp, uniqueIndex, check} from 'drizzle-orm/pg-core';
|
|
2: import { sql } from 'drizzle-orm';
|
|
3: import { baseTable } from './base.schema';
|
|
4: export const users = baseTable(
|
|
5: 'users',
|
|
6: {
|
|
7: name: varchar('name', { length: 255 }).notNull(),
|
|
8: email: varchar('email', { length: 255 }),
|
|
9: password: varchar('password', { length: 255 }),
|
|
10: emailVerifiedAt: timestamp('email_verified_at', { withTimezone: true }),
|
|
11: phone: varchar('phone', { length: 20 }),
|
|
12: phoneVerifiedAt: timestamp('phone_verified_at', { withTimezone: true }),
|
|
13: },
|
|
14: (table) => [
|
|
15: uniqueIndex('users_email_idx').on(table.email),
|
|
16: uniqueIndex('users_phone_idx').on(table.phone),
|
|
17: check('users_email_or_phone_check', sql`${table.email} IS NOT NULL OR ${table.phone} IS NOT NULL`),
|
|
18: ]
|
|
19: );
|
|
20: export type User = typeof users.$inferSelect;
|
|
21: export type NewUser = typeof users.$inferInsert;
|
|
</file>
|
|
|
|
<file path="database/seeders/address-predefined.seeder.ts">
|
|
1: import { z } from 'zod';
|
|
2: import { db } from '@/server/database';
|
|
3: import { addressPredefined } from '@/server/database/schemas';
|
|
4: import { LocalizedLabelSchema } from '@/server/database/seeders/schemas';
|
|
5: import deAddressPredefinedSeedData from './data/address-predefined.de.seed.json';
|
|
6: import irAddressPredefinedSeedData from './data/address-predefined.ir.seed.json';
|
|
7: const fieldEnumSchema = z.enum(['administrative_area', 'locality', 'dependent_locality']);
|
|
8: type SeedNode = {
|
|
9: field: z.infer<typeof fieldEnumSchema>;
|
|
10: key: string;
|
|
11: name: z.infer<typeof LocalizedLabelSchema>;
|
|
12: children?: SeedNode[];
|
|
13: };
|
|
14: const seedNodeSchema: z.ZodType<SeedNode> = z.lazy(() =>
|
|
15: z.object({
|
|
16: field: fieldEnumSchema,
|
|
17: key: z.string(),
|
|
18: name: LocalizedLabelSchema,
|
|
19: children: z.array(seedNodeSchema).optional(),
|
|
20: })
|
|
21: );
|
|
22: const addressPredefinedSeedSchema = z.array(
|
|
23: seedNodeSchema.and(z.object({ countryCode: z.string().length(2) }))
|
|
24: );
|
|
25: async function insertNode(
|
|
26: node: SeedNode,
|
|
27: countryCode: string,
|
|
28: parentId: string | null
|
|
29: ): Promise<number> {
|
|
30: const [inserted] = await db
|
|
31: .insert(addressPredefined)
|
|
32: .values({
|
|
33: countryCode,
|
|
34: field: node.field,
|
|
35: key: node.key,
|
|
36: name: node.name,
|
|
37: parentId: parentId ?? undefined,
|
|
38: })
|
|
39: .onConflictDoNothing()
|
|
40: .returning({ id: addressPredefined.id });
|
|
41: const id =
|
|
42: inserted?.id ??
|
|
43: (
|
|
44: await db.query.addressPredefined.findFirst({
|
|
45: where: {
|
|
46: countryCode: countryCode,
|
|
47: field: node.field,
|
|
48: key: node.key,
|
|
49: parentId: parentId ? parentId : { isNull: true },
|
|
50: },
|
|
51: })
|
|
52: )?.id;
|
|
53: if (!id) {
|
|
54: throw new Error(`Failed to resolve id for ${countryCode}/${node.field}/${node.key}`);
|
|
55: }
|
|
56: let count = 1;
|
|
57: for (const child of node.children ?? []) {
|
|
58: count += await insertNode(child, countryCode, id);
|
|
59: }
|
|
60: return count;
|
|
61: }
|
|
62: const ADDRESS_PREDEFINED_SEED_SOURCES = [
|
|
63: deAddressPredefinedSeedData,
|
|
64: irAddressPredefinedSeedData,
|
|
65: ] as const;
|
|
66: export async function seedAddressPredefined() {
|
|
67: const roots = ADDRESS_PREDEFINED_SEED_SOURCES.flatMap(
|
|
68: (data) => addressPredefinedSeedSchema.parse(data)
|
|
69: );
|
|
70: const counts = await Promise.all(
|
|
71: roots.map((root) => insertNode(root, root.countryCode, null))
|
|
72: );
|
|
73: const total = counts.reduce((sum, n) => sum + n, 0);
|
|
74: console.log(`Seeded ${total} address predefined values`);
|
|
75: }
|
|
</file>
|
|
|
|
<file path="database/seeders/country.seeder.ts">
|
|
1: import { z } from 'zod';
|
|
2: import { db } from '@/server/database';
|
|
3: import { countries } from '@/server/database/schemas';
|
|
4: import countrySeedData from './data/countries.seed.json';
|
|
5: import { LocalizedLabelSchema } from '@/server/database/seeders/schemas';
|
|
6: const countrySeedSchema = z.array(z.object({
|
|
7: code: z.string().length(2),
|
|
8: name: z.record(z.string(), z.string()),
|
|
9: phoneCode: z.string(),
|
|
10: addressLabels: z.object({
|
|
11: administrativeArea: LocalizedLabelSchema.optional(),
|
|
12: locality: LocalizedLabelSchema.optional(),
|
|
13: dependentLocality: LocalizedLabelSchema.optional(),
|
|
14: postalCode: LocalizedLabelSchema.optional(),
|
|
15: sortingCode: LocalizedLabelSchema.optional(),
|
|
16: }).optional(),
|
|
17: }));
|
|
18: export async function seedCountries() {
|
|
19: const data = countrySeedSchema.parse(countrySeedData);
|
|
20: await db
|
|
21: .insert(countries)
|
|
22: .values(data)
|
|
23: .onConflictDoUpdate({
|
|
24: target: countries.code,
|
|
25: set: {
|
|
26: name: countries.name,
|
|
27: phoneCode: countries.phoneCode,
|
|
28: addressLabels: countries.addressLabels,
|
|
29: },
|
|
30: });
|
|
31: console.log(`Seeded ${data.length} countries`);
|
|
32: }
|
|
</file>
|
|
|
|
<file path="database/seeders/data/address-predefined.de.seed.json">
|
|
1: [
|
|
2: {
|
|
3: "countryCode": "DE",
|
|
4: "field": "administrative_area",
|
|
5: "key": "baden_wuerttemberg",
|
|
6: "name": {
|
|
7: "en": "Baden-Württemberg",
|
|
8: "fa": "بادن-وورتمبرگ",
|
|
9: "de": "Baden-Württemberg"
|
|
10: }
|
|
11: },
|
|
12: {
|
|
13: "countryCode": "DE",
|
|
14: "field": "administrative_area",
|
|
15: "key": "berlin",
|
|
16: "name": {
|
|
17: "en": "Berlin",
|
|
18: "fa": "برلین",
|
|
19: "de": "Berlin"
|
|
20: }
|
|
21: },
|
|
22: {
|
|
23: "countryCode": "DE",
|
|
24: "field": "administrative_area",
|
|
25: "key": "brandenburg",
|
|
26: "name": {
|
|
27: "en": "Brandenburg",
|
|
28: "fa": "براندنبورگ",
|
|
29: "de": "Brandenburg"
|
|
30: }
|
|
31: },
|
|
32: {
|
|
33: "countryCode": "DE",
|
|
34: "field": "administrative_area",
|
|
35: "key": "bremen",
|
|
36: "name": {
|
|
37: "en": "Bremen",
|
|
38: "fa": "برمن",
|
|
39: "de": "Bremen"
|
|
40: }
|
|
41: },
|
|
42: {
|
|
43: "countryCode": "DE",
|
|
44: "field": "administrative_area",
|
|
45: "key": "hamburg",
|
|
46: "name": {
|
|
47: "en": "Hamburg",
|
|
48: "fa": "هامبورگ",
|
|
49: "de": "Hamburg"
|
|
50: }
|
|
51: },
|
|
52: {
|
|
53: "countryCode": "DE",
|
|
54: "field": "administrative_area",
|
|
55: "key": "hesse",
|
|
56: "name": {
|
|
57: "en": "Hesse",
|
|
58: "fa": "هسن",
|
|
59: "de": "Hessen"
|
|
60: }
|
|
61: },
|
|
62: {
|
|
63: "countryCode": "DE",
|
|
64: "field": "administrative_area",
|
|
65: "key": "lower_saxony",
|
|
66: "name": {
|
|
67: "en": "Lower Saxony",
|
|
68: "fa": "نیدرزاکسن",
|
|
69: "de": "Niedersachsen"
|
|
70: }
|
|
71: },
|
|
72: {
|
|
73: "countryCode": "DE",
|
|
74: "field": "administrative_area",
|
|
75: "key": "mecklenburg_vorpommern",
|
|
76: "name": {
|
|
77: "en": "Mecklenburg-Vorpommern",
|
|
78: "fa": "مکلنبورگ-فورپومرن",
|
|
79: "de": "Mecklenburg-Vorpommern"
|
|
80: }
|
|
81: },
|
|
82: {
|
|
83: "countryCode": "DE",
|
|
84: "field": "administrative_area",
|
|
85: "key": "north_rhine_westphalia",
|
|
86: "name": {
|
|
87: "en": "North Rhine-Westphalia",
|
|
88: "fa": "نوردراین-وستفالن",
|
|
89: "de": "Nordrhein-Westfalen"
|
|
90: }
|
|
91: },
|
|
92: {
|
|
93: "countryCode": "DE",
|
|
94: "field": "administrative_area",
|
|
95: "key": "rhineland_palatinate",
|
|
96: "name": {
|
|
97: "en": "Rhineland-Palatinate",
|
|
98: "fa": "راینلاند-فالتس",
|
|
99: "de": "Rheinland-Pfalz"
|
|
100: }
|
|
101: },
|
|
102: {
|
|
103: "countryCode": "DE",
|
|
104: "field": "administrative_area",
|
|
105: "key": "saarland",
|
|
106: "name": {
|
|
107: "en": "Saarland",
|
|
108: "fa": "زارلاند",
|
|
109: "de": "Saarland"
|
|
110: }
|
|
111: },
|
|
112: {
|
|
113: "countryCode": "DE",
|
|
114: "field": "administrative_area",
|
|
115: "key": "saxony",
|
|
116: "name": {
|
|
117: "en": "Saxony",
|
|
118: "fa": "زاکسن",
|
|
119: "de": "Sachsen"
|
|
120: }
|
|
121: },
|
|
122: {
|
|
123: "countryCode": "DE",
|
|
124: "field": "administrative_area",
|
|
125: "key": "saxony_anhalt",
|
|
126: "name": {
|
|
127: "en": "Saxony-Anhalt",
|
|
128: "fa": "زاکسن-آنهالت",
|
|
129: "de": "Sachsen-Anhalt"
|
|
130: }
|
|
131: },
|
|
132: {
|
|
133: "countryCode": "DE",
|
|
134: "field": "administrative_area",
|
|
135: "key": "schleswig_holstein",
|
|
136: "name": {
|
|
137: "en": "Schleswig-Holstein",
|
|
138: "fa": "اشلسویگ-هولشتاین",
|
|
139: "de": "Schleswig-Holstein"
|
|
140: }
|
|
141: },
|
|
142: {
|
|
143: "countryCode": "DE",
|
|
144: "field": "administrative_area",
|
|
145: "key": "thuringia",
|
|
146: "name": {
|
|
147: "en": "Thuringia",
|
|
148: "fa": "تورینگن",
|
|
149: "de": "Thüringen"
|
|
150: }
|
|
151: },
|
|
152: {
|
|
153: "countryCode": "DE",
|
|
154: "field": "administrative_area",
|
|
155: "key": "bavaria",
|
|
156: "name": { "en": "Bavaria", "fa": "باواریا", "de": "Bayern" }
|
|
157: }
|
|
158: ]
|
|
</file>
|
|
|
|
<file path="database/seeders/data/address-predefined.ir.seed.json">
|
|
1: [
|
|
2: {
|
|
3: "countryCode": "IR",
|
|
4: "field": "administrative_area",
|
|
5: "key": "alborz",
|
|
6: "name": {
|
|
7: "en": "Alborz",
|
|
8: "fa": "البرز",
|
|
9: "de": "Alborz"
|
|
10: },
|
|
11: "children": [
|
|
12: {
|
|
13: "field": "locality",
|
|
14: "key": "chaharbagh",
|
|
15: "name": {
|
|
16: "en": "Chaharbagh",
|
|
17: "fa": "چهارباغ",
|
|
18: "de": "Chaharbagh"
|
|
19: }
|
|
20: },
|
|
21: {
|
|
22: "field": "locality",
|
|
23: "key": "eshtehard",
|
|
24: "name": {
|
|
25: "en": "Eshtehard",
|
|
26: "fa": "اشتهارد",
|
|
27: "de": "Eshtehard"
|
|
28: }
|
|
29: },
|
|
30: {
|
|
31: "field": "locality",
|
|
32: "key": "fardis",
|
|
33: "name": {
|
|
34: "en": "Fardis",
|
|
35: "fa": "فردیس",
|
|
36: "de": "Fardis"
|
|
37: }
|
|
38: },
|
|
39: {
|
|
40: "field": "locality",
|
|
41: "key": "karaj",
|
|
42: "name": {
|
|
43: "en": "Karaj",
|
|
44: "fa": "کرج",
|
|
45: "de": "Karaj"
|
|
46: }
|
|
47: },
|
|
48: {
|
|
49: "field": "locality",
|
|
50: "key": "nazarabad",
|
|
51: "name": {
|
|
52: "en": "Nazarabad",
|
|
53: "fa": "نظرآباد",
|
|
54: "de": "Nazarabad"
|
|
55: }
|
|
56: },
|
|
57: {
|
|
58: "field": "locality",
|
|
59: "key": "savojbolagh",
|
|
60: "name": {
|
|
61: "en": "Savojbolagh",
|
|
62: "fa": "ساوجبلاغ",
|
|
63: "de": "Savojbolagh"
|
|
64: }
|
|
65: },
|
|
66: {
|
|
67: "field": "locality",
|
|
68: "key": "taleqan",
|
|
69: "name": {
|
|
70: "en": "Taleqan",
|
|
71: "fa": "طالقان",
|
|
72: "de": "Taleqan"
|
|
73: }
|
|
74: }
|
|
75: ]
|
|
76: },
|
|
77: {
|
|
78: "countryCode": "IR",
|
|
79: "field": "administrative_area",
|
|
80: "key": "ardabil",
|
|
81: "name": {
|
|
82: "en": "Ardabil",
|
|
83: "fa": "اردبیل",
|
|
84: "de": "Ardabil"
|
|
85: },
|
|
86: "children": [
|
|
87: {
|
|
88: "field": "locality",
|
|
89: "key": "ardabil",
|
|
90: "name": {
|
|
91: "en": "Ardabil",
|
|
92: "fa": "اردبیل",
|
|
93: "de": "Ardabil"
|
|
94: }
|
|
95: },
|
|
96: {
|
|
97: "field": "locality",
|
|
98: "key": "aslanduz",
|
|
99: "name": {
|
|
100: "en": "Aslan Duz",
|
|
101: "fa": "اصلاندوز",
|
|
102: "de": "Aslan Duz"
|
|
103: }
|
|
104: },
|
|
105: {
|
|
106: "field": "locality",
|
|
107: "key": "bilehsavar",
|
|
108: "name": {
|
|
109: "en": "Bileh Savar",
|
|
110: "fa": "بیلهسوار",
|
|
111: "de": "Bileh Savar"
|
|
112: }
|
|
113: },
|
|
114: {
|
|
115: "field": "locality",
|
|
116: "key": "germi",
|
|
117: "name": {
|
|
118: "en": "Germi",
|
|
119: "fa": "گرمی",
|
|
120: "de": "Germi"
|
|
121: }
|
|
122: },
|
|
123: {
|
|
124: "field": "locality",
|
|
125: "key": "khalkhal",
|
|
126: "name": {
|
|
127: "en": "Khalkhal",
|
|
128: "fa": "خلخال",
|
|
129: "de": "Khalkhal"
|
|
130: }
|
|
131: },
|
|
132: {
|
|
133: "field": "locality",
|
|
134: "key": "kowsar",
|
|
135: "name": {
|
|
136: "en": "Kowsar",
|
|
137: "fa": "کوثر",
|
|
138: "de": "Kowsar"
|
|
139: }
|
|
140: },
|
|
141: {
|
|
142: "field": "locality",
|
|
143: "key": "meshginshahr",
|
|
144: "name": {
|
|
145: "en": "Meshgin Shahr",
|
|
146: "fa": "مشگینشهر",
|
|
147: "de": "Meshgin Shahr"
|
|
148: }
|
|
149: },
|
|
150: {
|
|
151: "field": "locality",
|
|
152: "key": "namin",
|
|
153: "name": {
|
|
154: "en": "Namin",
|
|
155: "fa": "نمین",
|
|
156: "de": "Namin"
|
|
157: }
|
|
158: },
|
|
159: {
|
|
160: "field": "locality",
|
|
161: "key": "nir",
|
|
162: "name": {
|
|
163: "en": "Nir",
|
|
164: "fa": "نیر",
|
|
165: "de": "Nir"
|
|
166: }
|
|
167: },
|
|
168: {
|
|
169: "field": "locality",
|
|
170: "key": "parsabad",
|
|
171: "name": {
|
|
172: "en": "Parsabad",
|
|
173: "fa": "پارسآباد",
|
|
174: "de": "Parsabad"
|
|
175: }
|
|
176: },
|
|
177: {
|
|
178: "field": "locality",
|
|
179: "key": "sareyn",
|
|
180: "name": {
|
|
181: "en": "Sareyn",
|
|
182: "fa": "سرعین",
|
|
183: "de": "Sareyn"
|
|
184: }
|
|
185: },
|
|
186: {
|
|
187: "field": "locality",
|
|
188: "key": "ungut",
|
|
189: "name": {
|
|
190: "en": "Ungut",
|
|
191: "fa": "انگوت",
|
|
192: "de": "Ungut"
|
|
193: }
|
|
194: }
|
|
195: ]
|
|
196: },
|
|
197: {
|
|
198: "countryCode": "IR",
|
|
199: "field": "administrative_area",
|
|
200: "key": "bushehr",
|
|
201: "name": {
|
|
202: "en": "Bushehr",
|
|
203: "fa": "بوشهر",
|
|
204: "de": "Buschehr"
|
|
205: },
|
|
206: "children": [
|
|
207: {
|
|
208: "field": "locality",
|
|
209: "key": "asaluyeh",
|
|
210: "name": {
|
|
211: "en": "Asaluyeh",
|
|
212: "fa": "عسلویه",
|
|
213: "de": "Asaluyeh"
|
|
214: }
|
|
215: },
|
|
216: {
|
|
217: "field": "locality",
|
|
218: "key": "bushehr",
|
|
219: "name": {
|
|
220: "en": "Bushehr",
|
|
221: "fa": "بوشهر",
|
|
222: "de": "Buschehr"
|
|
223: }
|
|
224: },
|
|
225: {
|
|
226: "field": "locality",
|
|
227: "key": "dashtestan",
|
|
228: "name": {
|
|
229: "en": "Dashtestan",
|
|
230: "fa": "دشتستان",
|
|
231: "de": "Dashtestan"
|
|
232: }
|
|
233: },
|
|
234: {
|
|
235: "field": "locality",
|
|
236: "key": "dashti",
|
|
237: "name": {
|
|
238: "en": "Dashti",
|
|
239: "fa": "دشتی",
|
|
240: "de": "Dashti"
|
|
241: }
|
|
242: },
|
|
243: {
|
|
244: "field": "locality",
|
|
245: "key": "deylam",
|
|
246: "name": {
|
|
247: "en": "Deylam",
|
|
248: "fa": "دیلم",
|
|
249: "de": "Deylam"
|
|
250: }
|
|
251: },
|
|
252: {
|
|
253: "field": "locality",
|
|
254: "key": "deyr",
|
|
255: "name": {
|
|
256: "en": "Deyr",
|
|
257: "fa": "دیر",
|
|
258: "de": "Deyr"
|
|
259: }
|
|
260: },
|
|
261: {
|
|
262: "field": "locality",
|
|
263: "key": "ganaveh",
|
|
264: "name": {
|
|
265: "en": "Ganaveh",
|
|
266: "fa": "گناوه",
|
|
267: "de": "Ganaveh"
|
|
268: }
|
|
269: },
|
|
270: {
|
|
271: "field": "locality",
|
|
272: "key": "jam",
|
|
273: "name": {
|
|
274: "en": "Jam",
|
|
275: "fa": "جم",
|
|
276: "de": "Jam"
|
|
277: }
|
|
278: },
|
|
279: {
|
|
280: "field": "locality",
|
|
281: "key": "kangan",
|
|
282: "name": {
|
|
283: "en": "Kangan",
|
|
284: "fa": "کنگان",
|
|
285: "de": "Kangan"
|
|
286: }
|
|
287: },
|
|
288: {
|
|
289: "field": "locality",
|
|
290: "key": "tangestan",
|
|
291: "name": {
|
|
292: "en": "Tangestan",
|
|
293: "fa": "تنگستان",
|
|
294: "de": "Tangestan"
|
|
295: }
|
|
296: }
|
|
297: ]
|
|
298: },
|
|
299: {
|
|
300: "countryCode": "IR",
|
|
301: "field": "administrative_area",
|
|
302: "key": "chaharmahalandbakhtiari",
|
|
303: "name": {
|
|
304: "en": "Chaharmahal and Bakhtiari",
|
|
305: "fa": "چهارمحال و بختیاری",
|
|
306: "de": "Tschahar Mahal und Bachtiari"
|
|
307: },
|
|
308: "children": [
|
|
309: {
|
|
310: "field": "locality",
|
|
311: "key": "ardal",
|
|
312: "name": {
|
|
313: "en": "Ardal",
|
|
314: "fa": "اردل",
|
|
315: "de": "Ardal"
|
|
316: }
|
|
317: },
|
|
318: {
|
|
319: "field": "locality",
|
|
320: "key": "ben",
|
|
321: "name": {
|
|
322: "en": "Ben",
|
|
323: "fa": "بن",
|
|
324: "de": "Ben"
|
|
325: }
|
|
326: },
|
|
327: {
|
|
328: "field": "locality",
|
|
329: "key": "borujen",
|
|
330: "name": {
|
|
331: "en": "Borujen",
|
|
332: "fa": "بروجن",
|
|
333: "de": "Borujen"
|
|
334: }
|
|
335: },
|
|
336: {
|
|
337: "field": "locality",
|
|
338: "key": "falard",
|
|
339: "name": {
|
|
340: "en": "Falard",
|
|
341: "fa": "فلارد",
|
|
342: "de": "Falard"
|
|
343: }
|
|
344: },
|
|
345: {
|
|
346: "field": "locality",
|
|
347: "key": "farrokhshahr",
|
|
348: "name": {
|
|
349: "en": "Farrokhshahr",
|
|
350: "fa": "فرخشهر",
|
|
351: "de": "Farrokhshahr"
|
|
352: }
|
|
353: },
|
|
354: {
|
|
355: "field": "locality",
|
|
356: "key": "farsan",
|
|
357: "name": {
|
|
358: "en": "Farsan",
|
|
359: "fa": "فارسان",
|
|
360: "de": "Farsan"
|
|
361: }
|
|
362: },
|
|
363: {
|
|
364: "field": "locality",
|
|
365: "key": "khanmirza",
|
|
366: "name": {
|
|
367: "en": "Khanmirza",
|
|
368: "fa": "خانمیرزا",
|
|
369: "de": "Khanmirza"
|
|
370: }
|
|
371: },
|
|
372: {
|
|
373: "field": "locality",
|
|
374: "key": "kiar",
|
|
375: "name": {
|
|
376: "en": "Kiar",
|
|
377: "fa": "کیار",
|
|
378: "de": "Kiar"
|
|
379: }
|
|
380: },
|
|
381: {
|
|
382: "field": "locality",
|
|
383: "key": "kuhrang",
|
|
384: "name": {
|
|
385: "en": "Kuhrang",
|
|
386: "fa": "کوهرنگ",
|
|
387: "de": "Kuhrang"
|
|
388: }
|
|
389: },
|
|
390: {
|
|
391: "field": "locality",
|
|
392: "key": "lordegan",
|
|
393: "name": {
|
|
394: "en": "Lordegan",
|
|
395: "fa": "لردگان",
|
|
396: "de": "Lordegan"
|
|
397: }
|
|
398: },
|
|
399: {
|
|
400: "field": "locality",
|
|
401: "key": "saman",
|
|
402: "name": {
|
|
403: "en": "Saman",
|
|
404: "fa": "سامان",
|
|
405: "de": "Saman"
|
|
406: }
|
|
407: },
|
|
408: {
|
|
409: "field": "locality",
|
|
410: "key": "shahrekord",
|
|
411: "name": {
|
|
412: "en": "Shahrekord",
|
|
413: "fa": "شهرکرد",
|
|
414: "de": "Shahrekord"
|
|
415: }
|
|
416: }
|
|
417: ]
|
|
418: },
|
|
419: {
|
|
420: "countryCode": "IR",
|
|
421: "field": "administrative_area",
|
|
422: "key": "eastazerbaijan",
|
|
423: "name": {
|
|
424: "en": "East Azerbaijan",
|
|
425: "fa": "آذربایجان شرقی",
|
|
426: "de": "Ost-Aserbaidschan"
|
|
427: },
|
|
428: "children": [
|
|
429: {
|
|
430: "field": "locality",
|
|
431: "key": "ahar",
|
|
432: "name": {
|
|
433: "en": "Ahar",
|
|
434: "fa": "اهر",
|
|
435: "de": "Ahar"
|
|
436: }
|
|
437: },
|
|
438: {
|
|
439: "field": "locality",
|
|
440: "key": "ajabshir",
|
|
441: "name": {
|
|
442: "en": "Ajab Shir",
|
|
443: "fa": "عجبشیر",
|
|
444: "de": "Ajab Shir"
|
|
445: }
|
|
446: },
|
|
447: {
|
|
448: "field": "locality",
|
|
449: "key": "azarshahr",
|
|
450: "name": {
|
|
451: "en": "Azarshahr",
|
|
452: "fa": "آذرشهر",
|
|
453: "de": "Azarshahr"
|
|
454: }
|
|
455: },
|
|
456: {
|
|
457: "field": "locality",
|
|
458: "key": "bonab",
|
|
459: "name": {
|
|
460: "en": "Bonab",
|
|
461: "fa": "بناب",
|
|
462: "de": "Bonab"
|
|
463: }
|
|
464: },
|
|
465: {
|
|
466: "field": "locality",
|
|
467: "key": "bostanabad",
|
|
468: "name": {
|
|
469: "en": "Bostanabad",
|
|
470: "fa": "بستانآباد",
|
|
471: "de": "Bostanabad"
|
|
472: }
|
|
473: },
|
|
474: {
|
|
475: "field": "locality",
|
|
476: "key": "charuymaq",
|
|
477: "name": {
|
|
478: "en": "Charuymaq",
|
|
479: "fa": "چاروایماق",
|
|
480: "de": "Charuymaq"
|
|
481: }
|
|
482: },
|
|
483: {
|
|
484: "field": "locality",
|
|
485: "key": "hashtrud",
|
|
486: "name": {
|
|
487: "en": "Hashtrud",
|
|
488: "fa": "هشترود",
|
|
489: "de": "Hashtrud"
|
|
490: }
|
|
491: },
|
|
492: {
|
|
493: "field": "locality",
|
|
494: "key": "heris",
|
|
495: "name": {
|
|
496: "en": "Heris",
|
|
497: "fa": "هریس",
|
|
498: "de": "Heris"
|
|
499: }
|
|
500: },
|
|
501: {
|
|
502: "field": "locality",
|
|
503: "key": "hurand",
|
|
504: "name": {
|
|
505: "en": "Hurand",
|
|
506: "fa": "هوراند",
|
|
507: "de": "Hurand"
|
|
508: }
|
|
509: },
|
|
510: {
|
|
511: "field": "locality",
|
|
512: "key": "jolfa",
|
|
513: "name": {
|
|
514: "en": "Jolfa",
|
|
515: "fa": "جلفا",
|
|
516: "de": "Jolfa"
|
|
517: }
|
|
518: },
|
|
519: {
|
|
520: "field": "locality",
|
|
521: "key": "kaleybar",
|
|
522: "name": {
|
|
523: "en": "Kaleybar",
|
|
524: "fa": "کلیبر",
|
|
525: "de": "Kaleybar"
|
|
526: }
|
|
527: },
|
|
528: {
|
|
529: "field": "locality",
|
|
530: "key": "khodaafarin",
|
|
531: "name": {
|
|
532: "en": "Khoda Afarin",
|
|
533: "fa": "خداآفرین",
|
|
534: "de": "Khoda Afarin"
|
|
535: }
|
|
536: },
|
|
537: {
|
|
538: "field": "locality",
|
|
539: "key": "malekan",
|
|
540: "name": {
|
|
541: "en": "Malekan",
|
|
542: "fa": "ملکان",
|
|
543: "de": "Malekan"
|
|
544: }
|
|
545: },
|
|
546: {
|
|
547: "field": "locality",
|
|
548: "key": "maragheh",
|
|
549: "name": {
|
|
550: "en": "Maragheh",
|
|
551: "fa": "مراغه",
|
|
552: "de": "Maragheh"
|
|
553: }
|
|
554: },
|
|
555: {
|
|
556: "field": "locality",
|
|
557: "key": "marand",
|
|
558: "name": {
|
|
559: "en": "Marand",
|
|
560: "fa": "مرند",
|
|
561: "de": "Marand"
|
|
562: }
|
|
563: },
|
|
564: {
|
|
565: "field": "locality",
|
|
566: "key": "mianeh",
|
|
567: "name": {
|
|
568: "en": "Mianeh",
|
|
569: "fa": "میانه",
|
|
570: "de": "Mianeh"
|
|
571: }
|
|
572: },
|
|
573: {
|
|
574: "field": "locality",
|
|
575: "key": "osku",
|
|
576: "name": {
|
|
577: "en": "Osku",
|
|
578: "fa": "اسکو",
|
|
579: "de": "Osku"
|
|
580: }
|
|
581: },
|
|
582: {
|
|
583: "field": "locality",
|
|
584: "key": "sarab",
|
|
585: "name": {
|
|
586: "en": "Sarab",
|
|
587: "fa": "سراب",
|
|
588: "de": "Sarab"
|
|
589: }
|
|
590: },
|
|
591: {
|
|
592: "field": "locality",
|
|
593: "key": "shabestar",
|
|
594: "name": {
|
|
595: "en": "Shabestar",
|
|
596: "fa": "شبستر",
|
|
597: "de": "Shabestar"
|
|
598: }
|
|
599: },
|
|
600: {
|
|
601: "field": "locality",
|
|
602: "key": "tabriz",
|
|
603: "name": {
|
|
604: "en": "Tabriz",
|
|
605: "fa": "تبریز",
|
|
606: "de": "Täbris"
|
|
607: }
|
|
608: },
|
|
609: {
|
|
610: "field": "locality",
|
|
611: "key": "varzaqan",
|
|
612: "name": {
|
|
613: "en": "Varzaqan",
|
|
614: "fa": "ورزقان",
|
|
615: "de": "Varzaqan"
|
|
616: }
|
|
617: }
|
|
618: ]
|
|
619: },
|
|
620: {
|
|
621: "countryCode": "IR",
|
|
622: "field": "administrative_area",
|
|
623: "key": "fars",
|
|
624: "name": {
|
|
625: "en": "Fars",
|
|
626: "fa": "فارس",
|
|
627: "de": "Fars"
|
|
628: },
|
|
629: "children": [
|
|
630: {
|
|
631: "field": "locality",
|
|
632: "key": "abadeh",
|
|
633: "name": {
|
|
634: "en": "Abadeh",
|
|
635: "fa": "آباده",
|
|
636: "de": "Abadeh"
|
|
637: }
|
|
638: },
|
|
639: {
|
|
640: "field": "locality",
|
|
641: "key": "arsanjan",
|
|
642: "name": {
|
|
643: "en": "Arsanjan",
|
|
644: "fa": "ارسنجان",
|
|
645: "de": "Arsanjan"
|
|
646: }
|
|
647: },
|
|
648: {
|
|
649: "field": "locality",
|
|
650: "key": "bakhtegan",
|
|
651: "name": {
|
|
652: "en": "Bakhtegan",
|
|
653: "fa": "بختگان",
|
|
654: "de": "Bakhtegan"
|
|
655: }
|
|
656: },
|
|
657: {
|
|
658: "field": "locality",
|
|
659: "key": "bavanat",
|
|
660: "name": {
|
|
661: "en": "Bavanat",
|
|
662: "fa": "بوانات",
|
|
663: "de": "Bavanat"
|
|
664: }
|
|
665: },
|
|
666: {
|
|
667: "field": "locality",
|
|
668: "key": "beyza",
|
|
669: "name": {
|
|
670: "en": "Beyza",
|
|
671: "fa": "بیضا",
|
|
672: "de": "Beyza"
|
|
673: }
|
|
674: },
|
|
675: {
|
|
676: "field": "locality",
|
|
677: "key": "darab",
|
|
678: "name": {
|
|
679: "en": "Darab",
|
|
680: "fa": "داراب",
|
|
681: "de": "Darab"
|
|
682: }
|
|
683: },
|
|
684: {
|
|
685: "field": "locality",
|
|
686: "key": "eqlid",
|
|
687: "name": {
|
|
688: "en": "Eqlid",
|
|
689: "fa": "اقلید",
|
|
690: "de": "Eqlid"
|
|
691: }
|
|
692: },
|
|
693: {
|
|
694: "field": "locality",
|
|
695: "key": "estahban",
|
|
696: "name": {
|
|
697: "en": "Estahban",
|
|
698: "fa": "استهبان",
|
|
699: "de": "Estahban"
|
|
700: }
|
|
701: },
|
|
702: {
|
|
703: "field": "locality",
|
|
704: "key": "evaz",
|
|
705: "name": {
|
|
706: "en": "Evaz",
|
|
707: "fa": "اوز",
|
|
708: "de": "Evaz"
|
|
709: }
|
|
710: },
|
|
711: {
|
|
712: "field": "locality",
|
|
713: "key": "farashband",
|
|
714: "name": {
|
|
715: "en": "Farashband",
|
|
716: "fa": "فراشبند",
|
|
717: "de": "Farashband"
|
|
718: }
|
|
719: },
|
|
720: {
|
|
721: "field": "locality",
|
|
722: "key": "fasa",
|
|
723: "name": {
|
|
724: "en": "Fasa",
|
|
725: "fa": "فسا",
|
|
726: "de": "Fasa"
|
|
727: }
|
|
728: },
|
|
729: {
|
|
730: "field": "locality",
|
|
731: "key": "firuzabad",
|
|
732: "name": {
|
|
733: "en": "Firuzabad",
|
|
734: "fa": "فیروزآباد",
|
|
735: "de": "Firuzabad"
|
|
736: }
|
|
737: },
|
|
738: {
|
|
739: "field": "locality",
|
|
740: "key": "gerash",
|
|
741: "name": {
|
|
742: "en": "Gerash",
|
|
743: "fa": "گراش",
|
|
744: "de": "Gerash"
|
|
745: }
|
|
746: },
|
|
747: {
|
|
748: "field": "locality",
|
|
749: "key": "jahrom",
|
|
750: "name": {
|
|
751: "en": "Jahrom",
|
|
752: "fa": "جهرم",
|
|
753: "de": "Jahrom"
|
|
754: }
|
|
755: },
|
|
756: {
|
|
757: "field": "locality",
|
|
758: "key": "juyom",
|
|
759: "name": {
|
|
760: "en": "Juyom",
|
|
761: "fa": "جویم",
|
|
762: "de": "Juyom"
|
|
763: }
|
|
764: },
|
|
765: {
|
|
766: "field": "locality",
|
|
767: "key": "kavar",
|
|
768: "name": {
|
|
769: "en": "Kavar",
|
|
770: "fa": "کوار",
|
|
771: "de": "Kavar"
|
|
772: }
|
|
773: },
|
|
774: {
|
|
775: "field": "locality",
|
|
776: "key": "kazerun",
|
|
777: "name": {
|
|
778: "en": "Kazerun",
|
|
779: "fa": "کازرون",
|
|
780: "de": "Kazerun"
|
|
781: }
|
|
782: },
|
|
783: {
|
|
784: "field": "locality",
|
|
785: "key": "khafr",
|
|
786: "name": {
|
|
787: "en": "Khafr",
|
|
788: "fa": "خفر",
|
|
789: "de": "Khafr"
|
|
790: }
|
|
791: },
|
|
792: {
|
|
793: "field": "locality",
|
|
794: "key": "kharameh",
|
|
795: "name": {
|
|
796: "en": "Kharameh",
|
|
797: "fa": "خرامه",
|
|
798: "de": "Kharameh"
|
|
799: }
|
|
800: },
|
|
801: {
|
|
802: "field": "locality",
|
|
803: "key": "khonj",
|
|
804: "name": {
|
|
805: "en": "Khonj",
|
|
806: "fa": "خنج",
|
|
807: "de": "Khonj"
|
|
808: }
|
|
809: },
|
|
810: {
|
|
811: "field": "locality",
|
|
812: "key": "khorrambid",
|
|
813: "name": {
|
|
814: "en": "Khorrambid",
|
|
815: "fa": "خرمبید",
|
|
816: "de": "Khorrambid"
|
|
817: }
|
|
818: },
|
|
819: {
|
|
820: "field": "locality",
|
|
821: "key": "kuhchenar",
|
|
822: "name": {
|
|
823: "en": "Kuhchenar",
|
|
824: "fa": "کوهچنار",
|
|
825: "de": "Kuhchenar"
|
|
826: }
|
|
827: },
|
|
828: {
|
|
829: "field": "locality",
|
|
830: "key": "lamerd",
|
|
831: "name": {
|
|
832: "en": "Lamerd",
|
|
833: "fa": "لامرد",
|
|
834: "de": "Lamerd"
|
|
835: }
|
|
836: },
|
|
837: {
|
|
838: "field": "locality",
|
|
839: "key": "larestan",
|
|
840: "name": {
|
|
841: "en": "Larestan",
|
|
842: "fa": "لارستان",
|
|
843: "de": "Larestan"
|
|
844: }
|
|
845: },
|
|
846: {
|
|
847: "field": "locality",
|
|
848: "key": "mamasani",
|
|
849: "name": {
|
|
850: "en": "Mamasani",
|
|
851: "fa": "ممسنی",
|
|
852: "de": "Mamasani"
|
|
853: }
|
|
854: },
|
|
855: {
|
|
856: "field": "locality",
|
|
857: "key": "marvdasht",
|
|
858: "name": {
|
|
859: "en": "Marvdasht",
|
|
860: "fa": "مرودشت",
|
|
861: "de": "Marvdasht"
|
|
862: }
|
|
863: },
|
|
864: {
|
|
865: "field": "locality",
|
|
866: "key": "mohr",
|
|
867: "name": {
|
|
868: "en": "Mohr",
|
|
869: "fa": "مهر",
|
|
870: "de": "Mohr"
|
|
871: }
|
|
872: },
|
|
873: {
|
|
874: "field": "locality",
|
|
875: "key": "neyriz",
|
|
876: "name": {
|
|
877: "en": "Neyriz",
|
|
878: "fa": "نیریز",
|
|
879: "de": "Neyriz"
|
|
880: }
|
|
881: },
|
|
882: {
|
|
883: "field": "locality",
|
|
884: "key": "pasargad",
|
|
885: "name": {
|
|
886: "en": "Pasargad",
|
|
887: "fa": "پاسارگاد",
|
|
888: "de": "Pasargad"
|
|
889: }
|
|
890: },
|
|
891: {
|
|
892: "field": "locality",
|
|
893: "key": "qirandkarzin",
|
|
894: "name": {
|
|
895: "en": "Qir and Karzin",
|
|
896: "fa": "قیر و کارزین",
|
|
897: "de": "Qir and Karzin"
|
|
898: }
|
|
899: },
|
|
900: {
|
|
901: "field": "locality",
|
|
902: "key": "rostam",
|
|
903: "name": {
|
|
904: "en": "Rostam",
|
|
905: "fa": "رستم",
|
|
906: "de": "Rostam"
|
|
907: }
|
|
908: },
|
|
909: {
|
|
910: "field": "locality",
|
|
911: "key": "sarchehan",
|
|
912: "name": {
|
|
913: "en": "Sarchehan",
|
|
914: "fa": "سرچهان",
|
|
915: "de": "Sarchehan"
|
|
916: }
|
|
917: },
|
|
918: {
|
|
919: "field": "locality",
|
|
920: "key": "sarvestan",
|
|
921: "name": {
|
|
922: "en": "Sarvestan",
|
|
923: "fa": "سروستان",
|
|
924: "de": "Sarvestan"
|
|
925: }
|
|
926: },
|
|
927: {
|
|
928: "field": "locality",
|
|
929: "key": "sepidan",
|
|
930: "name": {
|
|
931: "en": "Sepidan",
|
|
932: "fa": "سپیدان",
|
|
933: "de": "Sepidan"
|
|
934: }
|
|
935: },
|
|
936: {
|
|
937: "field": "locality",
|
|
938: "key": "shiraz",
|
|
939: "name": {
|
|
940: "en": "Shiraz",
|
|
941: "fa": "شیراز",
|
|
942: "de": "Schiras"
|
|
943: }
|
|
944: },
|
|
945: {
|
|
946: "field": "locality",
|
|
947: "key": "zarqan",
|
|
948: "name": {
|
|
949: "en": "Zarqan",
|
|
950: "fa": "زرقان",
|
|
951: "de": "Zarqan"
|
|
952: }
|
|
953: },
|
|
954: {
|
|
955: "field": "locality",
|
|
956: "key": "zarrindasht",
|
|
957: "name": {
|
|
958: "en": "Zarrin Dasht",
|
|
959: "fa": "زریندشت",
|
|
960: "de": "Zarrin Dasht"
|
|
961: }
|
|
962: }
|
|
963: ]
|
|
964: },
|
|
965: {
|
|
966: "countryCode": "IR",
|
|
967: "field": "administrative_area",
|
|
968: "key": "gilan",
|
|
969: "name": {
|
|
970: "en": "Gilan",
|
|
971: "fa": "گیلان",
|
|
972: "de": "Gilan"
|
|
973: },
|
|
974: "children": [
|
|
975: {
|
|
976: "field": "locality",
|
|
977: "key": "amlash",
|
|
978: "name": {
|
|
979: "en": "Amlash",
|
|
980: "fa": "املش",
|
|
981: "de": "Amlash"
|
|
982: }
|
|
983: },
|
|
984: {
|
|
985: "field": "locality",
|
|
986: "key": "astanehyeashrafiyeh",
|
|
987: "name": {
|
|
988: "en": "Astaneh-ye Ashrafiyeh",
|
|
989: "fa": "آستانهاشرفیه",
|
|
990: "de": "Astaneh-ye Ashrafiyeh"
|
|
991: }
|
|
992: },
|
|
993: {
|
|
994: "field": "locality",
|
|
995: "key": "astara",
|
|
996: "name": {
|
|
997: "en": "Astara",
|
|
998: "fa": "آستارا",
|
|
999: "de": "Astara"
|
|
1000: }
|
|
1001: },
|
|
1002: {
|
|
1003: "field": "locality",
|
|
1004: "key": "bandareanzali",
|
|
1005: "name": {
|
|
1006: "en": "Bandar-e Anzali",
|
|
1007: "fa": "بندر انزلی",
|
|
1008: "de": "Bandar-e Anzali"
|
|
1009: }
|
|
1010: },
|
|
1011: {
|
|
1012: "field": "locality",
|
|
1013: "key": "fuman",
|
|
1014: "name": {
|
|
1015: "en": "Fuman",
|
|
1016: "fa": "فومن",
|
|
1017: "de": "Fuman"
|
|
1018: }
|
|
1019: },
|
|
1020: {
|
|
1021: "field": "locality",
|
|
1022: "key": "khomam",
|
|
1023: "name": {
|
|
1024: "en": "Khomam",
|
|
1025: "fa": "خمام",
|
|
1026: "de": "Khomam"
|
|
1027: }
|
|
1028: },
|
|
1029: {
|
|
1030: "field": "locality",
|
|
1031: "key": "lahijan",
|
|
1032: "name": {
|
|
1033: "en": "Lahijan",
|
|
1034: "fa": "لاهیجان",
|
|
1035: "de": "Lahijan"
|
|
1036: }
|
|
1037: },
|
|
1038: {
|
|
1039: "field": "locality",
|
|
1040: "key": "langarud",
|
|
1041: "name": {
|
|
1042: "en": "Langarud",
|
|
1043: "fa": "لنگرود",
|
|
1044: "de": "Langarud"
|
|
1045: }
|
|
1046: },
|
|
1047: {
|
|
1048: "field": "locality",
|
|
1049: "key": "masal",
|
|
1050: "name": {
|
|
1051: "en": "Masal",
|
|
1052: "fa": "ماسال",
|
|
1053: "de": "Masal"
|
|
1054: }
|
|
1055: },
|
|
1056: {
|
|
1057: "field": "locality",
|
|
1058: "key": "rasht",
|
|
1059: "name": {
|
|
1060: "en": "Rasht",
|
|
1061: "fa": "رشت",
|
|
1062: "de": "Rasht"
|
|
1063: }
|
|
1064: },
|
|
1065: {
|
|
1066: "field": "locality",
|
|
1067: "key": "rezvanshahr",
|
|
1068: "name": {
|
|
1069: "en": "Rezvanshahr",
|
|
1070: "fa": "رضوانشهر",
|
|
1071: "de": "Rezvanshahr"
|
|
1072: }
|
|
1073: },
|
|
1074: {
|
|
1075: "field": "locality",
|
|
1076: "key": "rudbar",
|
|
1077: "name": {
|
|
1078: "en": "Rudbar",
|
|
1079: "fa": "رودبار",
|
|
1080: "de": "Rudbar"
|
|
1081: }
|
|
1082: },
|
|
1083: {
|
|
1084: "field": "locality",
|
|
1085: "key": "rudsar",
|
|
1086: "name": {
|
|
1087: "en": "Rudsar",
|
|
1088: "fa": "رودسر",
|
|
1089: "de": "Rudsar"
|
|
1090: }
|
|
1091: },
|
|
1092: {
|
|
1093: "field": "locality",
|
|
1094: "key": "shaft",
|
|
1095: "name": {
|
|
1096: "en": "Shaft",
|
|
1097: "fa": "شفت",
|
|
1098: "de": "Shaft"
|
|
1099: }
|
|
1100: },
|
|
1101: {
|
|
1102: "field": "locality",
|
|
1103: "key": "siahkal",
|
|
1104: "name": {
|
|
1105: "en": "Siahkal",
|
|
1106: "fa": "سیاهکل",
|
|
1107: "de": "Siahkal"
|
|
1108: }
|
|
1109: },
|
|
1110: {
|
|
1111: "field": "locality",
|
|
1112: "key": "sowmeehsara",
|
|
1113: "name": {
|
|
1114: "en": "Sowme'eh Sara",
|
|
1115: "fa": "صومعهسرا",
|
|
1116: "de": "Sowme'eh Sara"
|
|
1117: }
|
|
1118: },
|
|
1119: {
|
|
1120: "field": "locality",
|
|
1121: "key": "talesh",
|
|
1122: "name": {
|
|
1123: "en": "Talesh",
|
|
1124: "fa": "تالش",
|
|
1125: "de": "Talesh"
|
|
1126: }
|
|
1127: }
|
|
1128: ]
|
|
1129: },
|
|
1130: {
|
|
1131: "countryCode": "IR",
|
|
1132: "field": "administrative_area",
|
|
1133: "key": "golestan",
|
|
1134: "name": {
|
|
1135: "en": "Golestan",
|
|
1136: "fa": "گلستان",
|
|
1137: "de": "Golestan"
|
|
1138: },
|
|
1139: "children": [
|
|
1140: {
|
|
1141: "field": "locality",
|
|
1142: "key": "aliabad",
|
|
1143: "name": {
|
|
1144: "en": "Aliabad",
|
|
1145: "fa": "علیآباد کتول",
|
|
1146: "de": "Aliabad"
|
|
1147: }
|
|
1148: },
|
|
1149: {
|
|
1150: "field": "locality",
|
|
1151: "key": "aqqala",
|
|
1152: "name": {
|
|
1153: "en": "Aqqala",
|
|
1154: "fa": "آققلا",
|
|
1155: "de": "Aqqala"
|
|
1156: }
|
|
1157: },
|
|
1158: {
|
|
1159: "field": "locality",
|
|
1160: "key": "azadshahr",
|
|
1161: "name": {
|
|
1162: "en": "Azadshahr",
|
|
1163: "fa": "آزادشهر",
|
|
1164: "de": "Azadshahr"
|
|
1165: }
|
|
1166: },
|
|
1167: {
|
|
1168: "field": "locality",
|
|
1169: "key": "bandaregaz",
|
|
1170: "name": {
|
|
1171: "en": "Bandar-e Gaz",
|
|
1172: "fa": "بندر گز",
|
|
1173: "de": "Bandar-e Gaz"
|
|
1174: }
|
|
1175: },
|
|
1176: {
|
|
1177: "field": "locality",
|
|
1178: "key": "galikash",
|
|
1179: "name": {
|
|
1180: "en": "Galikash",
|
|
1181: "fa": "گالیکش",
|
|
1182: "de": "Galikash"
|
|
1183: }
|
|
1184: },
|
|
1185: {
|
|
1186: "field": "locality",
|
|
1187: "key": "gomishan",
|
|
1188: "name": {
|
|
1189: "en": "Gomishan",
|
|
1190: "fa": "گمیشان",
|
|
1191: "de": "Gomishan"
|
|
1192: }
|
|
1193: },
|
|
1194: {
|
|
1195: "field": "locality",
|
|
1196: "key": "gonbadekavus",
|
|
1197: "name": {
|
|
1198: "en": "Gonbad-e Kavus",
|
|
1199: "fa": "گنبد کاووس",
|
|
1200: "de": "Gonbad-e Kavus"
|
|
1201: }
|
|
1202: },
|
|
1203: {
|
|
1204: "field": "locality",
|
|
1205: "key": "gorgan",
|
|
1206: "name": {
|
|
1207: "en": "Gorgan",
|
|
1208: "fa": "گرگان",
|
|
1209: "de": "Gorgan"
|
|
1210: }
|
|
1211: },
|
|
1212: {
|
|
1213: "field": "locality",
|
|
1214: "key": "kalaleh",
|
|
1215: "name": {
|
|
1216: "en": "Kalaleh",
|
|
1217: "fa": "کلاله",
|
|
1218: "de": "Kalaleh"
|
|
1219: }
|
|
1220: },
|
|
1221: {
|
|
1222: "field": "locality",
|
|
1223: "key": "kordkuy",
|
|
1224: "name": {
|
|
1225: "en": "Kordkuy",
|
|
1226: "fa": "کردکوی",
|
|
1227: "de": "Kordkuy"
|
|
1228: }
|
|
1229: },
|
|
1230: {
|
|
1231: "field": "locality",
|
|
1232: "key": "maravehtappeh",
|
|
1233: "name": {
|
|
1234: "en": "Maraveh Tappeh",
|
|
1235: "fa": "مراوهتپه",
|
|
1236: "de": "Maraveh Tappeh"
|
|
1237: }
|
|
1238: },
|
|
1239: {
|
|
1240: "field": "locality",
|
|
1241: "key": "minudasht",
|
|
1242: "name": {
|
|
1243: "en": "Minudasht",
|
|
1244: "fa": "مینودشت",
|
|
1245: "de": "Minudasht"
|
|
1246: }
|
|
1247: },
|
|
1248: {
|
|
1249: "field": "locality",
|
|
1250: "key": "ramian",
|
|
1251: "name": {
|
|
1252: "en": "Ramian",
|
|
1253: "fa": "رامیان",
|
|
1254: "de": "Ramian"
|
|
1255: }
|
|
1256: },
|
|
1257: {
|
|
1258: "field": "locality",
|
|
1259: "key": "torkaman",
|
|
1260: "name": {
|
|
1261: "en": "Torkaman",
|
|
1262: "fa": "ترکمن",
|
|
1263: "de": "Torkaman"
|
|
1264: }
|
|
1265: }
|
|
1266: ]
|
|
1267: },
|
|
1268: {
|
|
1269: "countryCode": "IR",
|
|
1270: "field": "administrative_area",
|
|
1271: "key": "hamadan",
|
|
1272: "name": {
|
|
1273: "en": "Hamadan",
|
|
1274: "fa": "همدان",
|
|
1275: "de": "Hamadan"
|
|
1276: },
|
|
1277: "children": [
|
|
1278: {
|
|
1279: "field": "locality",
|
|
1280: "key": "asadabad",
|
|
1281: "name": {
|
|
1282: "en": "Asadabad",
|
|
1283: "fa": "اسدآباد",
|
|
1284: "de": "Asadabad"
|
|
1285: }
|
|
1286: },
|
|
1287: {
|
|
1288: "field": "locality",
|
|
1289: "key": "bahar",
|
|
1290: "name": {
|
|
1291: "en": "Bahar",
|
|
1292: "fa": "بهار",
|
|
1293: "de": "Bahar"
|
|
1294: }
|
|
1295: },
|
|
1296: {
|
|
1297: "field": "locality",
|
|
1298: "key": "dargazin",
|
|
1299: "name": {
|
|
1300: "en": "Dargazin",
|
|
1301: "fa": "درگزین",
|
|
1302: "de": "Dargazin"
|
|
1303: }
|
|
1304: },
|
|
1305: {
|
|
1306: "field": "locality",
|
|
1307: "key": "famenin",
|
|
1308: "name": {
|
|
1309: "en": "Famenin",
|
|
1310: "fa": "فامنین",
|
|
1311: "de": "Famenin"
|
|
1312: }
|
|
1313: },
|
|
1314: {
|
|
1315: "field": "locality",
|
|
1316: "key": "hamadan",
|
|
1317: "name": {
|
|
1318: "en": "Hamadan",
|
|
1319: "fa": "همدان",
|
|
1320: "de": "Hamadan"
|
|
1321: }
|
|
1322: },
|
|
1323: {
|
|
1324: "field": "locality",
|
|
1325: "key": "kabudarahang",
|
|
1326: "name": {
|
|
1327: "en": "Kabudarahang",
|
|
1328: "fa": "کبودراهنگ",
|
|
1329: "de": "Kabudarahang"
|
|
1330: }
|
|
1331: },
|
|
1332: {
|
|
1333: "field": "locality",
|
|
1334: "key": "malayer",
|
|
1335: "name": {
|
|
1336: "en": "Malayer",
|
|
1337: "fa": "ملایر",
|
|
1338: "de": "Malayer"
|
|
1339: }
|
|
1340: },
|
|
1341: {
|
|
1342: "field": "locality",
|
|
1343: "key": "nahavand",
|
|
1344: "name": {
|
|
1345: "en": "Nahavand",
|
|
1346: "fa": "نهاوند",
|
|
1347: "de": "Nahavand"
|
|
1348: }
|
|
1349: },
|
|
1350: {
|
|
1351: "field": "locality",
|
|
1352: "key": "razan",
|
|
1353: "name": {
|
|
1354: "en": "Razan",
|
|
1355: "fa": "رزن",
|
|
1356: "de": "Razan"
|
|
1357: }
|
|
1358: },
|
|
1359: {
|
|
1360: "field": "locality",
|
|
1361: "key": "tuyserkan",
|
|
1362: "name": {
|
|
1363: "en": "Tuyserkan",
|
|
1364: "fa": "تویسرکان",
|
|
1365: "de": "Tuyserkan"
|
|
1366: }
|
|
1367: }
|
|
1368: ]
|
|
1369: },
|
|
1370: {
|
|
1371: "countryCode": "IR",
|
|
1372: "field": "administrative_area",
|
|
1373: "key": "hormozgan",
|
|
1374: "name": {
|
|
1375: "en": "Hormozgan",
|
|
1376: "fa": "هرمزگان",
|
|
1377: "de": "Hormozgan"
|
|
1378: },
|
|
1379: "children": [
|
|
1380: {
|
|
1381: "field": "locality",
|
|
1382: "key": "abumusa",
|
|
1383: "name": {
|
|
1384: "en": "Abumusa",
|
|
1385: "fa": "ابوموسی",
|
|
1386: "de": "Abumusa"
|
|
1387: }
|
|
1388: },
|
|
1389: {
|
|
1390: "field": "locality",
|
|
1391: "key": "bandarabbas",
|
|
1392: "name": {
|
|
1393: "en": "Bandar Abbas",
|
|
1394: "fa": "بندرعباس",
|
|
1395: "de": "Bandar Abbas"
|
|
1396: }
|
|
1397: },
|
|
1398: {
|
|
1399: "field": "locality",
|
|
1400: "key": "bandarlengeh",
|
|
1401: "name": {
|
|
1402: "en": "Bandar Lengeh",
|
|
1403: "fa": "بندر لنگه",
|
|
1404: "de": "Bandar Lengeh"
|
|
1405: }
|
|
1406: },
|
|
1407: {
|
|
1408: "field": "locality",
|
|
1409: "key": "bashagard",
|
|
1410: "name": {
|
|
1411: "en": "Bashagard",
|
|
1412: "fa": "بشاگرد",
|
|
1413: "de": "Bashagard"
|
|
1414: }
|
|
1415: },
|
|
1416: {
|
|
1417: "field": "locality",
|
|
1418: "key": "bastak",
|
|
1419: "name": {
|
|
1420: "en": "Bastak",
|
|
1421: "fa": "بستک",
|
|
1422: "de": "Bastak"
|
|
1423: }
|
|
1424: },
|
|
1425: {
|
|
1426: "field": "locality",
|
|
1427: "key": "hajjiabad",
|
|
1428: "name": {
|
|
1429: "en": "Hajjiabad",
|
|
1430: "fa": "حاجیآباد",
|
|
1431: "de": "Hajjiabad"
|
|
1432: }
|
|
1433: },
|
|
1434: {
|
|
1435: "field": "locality",
|
|
1436: "key": "jask",
|
|
1437: "name": {
|
|
1438: "en": "Jask",
|
|
1439: "fa": "جاسک",
|
|
1440: "de": "Jask"
|
|
1441: }
|
|
1442: },
|
|
1443: {
|
|
1444: "field": "locality",
|
|
1445: "key": "khamir",
|
|
1446: "name": {
|
|
1447: "en": "Khamir",
|
|
1448: "fa": "بندر خمیر",
|
|
1449: "de": "Khamir"
|
|
1450: }
|
|
1451: },
|
|
1452: {
|
|
1453: "field": "locality",
|
|
1454: "key": "minab",
|
|
1455: "name": {
|
|
1456: "en": "Minab",
|
|
1457: "fa": "میناب",
|
|
1458: "de": "Minab"
|
|
1459: }
|
|
1460: },
|
|
1461: {
|
|
1462: "field": "locality",
|
|
1463: "key": "parsian",
|
|
1464: "name": {
|
|
1465: "en": "Parsian",
|
|
1466: "fa": "پارسیان",
|
|
1467: "de": "Parsian"
|
|
1468: }
|
|
1469: },
|
|
1470: {
|
|
1471: "field": "locality",
|
|
1472: "key": "qeshm",
|
|
1473: "name": {
|
|
1474: "en": "Qeshm",
|
|
1475: "fa": "قشم",
|
|
1476: "de": "Qeshm"
|
|
1477: }
|
|
1478: },
|
|
1479: {
|
|
1480: "field": "locality",
|
|
1481: "key": "rudan",
|
|
1482: "name": {
|
|
1483: "en": "Rudan",
|
|
1484: "fa": "رودان",
|
|
1485: "de": "Rudan"
|
|
1486: }
|
|
1487: },
|
|
1488: {
|
|
1489: "field": "locality",
|
|
1490: "key": "sirik",
|
|
1491: "name": {
|
|
1492: "en": "Sirik",
|
|
1493: "fa": "سیریک",
|
|
1494: "de": "Sirik"
|
|
1495: }
|
|
1496: }
|
|
1497: ]
|
|
1498: },
|
|
1499: {
|
|
1500: "countryCode": "IR",
|
|
1501: "field": "administrative_area",
|
|
1502: "key": "ilam",
|
|
1503: "name": {
|
|
1504: "en": "Ilam",
|
|
1505: "fa": "ایلام",
|
|
1506: "de": "Ilam"
|
|
1507: },
|
|
1508: "children": [
|
|
1509: {
|
|
1510: "field": "locality",
|
|
1511: "key": "abdanan",
|
|
1512: "name": {
|
|
1513: "en": "Abdanan",
|
|
1514: "fa": "آبدانان",
|
|
1515: "de": "Abdanan"
|
|
1516: }
|
|
1517: },
|
|
1518: {
|
|
1519: "field": "locality",
|
|
1520: "key": "badreh",
|
|
1521: "name": {
|
|
1522: "en": "Badreh",
|
|
1523: "fa": "بدره",
|
|
1524: "de": "Badreh"
|
|
1525: }
|
|
1526: },
|
|
1527: {
|
|
1528: "field": "locality",
|
|
1529: "key": "chardavol",
|
|
1530: "name": {
|
|
1531: "en": "Chardavol",
|
|
1532: "fa": "چرداول",
|
|
1533: "de": "Chardavol"
|
|
1534: }
|
|
1535: },
|
|
1536: {
|
|
1537: "field": "locality",
|
|
1538: "key": "chavar",
|
|
1539: "name": {
|
|
1540: "en": "Chavar",
|
|
1541: "fa": "چوار",
|
|
1542: "de": "Chavar"
|
|
1543: }
|
|
1544: },
|
|
1545: {
|
|
1546: "field": "locality",
|
|
1547: "key": "darrehshahr",
|
|
1548: "name": {
|
|
1549: "en": "Darreh Shahr",
|
|
1550: "fa": "درهشهر",
|
|
1551: "de": "Darreh Shahr"
|
|
1552: }
|
|
1553: },
|
|
1554: {
|
|
1555: "field": "locality",
|
|
1556: "key": "dehloran",
|
|
1557: "name": {
|
|
1558: "en": "Dehloran",
|
|
1559: "fa": "دهلران",
|
|
1560: "de": "Dehloran"
|
|
1561: }
|
|
1562: },
|
|
1563: {
|
|
1564: "field": "locality",
|
|
1565: "key": "eyvan",
|
|
1566: "name": {
|
|
1567: "en": "Eyvan",
|
|
1568: "fa": "ایوان",
|
|
1569: "de": "Eyvan"
|
|
1570: }
|
|
1571: },
|
|
1572: {
|
|
1573: "field": "locality",
|
|
1574: "key": "holeylan",
|
|
1575: "name": {
|
|
1576: "en": "Holeylan",
|
|
1577: "fa": "هلیلان",
|
|
1578: "de": "Holeylan"
|
|
1579: }
|
|
1580: },
|
|
1581: {
|
|
1582: "field": "locality",
|
|
1583: "key": "ilam",
|
|
1584: "name": {
|
|
1585: "en": "Ilam",
|
|
1586: "fa": "ایلام",
|
|
1587: "de": "Ilam"
|
|
1588: }
|
|
1589: },
|
|
1590: {
|
|
1591: "field": "locality",
|
|
1592: "key": "malekshahi",
|
|
1593: "name": {
|
|
1594: "en": "Malekshahi",
|
|
1595: "fa": "ملکشاهی",
|
|
1596: "de": "Malekshahi"
|
|
1597: }
|
|
1598: },
|
|
1599: {
|
|
1600: "field": "locality",
|
|
1601: "key": "mehran",
|
|
1602: "name": {
|
|
1603: "en": "Mehran",
|
|
1604: "fa": "مهران",
|
|
1605: "de": "Mehran"
|
|
1606: }
|
|
1607: },
|
|
1608: {
|
|
1609: "field": "locality",
|
|
1610: "key": "sirvan",
|
|
1611: "name": {
|
|
1612: "en": "Sirvan",
|
|
1613: "fa": "سیروان",
|
|
1614: "de": "Sirvan"
|
|
1615: }
|
|
1616: }
|
|
1617: ]
|
|
1618: },
|
|
1619: {
|
|
1620: "countryCode": "IR",
|
|
1621: "field": "administrative_area",
|
|
1622: "key": "isfahan",
|
|
1623: "name": {
|
|
1624: "en": "Isfahan",
|
|
1625: "fa": "اصفهان",
|
|
1626: "de": "Isfahan"
|
|
1627: },
|
|
1628: "children": [
|
|
1629: {
|
|
1630: "field": "locality",
|
|
1631: "key": "aranvabidgol",
|
|
1632: "name": {
|
|
1633: "en": "Aran va Bidgol",
|
|
1634: "fa": "آران و بیدگل",
|
|
1635: "de": "Aran va Bidgol"
|
|
1636: }
|
|
1637: },
|
|
1638: {
|
|
1639: "field": "locality",
|
|
1640: "key": "ardestan",
|
|
1641: "name": {
|
|
1642: "en": "Ardestan",
|
|
1643: "fa": "اردستان",
|
|
1644: "de": "Ardestan"
|
|
1645: }
|
|
1646: },
|
|
1647: {
|
|
1648: "field": "locality",
|
|
1649: "key": "borkhar",
|
|
1650: "name": {
|
|
1651: "en": "Borkhar",
|
|
1652: "fa": "برخوار",
|
|
1653: "de": "Borkhar"
|
|
1654: }
|
|
1655: },
|
|
1656: {
|
|
1657: "field": "locality",
|
|
1658: "key": "buinmiandasht",
|
|
1659: "name": {
|
|
1660: "en": "Buin Miandasht",
|
|
1661: "fa": "بویینمیاندشت",
|
|
1662: "de": "Buin Miandasht"
|
|
1663: }
|
|
1664: },
|
|
1665: {
|
|
1666: "field": "locality",
|
|
1667: "key": "chadegan",
|
|
1668: "name": {
|
|
1669: "en": "Chadegan",
|
|
1670: "fa": "چادگان",
|
|
1671: "de": "Chadegan"
|
|
1672: }
|
|
1673: },
|
|
1674: {
|
|
1675: "field": "locality",
|
|
1676: "key": "dehaqan",
|
|
1677: "name": {
|
|
1678: "en": "Dehaqan",
|
|
1679: "fa": "دهاقان",
|
|
1680: "de": "Dehaqan"
|
|
1681: }
|
|
1682: },
|
|
1683: {
|
|
1684: "field": "locality",
|
|
1685: "key": "falavarjan",
|
|
1686: "name": {
|
|
1687: "en": "Falavarjan",
|
|
1688: "fa": "فلاورجان",
|
|
1689: "de": "Falavarjan"
|
|
1690: }
|
|
1691: },
|
|
1692: {
|
|
1693: "field": "locality",
|
|
1694: "key": "faridan",
|
|
1695: "name": {
|
|
1696: "en": "Faridan",
|
|
1697: "fa": "فریدن",
|
|
1698: "de": "Faridan"
|
|
1699: }
|
|
1700: },
|
|
1701: {
|
|
1702: "field": "locality",
|
|
1703: "key": "fereydunshahr",
|
|
1704: "name": {
|
|
1705: "en": "Fereydunshahr",
|
|
1706: "fa": "فریدونشهر",
|
|
1707: "de": "Fereydunshahr"
|
|
1708: }
|
|
1709: },
|
|
1710: {
|
|
1711: "field": "locality",
|
|
1712: "key": "golpayegan",
|
|
1713: "name": {
|
|
1714: "en": "Golpayegan",
|
|
1715: "fa": "گلپایگان",
|
|
1716: "de": "Golpayegan"
|
|
1717: }
|
|
1718: },
|
|
1719: {
|
|
1720: "field": "locality",
|
|
1721: "key": "harand",
|
|
1722: "name": {
|
|
1723: "en": "Harand",
|
|
1724: "fa": "هرند",
|
|
1725: "de": "Harand"
|
|
1726: }
|
|
1727: },
|
|
1728: {
|
|
1729: "field": "locality",
|
|
1730: "key": "isfahan",
|
|
1731: "name": {
|
|
1732: "en": "Isfahan",
|
|
1733: "fa": "اصفهان",
|
|
1734: "de": "Isfahan"
|
|
1735: }
|
|
1736: },
|
|
1737: {
|
|
1738: "field": "locality",
|
|
1739: "key": "jarqavieh",
|
|
1740: "name": {
|
|
1741: "en": "Jarqavieh",
|
|
1742: "fa": "جرقویه",
|
|
1743: "de": "Jarqavieh"
|
|
1744: }
|
|
1745: },
|
|
1746: {
|
|
1747: "field": "locality",
|
|
1748: "key": "kashan",
|
|
1749: "name": {
|
|
1750: "en": "Kashan",
|
|
1751: "fa": "کاشان",
|
|
1752: "de": "Kashan"
|
|
1753: }
|
|
1754: },
|
|
1755: {
|
|
1756: "field": "locality",
|
|
1757: "key": "khansar",
|
|
1758: "name": {
|
|
1759: "en": "Khansar",
|
|
1760: "fa": "خوانسار",
|
|
1761: "de": "Khansar"
|
|
1762: }
|
|
1763: },
|
|
1764: {
|
|
1765: "field": "locality",
|
|
1766: "key": "khomeynishahr",
|
|
1767: "name": {
|
|
1768: "en": "Khomeyni Shahr",
|
|
1769: "fa": "خمینیشهر",
|
|
1770: "de": "Khomeyni Shahr"
|
|
1771: }
|
|
1772: },
|
|
1773: {
|
|
1774: "field": "locality",
|
|
1775: "key": "khurandbiabanak",
|
|
1776: "name": {
|
|
1777: "en": "Khur and Biabanak",
|
|
1778: "fa": "خور و بیابانک",
|
|
1779: "de": "Khur and Biabanak"
|
|
1780: }
|
|
1781: },
|
|
1782: {
|
|
1783: "field": "locality",
|
|
1784: "key": "kuhpayeh",
|
|
1785: "name": {
|
|
1786: "en": "Kuhpayeh",
|
|
1787: "fa": "کوهپایه",
|
|
1788: "de": "Kuhpayeh"
|
|
1789: }
|
|
1790: },
|
|
1791: {
|
|
1792: "field": "locality",
|
|
1793: "key": "lenjan",
|
|
1794: "name": {
|
|
1795: "en": "Lenjan",
|
|
1796: "fa": "لنجان",
|
|
1797: "de": "Lenjan"
|
|
1798: }
|
|
1799: },
|
|
1800: {
|
|
1801: "field": "locality",
|
|
1802: "key": "mobarakeh",
|
|
1803: "name": {
|
|
1804: "en": "Mobarakeh",
|
|
1805: "fa": "مبارکه",
|
|
1806: "de": "Mobarakeh"
|
|
1807: }
|
|
1808: },
|
|
1809: {
|
|
1810: "field": "locality",
|
|
1811: "key": "nain",
|
|
1812: "name": {
|
|
1813: "en": "Nain",
|
|
1814: "fa": "نایین",
|
|
1815: "de": "Nain"
|
|
1816: }
|
|
1817: },
|
|
1818: {
|
|
1819: "field": "locality",
|
|
1820: "key": "najafabad",
|
|
1821: "name": {
|
|
1822: "en": "Najafabad",
|
|
1823: "fa": "نجفآباد",
|
|
1824: "de": "Najafabad"
|
|
1825: }
|
|
1826: },
|
|
1827: {
|
|
1828: "field": "locality",
|
|
1829: "key": "natanz",
|
|
1830: "name": {
|
|
1831: "en": "Natanz",
|
|
1832: "fa": "نطنز",
|
|
1833: "de": "Natanz"
|
|
1834: }
|
|
1835: },
|
|
1836: {
|
|
1837: "field": "locality",
|
|
1838: "key": "semirom",
|
|
1839: "name": {
|
|
1840: "en": "Semirom",
|
|
1841: "fa": "سمیرم",
|
|
1842: "de": "Semirom"
|
|
1843: }
|
|
1844: },
|
|
1845: {
|
|
1846: "field": "locality",
|
|
1847: "key": "shahinshahrandmeymeh",
|
|
1848: "name": {
|
|
1849: "en": "Shahin Shahr and Meymeh",
|
|
1850: "fa": "شاهینشهر و میمه",
|
|
1851: "de": "Shahin Shahr and Meymeh"
|
|
1852: }
|
|
1853: },
|
|
1854: {
|
|
1855: "field": "locality",
|
|
1856: "key": "shahreza",
|
|
1857: "name": {
|
|
1858: "en": "Shahreza",
|
|
1859: "fa": "شهرضا",
|
|
1860: "de": "Shahreza"
|
|
1861: }
|
|
1862: },
|
|
1863: {
|
|
1864: "field": "locality",
|
|
1865: "key": "tiranandkarvan",
|
|
1866: "name": {
|
|
1867: "en": "Tiran and Karvan",
|
|
1868: "fa": "تیران و کرون",
|
|
1869: "de": "Tiran and Karvan"
|
|
1870: }
|
|
1871: },
|
|
1872: {
|
|
1873: "field": "locality",
|
|
1874: "key": "varzaneh",
|
|
1875: "name": {
|
|
1876: "en": "Varzaneh",
|
|
1877: "fa": "ورزنه",
|
|
1878: "de": "Varzaneh"
|
|
1879: }
|
|
1880: }
|
|
1881: ]
|
|
1882: },
|
|
1883: {
|
|
1884: "countryCode": "IR",
|
|
1885: "field": "administrative_area",
|
|
1886: "key": "kerman",
|
|
1887: "name": {
|
|
1888: "en": "Kerman",
|
|
1889: "fa": "کرمان",
|
|
1890: "de": "Kerman"
|
|
1891: },
|
|
1892: "children": [
|
|
1893: {
|
|
1894: "field": "locality",
|
|
1895: "key": "anar",
|
|
1896: "name": {
|
|
1897: "en": "Anar",
|
|
1898: "fa": "انار",
|
|
1899: "de": "Anar"
|
|
1900: }
|
|
1901: },
|
|
1902: {
|
|
1903: "field": "locality",
|
|
1904: "key": "anbarabad",
|
|
1905: "name": {
|
|
1906: "en": "Anbarabad",
|
|
1907: "fa": "عنبرآباد",
|
|
1908: "de": "Anbarabad"
|
|
1909: }
|
|
1910: },
|
|
1911: {
|
|
1912: "field": "locality",
|
|
1913: "key": "arzuiyeh",
|
|
1914: "name": {
|
|
1915: "en": "Arzuiyeh",
|
|
1916: "fa": "ارزوئیه",
|
|
1917: "de": "Arzuiyeh"
|
|
1918: }
|
|
1919: },
|
|
1920: {
|
|
1921: "field": "locality",
|
|
1922: "key": "baft",
|
|
1923: "name": {
|
|
1924: "en": "Baft",
|
|
1925: "fa": "بافت",
|
|
1926: "de": "Baft"
|
|
1927: }
|
|
1928: },
|
|
1929: {
|
|
1930: "field": "locality",
|
|
1931: "key": "bam",
|
|
1932: "name": {
|
|
1933: "en": "Bam",
|
|
1934: "fa": "بم",
|
|
1935: "de": "Bam"
|
|
1936: }
|
|
1937: },
|
|
1938: {
|
|
1939: "field": "locality",
|
|
1940: "key": "bardsir",
|
|
1941: "name": {
|
|
1942: "en": "Bardsir",
|
|
1943: "fa": "بردسیر",
|
|
1944: "de": "Bardsir"
|
|
1945: }
|
|
1946: },
|
|
1947: {
|
|
1948: "field": "locality",
|
|
1949: "key": "fahraj",
|
|
1950: "name": {
|
|
1951: "en": "Fahraj",
|
|
1952: "fa": "فهرج",
|
|
1953: "de": "Fahraj"
|
|
1954: }
|
|
1955: },
|
|
1956: {
|
|
1957: "field": "locality",
|
|
1958: "key": "faryab",
|
|
1959: "name": {
|
|
1960: "en": "Faryab",
|
|
1961: "fa": "فاریاب",
|
|
1962: "de": "Faryab"
|
|
1963: }
|
|
1964: },
|
|
1965: {
|
|
1966: "field": "locality",
|
|
1967: "key": "gonbaki",
|
|
1968: "name": {
|
|
1969: "en": "Gonbaki",
|
|
1970: "fa": "گنبکی",
|
|
1971: "de": "Gonbaki"
|
|
1972: }
|
|
1973: },
|
|
1974: {
|
|
1975: "field": "locality",
|
|
1976: "key": "jazmurian",
|
|
1977: "name": {
|
|
1978: "en": "Jazmurian",
|
|
1979: "fa": "جازموریان",
|
|
1980: "de": "Jazmurian"
|
|
1981: }
|
|
1982: },
|
|
1983: {
|
|
1984: "field": "locality",
|
|
1985: "key": "jiroft",
|
|
1986: "name": {
|
|
1987: "en": "Jiroft",
|
|
1988: "fa": "جیرفت",
|
|
1989: "de": "Jiroft"
|
|
1990: }
|
|
1991: },
|
|
1992: {
|
|
1993: "field": "locality",
|
|
1994: "key": "kahnuj",
|
|
1995: "name": {
|
|
1996: "en": "Kahnuj",
|
|
1997: "fa": "کهنوج",
|
|
1998: "de": "Kahnuj"
|
|
1999: }
|
|
2000: },
|
|
2001: {
|
|
2002: "field": "locality",
|
|
2003: "key": "kerman",
|
|
2004: "name": {
|
|
2005: "en": "Kerman",
|
|
2006: "fa": "کرمان",
|
|
2007: "de": "Kerman"
|
|
2008: }
|
|
2009: },
|
|
2010: {
|
|
2011: "field": "locality",
|
|
2012: "key": "kuhbanan",
|
|
2013: "name": {
|
|
2014: "en": "Kuhbanan",
|
|
2015: "fa": "کوهبنان",
|
|
2016: "de": "Kuhbanan"
|
|
2017: }
|
|
2018: },
|
|
2019: {
|
|
2020: "field": "locality",
|
|
2021: "key": "manujan",
|
|
2022: "name": {
|
|
2023: "en": "Manujan",
|
|
2024: "fa": "منوجان",
|
|
2025: "de": "Manujan"
|
|
2026: }
|
|
2027: },
|
|
2028: {
|
|
2029: "field": "locality",
|
|
2030: "key": "narmashir",
|
|
2031: "name": {
|
|
2032: "en": "Narmashir",
|
|
2033: "fa": "نرماشیر",
|
|
2034: "de": "Narmashir"
|
|
2035: }
|
|
2036: },
|
|
2037: {
|
|
2038: "field": "locality",
|
|
2039: "key": "qalehganj",
|
|
2040: "name": {
|
|
2041: "en": "Qaleh Ganj",
|
|
2042: "fa": "قلعهگنج",
|
|
2043: "de": "Qaleh Ganj"
|
|
2044: }
|
|
2045: },
|
|
2046: {
|
|
2047: "field": "locality",
|
|
2048: "key": "rabor",
|
|
2049: "name": {
|
|
2050: "en": "Rabor",
|
|
2051: "fa": "رابر",
|
|
2052: "de": "Rabor"
|
|
2053: }
|
|
2054: },
|
|
2055: {
|
|
2056: "field": "locality",
|
|
2057: "key": "rafsanjan",
|
|
2058: "name": {
|
|
2059: "en": "Rafsanjan",
|
|
2060: "fa": "رفسنجان",
|
|
2061: "de": "Rafsanjan"
|
|
2062: }
|
|
2063: },
|
|
2064: {
|
|
2065: "field": "locality",
|
|
2066: "key": "ravar",
|
|
2067: "name": {
|
|
2068: "en": "Ravar",
|
|
2069: "fa": "راور",
|
|
2070: "de": "Ravar"
|
|
2071: }
|
|
2072: },
|
|
2073: {
|
|
2074: "field": "locality",
|
|
2075: "key": "rigan",
|
|
2076: "name": {
|
|
2077: "en": "Rigan",
|
|
2078: "fa": "ریگان",
|
|
2079: "de": "Rigan"
|
|
2080: }
|
|
2081: },
|
|
2082: {
|
|
2083: "field": "locality",
|
|
2084: "key": "rudbarejonubi",
|
|
2085: "name": {
|
|
2086: "en": "Rudbar-e Jonubi",
|
|
2087: "fa": "رودبار جنوب",
|
|
2088: "de": "Rudbar-e Jonubi"
|
|
2089: }
|
|
2090: },
|
|
2091: {
|
|
2092: "field": "locality",
|
|
2093: "key": "shahrebabak",
|
|
2094: "name": {
|
|
2095: "en": "Shahr-e Babak",
|
|
2096: "fa": "شهر بابک",
|
|
2097: "de": "Shahr-e Babak"
|
|
2098: }
|
|
2099: },
|
|
2100: {
|
|
2101: "field": "locality",
|
|
2102: "key": "sirjan",
|
|
2103: "name": {
|
|
2104: "en": "Sirjan",
|
|
2105: "fa": "سیرجان",
|
|
2106: "de": "Sirjan"
|
|
2107: }
|
|
2108: },
|
|
2109: {
|
|
2110: "field": "locality",
|
|
2111: "key": "zarand",
|
|
2112: "name": {
|
|
2113: "en": "Zarand",
|
|
2114: "fa": "زرند",
|
|
2115: "de": "Zarand"
|
|
2116: }
|
|
2117: }
|
|
2118: ]
|
|
2119: },
|
|
2120: {
|
|
2121: "countryCode": "IR",
|
|
2122: "field": "administrative_area",
|
|
2123: "key": "kermanshah",
|
|
2124: "name": {
|
|
2125: "en": "Kermanshah",
|
|
2126: "fa": "کرمانشاه",
|
|
2127: "de": "Kermanschah"
|
|
2128: },
|
|
2129: "children": [
|
|
2130: {
|
|
2131: "field": "locality",
|
|
2132: "key": "dalahu",
|
|
2133: "name": {
|
|
2134: "en": "Dalahu",
|
|
2135: "fa": "دالاهو",
|
|
2136: "de": "Dalahu"
|
|
2137: }
|
|
2138: },
|
|
2139: {
|
|
2140: "field": "locality",
|
|
2141: "key": "gilanegharb",
|
|
2142: "name": {
|
|
2143: "en": "Gilan-e Gharb",
|
|
2144: "fa": "گیلان غرب",
|
|
2145: "de": "Gilan-e Gharb"
|
|
2146: }
|
|
2147: },
|
|
2148: {
|
|
2149: "field": "locality",
|
|
2150: "key": "harsin",
|
|
2151: "name": {
|
|
2152: "en": "Harsin",
|
|
2153: "fa": "هرسین",
|
|
2154: "de": "Harsin"
|
|
2155: }
|
|
2156: },
|
|
2157: {
|
|
2158: "field": "locality",
|
|
2159: "key": "javanrud",
|
|
2160: "name": {
|
|
2161: "en": "Javanrud",
|
|
2162: "fa": "جوانرود",
|
|
2163: "de": "Javanrud"
|
|
2164: }
|
|
2165: },
|
|
2166: {
|
|
2167: "field": "locality",
|
|
2168: "key": "kangavar",
|
|
2169: "name": {
|
|
2170: "en": "Kangavar",
|
|
2171: "fa": "کنگاور",
|
|
2172: "de": "Kangavar"
|
|
2173: }
|
|
2174: },
|
|
2175: {
|
|
2176: "field": "locality",
|
|
2177: "key": "kermanshah",
|
|
2178: "name": {
|
|
2179: "en": "Kermanshah",
|
|
2180: "fa": "کرمانشاه",
|
|
2181: "de": "Kermanschah"
|
|
2182: }
|
|
2183: },
|
|
2184: {
|
|
2185: "field": "locality",
|
|
2186: "key": "paveh",
|
|
2187: "name": {
|
|
2188: "en": "Paveh",
|
|
2189: "fa": "پاوه",
|
|
2190: "de": "Paveh"
|
|
2191: }
|
|
2192: },
|
|
2193: {
|
|
2194: "field": "locality",
|
|
2195: "key": "qasreshirin",
|
|
2196: "name": {
|
|
2197: "en": "Qasr-e Shirin",
|
|
2198: "fa": "قصر شیرین",
|
|
2199: "de": "Qasr-e Shirin"
|
|
2200: }
|
|
2201: },
|
|
2202: {
|
|
2203: "field": "locality",
|
|
2204: "key": "ravansar",
|
|
2205: "name": {
|
|
2206: "en": "Ravansar",
|
|
2207: "fa": "روانسر",
|
|
2208: "de": "Ravansar"
|
|
2209: }
|
|
2210: },
|
|
2211: {
|
|
2212: "field": "locality",
|
|
2213: "key": "sahneh",
|
|
2214: "name": {
|
|
2215: "en": "Sahneh",
|
|
2216: "fa": "صحنه",
|
|
2217: "de": "Sahneh"
|
|
2218: }
|
|
2219: },
|
|
2220: {
|
|
2221: "field": "locality",
|
|
2222: "key": "salasebabajani",
|
|
2223: "name": {
|
|
2224: "en": "Salas-e Babajani",
|
|
2225: "fa": "ثلاث باباجانی",
|
|
2226: "de": "Salas-e Babajani"
|
|
2227: }
|
|
2228: },
|
|
2229: {
|
|
2230: "field": "locality",
|
|
2231: "key": "sarpolezahab",
|
|
2232: "name": {
|
|
2233: "en": "Sarpol-e Zahab",
|
|
2234: "fa": "سرپل ذهاب",
|
|
2235: "de": "Sarpol-e Zahab"
|
|
2236: }
|
|
2237: },
|
|
2238: {
|
|
2239: "field": "locality",
|
|
2240: "key": "shahabadegharb",
|
|
2241: "name": {
|
|
2242: "en": "Shahabad-e Gharb",
|
|
2243: "fa": "شاهآباد غرب",
|
|
2244: "de": "Shahabad-e Gharb"
|
|
2245: }
|
|
2246: },
|
|
2247: {
|
|
2248: "field": "locality",
|
|
2249: "key": "sonqor",
|
|
2250: "name": {
|
|
2251: "en": "Sonqor",
|
|
2252: "fa": "سنقر",
|
|
2253: "de": "Sonqor"
|
|
2254: }
|
|
2255: }
|
|
2256: ]
|
|
2257: },
|
|
2258: {
|
|
2259: "countryCode": "IR",
|
|
2260: "field": "administrative_area",
|
|
2261: "key": "khuzestan",
|
|
2262: "name": {
|
|
2263: "en": "Khuzestan",
|
|
2264: "fa": "خوزستان",
|
|
2265: "de": "Chuzestan"
|
|
2266: },
|
|
2267: "children": [
|
|
2268: {
|
|
2269: "field": "locality",
|
|
2270: "key": "abadan",
|
|
2271: "name": {
|
|
2272: "en": "Abadan",
|
|
2273: "fa": "آبادان",
|
|
2274: "de": "Abadan"
|
|
2275: }
|
|
2276: },
|
|
2277: {
|
|
2278: "field": "locality",
|
|
2279: "key": "aghajri",
|
|
2280: "name": {
|
|
2281: "en": "Aghajri",
|
|
2282: "fa": "آغاجاری",
|
|
2283: "de": "Aghajri"
|
|
2284: }
|
|
2285: },
|
|
2286: {
|
|
2287: "field": "locality",
|
|
2288: "key": "ahvaz",
|
|
2289: "name": {
|
|
2290: "en": "Ahvaz",
|
|
2291: "fa": "اهواز",
|
|
2292: "de": "Ahvaz"
|
|
2293: }
|
|
2294: },
|
|
2295: {
|
|
2296: "field": "locality",
|
|
2297: "key": "andika",
|
|
2298: "name": {
|
|
2299: "en": "Andika",
|
|
2300: "fa": "اندیکا",
|
|
2301: "de": "Andika"
|
|
2302: }
|
|
2303: },
|
|
2304: {
|
|
2305: "field": "locality",
|
|
2306: "key": "andimeshk",
|
|
2307: "name": {
|
|
2308: "en": "Andimeshk",
|
|
2309: "fa": "اندیمشک",
|
|
2310: "de": "Andimeshk"
|
|
2311: }
|
|
2312: },
|
|
2313: {
|
|
2314: "field": "locality",
|
|
2315: "key": "baghemalek",
|
|
2316: "name": {
|
|
2317: "en": "Bagh-e Malek",
|
|
2318: "fa": "باغملک",
|
|
2319: "de": "Bagh-e Malek"
|
|
2320: }
|
|
2321: },
|
|
2322: {
|
|
2323: "field": "locality",
|
|
2324: "key": "bavi",
|
|
2325: "name": {
|
|
2326: "en": "Bavi",
|
|
2327: "fa": "باوی",
|
|
2328: "de": "Bavi"
|
|
2329: }
|
|
2330: },
|
|
2331: {
|
|
2332: "field": "locality",
|
|
2333: "key": "behbahan",
|
|
2334: "name": {
|
|
2335: "en": "Behbahan",
|
|
2336: "fa": "بهبهان",
|
|
2337: "de": "Behbahan"
|
|
2338: }
|
|
2339: },
|
|
2340: {
|
|
2341: "field": "locality",
|
|
2342: "key": "dashteazadegan",
|
|
2343: "name": {
|
|
2344: "en": "Dasht-e Azadegan",
|
|
2345: "fa": "دشت آزادگان",
|
|
2346: "de": "Dasht-e Azadegan"
|
|
2347: }
|
|
2348: },
|
|
2349: {
|
|
2350: "field": "locality",
|
|
2351: "key": "dezful",
|
|
2352: "name": {
|
|
2353: "en": "Dezful",
|
|
2354: "fa": "دزفول",
|
|
2355: "de": "Dezful"
|
|
2356: }
|
|
2357: },
|
|
2358: {
|
|
2359: "field": "locality",
|
|
2360: "key": "dezpart",
|
|
2361: "name": {
|
|
2362: "en": "Dezpart",
|
|
2363: "fa": "دزپارت",
|
|
2364: "de": "Dezpart"
|
|
2365: }
|
|
2366: },
|
|
2367: {
|
|
2368: "field": "locality",
|
|
2369: "key": "gotvand",
|
|
2370: "name": {
|
|
2371: "en": "Gotvand",
|
|
2372: "fa": "گتوند",
|
|
2373: "de": "Gotvand"
|
|
2374: }
|
|
2375: },
|
|
2376: {
|
|
2377: "field": "locality",
|
|
2378: "key": "haftkel",
|
|
2379: "name": {
|
|
2380: "en": "Haftkel",
|
|
2381: "fa": "هفتکل",
|
|
2382: "de": "Haftkel"
|
|
2383: }
|
|
2384: },
|
|
2385: {
|
|
2386: "field": "locality",
|
|
2387: "key": "hamidiyeh",
|
|
2388: "name": {
|
|
2389: "en": "Hamidiyeh",
|
|
2390: "fa": "حمیدیه",
|
|
2391: "de": "Hamidiyeh"
|
|
2392: }
|
|
2393: },
|
|
2394: {
|
|
2395: "field": "locality",
|
|
2396: "key": "hendijan",
|
|
2397: "name": {
|
|
2398: "en": "Hendijan",
|
|
2399: "fa": "هندیجان",
|
|
2400: "de": "Hendijan"
|
|
2401: }
|
|
2402: },
|
|
2403: {
|
|
2404: "field": "locality",
|
|
2405: "key": "hoveyzeh",
|
|
2406: "name": {
|
|
2407: "en": "Hoveyzeh",
|
|
2408: "fa": "هویزه",
|
|
2409: "de": "Hoveyzeh"
|
|
2410: }
|
|
2411: },
|
|
2412: {
|
|
2413: "field": "locality",
|
|
2414: "key": "izeh",
|
|
2415: "name": {
|
|
2416: "en": "Izeh",
|
|
2417: "fa": "ایذه",
|
|
2418: "de": "Izeh"
|
|
2419: }
|
|
2420: },
|
|
2421: {
|
|
2422: "field": "locality",
|
|
2423: "key": "karkheh",
|
|
2424: "name": {
|
|
2425: "en": "Karkheh",
|
|
2426: "fa": "کرخه",
|
|
2427: "de": "Karkheh"
|
|
2428: }
|
|
2429: },
|
|
2430: {
|
|
2431: "field": "locality",
|
|
2432: "key": "karun",
|
|
2433: "name": {
|
|
2434: "en": "Karun",
|
|
2435: "fa": "کارون",
|
|
2436: "de": "Karun"
|
|
2437: }
|
|
2438: },
|
|
2439: {
|
|
2440: "field": "locality",
|
|
2441: "key": "khorramshahr",
|
|
2442: "name": {
|
|
2443: "en": "Khorramshahr",
|
|
2444: "fa": "خرمشهر",
|
|
2445: "de": "Khorramshahr"
|
|
2446: }
|
|
2447: },
|
|
2448: {
|
|
2449: "field": "locality",
|
|
2450: "key": "lali",
|
|
2451: "name": {
|
|
2452: "en": "Lali",
|
|
2453: "fa": "لالی",
|
|
2454: "de": "Lali"
|
|
2455: }
|
|
2456: },
|
|
2457: {
|
|
2458: "field": "locality",
|
|
2459: "key": "mahshahr",
|
|
2460: "name": {
|
|
2461: "en": "Mahshahr",
|
|
2462: "fa": "بندر ماهشهر",
|
|
2463: "de": "Mahshahr"
|
|
2464: }
|
|
2465: },
|
|
2466: {
|
|
2467: "field": "locality",
|
|
2468: "key": "masjedsoleyman",
|
|
2469: "name": {
|
|
2470: "en": "Masjed Soleyman",
|
|
2471: "fa": "مسجدسلیمان",
|
|
2472: "de": "Masjed Soleyman"
|
|
2473: }
|
|
2474: },
|
|
2475: {
|
|
2476: "field": "locality",
|
|
2477: "key": "omidiyeh",
|
|
2478: "name": {
|
|
2479: "en": "Omidiyeh",
|
|
2480: "fa": "امیدیه",
|
|
2481: "de": "Omidiyeh"
|
|
2482: }
|
|
2483: },
|
|
2484: {
|
|
2485: "field": "locality",
|
|
2486: "key": "ramhormoz",
|
|
2487: "name": {
|
|
2488: "en": "Ramhormoz",
|
|
2489: "fa": "رامهرمز",
|
|
2490: "de": "Ramhormoz"
|
|
2491: }
|
|
2492: },
|
|
2493: {
|
|
2494: "field": "locality",
|
|
2495: "key": "ramshir",
|
|
2496: "name": {
|
|
2497: "en": "Ramshir",
|
|
2498: "fa": "رامشیر",
|
|
2499: "de": "Ramshir"
|
|
2500: }
|
|
2501: },
|
|
2502: {
|
|
2503: "field": "locality",
|
|
2504: "key": "seydun",
|
|
2505: "name": {
|
|
2506: "en": "Seydun",
|
|
2507: "fa": "سیدون",
|
|
2508: "de": "Seydun"
|
|
2509: }
|
|
2510: },
|
|
2511: {
|
|
2512: "field": "locality",
|
|
2513: "key": "shadegan",
|
|
2514: "name": {
|
|
2515: "en": "Shadegan",
|
|
2516: "fa": "شادگان",
|
|
2517: "de": "Shadegan"
|
|
2518: }
|
|
2519: },
|
|
2520: {
|
|
2521: "field": "locality",
|
|
2522: "key": "shush",
|
|
2523: "name": {
|
|
2524: "en": "Shush",
|
|
2525: "fa": "شوش",
|
|
2526: "de": "Shush"
|
|
2527: }
|
|
2528: },
|
|
2529: {
|
|
2530: "field": "locality",
|
|
2531: "key": "shushtar",
|
|
2532: "name": {
|
|
2533: "en": "Shushtar",
|
|
2534: "fa": "شوشتر",
|
|
2535: "de": "Shushtar"
|
|
2536: }
|
|
2537: }
|
|
2538: ]
|
|
2539: },
|
|
2540: {
|
|
2541: "countryCode": "IR",
|
|
2542: "field": "administrative_area",
|
|
2543: "key": "kohgiluyehandboyerahmad",
|
|
2544: "name": {
|
|
2545: "en": "Kohgiluyeh and Boyer-Ahmad",
|
|
2546: "fa": "کهگیلویه و بویراحمد",
|
|
2547: "de": "Kohgiluye und Buyer Ahmad"
|
|
2548: },
|
|
2549: "children": [
|
|
2550: {
|
|
2551: "field": "locality",
|
|
2552: "key": "bahmai",
|
|
2553: "name": {
|
|
2554: "en": "Bahmai",
|
|
2555: "fa": "بهمئی",
|
|
2556: "de": "Bahmai"
|
|
2557: }
|
|
2558: },
|
|
2559: {
|
|
2560: "field": "locality",
|
|
2561: "key": "basht",
|
|
2562: "name": {
|
|
2563: "en": "Basht",
|
|
2564: "fa": "باشت",
|
|
2565: "de": "Basht"
|
|
2566: }
|
|
2567: },
|
|
2568: {
|
|
2569: "field": "locality",
|
|
2570: "key": "boyerahmad",
|
|
2571: "name": {
|
|
2572: "en": "Boyer-Ahmad",
|
|
2573: "fa": "بویراحمد",
|
|
2574: "de": "Boyer-Ahmad"
|
|
2575: }
|
|
2576: },
|
|
2577: {
|
|
2578: "field": "locality",
|
|
2579: "key": "charam",
|
|
2580: "name": {
|
|
2581: "en": "Charam",
|
|
2582: "fa": "چرام",
|
|
2583: "de": "Charam"
|
|
2584: }
|
|
2585: },
|
|
2586: {
|
|
2587: "field": "locality",
|
|
2588: "key": "dana",
|
|
2589: "name": {
|
|
2590: "en": "Dana",
|
|
2591: "fa": "دنا",
|
|
2592: "de": "Dana"
|
|
2593: }
|
|
2594: },
|
|
2595: {
|
|
2596: "field": "locality",
|
|
2597: "key": "gachsaran",
|
|
2598: "name": {
|
|
2599: "en": "Gachsaran",
|
|
2600: "fa": "گچساران",
|
|
2601: "de": "Gachsaran"
|
|
2602: }
|
|
2603: },
|
|
2604: {
|
|
2605: "field": "locality",
|
|
2606: "key": "kohgiluyeh",
|
|
2607: "name": {
|
|
2608: "en": "Kohgiluyeh",
|
|
2609: "fa": "کهگیلویه",
|
|
2610: "de": "Kohgiluyeh"
|
|
2611: }
|
|
2612: },
|
|
2613: {
|
|
2614: "field": "locality",
|
|
2615: "key": "landeh",
|
|
2616: "name": {
|
|
2617: "en": "Landeh",
|
|
2618: "fa": "لنده",
|
|
2619: "de": "Landeh"
|
|
2620: }
|
|
2621: },
|
|
2622: {
|
|
2623: "field": "locality",
|
|
2624: "key": "margown",
|
|
2625: "name": {
|
|
2626: "en": "Margown",
|
|
2627: "fa": "مارگون",
|
|
2628: "de": "Margown"
|
|
2629: }
|
|
2630: }
|
|
2631: ]
|
|
2632: },
|
|
2633: {
|
|
2634: "countryCode": "IR",
|
|
2635: "field": "administrative_area",
|
|
2636: "key": "kurdistan",
|
|
2637: "name": {
|
|
2638: "en": "Kurdistan",
|
|
2639: "fa": "کردستان",
|
|
2640: "de": "Kurdistan"
|
|
2641: },
|
|
2642: "children": [
|
|
2643: {
|
|
2644: "field": "locality",
|
|
2645: "key": "baneh",
|
|
2646: "name": {
|
|
2647: "en": "Baneh",
|
|
2648: "fa": "بانه",
|
|
2649: "de": "Baneh"
|
|
2650: }
|
|
2651: },
|
|
2652: {
|
|
2653: "field": "locality",
|
|
2654: "key": "bijar",
|
|
2655: "name": {
|
|
2656: "en": "Bijar",
|
|
2657: "fa": "بیجار",
|
|
2658: "de": "Bijar"
|
|
2659: }
|
|
2660: },
|
|
2661: {
|
|
2662: "field": "locality",
|
|
2663: "key": "dehgolan",
|
|
2664: "name": {
|
|
2665: "en": "Dehgolan",
|
|
2666: "fa": "دهگلان",
|
|
2667: "de": "Dehgolan"
|
|
2668: }
|
|
2669: },
|
|
2670: {
|
|
2671: "field": "locality",
|
|
2672: "key": "divandarreh",
|
|
2673: "name": {
|
|
2674: "en": "Divandarreh",
|
|
2675: "fa": "دیواندره",
|
|
2676: "de": "Divandarreh"
|
|
2677: }
|
|
2678: },
|
|
2679: {
|
|
2680: "field": "locality",
|
|
2681: "key": "kamyaran",
|
|
2682: "name": {
|
|
2683: "en": "Kamyaran",
|
|
2684: "fa": "کامیاران",
|
|
2685: "de": "Kamyaran"
|
|
2686: }
|
|
2687: },
|
|
2688: {
|
|
2689: "field": "locality",
|
|
2690: "key": "marivan",
|
|
2691: "name": {
|
|
2692: "en": "Marivan",
|
|
2693: "fa": "مریوان",
|
|
2694: "de": "Marivan"
|
|
2695: }
|
|
2696: },
|
|
2697: {
|
|
2698: "field": "locality",
|
|
2699: "key": "qorveh",
|
|
2700: "name": {
|
|
2701: "en": "Qorveh",
|
|
2702: "fa": "قروه",
|
|
2703: "de": "Qorveh"
|
|
2704: }
|
|
2705: },
|
|
2706: {
|
|
2707: "field": "locality",
|
|
2708: "key": "sanandaj",
|
|
2709: "name": {
|
|
2710: "en": "Sanandaj",
|
|
2711: "fa": "سنندج",
|
|
2712: "de": "Sanandaj"
|
|
2713: }
|
|
2714: },
|
|
2715: {
|
|
2716: "field": "locality",
|
|
2717: "key": "saqqez",
|
|
2718: "name": {
|
|
2719: "en": "Saqqez",
|
|
2720: "fa": "سقز",
|
|
2721: "de": "Saqqez"
|
|
2722: }
|
|
2723: },
|
|
2724: {
|
|
2725: "field": "locality",
|
|
2726: "key": "sarvabad",
|
|
2727: "name": {
|
|
2728: "en": "Sarvabad",
|
|
2729: "fa": "سروآباد",
|
|
2730: "de": "Sarvabad"
|
|
2731: }
|
|
2732: }
|
|
2733: ]
|
|
2734: },
|
|
2735: {
|
|
2736: "countryCode": "IR",
|
|
2737: "field": "administrative_area",
|
|
2738: "key": "lorestan",
|
|
2739: "name": {
|
|
2740: "en": "Lorestan",
|
|
2741: "fa": "لرستان",
|
|
2742: "de": "Lorestan"
|
|
2743: },
|
|
2744: "children": [
|
|
2745: {
|
|
2746: "field": "locality",
|
|
2747: "key": "aligudarz",
|
|
2748: "name": {
|
|
2749: "en": "Aligudarz",
|
|
2750: "fa": "الیگودرز",
|
|
2751: "de": "Aligudarz"
|
|
2752: }
|
|
2753: },
|
|
2754: {
|
|
2755: "field": "locality",
|
|
2756: "key": "azna",
|
|
2757: "name": {
|
|
2758: "en": "Azna",
|
|
2759: "fa": "ازنا",
|
|
2760: "de": "Azna"
|
|
2761: }
|
|
2762: },
|
|
2763: {
|
|
2764: "field": "locality",
|
|
2765: "key": "borujerd",
|
|
2766: "name": {
|
|
2767: "en": "Borujerd",
|
|
2768: "fa": "بروجرد",
|
|
2769: "de": "Borujerd"
|
|
2770: }
|
|
2771: },
|
|
2772: {
|
|
2773: "field": "locality",
|
|
2774: "key": "delfan",
|
|
2775: "name": {
|
|
2776: "en": "Delfan",
|
|
2777: "fa": "دلفان",
|
|
2778: "de": "Delfan"
|
|
2779: }
|
|
2780: },
|
|
2781: {
|
|
2782: "field": "locality",
|
|
2783: "key": "dorud",
|
|
2784: "name": {
|
|
2785: "en": "Dorud",
|
|
2786: "fa": "دورود",
|
|
2787: "de": "Dorud"
|
|
2788: }
|
|
2789: },
|
|
2790: {
|
|
2791: "field": "locality",
|
|
2792: "key": "dowreh",
|
|
2793: "name": {
|
|
2794: "en": "Dowreh",
|
|
2795: "fa": "دوره",
|
|
2796: "de": "Dowreh"
|
|
2797: }
|
|
2798: },
|
|
2799: {
|
|
2800: "field": "locality",
|
|
2801: "key": "khorramabad",
|
|
2802: "name": {
|
|
2803: "en": "Khorramabad",
|
|
2804: "fa": "خرمآباد",
|
|
2805: "de": "Khorramabad"
|
|
2806: }
|
|
2807: },
|
|
2808: {
|
|
2809: "field": "locality",
|
|
2810: "key": "kuhdasht",
|
|
2811: "name": {
|
|
2812: "en": "Kuhdasht",
|
|
2813: "fa": "کوهدشت",
|
|
2814: "de": "Kuhdasht"
|
|
2815: }
|
|
2816: },
|
|
2817: {
|
|
2818: "field": "locality",
|
|
2819: "key": "poledokhtar",
|
|
2820: "name": {
|
|
2821: "en": "Pol-e Dokhtar",
|
|
2822: "fa": "پلدختر",
|
|
2823: "de": "Pol-e Dokhtar"
|
|
2824: }
|
|
2825: },
|
|
2826: {
|
|
2827: "field": "locality",
|
|
2828: "key": "rumeshkan",
|
|
2829: "name": {
|
|
2830: "en": "Rumeshkan",
|
|
2831: "fa": "رومشکان",
|
|
2832: "de": "Rumeshkan"
|
|
2833: }
|
|
2834: },
|
|
2835: {
|
|
2836: "field": "locality",
|
|
2837: "key": "selseleh",
|
|
2838: "name": {
|
|
2839: "en": "Selseleh",
|
|
2840: "fa": "سلسله",
|
|
2841: "de": "Selseleh"
|
|
2842: }
|
|
2843: }
|
|
2844: ]
|
|
2845: },
|
|
2846: {
|
|
2847: "countryCode": "IR",
|
|
2848: "field": "administrative_area",
|
|
2849: "key": "markazi",
|
|
2850: "name": {
|
|
2851: "en": "Markazi",
|
|
2852: "fa": "مرکزی",
|
|
2853: "de": "Markazi"
|
|
2854: },
|
|
2855: "children": [
|
|
2856: {
|
|
2857: "field": "locality",
|
|
2858: "key": "arak",
|
|
2859: "name": {
|
|
2860: "en": "Arak",
|
|
2861: "fa": "اراک",
|
|
2862: "de": "Arak"
|
|
2863: }
|
|
2864: },
|
|
2865: {
|
|
2866: "field": "locality",
|
|
2867: "key": "ashtian",
|
|
2868: "name": {
|
|
2869: "en": "Ashtian",
|
|
2870: "fa": "آشتیان",
|
|
2871: "de": "Ashtian"
|
|
2872: }
|
|
2873: },
|
|
2874: {
|
|
2875: "field": "locality",
|
|
2876: "key": "delijan",
|
|
2877: "name": {
|
|
2878: "en": "Delijan",
|
|
2879: "fa": "دلیجان",
|
|
2880: "de": "Delijan"
|
|
2881: }
|
|
2882: },
|
|
2883: {
|
|
2884: "field": "locality",
|
|
2885: "key": "farahan",
|
|
2886: "name": {
|
|
2887: "en": "Farahan",
|
|
2888: "fa": "فراهان",
|
|
2889: "de": "Farahan"
|
|
2890: }
|
|
2891: },
|
|
2892: {
|
|
2893: "field": "locality",
|
|
2894: "key": "khomeyn",
|
|
2895: "name": {
|
|
2896: "en": "Khomeyn",
|
|
2897: "fa": "خمین",
|
|
2898: "de": "Khomeyn"
|
|
2899: }
|
|
2900: },
|
|
2901: {
|
|
2902: "field": "locality",
|
|
2903: "key": "khondab",
|
|
2904: "name": {
|
|
2905: "en": "Khondab",
|
|
2906: "fa": "خنداب",
|
|
2907: "de": "Khondab"
|
|
2908: }
|
|
2909: },
|
|
2910: {
|
|
2911: "field": "locality",
|
|
2912: "key": "komijan",
|
|
2913: "name": {
|
|
2914: "en": "Komijan",
|
|
2915: "fa": "کمیجان",
|
|
2916: "de": "Komijan"
|
|
2917: }
|
|
2918: },
|
|
2919: {
|
|
2920: "field": "locality",
|
|
2921: "key": "mahallat",
|
|
2922: "name": {
|
|
2923: "en": "Mahallat",
|
|
2924: "fa": "محلات",
|
|
2925: "de": "Mahallat"
|
|
2926: }
|
|
2927: },
|
|
2928: {
|
|
2929: "field": "locality",
|
|
2930: "key": "saveh",
|
|
2931: "name": {
|
|
2932: "en": "Saveh",
|
|
2933: "fa": "ساوه",
|
|
2934: "de": "Saveh"
|
|
2935: }
|
|
2936: },
|
|
2937: {
|
|
2938: "field": "locality",
|
|
2939: "key": "shazand",
|
|
2940: "name": {
|
|
2941: "en": "Shazand",
|
|
2942: "fa": "شازند",
|
|
2943: "de": "Shazand"
|
|
2944: }
|
|
2945: },
|
|
2946: {
|
|
2947: "field": "locality",
|
|
2948: "key": "tafresh",
|
|
2949: "name": {
|
|
2950: "en": "Tafresh",
|
|
2951: "fa": "تفرش",
|
|
2952: "de": "Tafresh"
|
|
2953: }
|
|
2954: },
|
|
2955: {
|
|
2956: "field": "locality",
|
|
2957: "key": "zarandiyeh",
|
|
2958: "name": {
|
|
2959: "en": "Zarandiyeh",
|
|
2960: "fa": "زرندیه",
|
|
2961: "de": "Zarandiyeh"
|
|
2962: }
|
|
2963: }
|
|
2964: ]
|
|
2965: },
|
|
2966: {
|
|
2967: "countryCode": "IR",
|
|
2968: "field": "administrative_area",
|
|
2969: "key": "mazandaran",
|
|
2970: "name": {
|
|
2971: "en": "Mazandaran",
|
|
2972: "fa": "مازندران",
|
|
2973: "de": "Mazandaran"
|
|
2974: },
|
|
2975: "children": [
|
|
2976: {
|
|
2977: "field": "locality",
|
|
2978: "key": "abbasabad",
|
|
2979: "name": {
|
|
2980: "en": "Abbasabad",
|
|
2981: "fa": "عباسآباد",
|
|
2982: "de": "Abbasabad"
|
|
2983: }
|
|
2984: },
|
|
2985: {
|
|
2986: "field": "locality",
|
|
2987: "key": "amol",
|
|
2988: "name": {
|
|
2989: "en": "Amol",
|
|
2990: "fa": "آمل",
|
|
2991: "de": "Amol"
|
|
2992: }
|
|
2993: },
|
|
2994: {
|
|
2995: "field": "locality",
|
|
2996: "key": "babol",
|
|
2997: "name": {
|
|
2998: "en": "Babol",
|
|
2999: "fa": "بابل",
|
|
3000: "de": "Babol"
|
|
3001: }
|
|
3002: },
|
|
3003: {
|
|
3004: "field": "locality",
|
|
3005: "key": "babolsar",
|
|
3006: "name": {
|
|
3007: "en": "Babolsar",
|
|
3008: "fa": "بابلسر",
|
|
3009: "de": "Babolsar"
|
|
3010: }
|
|
3011: },
|
|
3012: {
|
|
3013: "field": "locality",
|
|
3014: "key": "behshahr",
|
|
3015: "name": {
|
|
3016: "en": "Behshahr",
|
|
3017: "fa": "بهشهر",
|
|
3018: "de": "Behshahr"
|
|
3019: }
|
|
3020: },
|
|
3021: {
|
|
3022: "field": "locality",
|
|
3023: "key": "chalus",
|
|
3024: "name": {
|
|
3025: "en": "Chalus",
|
|
3026: "fa": "چالوس",
|
|
3027: "de": "Chalus"
|
|
3028: }
|
|
3029: },
|
|
3030: {
|
|
3031: "field": "locality",
|
|
3032: "key": "fereydunkenar",
|
|
3033: "name": {
|
|
3034: "en": "Fereydunkenar",
|
|
3035: "fa": "فریدونکنار",
|
|
3036: "de": "Fereydunkenar"
|
|
3037: }
|
|
3038: },
|
|
3039: {
|
|
3040: "field": "locality",
|
|
3041: "key": "galugah",
|
|
3042: "name": {
|
|
3043: "en": "Galugah",
|
|
3044: "fa": "گلوگاه",
|
|
3045: "de": "Galugah"
|
|
3046: }
|
|
3047: },
|
|
3048: {
|
|
3049: "field": "locality",
|
|
3050: "key": "juybar",
|
|
3051: "name": {
|
|
3052: "en": "Juybar",
|
|
3053: "fa": "جویبار",
|
|
3054: "de": "Juybar"
|
|
3055: }
|
|
3056: },
|
|
3057: {
|
|
3058: "field": "locality",
|
|
3059: "key": "kelardasht",
|
|
3060: "name": {
|
|
3061: "en": "Kelardasht",
|
|
3062: "fa": "کلاردشت",
|
|
3063: "de": "Kelardasht"
|
|
3064: }
|
|
3065: },
|
|
3066: {
|
|
3067: "field": "locality",
|
|
3068: "key": "mahmudabad",
|
|
3069: "name": {
|
|
3070: "en": "Mahmudabad",
|
|
3071: "fa": "محمودآباد",
|
|
3072: "de": "Mahmudabad"
|
|
3073: }
|
|
3074: },
|
|
3075: {
|
|
3076: "field": "locality",
|
|
3077: "key": "miandorud",
|
|
3078: "name": {
|
|
3079: "en": "Miandorud",
|
|
3080: "fa": "میاندورود",
|
|
3081: "de": "Miandorud"
|
|
3082: }
|
|
3083: },
|
|
3084: {
|
|
3085: "field": "locality",
|
|
3086: "key": "neka",
|
|
3087: "name": {
|
|
3088: "en": "Neka",
|
|
3089: "fa": "نکا",
|
|
3090: "de": "Neka"
|
|
3091: }
|
|
3092: },
|
|
3093: {
|
|
3094: "field": "locality",
|
|
3095: "key": "northsavadkuh",
|
|
3096: "name": {
|
|
3097: "en": "North Savadkuh",
|
|
3098: "fa": "سوادکوه شمالی",
|
|
3099: "de": "North Savadkuh"
|
|
3100: }
|
|
3101: },
|
|
3102: {
|
|
3103: "field": "locality",
|
|
3104: "key": "nowshahr",
|
|
3105: "name": {
|
|
3106: "en": "Nowshahr",
|
|
3107: "fa": "نوشهر",
|
|
3108: "de": "Nowshahr"
|
|
3109: }
|
|
3110: },
|
|
3111: {
|
|
3112: "field": "locality",
|
|
3113: "key": "nur",
|
|
3114: "name": {
|
|
3115: "en": "Nur",
|
|
3116: "fa": "نور",
|
|
3117: "de": "Nur"
|
|
3118: }
|
|
3119: },
|
|
3120: {
|
|
3121: "field": "locality",
|
|
3122: "key": "qaemshahr",
|
|
3123: "name": {
|
|
3124: "en": "Qaem Shahr",
|
|
3125: "fa": "قائمشهر",
|
|
3126: "de": "Qaem Shahr"
|
|
3127: }
|
|
3128: },
|
|
3129: {
|
|
3130: "field": "locality",
|
|
3131: "key": "ramsar",
|
|
3132: "name": {
|
|
3133: "en": "Ramsar",
|
|
3134: "fa": "رامسر",
|
|
3135: "de": "Ramsar"
|
|
3136: }
|
|
3137: },
|
|
3138: {
|
|
3139: "field": "locality",
|
|
3140: "key": "sari",
|
|
3141: "name": {
|
|
3142: "en": "Sari",
|
|
3143: "fa": "ساری",
|
|
3144: "de": "Sari"
|
|
3145: }
|
|
3146: },
|
|
3147: {
|
|
3148: "field": "locality",
|
|
3149: "key": "savadkuh",
|
|
3150: "name": {
|
|
3151: "en": "Savadkuh",
|
|
3152: "fa": "سوادکوه",
|
|
3153: "de": "Savadkuh"
|
|
3154: }
|
|
3155: },
|
|
3156: {
|
|
3157: "field": "locality",
|
|
3158: "key": "simorgh",
|
|
3159: "name": {
|
|
3160: "en": "Simorgh",
|
|
3161: "fa": "سیمرغ",
|
|
3162: "de": "Simorgh"
|
|
3163: }
|
|
3164: },
|
|
3165: {
|
|
3166: "field": "locality",
|
|
3167: "key": "tonekabon",
|
|
3168: "name": {
|
|
3169: "en": "Tonekabon",
|
|
3170: "fa": "تنکابن",
|
|
3171: "de": "Tonekabon"
|
|
3172: }
|
|
3173: }
|
|
3174: ]
|
|
3175: },
|
|
3176: {
|
|
3177: "countryCode": "IR",
|
|
3178: "field": "administrative_area",
|
|
3179: "key": "northkhorasan",
|
|
3180: "name": {
|
|
3181: "en": "North Khorasan",
|
|
3182: "fa": "خراسان شمالی",
|
|
3183: "de": "Nordchorasan"
|
|
3184: },
|
|
3185: "children": [
|
|
3186: {
|
|
3187: "field": "locality",
|
|
3188: "key": "bamandsafiabad",
|
|
3189: "name": {
|
|
3190: "en": "Bam and Safiabad",
|
|
3191: "fa": "بام و صفیآباد",
|
|
3192: "de": "Bam and Safiabad"
|
|
3193: }
|
|
3194: },
|
|
3195: {
|
|
3196: "field": "locality",
|
|
3197: "key": "bojnord",
|
|
3198: "name": {
|
|
3199: "en": "Bojnord",
|
|
3200: "fa": "بجنورد",
|
|
3201: "de": "Bojnord"
|
|
3202: }
|
|
3203: },
|
|
3204: {
|
|
3205: "field": "locality",
|
|
3206: "key": "esfarayen",
|
|
3207: "name": {
|
|
3208: "en": "Esfarayen",
|
|
3209: "fa": "اسفراین",
|
|
3210: "de": "Esfarayen"
|
|
3211: }
|
|
3212: },
|
|
3213: {
|
|
3214: "field": "locality",
|
|
3215: "key": "faruj",
|
|
3216: "name": {
|
|
3217: "en": "Faruj",
|
|
3218: "fa": "فاروج",
|
|
3219: "de": "Faruj"
|
|
3220: }
|
|
3221: },
|
|
3222: {
|
|
3223: "field": "locality",
|
|
3224: "key": "garmeh",
|
|
3225: "name": {
|
|
3226: "en": "Garmeh",
|
|
3227: "fa": "گرمه",
|
|
3228: "de": "Garmeh"
|
|
3229: }
|
|
3230: },
|
|
3231: {
|
|
3232: "field": "locality",
|
|
3233: "key": "jajrom",
|
|
3234: "name": {
|
|
3235: "en": "Jajrom",
|
|
3236: "fa": "جاجرم",
|
|
3237: "de": "Jajrom"
|
|
3238: }
|
|
3239: },
|
|
3240: {
|
|
3241: "field": "locality",
|
|
3242: "key": "maneh",
|
|
3243: "name": {
|
|
3244: "en": "Maneh",
|
|
3245: "fa": "مانه و سملقان",
|
|
3246: "de": "Maneh"
|
|
3247: }
|
|
3248: },
|
|
3249: {
|
|
3250: "field": "locality",
|
|
3251: "key": "razandjargalan",
|
|
3252: "name": {
|
|
3253: "en": "Raz and Jargalan",
|
|
3254: "fa": "راز و جرگلان",
|
|
3255: "de": "Raz and Jargalan"
|
|
3256: }
|
|
3257: },
|
|
3258: {
|
|
3259: "field": "locality",
|
|
3260: "key": "samalqan",
|
|
3261: "name": {
|
|
3262: "en": "Samalqan",
|
|
3263: "fa": "سملقان",
|
|
3264: "de": "Samalqan"
|
|
3265: }
|
|
3266: },
|
|
3267: {
|
|
3268: "field": "locality",
|
|
3269: "key": "shirvan",
|
|
3270: "name": {
|
|
3271: "en": "Shirvan",
|
|
3272: "fa": "شیروان",
|
|
3273: "de": "Shirvan"
|
|
3274: }
|
|
3275: }
|
|
3276: ]
|
|
3277: },
|
|
3278: {
|
|
3279: "countryCode": "IR",
|
|
3280: "field": "administrative_area",
|
|
3281: "key": "qazvin",
|
|
3282: "name": {
|
|
3283: "en": "Qazvin",
|
|
3284: "fa": "قزوین",
|
|
3285: "de": "Ghazvin"
|
|
3286: },
|
|
3287: "children": [
|
|
3288: {
|
|
3289: "field": "locality",
|
|
3290: "key": "abyek",
|
|
3291: "name": {
|
|
3292: "en": "Abyek",
|
|
3293: "fa": "آبیک",
|
|
3294: "de": "Abyek"
|
|
3295: }
|
|
3296: },
|
|
3297: {
|
|
3298: "field": "locality",
|
|
3299: "key": "alborz",
|
|
3300: "name": {
|
|
3301: "en": "Alborz",
|
|
3302: "fa": "البرز",
|
|
3303: "de": "Alborz"
|
|
3304: }
|
|
3305: },
|
|
3306: {
|
|
3307: "field": "locality",
|
|
3308: "key": "avaj",
|
|
3309: "name": {
|
|
3310: "en": "Avaj",
|
|
3311: "fa": "آوج",
|
|
3312: "de": "Avaj"
|
|
3313: }
|
|
3314: },
|
|
3315: {
|
|
3316: "field": "locality",
|
|
3317: "key": "buinzahra",
|
|
3318: "name": {
|
|
3319: "en": "Buin Zahra",
|
|
3320: "fa": "بوئینزهرا",
|
|
3321: "de": "Buin Zahra"
|
|
3322: }
|
|
3323: },
|
|
3324: {
|
|
3325: "field": "locality",
|
|
3326: "key": "qazvin",
|
|
3327: "name": {
|
|
3328: "en": "Qazvin",
|
|
3329: "fa": "قزوین",
|
|
3330: "de": "Ghazvin"
|
|
3331: }
|
|
3332: },
|
|
3333: {
|
|
3334: "field": "locality",
|
|
3335: "key": "takestan",
|
|
3336: "name": {
|
|
3337: "en": "Takestan",
|
|
3338: "fa": "تاکستان",
|
|
3339: "de": "Takestan"
|
|
3340: }
|
|
3341: }
|
|
3342: ]
|
|
3343: },
|
|
3344: {
|
|
3345: "countryCode": "IR",
|
|
3346: "field": "administrative_area",
|
|
3347: "key": "qom",
|
|
3348: "name": {
|
|
3349: "en": "Qom",
|
|
3350: "fa": "قم",
|
|
3351: "de": "Ghom"
|
|
3352: },
|
|
3353: "children": [
|
|
3354: {
|
|
3355: "field": "locality",
|
|
3356: "key": "jafarabad",
|
|
3357: "name": {
|
|
3358: "en": "Jafarabad",
|
|
3359: "fa": "جعفرآباد",
|
|
3360: "de": "Jafarabad"
|
|
3361: }
|
|
3362: },
|
|
3363: {
|
|
3364: "field": "locality",
|
|
3365: "key": "kahak",
|
|
3366: "name": {
|
|
3367: "en": "Kahak",
|
|
3368: "fa": "کهک",
|
|
3369: "de": "Kahak"
|
|
3370: }
|
|
3371: },
|
|
3372: {
|
|
3373: "field": "locality",
|
|
3374: "key": "qom",
|
|
3375: "name": {
|
|
3376: "en": "Qom",
|
|
3377: "fa": "قم",
|
|
3378: "de": "Ghom"
|
|
3379: }
|
|
3380: }
|
|
3381: ]
|
|
3382: },
|
|
3383: {
|
|
3384: "countryCode": "IR",
|
|
3385: "field": "administrative_area",
|
|
3386: "key": "razavikhorasan",
|
|
3387: "name": {
|
|
3388: "en": "Razavi Khorasan",
|
|
3389: "fa": "خراسان رضوی",
|
|
3390: "de": "Chorasan-e Razawi"
|
|
3391: },
|
|
3392: "children": [
|
|
3393: {
|
|
3394: "field": "locality",
|
|
3395: "key": "bajestan",
|
|
3396: "name": {
|
|
3397: "en": "Bajestan",
|
|
3398: "fa": "بجستان",
|
|
3399: "de": "Bajestan"
|
|
3400: }
|
|
3401: },
|
|
3402: {
|
|
3403: "field": "locality",
|
|
3404: "key": "bakharz",
|
|
3405: "name": {
|
|
3406: "en": "Bakharz",
|
|
3407: "fa": "باخرز",
|
|
3408: "de": "Bakharz"
|
|
3409: }
|
|
3410: },
|
|
3411: {
|
|
3412: "field": "locality",
|
|
3413: "key": "bardaskan",
|
|
3414: "name": {
|
|
3415: "en": "Bardaskan",
|
|
3416: "fa": "بردسکن",
|
|
3417: "de": "Bardaskan"
|
|
3418: }
|
|
3419: },
|
|
3420: {
|
|
3421: "field": "locality",
|
|
3422: "key": "chenaran",
|
|
3423: "name": {
|
|
3424: "en": "Chenaran",
|
|
3425: "fa": "چناران",
|
|
3426: "de": "Chenaran"
|
|
3427: }
|
|
3428: },
|
|
3429: {
|
|
3430: "field": "locality",
|
|
3431: "key": "dargaz",
|
|
3432: "name": {
|
|
3433: "en": "Dargaz",
|
|
3434: "fa": "درگز",
|
|
3435: "de": "Dargaz"
|
|
3436: }
|
|
3437: },
|
|
3438: {
|
|
3439: "field": "locality",
|
|
3440: "key": "davarzan",
|
|
3441: "name": {
|
|
3442: "en": "Davarzan",
|
|
3443: "fa": "داورزن",
|
|
3444: "de": "Davarzan"
|
|
3445: }
|
|
3446: },
|
|
3447: {
|
|
3448: "field": "locality",
|
|
3449: "key": "fariman",
|
|
3450: "name": {
|
|
3451: "en": "Fariman",
|
|
3452: "fa": "فریمان",
|
|
3453: "de": "Fariman"
|
|
3454: }
|
|
3455: },
|
|
3456: {
|
|
3457: "field": "locality",
|
|
3458: "key": "firuzeh",
|
|
3459: "name": {
|
|
3460: "en": "Firuzeh",
|
|
3461: "fa": "فیروزه",
|
|
3462: "de": "Firuzeh"
|
|
3463: }
|
|
3464: },
|
|
3465: {
|
|
3466: "field": "locality",
|
|
3467: "key": "golbahar",
|
|
3468: "name": {
|
|
3469: "en": "Golbahar",
|
|
3470: "fa": "گلبهار",
|
|
3471: "de": "Golbahar"
|
|
3472: }
|
|
3473: },
|
|
3474: {
|
|
3475: "field": "locality",
|
|
3476: "key": "gonabad",
|
|
3477: "name": {
|
|
3478: "en": "Gonabad",
|
|
3479: "fa": "گناباد",
|
|
3480: "de": "Gonabad"
|
|
3481: }
|
|
3482: },
|
|
3483: {
|
|
3484: "field": "locality",
|
|
3485: "key": "joghatai",
|
|
3486: "name": {
|
|
3487: "en": "Joghatai",
|
|
3488: "fa": "جغتای",
|
|
3489: "de": "Joghatai"
|
|
3490: }
|
|
3491: },
|
|
3492: {
|
|
3493: "field": "locality",
|
|
3494: "key": "joveyn",
|
|
3495: "name": {
|
|
3496: "en": "Joveyn",
|
|
3497: "fa": "جوین",
|
|
3498: "de": "Joveyn"
|
|
3499: }
|
|
3500: },
|
|
3501: {
|
|
3502: "field": "locality",
|
|
3503: "key": "kalat",
|
|
3504: "name": {
|
|
3505: "en": "Kalat",
|
|
3506: "fa": "کلات",
|
|
3507: "de": "Kalat"
|
|
3508: }
|
|
3509: },
|
|
3510: {
|
|
3511: "field": "locality",
|
|
3512: "key": "kashmar",
|
|
3513: "name": {
|
|
3514: "en": "Kashmar",
|
|
3515: "fa": "کاشمر",
|
|
3516: "de": "Kashmar"
|
|
3517: }
|
|
3518: },
|
|
3519: {
|
|
3520: "field": "locality",
|
|
3521: "key": "khaf",
|
|
3522: "name": {
|
|
3523: "en": "Khaf",
|
|
3524: "fa": "خواف",
|
|
3525: "de": "Khaf"
|
|
3526: }
|
|
3527: },
|
|
3528: {
|
|
3529: "field": "locality",
|
|
3530: "key": "khalilabad",
|
|
3531: "name": {
|
|
3532: "en": "Khalilabad",
|
|
3533: "fa": "خلیلآباد",
|
|
3534: "de": "Khalilabad"
|
|
3535: }
|
|
3536: },
|
|
3537: {
|
|
3538: "field": "locality",
|
|
3539: "key": "khoshab",
|
|
3540: "name": {
|
|
3541: "en": "Khoshab",
|
|
3542: "fa": "خوشاب",
|
|
3543: "de": "Khoshab"
|
|
3544: }
|
|
3545: },
|
|
3546: {
|
|
3547: "field": "locality",
|
|
3548: "key": "kuhsorkh",
|
|
3549: "name": {
|
|
3550: "en": "Kuhsorkh",
|
|
3551: "fa": "کوهسرخ",
|
|
3552: "de": "Kuhsorkh"
|
|
3553: }
|
|
3554: },
|
|
3555: {
|
|
3556: "field": "locality",
|
|
3557: "key": "mahvelat",
|
|
3558: "name": {
|
|
3559: "en": "Mahvelat",
|
|
3560: "fa": "مهولات",
|
|
3561: "de": "Mahvelat"
|
|
3562: }
|
|
3563: },
|
|
3564: {
|
|
3565: "field": "locality",
|
|
3566: "key": "mashhad",
|
|
3567: "name": {
|
|
3568: "en": "Mashhad",
|
|
3569: "fa": "مشهد",
|
|
3570: "de": "Mashhad"
|
|
3571: }
|
|
3572: },
|
|
3573: {
|
|
3574: "field": "locality",
|
|
3575: "key": "miyanjolgeh",
|
|
3576: "name": {
|
|
3577: "en": "Miyan Jolgeh",
|
|
3578: "fa": "میانجلگه",
|
|
3579: "de": "Miyan Jolgeh"
|
|
3580: }
|
|
3581: },
|
|
3582: {
|
|
3583: "field": "locality",
|
|
3584: "key": "nishapur",
|
|
3585: "name": {
|
|
3586: "en": "Nishapur",
|
|
3587: "fa": "نیشابور",
|
|
3588: "de": "Nishapur"
|
|
3589: }
|
|
3590: },
|
|
3591: {
|
|
3592: "field": "locality",
|
|
3593: "key": "quchan",
|
|
3594: "name": {
|
|
3595: "en": "Quchan",
|
|
3596: "fa": "قوچان",
|
|
3597: "de": "Quchan"
|
|
3598: }
|
|
3599: },
|
|
3600: {
|
|
3601: "field": "locality",
|
|
3602: "key": "roshtkhar",
|
|
3603: "name": {
|
|
3604: "en": "Roshtkhar",
|
|
3605: "fa": "رشتخوار",
|
|
3606: "de": "Roshtkhar"
|
|
3607: }
|
|
3608: },
|
|
3609: {
|
|
3610: "field": "locality",
|
|
3611: "key": "sabzevar",
|
|
3612: "name": {
|
|
3613: "en": "Sabzevar",
|
|
3614: "fa": "سبزوار",
|
|
3615: "de": "Sabzevar"
|
|
3616: }
|
|
3617: },
|
|
3618: {
|
|
3619: "field": "locality",
|
|
3620: "key": "salehabad",
|
|
3621: "name": {
|
|
3622: "en": "Salehabad",
|
|
3623: "fa": "صالحآباد",
|
|
3624: "de": "Salehabad"
|
|
3625: }
|
|
3626: },
|
|
3627: {
|
|
3628: "field": "locality",
|
|
3629: "key": "sarakhs",
|
|
3630: "name": {
|
|
3631: "en": "Sarakhs",
|
|
3632: "fa": "سرخس",
|
|
3633: "de": "Sarakhs"
|
|
3634: }
|
|
3635: },
|
|
3636: {
|
|
3637: "field": "locality",
|
|
3638: "key": "sheshtamad",
|
|
3639: "name": {
|
|
3640: "en": "Sheshtamad",
|
|
3641: "fa": "ششتمد",
|
|
3642: "de": "Sheshtamad"
|
|
3643: }
|
|
3644: },
|
|
3645: {
|
|
3646: "field": "locality",
|
|
3647: "key": "taybad",
|
|
3648: "name": {
|
|
3649: "en": "Taybad",
|
|
3650: "fa": "تایباد",
|
|
3651: "de": "Taybad"
|
|
3652: }
|
|
3653: },
|
|
3654: {
|
|
3655: "field": "locality",
|
|
3656: "key": "torbateheydarieh",
|
|
3657: "name": {
|
|
3658: "en": "Torbat-e Heydarieh",
|
|
3659: "fa": "تربت حیدریه",
|
|
3660: "de": "Torbat-e Heydarieh"
|
|
3661: }
|
|
3662: },
|
|
3663: {
|
|
3664: "field": "locality",
|
|
3665: "key": "torbatejam",
|
|
3666: "name": {
|
|
3667: "en": "Torbat-e Jam",
|
|
3668: "fa": "تربت جام",
|
|
3669: "de": "Torbat-e Jam"
|
|
3670: }
|
|
3671: },
|
|
3672: {
|
|
3673: "field": "locality",
|
|
3674: "key": "torqabehandshandiz",
|
|
3675: "name": {
|
|
3676: "en": "Torqabeh and Shandiz",
|
|
3677: "fa": "طرقبه و شاندیز",
|
|
3678: "de": "Torqabeh and Shandiz"
|
|
3679: }
|
|
3680: },
|
|
3681: {
|
|
3682: "field": "locality",
|
|
3683: "key": "zaveh",
|
|
3684: "name": {
|
|
3685: "en": "Zaveh",
|
|
3686: "fa": "زاوه",
|
|
3687: "de": "Zaveh"
|
|
3688: }
|
|
3689: },
|
|
3690: {
|
|
3691: "field": "locality",
|
|
3692: "key": "zeberkhan",
|
|
3693: "name": {
|
|
3694: "en": "Zeberkhan",
|
|
3695: "fa": "زبرخان",
|
|
3696: "de": "Zeberkhan"
|
|
3697: }
|
|
3698: }
|
|
3699: ]
|
|
3700: },
|
|
3701: {
|
|
3702: "countryCode": "IR",
|
|
3703: "field": "administrative_area",
|
|
3704: "key": "semnan",
|
|
3705: "name": {
|
|
3706: "en": "Semnan",
|
|
3707: "fa": "سمنان",
|
|
3708: "de": "Semnan"
|
|
3709: },
|
|
3710: "children": [
|
|
3711: {
|
|
3712: "field": "locality",
|
|
3713: "key": "aradan",
|
|
3714: "name": {
|
|
3715: "en": "Aradan",
|
|
3716: "fa": "آرادان",
|
|
3717: "de": "Aradan"
|
|
3718: }
|
|
3719: },
|
|
3720: {
|
|
3721: "field": "locality",
|
|
3722: "key": "damghan",
|
|
3723: "name": {
|
|
3724: "en": "Damghan",
|
|
3725: "fa": "دامغان",
|
|
3726: "de": "Damghan"
|
|
3727: }
|
|
3728: },
|
|
3729: {
|
|
3730: "field": "locality",
|
|
3731: "key": "garmsar",
|
|
3732: "name": {
|
|
3733: "en": "Garmsar",
|
|
3734: "fa": "گرمسار",
|
|
3735: "de": "Garmsar"
|
|
3736: }
|
|
3737: },
|
|
3738: {
|
|
3739: "field": "locality",
|
|
3740: "key": "mehdishahr",
|
|
3741: "name": {
|
|
3742: "en": "Mehdishahr",
|
|
3743: "fa": "مهدیشهر",
|
|
3744: "de": "Mehdishahr"
|
|
3745: }
|
|
3746: },
|
|
3747: {
|
|
3748: "field": "locality",
|
|
3749: "key": "meyami",
|
|
3750: "name": {
|
|
3751: "en": "Meyami",
|
|
3752: "fa": "میامی",
|
|
3753: "de": "Meyami"
|
|
3754: }
|
|
3755: },
|
|
3756: {
|
|
3757: "field": "locality",
|
|
3758: "key": "semnan",
|
|
3759: "name": {
|
|
3760: "en": "Semnan",
|
|
3761: "fa": "سمنان",
|
|
3762: "de": "Semnan"
|
|
3763: }
|
|
3764: },
|
|
3765: {
|
|
3766: "field": "locality",
|
|
3767: "key": "shahrud",
|
|
3768: "name": {
|
|
3769: "en": "Shahrud",
|
|
3770: "fa": "شاهرود",
|
|
3771: "de": "Shahrud"
|
|
3772: }
|
|
3773: },
|
|
3774: {
|
|
3775: "field": "locality",
|
|
3776: "key": "sorkheh",
|
|
3777: "name": {
|
|
3778: "en": "Sorkheh",
|
|
3779: "fa": "سرخه",
|
|
3780: "de": "Sorkheh"
|
|
3781: }
|
|
3782: }
|
|
3783: ]
|
|
3784: },
|
|
3785: {
|
|
3786: "countryCode": "IR",
|
|
3787: "field": "administrative_area",
|
|
3788: "key": "sistanandbaluchistan",
|
|
3789: "name": {
|
|
3790: "en": "Sistan and Baluchistan",
|
|
3791: "fa": "سیستان و بلوچستان",
|
|
3792: "de": "Sistan und Belutschistan"
|
|
3793: },
|
|
3794: "children": [
|
|
3795: {
|
|
3796: "field": "locality",
|
|
3797: "key": "bampur",
|
|
3798: "name": {
|
|
3799: "en": "Bampur",
|
|
3800: "fa": "بمپور",
|
|
3801: "de": "Bampur"
|
|
3802: }
|
|
3803: },
|
|
3804: {
|
|
3805: "field": "locality",
|
|
3806: "key": "chabahar",
|
|
3807: "name": {
|
|
3808: "en": "Chabahar",
|
|
3809: "fa": "چابهار",
|
|
3810: "de": "Chabahar"
|
|
3811: }
|
|
3812: },
|
|
3813: {
|
|
3814: "field": "locality",
|
|
3815: "key": "dalgan",
|
|
3816: "name": {
|
|
3817: "en": "Dalgan",
|
|
3818: "fa": "دلگان",
|
|
3819: "de": "Dalgan"
|
|
3820: }
|
|
3821: },
|
|
3822: {
|
|
3823: "field": "locality",
|
|
3824: "key": "dashtiari",
|
|
3825: "name": {
|
|
3826: "en": "Dashtiari",
|
|
3827: "fa": "دشتیاری",
|
|
3828: "de": "Dashtiari"
|
|
3829: }
|
|
3830: },
|
|
3831: {
|
|
3832: "field": "locality",
|
|
3833: "key": "fanuj",
|
|
3834: "name": {
|
|
3835: "en": "Fanuj",
|
|
3836: "fa": "فنوج",
|
|
3837: "de": "Fanuj"
|
|
3838: }
|
|
3839: },
|
|
3840: {
|
|
3841: "field": "locality",
|
|
3842: "key": "golshan",
|
|
3843: "name": {
|
|
3844: "en": "Golshan",
|
|
3845: "fa": "گلشن",
|
|
3846: "de": "Golshan"
|
|
3847: }
|
|
3848: },
|
|
3849: {
|
|
3850: "field": "locality",
|
|
3851: "key": "hamun",
|
|
3852: "name": {
|
|
3853: "en": "Hamun",
|
|
3854: "fa": "هامون",
|
|
3855: "de": "Hamun"
|
|
3856: }
|
|
3857: },
|
|
3858: {
|
|
3859: "field": "locality",
|
|
3860: "key": "hirmand",
|
|
3861: "name": {
|
|
3862: "en": "Hirmand",
|
|
3863: "fa": "هیرمند",
|
|
3864: "de": "Hirmand"
|
|
3865: }
|
|
3866: },
|
|
3867: {
|
|
3868: "field": "locality",
|
|
3869: "key": "iranshahr",
|
|
3870: "name": {
|
|
3871: "en": "Iranshahr",
|
|
3872: "fa": "ایرانشهر",
|
|
3873: "de": "Iranshahr"
|
|
3874: }
|
|
3875: },
|
|
3876: {
|
|
3877: "field": "locality",
|
|
3878: "key": "khash",
|
|
3879: "name": {
|
|
3880: "en": "Khash",
|
|
3881: "fa": "خاش",
|
|
3882: "de": "Khash"
|
|
3883: }
|
|
3884: },
|
|
3885: {
|
|
3886: "field": "locality",
|
|
3887: "key": "konarak",
|
|
3888: "name": {
|
|
3889: "en": "Konarak",
|
|
3890: "fa": "کنارک",
|
|
3891: "de": "Konarak"
|
|
3892: }
|
|
3893: },
|
|
3894: {
|
|
3895: "field": "locality",
|
|
3896: "key": "lashar",
|
|
3897: "name": {
|
|
3898: "en": "Lashar",
|
|
3899: "fa": "لاشار",
|
|
3900: "de": "Lashar"
|
|
3901: }
|
|
3902: },
|
|
3903: {
|
|
3904: "field": "locality",
|
|
3905: "key": "mehrestan",
|
|
3906: "name": {
|
|
3907: "en": "Mehrestan",
|
|
3908: "fa": "مهرستان",
|
|
3909: "de": "Mehrestan"
|
|
3910: }
|
|
3911: },
|
|
3912: {
|
|
3913: "field": "locality",
|
|
3914: "key": "mirjaveh",
|
|
3915: "name": {
|
|
3916: "en": "Mirjaveh",
|
|
3917: "fa": "میرجاوه",
|
|
3918: "de": "Mirjaveh"
|
|
3919: }
|
|
3920: },
|
|
3921: {
|
|
3922: "field": "locality",
|
|
3923: "key": "nikshahr",
|
|
3924: "name": {
|
|
3925: "en": "Nik Shahr",
|
|
3926: "fa": "نیکشهر",
|
|
3927: "de": "Nik Shahr"
|
|
3928: }
|
|
3929: },
|
|
3930: {
|
|
3931: "field": "locality",
|
|
3932: "key": "nimruz",
|
|
3933: "name": {
|
|
3934: "en": "Nimruz",
|
|
3935: "fa": "نیمروز",
|
|
3936: "de": "Nimruz"
|
|
3937: }
|
|
3938: },
|
|
3939: {
|
|
3940: "field": "locality",
|
|
3941: "key": "qasreqand",
|
|
3942: "name": {
|
|
3943: "en": "Qasr-e Qand",
|
|
3944: "fa": "قصرقند",
|
|
3945: "de": "Qasr-e Qand"
|
|
3946: }
|
|
3947: },
|
|
3948: {
|
|
3949: "field": "locality",
|
|
3950: "key": "rask",
|
|
3951: "name": {
|
|
3952: "en": "Rask",
|
|
3953: "fa": "راسک",
|
|
3954: "de": "Rask"
|
|
3955: }
|
|
3956: },
|
|
3957: {
|
|
3958: "field": "locality",
|
|
3959: "key": "saravan",
|
|
3960: "name": {
|
|
3961: "en": "Saravan",
|
|
3962: "fa": "سراوان",
|
|
3963: "de": "Saravan"
|
|
3964: }
|
|
3965: },
|
|
3966: {
|
|
3967: "field": "locality",
|
|
3968: "key": "sarbaz",
|
|
3969: "name": {
|
|
3970: "en": "Sarbaz",
|
|
3971: "fa": "سرباز",
|
|
3972: "de": "Sarbaz"
|
|
3973: }
|
|
3974: },
|
|
3975: {
|
|
3976: "field": "locality",
|
|
3977: "key": "sibandsuran",
|
|
3978: "name": {
|
|
3979: "en": "Sib and Suran",
|
|
3980: "fa": "سیب و سوران",
|
|
3981: "de": "Sib and Suran"
|
|
3982: }
|
|
3983: },
|
|
3984: {
|
|
3985: "field": "locality",
|
|
3986: "key": "taftan",
|
|
3987: "name": {
|
|
3988: "en": "Taftan",
|
|
3989: "fa": "تفتان",
|
|
3990: "de": "Taftan"
|
|
3991: }
|
|
3992: },
|
|
3993: {
|
|
3994: "field": "locality",
|
|
3995: "key": "zabol",
|
|
3996: "name": {
|
|
3997: "en": "Zabol",
|
|
3998: "fa": "زابل",
|
|
3999: "de": "Zabol"
|
|
4000: }
|
|
4001: },
|
|
4002: {
|
|
4003: "field": "locality",
|
|
4004: "key": "zahedan",
|
|
4005: "name": {
|
|
4006: "en": "Zahedan",
|
|
4007: "fa": "زاهدان",
|
|
4008: "de": "Zahedan"
|
|
4009: }
|
|
4010: },
|
|
4011: {
|
|
4012: "field": "locality",
|
|
4013: "key": "zarabad",
|
|
4014: "name": {
|
|
4015: "en": "Zarabad",
|
|
4016: "fa": "زرآباد",
|
|
4017: "de": "Zarabad"
|
|
4018: }
|
|
4019: },
|
|
4020: {
|
|
4021: "field": "locality",
|
|
4022: "key": "zehak",
|
|
4023: "name": {
|
|
4024: "en": "Zehak",
|
|
4025: "fa": "زهک",
|
|
4026: "de": "Zehak"
|
|
4027: }
|
|
4028: }
|
|
4029: ]
|
|
4030: },
|
|
4031: {
|
|
4032: "countryCode": "IR",
|
|
4033: "field": "administrative_area",
|
|
4034: "key": "southkhorasan",
|
|
4035: "name": {
|
|
4036: "en": "South Khorasan",
|
|
4037: "fa": "خراسان جنوبی",
|
|
4038: "de": "Südchorasan"
|
|
4039: },
|
|
4040: "children": [
|
|
4041: {
|
|
4042: "field": "locality",
|
|
4043: "key": "birjand",
|
|
4044: "name": {
|
|
4045: "en": "Birjand",
|
|
4046: "fa": "بیرجند",
|
|
4047: "de": "Birjand"
|
|
4048: }
|
|
4049: },
|
|
4050: {
|
|
4051: "field": "locality",
|
|
4052: "key": "boshruyeh",
|
|
4053: "name": {
|
|
4054: "en": "Boshruyeh",
|
|
4055: "fa": "بشرویه",
|
|
4056: "de": "Boshruyeh"
|
|
4057: }
|
|
4058: },
|
|
4059: {
|
|
4060: "field": "locality",
|
|
4061: "key": "darmian",
|
|
4062: "name": {
|
|
4063: "en": "Darmian",
|
|
4064: "fa": "درمیان",
|
|
4065: "de": "Darmian"
|
|
4066: }
|
|
4067: },
|
|
4068: {
|
|
4069: "field": "locality",
|
|
4070: "key": "ferdows",
|
|
4071: "name": {
|
|
4072: "en": "Ferdows",
|
|
4073: "fa": "فردوس",
|
|
4074: "de": "Ferdows"
|
|
4075: }
|
|
4076: },
|
|
4077: {
|
|
4078: "field": "locality",
|
|
4079: "key": "khusf",
|
|
4080: "name": {
|
|
4081: "en": "Khusf",
|
|
4082: "fa": "خوسف",
|
|
4083: "de": "Khusf"
|
|
4084: }
|
|
4085: },
|
|
4086: {
|
|
4087: "field": "locality",
|
|
4088: "key": "nehbandan",
|
|
4089: "name": {
|
|
4090: "en": "Nehbandan",
|
|
4091: "fa": "نهبندان",
|
|
4092: "de": "Nehbandan"
|
|
4093: }
|
|
4094: },
|
|
4095: {
|
|
4096: "field": "locality",
|
|
4097: "key": "qaen",
|
|
4098: "name": {
|
|
4099: "en": "Qaen",
|
|
4100: "fa": "قائنات",
|
|
4101: "de": "Qaen"
|
|
4102: }
|
|
4103: },
|
|
4104: {
|
|
4105: "field": "locality",
|
|
4106: "key": "sarayan",
|
|
4107: "name": {
|
|
4108: "en": "Sarayan",
|
|
4109: "fa": "سرایان",
|
|
4110: "de": "Sarayan"
|
|
4111: }
|
|
4112: },
|
|
4113: {
|
|
4114: "field": "locality",
|
|
4115: "key": "sarbisheh",
|
|
4116: "name": {
|
|
4117: "en": "Sarbisheh",
|
|
4118: "fa": "سربیشه",
|
|
4119: "de": "Sarbisheh"
|
|
4120: }
|
|
4121: },
|
|
4122: {
|
|
4123: "field": "locality",
|
|
4124: "key": "tabas",
|
|
4125: "name": {
|
|
4126: "en": "Tabas",
|
|
4127: "fa": "طبس",
|
|
4128: "de": "Tabas"
|
|
4129: }
|
|
4130: },
|
|
4131: {
|
|
4132: "field": "locality",
|
|
4133: "key": "zirkuh",
|
|
4134: "name": {
|
|
4135: "en": "Zirkuh",
|
|
4136: "fa": "زیرکوه",
|
|
4137: "de": "Zirkuh"
|
|
4138: }
|
|
4139: }
|
|
4140: ]
|
|
4141: },
|
|
4142: {
|
|
4143: "countryCode": "IR",
|
|
4144: "field": "administrative_area",
|
|
4145: "key": "tehran",
|
|
4146: "name": {
|
|
4147: "en": "Tehran",
|
|
4148: "fa": "تهران",
|
|
4149: "de": "Teheran"
|
|
4150: },
|
|
4151: "children": [
|
|
4152: {
|
|
4153: "field": "locality",
|
|
4154: "key": "baharestan",
|
|
4155: "name": {
|
|
4156: "en": "Baharestan",
|
|
4157: "fa": "بهارستان",
|
|
4158: "de": "Baharestan"
|
|
4159: }
|
|
4160: },
|
|
4161: {
|
|
4162: "field": "locality",
|
|
4163: "key": "damavand",
|
|
4164: "name": {
|
|
4165: "en": "Damavand",
|
|
4166: "fa": "دماوند",
|
|
4167: "de": "Damavand"
|
|
4168: }
|
|
4169: },
|
|
4170: {
|
|
4171: "field": "locality",
|
|
4172: "key": "eslamshahr",
|
|
4173: "name": {
|
|
4174: "en": "Eslamshahr",
|
|
4175: "fa": "اسلامشهر",
|
|
4176: "de": "Eslamshahr"
|
|
4177: }
|
|
4178: },
|
|
4179: {
|
|
4180: "field": "locality",
|
|
4181: "key": "firuzkuh",
|
|
4182: "name": {
|
|
4183: "en": "Firuzkuh",
|
|
4184: "fa": "فیروزکوه",
|
|
4185: "de": "Firuzkuh"
|
|
4186: }
|
|
4187: },
|
|
4188: {
|
|
4189: "field": "locality",
|
|
4190: "key": "malard",
|
|
4191: "name": {
|
|
4192: "en": "Malard",
|
|
4193: "fa": "ملارد",
|
|
4194: "de": "Malard"
|
|
4195: }
|
|
4196: },
|
|
4197: {
|
|
4198: "field": "locality",
|
|
4199: "key": "pakdasht",
|
|
4200: "name": {
|
|
4201: "en": "Pakdasht",
|
|
4202: "fa": "پاکدشت",
|
|
4203: "de": "Pakdasht"
|
|
4204: }
|
|
4205: },
|
|
4206: {
|
|
4207: "field": "locality",
|
|
4208: "key": "pardis",
|
|
4209: "name": {
|
|
4210: "en": "Pardis",
|
|
4211: "fa": "پردیس",
|
|
4212: "de": "Pardis"
|
|
4213: }
|
|
4214: },
|
|
4215: {
|
|
4216: "field": "locality",
|
|
4217: "key": "pishva",
|
|
4218: "name": {
|
|
4219: "en": "Pishva",
|
|
4220: "fa": "پیشوا",
|
|
4221: "de": "Pishva"
|
|
4222: }
|
|
4223: },
|
|
4224: {
|
|
4225: "field": "locality",
|
|
4226: "key": "qarchak",
|
|
4227: "name": {
|
|
4228: "en": "Qarchak",
|
|
4229: "fa": "قرچک",
|
|
4230: "de": "Qarchak"
|
|
4231: }
|
|
4232: },
|
|
4233: {
|
|
4234: "field": "locality",
|
|
4235: "key": "qods",
|
|
4236: "name": {
|
|
4237: "en": "Qods",
|
|
4238: "fa": "قدس",
|
|
4239: "de": "Qods"
|
|
4240: }
|
|
4241: },
|
|
4242: {
|
|
4243: "field": "locality",
|
|
4244: "key": "ray",
|
|
4245: "name": {
|
|
4246: "en": "Ray",
|
|
4247: "fa": "ری",
|
|
4248: "de": "Ray"
|
|
4249: }
|
|
4250: },
|
|
4251: {
|
|
4252: "field": "locality",
|
|
4253: "key": "robatkarim",
|
|
4254: "name": {
|
|
4255: "en": "Robat Karim",
|
|
4256: "fa": "رباطکریم",
|
|
4257: "de": "Robat Karim"
|
|
4258: }
|
|
4259: },
|
|
4260: {
|
|
4261: "field": "locality",
|
|
4262: "key": "shahriar",
|
|
4263: "name": {
|
|
4264: "en": "Shahriar",
|
|
4265: "fa": "شهریار",
|
|
4266: "de": "Shahriar"
|
|
4267: }
|
|
4268: },
|
|
4269: {
|
|
4270: "field": "locality",
|
|
4271: "key": "shemiranat",
|
|
4272: "name": {
|
|
4273: "en": "Shemiranat",
|
|
4274: "fa": "شمیرانات",
|
|
4275: "de": "Shemiranat"
|
|
4276: }
|
|
4277: },
|
|
4278: {
|
|
4279: "field": "locality",
|
|
4280: "key": "tehran",
|
|
4281: "name": {
|
|
4282: "en": "Tehran",
|
|
4283: "fa": "تهران",
|
|
4284: "de": "Teheran"
|
|
4285: }
|
|
4286: },
|
|
4287: {
|
|
4288: "field": "locality",
|
|
4289: "key": "varamin",
|
|
4290: "name": {
|
|
4291: "en": "Varamin",
|
|
4292: "fa": "ورامین",
|
|
4293: "de": "Varamin"
|
|
4294: }
|
|
4295: }
|
|
4296: ]
|
|
4297: },
|
|
4298: {
|
|
4299: "countryCode": "IR",
|
|
4300: "field": "administrative_area",
|
|
4301: "key": "westazerbaijan",
|
|
4302: "name": {
|
|
4303: "en": "West Azerbaijan",
|
|
4304: "fa": "آذربایجان غربی",
|
|
4305: "de": "West-Aserbaidschan"
|
|
4306: },
|
|
4307: "children": [
|
|
4308: {
|
|
4309: "field": "locality",
|
|
4310: "key": "baruq",
|
|
4311: "name": {
|
|
4312: "en": "Baruq",
|
|
4313: "fa": "باروق",
|
|
4314: "de": "Baruq"
|
|
4315: }
|
|
4316: },
|
|
4317: {
|
|
4318: "field": "locality",
|
|
4319: "key": "bukan",
|
|
4320: "name": {
|
|
4321: "en": "Bukan",
|
|
4322: "fa": "بوکان",
|
|
4323: "de": "Bukan"
|
|
4324: }
|
|
4325: },
|
|
4326: {
|
|
4327: "field": "locality",
|
|
4328: "key": "chaharborj",
|
|
4329: "name": {
|
|
4330: "en": "Chaharborj",
|
|
4331: "fa": "چهاربرج",
|
|
4332: "de": "Chaharborj"
|
|
4333: }
|
|
4334: },
|
|
4335: {
|
|
4336: "field": "locality",
|
|
4337: "key": "chaldoran",
|
|
4338: "name": {
|
|
4339: "en": "Chaldoran",
|
|
4340: "fa": "چالدران",
|
|
4341: "de": "Chaldoran"
|
|
4342: }
|
|
4343: },
|
|
4344: {
|
|
4345: "field": "locality",
|
|
4346: "key": "chaypareh",
|
|
4347: "name": {
|
|
4348: "en": "Chaypareh",
|
|
4349: "fa": "چایپاره",
|
|
4350: "de": "Chaypareh"
|
|
4351: }
|
|
4352: },
|
|
4353: {
|
|
4354: "field": "locality",
|
|
4355: "key": "khoy",
|
|
4356: "name": {
|
|
4357: "en": "Khoy",
|
|
4358: "fa": "خوی",
|
|
4359: "de": "Khoy"
|
|
4360: }
|
|
4361: },
|
|
4362: {
|
|
4363: "field": "locality",
|
|
4364: "key": "mahabad",
|
|
4365: "name": {
|
|
4366: "en": "Mahabad",
|
|
4367: "fa": "مهاباد",
|
|
4368: "de": "Mahabad"
|
|
4369: }
|
|
4370: },
|
|
4371: {
|
|
4372: "field": "locality",
|
|
4373: "key": "maku",
|
|
4374: "name": {
|
|
4375: "en": "Maku",
|
|
4376: "fa": "ماکو",
|
|
4377: "de": "Maku"
|
|
4378: }
|
|
4379: },
|
|
4380: {
|
|
4381: "field": "locality",
|
|
4382: "key": "miandoab",
|
|
4383: "name": {
|
|
4384: "en": "Miandoab",
|
|
4385: "fa": "میاندوآب",
|
|
4386: "de": "Miandoab"
|
|
4387: }
|
|
4388: },
|
|
4389: {
|
|
4390: "field": "locality",
|
|
4391: "key": "mirabad",
|
|
4392: "name": {
|
|
4393: "en": "Mirabad",
|
|
4394: "fa": "میرآباد",
|
|
4395: "de": "Mirabad"
|
|
4396: }
|
|
4397: },
|
|
4398: {
|
|
4399: "field": "locality",
|
|
4400: "key": "naqadeh",
|
|
4401: "name": {
|
|
4402: "en": "Naqadeh",
|
|
4403: "fa": "نقده",
|
|
4404: "de": "Naqadeh"
|
|
4405: }
|
|
4406: },
|
|
4407: {
|
|
4408: "field": "locality",
|
|
4409: "key": "oshnavieh",
|
|
4410: "name": {
|
|
4411: "en": "Oshnavieh",
|
|
4412: "fa": "اشنویه",
|
|
4413: "de": "Oshnavieh"
|
|
4414: }
|
|
4415: },
|
|
4416: {
|
|
4417: "field": "locality",
|
|
4418: "key": "piranshahr",
|
|
4419: "name": {
|
|
4420: "en": "Piranshahr",
|
|
4421: "fa": "پیرانشهر",
|
|
4422: "de": "Piranshahr"
|
|
4423: }
|
|
4424: },
|
|
4425: {
|
|
4426: "field": "locality",
|
|
4427: "key": "poldasht",
|
|
4428: "name": {
|
|
4429: "en": "Poldasht",
|
|
4430: "fa": "پلدشت",
|
|
4431: "de": "Poldasht"
|
|
4432: }
|
|
4433: },
|
|
4434: {
|
|
4435: "field": "locality",
|
|
4436: "key": "salmas",
|
|
4437: "name": {
|
|
4438: "en": "Salmas",
|
|
4439: "fa": "سلماس",
|
|
4440: "de": "Salmas"
|
|
4441: }
|
|
4442: },
|
|
4443: {
|
|
4444: "field": "locality",
|
|
4445: "key": "sardasht",
|
|
4446: "name": {
|
|
4447: "en": "Sardasht",
|
|
4448: "fa": "سردشت",
|
|
4449: "de": "Sardasht"
|
|
4450: }
|
|
4451: },
|
|
4452: {
|
|
4453: "field": "locality",
|
|
4454: "key": "shahindezh",
|
|
4455: "name": {
|
|
4456: "en": "Shahin Dezh",
|
|
4457: "fa": "شاهیندژ",
|
|
4458: "de": "Shahin Dezh"
|
|
4459: }
|
|
4460: },
|
|
4461: {
|
|
4462: "field": "locality",
|
|
4463: "key": "showt",
|
|
4464: "name": {
|
|
4465: "en": "Showt",
|
|
4466: "fa": "شوط",
|
|
4467: "de": "Showt"
|
|
4468: }
|
|
4469: },
|
|
4470: {
|
|
4471: "field": "locality",
|
|
4472: "key": "takab",
|
|
4473: "name": {
|
|
4474: "en": "Takab",
|
|
4475: "fa": "تکاب",
|
|
4476: "de": "Takab"
|
|
4477: }
|
|
4478: },
|
|
4479: {
|
|
4480: "field": "locality",
|
|
4481: "key": "urmia",
|
|
4482: "name": {
|
|
4483: "en": "Urmia",
|
|
4484: "fa": "ارومیه",
|
|
4485: "de": "Urmia"
|
|
4486: }
|
|
4487: }
|
|
4488: ]
|
|
4489: },
|
|
4490: {
|
|
4491: "countryCode": "IR",
|
|
4492: "field": "administrative_area",
|
|
4493: "key": "yazd",
|
|
4494: "name": {
|
|
4495: "en": "Yazd",
|
|
4496: "fa": "یزد",
|
|
4497: "de": "Yazd"
|
|
4498: },
|
|
4499: "children": [
|
|
4500: {
|
|
4501: "field": "locality",
|
|
4502: "key": "abarkuh",
|
|
4503: "name": {
|
|
4504: "en": "Abarkuh",
|
|
4505: "fa": "ابرکوه",
|
|
4506: "de": "Abarkuh"
|
|
4507: }
|
|
4508: },
|
|
4509: {
|
|
4510: "field": "locality",
|
|
4511: "key": "ardakan",
|
|
4512: "name": {
|
|
4513: "en": "Ardakan",
|
|
4514: "fa": "اردکان",
|
|
4515: "de": "Ardakan"
|
|
4516: }
|
|
4517: },
|
|
4518: {
|
|
4519: "field": "locality",
|
|
4520: "key": "ashkezar",
|
|
4521: "name": {
|
|
4522: "en": "Ashkezar",
|
|
4523: "fa": "اشکذر",
|
|
4524: "de": "Ashkezar"
|
|
4525: }
|
|
4526: },
|
|
4527: {
|
|
4528: "field": "locality",
|
|
4529: "key": "bafq",
|
|
4530: "name": {
|
|
4531: "en": "Bafq",
|
|
4532: "fa": "بافق",
|
|
4533: "de": "Bafq"
|
|
4534: }
|
|
4535: },
|
|
4536: {
|
|
4537: "field": "locality",
|
|
4538: "key": "behabad",
|
|
4539: "name": {
|
|
4540: "en": "Behabad",
|
|
4541: "fa": "بهاباد",
|
|
4542: "de": "Behabad"
|
|
4543: }
|
|
4544: },
|
|
4545: {
|
|
4546: "field": "locality",
|
|
4547: "key": "khatam",
|
|
4548: "name": {
|
|
4549: "en": "Khatam",
|
|
4550: "fa": "خاتم",
|
|
4551: "de": "Khatam"
|
|
4552: }
|
|
4553: },
|
|
4554: {
|
|
4555: "field": "locality",
|
|
4556: "key": "marvast",
|
|
4557: "name": {
|
|
4558: "en": "Marvast",
|
|
4559: "fa": "مروست",
|
|
4560: "de": "Marvast"
|
|
4561: }
|
|
4562: },
|
|
4563: {
|
|
4564: "field": "locality",
|
|
4565: "key": "mehriz",
|
|
4566: "name": {
|
|
4567: "en": "Mehriz",
|
|
4568: "fa": "مهریز",
|
|
4569: "de": "Mehriz"
|
|
4570: }
|
|
4571: },
|
|
4572: {
|
|
4573: "field": "locality",
|
|
4574: "key": "meybod",
|
|
4575: "name": {
|
|
4576: "en": "Meybod",
|
|
4577: "fa": "میبد",
|
|
4578: "de": "Meybod"
|
|
4579: }
|
|
4580: },
|
|
4581: {
|
|
4582: "field": "locality",
|
|
4583: "key": "taft",
|
|
4584: "name": {
|
|
4585: "en": "Taft",
|
|
4586: "fa": "تفت",
|
|
4587: "de": "Taft"
|
|
4588: }
|
|
4589: },
|
|
4590: {
|
|
4591: "field": "locality",
|
|
4592: "key": "yazd",
|
|
4593: "name": {
|
|
4594: "en": "Yazd",
|
|
4595: "fa": "یزد",
|
|
4596: "de": "Yazd"
|
|
4597: }
|
|
4598: },
|
|
4599: {
|
|
4600: "field": "locality",
|
|
4601: "key": "zarach",
|
|
4602: "name": {
|
|
4603: "en": "Zarach",
|
|
4604: "fa": "زارچ",
|
|
4605: "de": "Zarach"
|
|
4606: }
|
|
4607: }
|
|
4608: ]
|
|
4609: },
|
|
4610: {
|
|
4611: "countryCode": "IR",
|
|
4612: "field": "administrative_area",
|
|
4613: "key": "zanjan",
|
|
4614: "name": {
|
|
4615: "en": "Zanjan",
|
|
4616: "fa": "زنجان",
|
|
4617: "de": "Zanjan"
|
|
4618: },
|
|
4619: "children": [
|
|
4620: {
|
|
4621: "field": "locality",
|
|
4622: "key": "abhar",
|
|
4623: "name": {
|
|
4624: "en": "Abhar",
|
|
4625: "fa": "ابهر",
|
|
4626: "de": "Abhar"
|
|
4627: }
|
|
4628: },
|
|
4629: {
|
|
4630: "field": "locality",
|
|
4631: "key": "ijrud",
|
|
4632: "name": {
|
|
4633: "en": "Ijrud",
|
|
4634: "fa": "ایجرود",
|
|
4635: "de": "Ijrud"
|
|
4636: }
|
|
4637: },
|
|
4638: {
|
|
4639: "field": "locality",
|
|
4640: "key": "khodabandeh",
|
|
4641: "name": {
|
|
4642: "en": "Khodabandeh",
|
|
4643: "fa": "خدابنده",
|
|
4644: "de": "Khodabandeh"
|
|
4645: }
|
|
4646: },
|
|
4647: {
|
|
4648: "field": "locality",
|
|
4649: "key": "khorramdarreh",
|
|
4650: "name": {
|
|
4651: "en": "Khorramdarreh",
|
|
4652: "fa": "خرمدره",
|
|
4653: "de": "Khorramdarreh"
|
|
4654: }
|
|
4655: },
|
|
4656: {
|
|
4657: "field": "locality",
|
|
4658: "key": "mahneshan",
|
|
4659: "name": {
|
|
4660: "en": "Mahneshan",
|
|
4661: "fa": "ماهنشان",
|
|
4662: "de": "Mahneshan"
|
|
4663: }
|
|
4664: },
|
|
4665: {
|
|
4666: "field": "locality",
|
|
4667: "key": "soltaniyeh",
|
|
4668: "name": {
|
|
4669: "en": "Soltaniyeh",
|
|
4670: "fa": "سلطانیه",
|
|
4671: "de": "Soltaniyeh"
|
|
4672: }
|
|
4673: },
|
|
4674: {
|
|
4675: "field": "locality",
|
|
4676: "key": "tarom",
|
|
4677: "name": {
|
|
4678: "en": "Tarom",
|
|
4679: "fa": "طارم",
|
|
4680: "de": "Tarom"
|
|
4681: }
|
|
4682: },
|
|
4683: {
|
|
4684: "field": "locality",
|
|
4685: "key": "zanjan",
|
|
4686: "name": {
|
|
4687: "en": "Zanjan",
|
|
4688: "fa": "زنجان",
|
|
4689: "de": "Zanjan"
|
|
4690: }
|
|
4691: }
|
|
4692: ]
|
|
4693: }
|
|
4694: ]
|
|
</file>
|
|
|
|
<file path="database/seeders/data/countries.seed.json">
|
|
1: [
|
|
2: {
|
|
3: "code": "IR",
|
|
4: "name": {
|
|
5: "en": "Iran",
|
|
6: "fa": "ایران",
|
|
7: "de": "Iran"
|
|
8: },
|
|
9: "phoneCode": "98",
|
|
10: "addressLabels": {
|
|
11: "administrativeArea": {
|
|
12: "en": "Province",
|
|
13: "fa": "استان",
|
|
14: "de": "Provinz"
|
|
15: },
|
|
16: "locality": {
|
|
17: "en": "County",
|
|
18: "fa": "شهرستان",
|
|
19: "de": "Landkreis"
|
|
20: },
|
|
21: "postalCode": {
|
|
22: "en": "Postal Code",
|
|
23: "fa": "کد پستی",
|
|
24: "de": "Postleitzahl"
|
|
25: }
|
|
26: }
|
|
27: },
|
|
28: {
|
|
29: "code": "TR",
|
|
30: "name": {
|
|
31: "en": "Turkey",
|
|
32: "fa": "ترکیه",
|
|
33: "de": "Türkei"
|
|
34: },
|
|
35: "phoneCode": "90"
|
|
36: },
|
|
37: {
|
|
38: "code": "SA",
|
|
39: "name": {
|
|
40: "en": "Saudi Arabia",
|
|
41: "fa": "عربستان سعودی",
|
|
42: "de": "Saudi-Arabien"
|
|
43: },
|
|
44: "phoneCode": "966"
|
|
45: },
|
|
46: {
|
|
47: "code": "AE",
|
|
48: "name": {
|
|
49: "en": "United Arab Emirates",
|
|
50: "fa": "امارات متحده عربی",
|
|
51: "de": "Vereinigte Arabische Emirate"
|
|
52: },
|
|
53: "phoneCode": "971"
|
|
54: },
|
|
55: {
|
|
56: "code": "IQ",
|
|
57: "name": {
|
|
58: "en": "Iraq",
|
|
59: "fa": "عراق",
|
|
60: "de": "Irak"
|
|
61: },
|
|
62: "phoneCode": "964"
|
|
63: },
|
|
64: {
|
|
65: "code": "AF",
|
|
66: "name": {
|
|
67: "en": "Afghanistan",
|
|
68: "fa": "افغانستان",
|
|
69: "de": "Afghanistan"
|
|
70: },
|
|
71: "phoneCode": "93"
|
|
72: },
|
|
73: {
|
|
74: "code": "PK",
|
|
75: "name": {
|
|
76: "en": "Pakistan",
|
|
77: "fa": "پاکستان",
|
|
78: "de": "Pakistan"
|
|
79: },
|
|
80: "phoneCode": "92"
|
|
81: },
|
|
82: {
|
|
83: "code": "KZ",
|
|
84: "name": {
|
|
85: "en": "Kazakhstan",
|
|
86: "fa": "قزاقستان",
|
|
87: "de": "Kasachstan"
|
|
88: },
|
|
89: "phoneCode": "7"
|
|
90: },
|
|
91: {
|
|
92: "code": "UZ",
|
|
93: "name": {
|
|
94: "en": "Uzbekistan",
|
|
95: "fa": "ازبکستان",
|
|
96: "de": "Usbekistan"
|
|
97: },
|
|
98: "phoneCode": "998"
|
|
99: },
|
|
100: {
|
|
101: "code": "TM",
|
|
102: "name": {
|
|
103: "en": "Turkmenistan",
|
|
104: "fa": "ترکمنستان",
|
|
105: "de": "Turkmenistan"
|
|
106: },
|
|
107: "phoneCode": "993"
|
|
108: },
|
|
109: {
|
|
110: "code": "TJ",
|
|
111: "name": {
|
|
112: "en": "Tajikistan",
|
|
113: "fa": "تاجیکستان",
|
|
114: "de": "Tadschikistan"
|
|
115: },
|
|
116: "phoneCode": "992"
|
|
117: },
|
|
118: {
|
|
119: "code": "KG",
|
|
120: "name": {
|
|
121: "en": "Kyrgyzstan",
|
|
122: "fa": "قرقیزستان",
|
|
123: "de": "Kirgisistan"
|
|
124: },
|
|
125: "phoneCode": "996"
|
|
126: },
|
|
127: {
|
|
128: "code": "US",
|
|
129: "name": {
|
|
130: "en": "United States",
|
|
131: "fa": "ایالات متحده آمریکا",
|
|
132: "de": "Vereinigte Staaten"
|
|
133: },
|
|
134: "phoneCode": "1"
|
|
135: },
|
|
136: {
|
|
137: "code": "CA",
|
|
138: "name": {
|
|
139: "en": "Canada",
|
|
140: "fa": "کانادا",
|
|
141: "de": "Kanada"
|
|
142: },
|
|
143: "phoneCode": "1"
|
|
144: },
|
|
145: {
|
|
146: "code": "MX",
|
|
147: "name": {
|
|
148: "en": "Mexico",
|
|
149: "fa": "مکزیک",
|
|
150: "de": "Mexiko"
|
|
151: },
|
|
152: "phoneCode": "52"
|
|
153: },
|
|
154: {
|
|
155: "code": "GB",
|
|
156: "name": {
|
|
157: "en": "United Kingdom",
|
|
158: "fa": "انگلستان",
|
|
159: "de": "Vereinigtes Königreich"
|
|
160: },
|
|
161: "phoneCode": "44"
|
|
162: },
|
|
163: {
|
|
164: "code": "DE",
|
|
165: "name": {
|
|
166: "en": "Germany",
|
|
167: "fa": "آلمان",
|
|
168: "de": "Deutschland"
|
|
169: },
|
|
170: "phoneCode": "49",
|
|
171: "addressLabels": {
|
|
172: "administrativeArea": {
|
|
173: "en": "State",
|
|
174: "fa": "ایالت",
|
|
175: "de": "Bundesland"
|
|
176: },
|
|
177: "locality": {
|
|
178: "en": "Ort",
|
|
179: "fa": "موقعیت مکانی (Ort)",
|
|
180: "de": "Ort"
|
|
181: },
|
|
182: "postalCode": {
|
|
183: "en": "PLZ Code",
|
|
184: "fa": "کد PLZ",
|
|
185: "de": "PLZ Code"
|
|
186: }
|
|
187: }
|
|
188: },
|
|
189: {
|
|
190: "code": "FR",
|
|
191: "name": {
|
|
192: "en": "France",
|
|
193: "fa": "فرانسه",
|
|
194: "de": "Frankreich"
|
|
195: },
|
|
196: "phoneCode": "33"
|
|
197: },
|
|
198: {
|
|
199: "code": "IT",
|
|
200: "name": {
|
|
201: "en": "Italy",
|
|
202: "fa": "ایتالیا",
|
|
203: "de": "Italien"
|
|
204: },
|
|
205: "phoneCode": "39"
|
|
206: },
|
|
207: {
|
|
208: "code": "ES",
|
|
209: "name": {
|
|
210: "en": "Spain",
|
|
211: "fa": "اسپانیا",
|
|
212: "de": "Spanien"
|
|
213: },
|
|
214: "phoneCode": "34"
|
|
215: },
|
|
216: {
|
|
217: "code": "NL",
|
|
218: "name": {
|
|
219: "en": "Netherlands",
|
|
220: "fa": "هلند",
|
|
221: "de": "Niederlande"
|
|
222: },
|
|
223: "phoneCode": "31"
|
|
224: },
|
|
225: {
|
|
226: "code": "SE",
|
|
227: "name": {
|
|
228: "en": "Sweden",
|
|
229: "fa": "سوئد",
|
|
230: "de": "Schweden"
|
|
231: },
|
|
232: "phoneCode": "46"
|
|
233: },
|
|
234: {
|
|
235: "code": "NO",
|
|
236: "name": {
|
|
237: "en": "Norway",
|
|
238: "fa": "نروژ",
|
|
239: "de": "Norwegen"
|
|
240: },
|
|
241: "phoneCode": "47"
|
|
242: },
|
|
243: {
|
|
244: "code": "DK",
|
|
245: "name": {
|
|
246: "en": "Denmark",
|
|
247: "fa": "دانمارک",
|
|
248: "de": "Dänemark"
|
|
249: },
|
|
250: "phoneCode": "45"
|
|
251: },
|
|
252: {
|
|
253: "code": "FI",
|
|
254: "name": {
|
|
255: "en": "Finland",
|
|
256: "fa": "فنلاند",
|
|
257: "de": "Finnland"
|
|
258: },
|
|
259: "phoneCode": "358"
|
|
260: },
|
|
261: {
|
|
262: "code": "CH",
|
|
263: "name": {
|
|
264: "en": "Switzerland",
|
|
265: "fa": "سوئیس",
|
|
266: "de": "Schweiz"
|
|
267: },
|
|
268: "phoneCode": "41"
|
|
269: },
|
|
270: {
|
|
271: "code": "AT",
|
|
272: "name": {
|
|
273: "en": "Austria",
|
|
274: "fa": "اتریش",
|
|
275: "de": "Österreich"
|
|
276: },
|
|
277: "phoneCode": "43"
|
|
278: },
|
|
279: {
|
|
280: "code": "BE",
|
|
281: "name": {
|
|
282: "en": "Belgium",
|
|
283: "fa": "بلژیک",
|
|
284: "de": "Belgien"
|
|
285: },
|
|
286: "phoneCode": "32"
|
|
287: },
|
|
288: {
|
|
289: "code": "PL",
|
|
290: "name": {
|
|
291: "en": "Poland",
|
|
292: "fa": "لهستان",
|
|
293: "de": "Polen"
|
|
294: },
|
|
295: "phoneCode": "48"
|
|
296: },
|
|
297: {
|
|
298: "code": "RU",
|
|
299: "name": {
|
|
300: "en": "Russia",
|
|
301: "fa": "روسیه",
|
|
302: "de": "Russland"
|
|
303: },
|
|
304: "phoneCode": "7"
|
|
305: },
|
|
306: {
|
|
307: "code": "UA",
|
|
308: "name": {
|
|
309: "en": "Ukraine",
|
|
310: "fa": "اوکراین",
|
|
311: "de": "Ukraine"
|
|
312: },
|
|
313: "phoneCode": "380"
|
|
314: },
|
|
315: {
|
|
316: "code": "CZ",
|
|
317: "name": {
|
|
318: "en": "Czech Republic",
|
|
319: "fa": "جمهوری چک",
|
|
320: "de": "Tschechien"
|
|
321: },
|
|
322: "phoneCode": "420"
|
|
323: },
|
|
324: {
|
|
325: "code": "HU",
|
|
326: "name": {
|
|
327: "en": "Hungary",
|
|
328: "fa": "مجارستان",
|
|
329: "de": "Ungarn"
|
|
330: },
|
|
331: "phoneCode": "36"
|
|
332: },
|
|
333: {
|
|
334: "code": "RO",
|
|
335: "name": {
|
|
336: "en": "Romania",
|
|
337: "fa": "رومانی",
|
|
338: "de": "Rumänien"
|
|
339: },
|
|
340: "phoneCode": "40"
|
|
341: },
|
|
342: {
|
|
343: "code": "BG",
|
|
344: "name": {
|
|
345: "en": "Bulgaria",
|
|
346: "fa": "بلغارستان",
|
|
347: "de": "Bulgarien"
|
|
348: },
|
|
349: "phoneCode": "359"
|
|
350: },
|
|
351: {
|
|
352: "code": "GR",
|
|
353: "name": {
|
|
354: "en": "Greece",
|
|
355: "fa": "یونان",
|
|
356: "de": "Griechenland"
|
|
357: },
|
|
358: "phoneCode": "30"
|
|
359: },
|
|
360: {
|
|
361: "code": "PT",
|
|
362: "name": {
|
|
363: "en": "Portugal",
|
|
364: "fa": "پرتغال",
|
|
365: "de": "Portugal"
|
|
366: },
|
|
367: "phoneCode": "351"
|
|
368: },
|
|
369: {
|
|
370: "code": "IE",
|
|
371: "name": {
|
|
372: "en": "Ireland",
|
|
373: "fa": "ایرلند",
|
|
374: "de": "Irland"
|
|
375: },
|
|
376: "phoneCode": "353"
|
|
377: },
|
|
378: {
|
|
379: "code": "AU",
|
|
380: "name": {
|
|
381: "en": "Australia",
|
|
382: "fa": "استرالیا",
|
|
383: "de": "Australien"
|
|
384: },
|
|
385: "phoneCode": "61"
|
|
386: },
|
|
387: {
|
|
388: "code": "NZ",
|
|
389: "name": {
|
|
390: "en": "New Zealand",
|
|
391: "fa": "نیوزیلند",
|
|
392: "de": "Neuseeland"
|
|
393: },
|
|
394: "phoneCode": "64"
|
|
395: },
|
|
396: {
|
|
397: "code": "JP",
|
|
398: "name": {
|
|
399: "en": "Japan",
|
|
400: "fa": "ژاپن",
|
|
401: "de": "Japan"
|
|
402: },
|
|
403: "phoneCode": "81"
|
|
404: },
|
|
405: {
|
|
406: "code": "KR",
|
|
407: "name": {
|
|
408: "en": "South Korea",
|
|
409: "fa": "کره جنوبی",
|
|
410: "de": "Südkorea"
|
|
411: },
|
|
412: "phoneCode": "82"
|
|
413: },
|
|
414: {
|
|
415: "code": "CN",
|
|
416: "name": {
|
|
417: "en": "China",
|
|
418: "fa": "چین",
|
|
419: "de": "China"
|
|
420: },
|
|
421: "phoneCode": "86"
|
|
422: },
|
|
423: {
|
|
424: "code": "IN",
|
|
425: "name": {
|
|
426: "en": "India",
|
|
427: "fa": "هند",
|
|
428: "de": "Indien"
|
|
429: },
|
|
430: "phoneCode": "91"
|
|
431: },
|
|
432: {
|
|
433: "code": "TH",
|
|
434: "name": {
|
|
435: "en": "Thailand",
|
|
436: "fa": "تایلند",
|
|
437: "de": "Thailand"
|
|
438: },
|
|
439: "phoneCode": "66"
|
|
440: },
|
|
441: {
|
|
442: "code": "VN",
|
|
443: "name": {
|
|
444: "en": "Vietnam",
|
|
445: "fa": "ویتنام",
|
|
446: "de": "Vietnam"
|
|
447: },
|
|
448: "phoneCode": "84"
|
|
449: },
|
|
450: {
|
|
451: "code": "MY",
|
|
452: "name": {
|
|
453: "en": "Malaysia",
|
|
454: "fa": "مالزی",
|
|
455: "de": "Malaysia"
|
|
456: },
|
|
457: "phoneCode": "60"
|
|
458: },
|
|
459: {
|
|
460: "code": "SG",
|
|
461: "name": {
|
|
462: "en": "Singapore",
|
|
463: "fa": "سنگاپور",
|
|
464: "de": "Singapur"
|
|
465: },
|
|
466: "phoneCode": "65"
|
|
467: },
|
|
468: {
|
|
469: "code": "ID",
|
|
470: "name": {
|
|
471: "en": "Indonesia",
|
|
472: "fa": "اندونزی",
|
|
473: "de": "Indonesien"
|
|
474: },
|
|
475: "phoneCode": "62"
|
|
476: },
|
|
477: {
|
|
478: "code": "PH",
|
|
479: "name": {
|
|
480: "en": "Philippines",
|
|
481: "fa": "فیلیپین",
|
|
482: "de": "Philippinen"
|
|
483: },
|
|
484: "phoneCode": "63"
|
|
485: },
|
|
486: {
|
|
487: "code": "BD",
|
|
488: "name": {
|
|
489: "en": "Bangladesh",
|
|
490: "fa": "بنگلادش",
|
|
491: "de": "Bangladesch"
|
|
492: },
|
|
493: "phoneCode": "880"
|
|
494: },
|
|
495: {
|
|
496: "code": "LK",
|
|
497: "name": {
|
|
498: "en": "Sri Lanka",
|
|
499: "fa": "سریلانکا",
|
|
500: "de": "Sri Lanka"
|
|
501: },
|
|
502: "phoneCode": "94"
|
|
503: },
|
|
504: {
|
|
505: "code": "NP",
|
|
506: "name": {
|
|
507: "en": "Nepal",
|
|
508: "fa": "نپال",
|
|
509: "de": "Nepal"
|
|
510: },
|
|
511: "phoneCode": "977"
|
|
512: },
|
|
513: {
|
|
514: "code": "BT",
|
|
515: "name": {
|
|
516: "en": "Bhutan",
|
|
517: "fa": "بوتان",
|
|
518: "de": "Bhutan"
|
|
519: },
|
|
520: "phoneCode": "975"
|
|
521: },
|
|
522: {
|
|
523: "code": "MV",
|
|
524: "name": {
|
|
525: "en": "Maldives",
|
|
526: "fa": "مالدیو",
|
|
527: "de": "Malediven"
|
|
528: },
|
|
529: "phoneCode": "960"
|
|
530: },
|
|
531: {
|
|
532: "code": "BR",
|
|
533: "name": {
|
|
534: "en": "Brazil",
|
|
535: "fa": "برزیل",
|
|
536: "de": "Brasilien"
|
|
537: },
|
|
538: "phoneCode": "55"
|
|
539: },
|
|
540: {
|
|
541: "code": "AR",
|
|
542: "name": {
|
|
543: "en": "Argentina",
|
|
544: "fa": "آرژانتین",
|
|
545: "de": "Argentinien"
|
|
546: },
|
|
547: "phoneCode": "54"
|
|
548: },
|
|
549: {
|
|
550: "code": "CL",
|
|
551: "name": {
|
|
552: "en": "Chile",
|
|
553: "fa": "شیلی",
|
|
554: "de": "Chile"
|
|
555: },
|
|
556: "phoneCode": "56"
|
|
557: },
|
|
558: {
|
|
559: "code": "CO",
|
|
560: "name": {
|
|
561: "en": "Colombia",
|
|
562: "fa": "کلمبیا",
|
|
563: "de": "Kolumbien"
|
|
564: },
|
|
565: "phoneCode": "57"
|
|
566: },
|
|
567: {
|
|
568: "code": "PE",
|
|
569: "name": {
|
|
570: "en": "Peru",
|
|
571: "fa": "پرو",
|
|
572: "de": "Peru"
|
|
573: },
|
|
574: "phoneCode": "51"
|
|
575: },
|
|
576: {
|
|
577: "code": "VE",
|
|
578: "name": {
|
|
579: "en": "Venezuela",
|
|
580: "fa": "ونزوئلا",
|
|
581: "de": "Venezuela"
|
|
582: },
|
|
583: "phoneCode": "58"
|
|
584: },
|
|
585: {
|
|
586: "code": "EC",
|
|
587: "name": {
|
|
588: "en": "Ecuador",
|
|
589: "fa": "اکوادور",
|
|
590: "de": "Ecuador"
|
|
591: },
|
|
592: "phoneCode": "593"
|
|
593: },
|
|
594: {
|
|
595: "code": "BO",
|
|
596: "name": {
|
|
597: "en": "Bolivia",
|
|
598: "fa": "بولیوی",
|
|
599: "de": "Bolivien"
|
|
600: },
|
|
601: "phoneCode": "591"
|
|
602: },
|
|
603: {
|
|
604: "code": "PY",
|
|
605: "name": {
|
|
606: "en": "Paraguay",
|
|
607: "fa": "پاراگوئه",
|
|
608: "de": "Paraguay"
|
|
609: },
|
|
610: "phoneCode": "595"
|
|
611: },
|
|
612: {
|
|
613: "code": "UY",
|
|
614: "name": {
|
|
615: "en": "Uruguay",
|
|
616: "fa": "اروگوئه",
|
|
617: "de": "Uruguay"
|
|
618: },
|
|
619: "phoneCode": "598"
|
|
620: },
|
|
621: {
|
|
622: "code": "GY",
|
|
623: "name": {
|
|
624: "en": "Guyana",
|
|
625: "fa": "گویان",
|
|
626: "de": "Guyana"
|
|
627: },
|
|
628: "phoneCode": "592"
|
|
629: },
|
|
630: {
|
|
631: "code": "SR",
|
|
632: "name": {
|
|
633: "en": "Suriname",
|
|
634: "fa": "سورینام",
|
|
635: "de": "Suriname"
|
|
636: },
|
|
637: "phoneCode": "597"
|
|
638: },
|
|
639: {
|
|
640: "code": "ZA",
|
|
641: "name": {
|
|
642: "en": "South Africa",
|
|
643: "fa": "آفریقای جنوبی",
|
|
644: "de": "Südafrika"
|
|
645: },
|
|
646: "phoneCode": "27"
|
|
647: },
|
|
648: {
|
|
649: "code": "NG",
|
|
650: "name": {
|
|
651: "en": "Nigeria",
|
|
652: "fa": "نیجریه",
|
|
653: "de": "Nigeria"
|
|
654: },
|
|
655: "phoneCode": "234"
|
|
656: },
|
|
657: {
|
|
658: "code": "KE",
|
|
659: "name": {
|
|
660: "en": "Kenya",
|
|
661: "fa": "کنیا",
|
|
662: "de": "Kenia"
|
|
663: },
|
|
664: "phoneCode": "254"
|
|
665: },
|
|
666: {
|
|
667: "code": "MA",
|
|
668: "name": {
|
|
669: "en": "Morocco",
|
|
670: "fa": "مراکش",
|
|
671: "de": "Marokko"
|
|
672: },
|
|
673: "phoneCode": "212"
|
|
674: },
|
|
675: {
|
|
676: "code": "TN",
|
|
677: "name": {
|
|
678: "en": "Tunisia",
|
|
679: "fa": "تونس",
|
|
680: "de": "Tunesien"
|
|
681: },
|
|
682: "phoneCode": "216"
|
|
683: },
|
|
684: {
|
|
685: "code": "DZ",
|
|
686: "name": {
|
|
687: "en": "Algeria",
|
|
688: "fa": "الجزایر",
|
|
689: "de": "Algerien"
|
|
690: },
|
|
691: "phoneCode": "213"
|
|
692: },
|
|
693: {
|
|
694: "code": "LY",
|
|
695: "name": {
|
|
696: "en": "Libya",
|
|
697: "fa": "لیبی",
|
|
698: "de": "Libyen"
|
|
699: },
|
|
700: "phoneCode": "218"
|
|
701: },
|
|
702: {
|
|
703: "code": "EG",
|
|
704: "name": {
|
|
705: "en": "Egypt",
|
|
706: "fa": "مصر",
|
|
707: "de": "Ägypten"
|
|
708: },
|
|
709: "phoneCode": "20"
|
|
710: },
|
|
711: {
|
|
712: "code": "SD",
|
|
713: "name": {
|
|
714: "en": "Sudan",
|
|
715: "fa": "سودان",
|
|
716: "de": "Sudan"
|
|
717: },
|
|
718: "phoneCode": "249"
|
|
719: },
|
|
720: {
|
|
721: "code": "ET",
|
|
722: "name": {
|
|
723: "en": "Ethiopia",
|
|
724: "fa": "اتیوپی",
|
|
725: "de": "Äthiopien"
|
|
726: },
|
|
727: "phoneCode": "251"
|
|
728: },
|
|
729: {
|
|
730: "code": "GH",
|
|
731: "name": {
|
|
732: "en": "Ghana",
|
|
733: "fa": "غنا",
|
|
734: "de": "Ghana"
|
|
735: },
|
|
736: "phoneCode": "233"
|
|
737: },
|
|
738: {
|
|
739: "code": "UG",
|
|
740: "name": {
|
|
741: "en": "Uganda",
|
|
742: "fa": "اوگاندا",
|
|
743: "de": "Uganda"
|
|
744: },
|
|
745: "phoneCode": "256"
|
|
746: },
|
|
747: {
|
|
748: "code": "TZ",
|
|
749: "name": {
|
|
750: "en": "Tanzania",
|
|
751: "fa": "تانزانیا",
|
|
752: "de": "Tansania"
|
|
753: },
|
|
754: "phoneCode": "255"
|
|
755: },
|
|
756: {
|
|
757: "code": "ZW",
|
|
758: "name": {
|
|
759: "en": "Zimbabwe",
|
|
760: "fa": "زیمبابوه",
|
|
761: "de": "Simbabwe"
|
|
762: },
|
|
763: "phoneCode": "263"
|
|
764: },
|
|
765: {
|
|
766: "code": "BW",
|
|
767: "name": {
|
|
768: "en": "Botswana",
|
|
769: "fa": "بوتسوانا",
|
|
770: "de": "Botswana"
|
|
771: },
|
|
772: "phoneCode": "267"
|
|
773: },
|
|
774: {
|
|
775: "code": "NA",
|
|
776: "name": {
|
|
777: "en": "Namibia",
|
|
778: "fa": "نامیبیا",
|
|
779: "de": "Namibia"
|
|
780: },
|
|
781: "phoneCode": "264"
|
|
782: },
|
|
783: {
|
|
784: "code": "ZM",
|
|
785: "name": {
|
|
786: "en": "Zambia",
|
|
787: "fa": "زامبیا",
|
|
788: "de": "Sambia"
|
|
789: },
|
|
790: "phoneCode": "260"
|
|
791: },
|
|
792: {
|
|
793: "code": "MW",
|
|
794: "name": {
|
|
795: "en": "Malawi",
|
|
796: "fa": "مالاوی",
|
|
797: "de": "Malawi"
|
|
798: },
|
|
799: "phoneCode": "265"
|
|
800: },
|
|
801: {
|
|
802: "code": "MZ",
|
|
803: "name": {
|
|
804: "en": "Mozambique",
|
|
805: "fa": "موزامبیک",
|
|
806: "de": "Mosambik"
|
|
807: },
|
|
808: "phoneCode": "258"
|
|
809: },
|
|
810: {
|
|
811: "code": "MG",
|
|
812: "name": {
|
|
813: "en": "Madagascar",
|
|
814: "fa": "ماداگاسکار",
|
|
815: "de": "Madagaskar"
|
|
816: },
|
|
817: "phoneCode": "261"
|
|
818: },
|
|
819: {
|
|
820: "code": "MU",
|
|
821: "name": {
|
|
822: "en": "Mauritius",
|
|
823: "fa": "موریس",
|
|
824: "de": "Mauritius"
|
|
825: },
|
|
826: "phoneCode": "230"
|
|
827: },
|
|
828: {
|
|
829: "code": "SC",
|
|
830: "name": {
|
|
831: "en": "Seychelles",
|
|
832: "fa": "سیشل",
|
|
833: "de": "Seychellen"
|
|
834: },
|
|
835: "phoneCode": "248"
|
|
836: },
|
|
837: {
|
|
838: "code": "RE",
|
|
839: "name": {
|
|
840: "en": "Réunion",
|
|
841: "fa": "رئونیون",
|
|
842: "de": "Réunion"
|
|
843: },
|
|
844: "phoneCode": "262"
|
|
845: },
|
|
846: {
|
|
847: "code": "YT",
|
|
848: "name": {
|
|
849: "en": "Mayotte",
|
|
850: "fa": "مایوت",
|
|
851: "de": "Mayotte"
|
|
852: },
|
|
853: "phoneCode": "262"
|
|
854: },
|
|
855: {
|
|
856: "code": "KM",
|
|
857: "name": {
|
|
858: "en": "Comoros",
|
|
859: "fa": "کومور",
|
|
860: "de": "Komoren"
|
|
861: },
|
|
862: "phoneCode": "269"
|
|
863: },
|
|
864: {
|
|
865: "code": "DJ",
|
|
866: "name": {
|
|
867: "en": "Djibouti",
|
|
868: "fa": "جیبوتی",
|
|
869: "de": "Dschibuti"
|
|
870: },
|
|
871: "phoneCode": "253"
|
|
872: },
|
|
873: {
|
|
874: "code": "SO",
|
|
875: "name": {
|
|
876: "en": "Somalia",
|
|
877: "fa": "سومالی",
|
|
878: "de": "Somalia"
|
|
879: },
|
|
880: "phoneCode": "252"
|
|
881: },
|
|
882: {
|
|
883: "code": "ER",
|
|
884: "name": {
|
|
885: "en": "Eritrea",
|
|
886: "fa": "اریتره",
|
|
887: "de": "Eritrea"
|
|
888: },
|
|
889: "phoneCode": "291"
|
|
890: },
|
|
891: {
|
|
892: "code": "SS",
|
|
893: "name": {
|
|
894: "en": "South Sudan",
|
|
895: "fa": "سودان جنوبی",
|
|
896: "de": "Südsudan"
|
|
897: },
|
|
898: "phoneCode": "211"
|
|
899: },
|
|
900: {
|
|
901: "code": "CF",
|
|
902: "name": {
|
|
903: "en": "Central African Republic",
|
|
904: "fa": "جمهوری آفریقای مرکزی",
|
|
905: "de": "Zentralafrikanische Republik"
|
|
906: },
|
|
907: "phoneCode": "236"
|
|
908: },
|
|
909: {
|
|
910: "code": "TD",
|
|
911: "name": {
|
|
912: "en": "Chad",
|
|
913: "fa": "چاد",
|
|
914: "de": "Tschad"
|
|
915: },
|
|
916: "phoneCode": "235"
|
|
917: },
|
|
918: {
|
|
919: "code": "NE",
|
|
920: "name": {
|
|
921: "en": "Niger",
|
|
922: "fa": "نیجر",
|
|
923: "de": "Niger"
|
|
924: },
|
|
925: "phoneCode": "227"
|
|
926: },
|
|
927: {
|
|
928: "code": "ML",
|
|
929: "name": {
|
|
930: "en": "Mali",
|
|
931: "fa": "مالی",
|
|
932: "de": "Mali"
|
|
933: },
|
|
934: "phoneCode": "223"
|
|
935: },
|
|
936: {
|
|
937: "code": "BF",
|
|
938: "name": {
|
|
939: "en": "Burkina Faso",
|
|
940: "fa": "بورکینافاسو",
|
|
941: "de": "Burkina Faso"
|
|
942: },
|
|
943: "phoneCode": "226"
|
|
944: },
|
|
945: {
|
|
946: "code": "CI",
|
|
947: "name": {
|
|
948: "en": "Côte d'Ivoire",
|
|
949: "fa": "ساحل عاج",
|
|
950: "de": "Elfenbeinküste"
|
|
951: },
|
|
952: "phoneCode": "225"
|
|
953: },
|
|
954: {
|
|
955: "code": "LR",
|
|
956: "name": {
|
|
957: "en": "Liberia",
|
|
958: "fa": "لیبریا",
|
|
959: "de": "Liberia"
|
|
960: },
|
|
961: "phoneCode": "231"
|
|
962: },
|
|
963: {
|
|
964: "code": "SL",
|
|
965: "name": {
|
|
966: "en": "Sierra Leone",
|
|
967: "fa": "سیرالئون",
|
|
968: "de": "Sierra Leone"
|
|
969: },
|
|
970: "phoneCode": "232"
|
|
971: },
|
|
972: {
|
|
973: "code": "GN",
|
|
974: "name": {
|
|
975: "en": "Guinea",
|
|
976: "fa": "گینه",
|
|
977: "de": "Guinea"
|
|
978: },
|
|
979: "phoneCode": "224"
|
|
980: },
|
|
981: {
|
|
982: "code": "GW",
|
|
983: "name": {
|
|
984: "en": "Guinea-Bissau",
|
|
985: "fa": "گینه بیسائو",
|
|
986: "de": "Guinea-Bissau"
|
|
987: },
|
|
988: "phoneCode": "245"
|
|
989: },
|
|
990: {
|
|
991: "code": "GM",
|
|
992: "name": {
|
|
993: "en": "Gambia",
|
|
994: "fa": "گامبیا",
|
|
995: "de": "Gambia"
|
|
996: },
|
|
997: "phoneCode": "220"
|
|
998: },
|
|
999: {
|
|
1000: "code": "SN",
|
|
1001: "name": {
|
|
1002: "en": "Senegal",
|
|
1003: "fa": "سنگال",
|
|
1004: "de": "Senegal"
|
|
1005: },
|
|
1006: "phoneCode": "221"
|
|
1007: },
|
|
1008: {
|
|
1009: "code": "MR",
|
|
1010: "name": {
|
|
1011: "en": "Mauritania",
|
|
1012: "fa": "موریتانی",
|
|
1013: "de": "Mauretanien"
|
|
1014: },
|
|
1015: "phoneCode": "222"
|
|
1016: },
|
|
1017: {
|
|
1018: "code": "CV",
|
|
1019: "name": {
|
|
1020: "en": "Cape Verde",
|
|
1021: "fa": "کیپورد",
|
|
1022: "de": "Kap Verde"
|
|
1023: },
|
|
1024: "phoneCode": "238"
|
|
1025: },
|
|
1026: {
|
|
1027: "code": "ST",
|
|
1028: "name": {
|
|
1029: "en": "São Tomé and Príncipe",
|
|
1030: "fa": "سائوتومه و پرنسیپ",
|
|
1031: "de": "São Tomé und Príncipe"
|
|
1032: },
|
|
1033: "phoneCode": "239"
|
|
1034: },
|
|
1035: {
|
|
1036: "code": "GQ",
|
|
1037: "name": {
|
|
1038: "en": "Equatorial Guinea",
|
|
1039: "fa": "گینه استوایی",
|
|
1040: "de": "Äquatorialguinea"
|
|
1041: },
|
|
1042: "phoneCode": "240"
|
|
1043: },
|
|
1044: {
|
|
1045: "code": "GA",
|
|
1046: "name": {
|
|
1047: "en": "Gabon",
|
|
1048: "fa": "گابن",
|
|
1049: "de": "Gabun"
|
|
1050: },
|
|
1051: "phoneCode": "241"
|
|
1052: },
|
|
1053: {
|
|
1054: "code": "CG",
|
|
1055: "name": {
|
|
1056: "en": "Republic of the Congo",
|
|
1057: "fa": "جمهوری کنگو",
|
|
1058: "de": "Republik Kongo"
|
|
1059: },
|
|
1060: "phoneCode": "242"
|
|
1061: },
|
|
1062: {
|
|
1063: "code": "CD",
|
|
1064: "name": {
|
|
1065: "en": "Democratic Republic of the Congo",
|
|
1066: "fa": "جمهوری دموکراتیک کنگو",
|
|
1067: "de": "Demokratische Republik Kongo"
|
|
1068: },
|
|
1069: "phoneCode": "243"
|
|
1070: },
|
|
1071: {
|
|
1072: "code": "AO",
|
|
1073: "name": {
|
|
1074: "en": "Angola",
|
|
1075: "fa": "آنگولا",
|
|
1076: "de": "Angola"
|
|
1077: },
|
|
1078: "phoneCode": "244"
|
|
1079: },
|
|
1080: {
|
|
1081: "code": "CM",
|
|
1082: "name": {
|
|
1083: "en": "Cameroon",
|
|
1084: "fa": "کامرون",
|
|
1085: "de": "Kamerun"
|
|
1086: },
|
|
1087: "phoneCode": "237"
|
|
1088: },
|
|
1089: {
|
|
1090: "code": "BI",
|
|
1091: "name": {
|
|
1092: "en": "Burundi",
|
|
1093: "fa": "بوروندی",
|
|
1094: "de": "Burundi"
|
|
1095: },
|
|
1096: "phoneCode": "257"
|
|
1097: },
|
|
1098: {
|
|
1099: "code": "RW",
|
|
1100: "name": {
|
|
1101: "en": "Rwanda",
|
|
1102: "fa": "رواندا",
|
|
1103: "de": "Ruanda"
|
|
1104: },
|
|
1105: "phoneCode": "250"
|
|
1106: },
|
|
1107: {
|
|
1108: "code": "LS",
|
|
1109: "name": {
|
|
1110: "en": "Lesotho",
|
|
1111: "fa": "لسوتو",
|
|
1112: "de": "Lesotho"
|
|
1113: },
|
|
1114: "phoneCode": "266"
|
|
1115: },
|
|
1116: {
|
|
1117: "code": "SZ",
|
|
1118: "name": {
|
|
1119: "en": "Eswatini",
|
|
1120: "fa": "اسواتینی",
|
|
1121: "de": "Eswatini"
|
|
1122: },
|
|
1123: "phoneCode": "268"
|
|
1124: },
|
|
1125: {
|
|
1126: "code": "GT",
|
|
1127: "name": {
|
|
1128: "en": "Guatemala",
|
|
1129: "fa": "گواتمالا",
|
|
1130: "de": "Guatemala"
|
|
1131: },
|
|
1132: "phoneCode": "502"
|
|
1133: },
|
|
1134: {
|
|
1135: "code": "HN",
|
|
1136: "name": {
|
|
1137: "en": "Honduras",
|
|
1138: "fa": "هندوراس",
|
|
1139: "de": "Honduras"
|
|
1140: },
|
|
1141: "phoneCode": "504"
|
|
1142: },
|
|
1143: {
|
|
1144: "code": "SV",
|
|
1145: "name": {
|
|
1146: "en": "El Salvador",
|
|
1147: "fa": "السالوادور",
|
|
1148: "de": "El Salvador"
|
|
1149: },
|
|
1150: "phoneCode": "503"
|
|
1151: },
|
|
1152: {
|
|
1153: "code": "NI",
|
|
1154: "name": {
|
|
1155: "en": "Nicaragua",
|
|
1156: "fa": "نیکاراگوئه",
|
|
1157: "de": "Nicaragua"
|
|
1158: },
|
|
1159: "phoneCode": "505"
|
|
1160: },
|
|
1161: {
|
|
1162: "code": "CR",
|
|
1163: "name": {
|
|
1164: "en": "Costa Rica",
|
|
1165: "fa": "کاستاریکا",
|
|
1166: "de": "Costa Rica"
|
|
1167: },
|
|
1168: "phoneCode": "506"
|
|
1169: },
|
|
1170: {
|
|
1171: "code": "PA",
|
|
1172: "name": {
|
|
1173: "en": "Panama",
|
|
1174: "fa": "پاناما",
|
|
1175: "de": "Panama"
|
|
1176: },
|
|
1177: "phoneCode": "507"
|
|
1178: },
|
|
1179: {
|
|
1180: "code": "BZ",
|
|
1181: "name": {
|
|
1182: "en": "Belize",
|
|
1183: "fa": "بلیز",
|
|
1184: "de": "Belize"
|
|
1185: },
|
|
1186: "phoneCode": "501"
|
|
1187: },
|
|
1188: {
|
|
1189: "code": "CU",
|
|
1190: "name": {
|
|
1191: "en": "Cuba",
|
|
1192: "fa": "کوبا",
|
|
1193: "de": "Kuba"
|
|
1194: },
|
|
1195: "phoneCode": "53"
|
|
1196: },
|
|
1197: {
|
|
1198: "code": "JM",
|
|
1199: "name": {
|
|
1200: "en": "Jamaica",
|
|
1201: "fa": "جامائیکا",
|
|
1202: "de": "Jamaika"
|
|
1203: },
|
|
1204: "phoneCode": "1"
|
|
1205: },
|
|
1206: {
|
|
1207: "code": "DO",
|
|
1208: "name": {
|
|
1209: "en": "Dominican Republic",
|
|
1210: "fa": "جمهوری دومینیکن",
|
|
1211: "de": "Dominikanische Republik"
|
|
1212: },
|
|
1213: "phoneCode": "1"
|
|
1214: },
|
|
1215: {
|
|
1216: "code": "HT",
|
|
1217: "name": {
|
|
1218: "en": "Haiti",
|
|
1219: "fa": "هائیتی",
|
|
1220: "de": "Haiti"
|
|
1221: },
|
|
1222: "phoneCode": "509"
|
|
1223: },
|
|
1224: {
|
|
1225: "code": "BS",
|
|
1226: "name": {
|
|
1227: "en": "Bahamas",
|
|
1228: "fa": "باهاما",
|
|
1229: "de": "Bahamas"
|
|
1230: },
|
|
1231: "phoneCode": "1"
|
|
1232: },
|
|
1233: {
|
|
1234: "code": "TT",
|
|
1235: "name": {
|
|
1236: "en": "Trinidad and Tobago",
|
|
1237: "fa": "ترینیداد و توباگو",
|
|
1238: "de": "Trinidad und Tobago"
|
|
1239: },
|
|
1240: "phoneCode": "1"
|
|
1241: },
|
|
1242: {
|
|
1243: "code": "BB",
|
|
1244: "name": {
|
|
1245: "en": "Barbados",
|
|
1246: "fa": "باربادوس",
|
|
1247: "de": "Barbados"
|
|
1248: },
|
|
1249: "phoneCode": "1"
|
|
1250: },
|
|
1251: {
|
|
1252: "code": "GD",
|
|
1253: "name": {
|
|
1254: "en": "Grenada",
|
|
1255: "fa": "گرنادا",
|
|
1256: "de": "Grenada"
|
|
1257: },
|
|
1258: "phoneCode": "1"
|
|
1259: },
|
|
1260: {
|
|
1261: "code": "LC",
|
|
1262: "name": {
|
|
1263: "en": "Saint Lucia",
|
|
1264: "fa": "سنت لوسیا",
|
|
1265: "de": "St. Lucia"
|
|
1266: },
|
|
1267: "phoneCode": "1"
|
|
1268: },
|
|
1269: {
|
|
1270: "code": "VC",
|
|
1271: "name": {
|
|
1272: "en": "Saint Vincent and the Grenadines",
|
|
1273: "fa": "سنت وینسنت و گرنادینها",
|
|
1274: "de": "St. Vincent und die Grenadinen"
|
|
1275: },
|
|
1276: "phoneCode": "1"
|
|
1277: },
|
|
1278: {
|
|
1279: "code": "AG",
|
|
1280: "name": {
|
|
1281: "en": "Antigua and Barbuda",
|
|
1282: "fa": "آنتیگوا و باربودا",
|
|
1283: "de": "Antigua und Barbuda"
|
|
1284: },
|
|
1285: "phoneCode": "1"
|
|
1286: },
|
|
1287: {
|
|
1288: "code": "DM",
|
|
1289: "name": {
|
|
1290: "en": "Dominica",
|
|
1291: "fa": "دومینیکا",
|
|
1292: "de": "Dominica"
|
|
1293: },
|
|
1294: "phoneCode": "1"
|
|
1295: },
|
|
1296: {
|
|
1297: "code": "KN",
|
|
1298: "name": {
|
|
1299: "en": "Saint Kitts and Nevis",
|
|
1300: "fa": "سنت کیتس و نویس",
|
|
1301: "de": "St. Kitts und Nevis"
|
|
1302: },
|
|
1303: "phoneCode": "1"
|
|
1304: },
|
|
1305: {
|
|
1306: "code": "FJ",
|
|
1307: "name": {
|
|
1308: "en": "Fiji",
|
|
1309: "fa": "فیجی",
|
|
1310: "de": "Fidschi"
|
|
1311: },
|
|
1312: "phoneCode": "679"
|
|
1313: },
|
|
1314: {
|
|
1315: "code": "PG",
|
|
1316: "name": {
|
|
1317: "en": "Papua New Guinea",
|
|
1318: "fa": "پاپوآ گینه نو",
|
|
1319: "de": "Papua-Neuguinea"
|
|
1320: },
|
|
1321: "phoneCode": "675"
|
|
1322: },
|
|
1323: {
|
|
1324: "code": "WS",
|
|
1325: "name": {
|
|
1326: "en": "Samoa",
|
|
1327: "fa": "ساموآ",
|
|
1328: "de": "Samoa"
|
|
1329: },
|
|
1330: "phoneCode": "685"
|
|
1331: },
|
|
1332: {
|
|
1333: "code": "TO",
|
|
1334: "name": {
|
|
1335: "en": "Tonga",
|
|
1336: "fa": "تونگا",
|
|
1337: "de": "Tonga"
|
|
1338: },
|
|
1339: "phoneCode": "676"
|
|
1340: },
|
|
1341: {
|
|
1342: "code": "VU",
|
|
1343: "name": {
|
|
1344: "en": "Vanuatu",
|
|
1345: "fa": "وانواتو",
|
|
1346: "de": "Vanuatu"
|
|
1347: },
|
|
1348: "phoneCode": "678"
|
|
1349: },
|
|
1350: {
|
|
1351: "code": "SB",
|
|
1352: "name": {
|
|
1353: "en": "Solomon Islands",
|
|
1354: "fa": "جزایر سلیمان",
|
|
1355: "de": "Salomonen"
|
|
1356: },
|
|
1357: "phoneCode": "677"
|
|
1358: },
|
|
1359: {
|
|
1360: "code": "KI",
|
|
1361: "name": {
|
|
1362: "en": "Kiribati",
|
|
1363: "fa": "کیریباتی",
|
|
1364: "de": "Kiribati"
|
|
1365: },
|
|
1366: "phoneCode": "686"
|
|
1367: },
|
|
1368: {
|
|
1369: "code": "FM",
|
|
1370: "name": {
|
|
1371: "en": "Micronesia",
|
|
1372: "fa": "میکرونزی",
|
|
1373: "de": "Mikronesien"
|
|
1374: },
|
|
1375: "phoneCode": "691"
|
|
1376: },
|
|
1377: {
|
|
1378: "code": "MH",
|
|
1379: "name": {
|
|
1380: "en": "Marshall Islands",
|
|
1381: "fa": "جزایر مارشال",
|
|
1382: "de": "Marshallinseln"
|
|
1383: },
|
|
1384: "phoneCode": "692"
|
|
1385: },
|
|
1386: {
|
|
1387: "code": "PW",
|
|
1388: "name": {
|
|
1389: "en": "Palau",
|
|
1390: "fa": "پالائو",
|
|
1391: "de": "Palau"
|
|
1392: },
|
|
1393: "phoneCode": "680"
|
|
1394: },
|
|
1395: {
|
|
1396: "code": "NR",
|
|
1397: "name": {
|
|
1398: "en": "Nauru",
|
|
1399: "fa": "نائورو",
|
|
1400: "de": "Nauru"
|
|
1401: },
|
|
1402: "phoneCode": "674"
|
|
1403: },
|
|
1404: {
|
|
1405: "code": "TV",
|
|
1406: "name": {
|
|
1407: "en": "Tuvalu",
|
|
1408: "fa": "تووالو",
|
|
1409: "de": "Tuvalu"
|
|
1410: },
|
|
1411: "phoneCode": "688"
|
|
1412: },
|
|
1413: {
|
|
1414: "code": "RS",
|
|
1415: "name": {
|
|
1416: "en": "Serbia",
|
|
1417: "fa": "صربستان",
|
|
1418: "de": "Serbien"
|
|
1419: },
|
|
1420: "phoneCode": "381"
|
|
1421: },
|
|
1422: {
|
|
1423: "code": "HR",
|
|
1424: "name": {
|
|
1425: "en": "Croatia",
|
|
1426: "fa": "کرواسی",
|
|
1427: "de": "Kroatien"
|
|
1428: },
|
|
1429: "phoneCode": "385"
|
|
1430: },
|
|
1431: {
|
|
1432: "code": "BA",
|
|
1433: "name": {
|
|
1434: "en": "Bosnia and Herzegovina",
|
|
1435: "fa": "بوسنی و هرزگوین",
|
|
1436: "de": "Bosnien und Herzegowina"
|
|
1437: },
|
|
1438: "phoneCode": "387"
|
|
1439: },
|
|
1440: {
|
|
1441: "code": "SI",
|
|
1442: "name": {
|
|
1443: "en": "Slovenia",
|
|
1444: "fa": "اسلوونی",
|
|
1445: "de": "Slowenien"
|
|
1446: },
|
|
1447: "phoneCode": "386"
|
|
1448: },
|
|
1449: {
|
|
1450: "code": "SK",
|
|
1451: "name": {
|
|
1452: "en": "Slovakia",
|
|
1453: "fa": "اسلواکی",
|
|
1454: "de": "Slowakei"
|
|
1455: },
|
|
1456: "phoneCode": "421"
|
|
1457: },
|
|
1458: {
|
|
1459: "code": "AL",
|
|
1460: "name": {
|
|
1461: "en": "Albania",
|
|
1462: "fa": "آلبانی",
|
|
1463: "de": "Albanien"
|
|
1464: },
|
|
1465: "phoneCode": "355"
|
|
1466: },
|
|
1467: {
|
|
1468: "code": "MK",
|
|
1469: "name": {
|
|
1470: "en": "North Macedonia",
|
|
1471: "fa": "مقدونیه شمالی",
|
|
1472: "de": "Nordmazedonien"
|
|
1473: },
|
|
1474: "phoneCode": "389"
|
|
1475: },
|
|
1476: {
|
|
1477: "code": "ME",
|
|
1478: "name": {
|
|
1479: "en": "Montenegro",
|
|
1480: "fa": "مونتهنگرو",
|
|
1481: "de": "Montenegro"
|
|
1482: },
|
|
1483: "phoneCode": "382"
|
|
1484: },
|
|
1485: {
|
|
1486: "code": "XK",
|
|
1487: "name": {
|
|
1488: "en": "Kosovo",
|
|
1489: "fa": "کوزوو",
|
|
1490: "de": "Kosovo"
|
|
1491: },
|
|
1492: "phoneCode": "383"
|
|
1493: },
|
|
1494: {
|
|
1495: "code": "EE",
|
|
1496: "name": {
|
|
1497: "en": "Estonia",
|
|
1498: "fa": "استونی",
|
|
1499: "de": "Estland"
|
|
1500: },
|
|
1501: "phoneCode": "372"
|
|
1502: },
|
|
1503: {
|
|
1504: "code": "LV",
|
|
1505: "name": {
|
|
1506: "en": "Latvia",
|
|
1507: "fa": "لتونی",
|
|
1508: "de": "Lettland"
|
|
1509: },
|
|
1510: "phoneCode": "371"
|
|
1511: },
|
|
1512: {
|
|
1513: "code": "LT",
|
|
1514: "name": {
|
|
1515: "en": "Lithuania",
|
|
1516: "fa": "لیتوانی",
|
|
1517: "de": "Litauen"
|
|
1518: },
|
|
1519: "phoneCode": "370"
|
|
1520: },
|
|
1521: {
|
|
1522: "code": "GE",
|
|
1523: "name": {
|
|
1524: "en": "Georgia",
|
|
1525: "fa": "گرجستان",
|
|
1526: "de": "Georgien"
|
|
1527: },
|
|
1528: "phoneCode": "995"
|
|
1529: },
|
|
1530: {
|
|
1531: "code": "AM",
|
|
1532: "name": {
|
|
1533: "en": "Armenia",
|
|
1534: "fa": "ارمنستان",
|
|
1535: "de": "Armenien"
|
|
1536: },
|
|
1537: "phoneCode": "374"
|
|
1538: },
|
|
1539: {
|
|
1540: "code": "AZ",
|
|
1541: "name": {
|
|
1542: "en": "Azerbaijan",
|
|
1543: "fa": "آذربایجان",
|
|
1544: "de": "Aserbaidschan"
|
|
1545: },
|
|
1546: "phoneCode": "994"
|
|
1547: },
|
|
1548: {
|
|
1549: "code": "YE",
|
|
1550: "name": {
|
|
1551: "en": "Yemen",
|
|
1552: "fa": "یمن",
|
|
1553: "de": "Jemen"
|
|
1554: },
|
|
1555: "phoneCode": "967"
|
|
1556: },
|
|
1557: {
|
|
1558: "code": "OM",
|
|
1559: "name": {
|
|
1560: "en": "Oman",
|
|
1561: "fa": "عمان",
|
|
1562: "de": "Oman"
|
|
1563: },
|
|
1564: "phoneCode": "968"
|
|
1565: },
|
|
1566: {
|
|
1567: "code": "QA",
|
|
1568: "name": {
|
|
1569: "en": "Qatar",
|
|
1570: "fa": "قطر",
|
|
1571: "de": "Katar"
|
|
1572: },
|
|
1573: "phoneCode": "974"
|
|
1574: },
|
|
1575: {
|
|
1576: "code": "KW",
|
|
1577: "name": {
|
|
1578: "en": "Kuwait",
|
|
1579: "fa": "کویت",
|
|
1580: "de": "Kuwait"
|
|
1581: },
|
|
1582: "phoneCode": "965"
|
|
1583: },
|
|
1584: {
|
|
1585: "code": "BH",
|
|
1586: "name": {
|
|
1587: "en": "Bahrain",
|
|
1588: "fa": "بحرین",
|
|
1589: "de": "Bahrain"
|
|
1590: },
|
|
1591: "phoneCode": "973"
|
|
1592: },
|
|
1593: {
|
|
1594: "code": "JO",
|
|
1595: "name": {
|
|
1596: "en": "Jordan",
|
|
1597: "fa": "اردن",
|
|
1598: "de": "Jordanien"
|
|
1599: },
|
|
1600: "phoneCode": "962"
|
|
1601: },
|
|
1602: {
|
|
1603: "code": "LB",
|
|
1604: "name": {
|
|
1605: "en": "Lebanon",
|
|
1606: "fa": "لبنان",
|
|
1607: "de": "Libanon"
|
|
1608: },
|
|
1609: "phoneCode": "961"
|
|
1610: },
|
|
1611: {
|
|
1612: "code": "SY",
|
|
1613: "name": {
|
|
1614: "en": "Syria",
|
|
1615: "fa": "سوریه",
|
|
1616: "de": "Syrien"
|
|
1617: },
|
|
1618: "phoneCode": "963"
|
|
1619: },
|
|
1620: {
|
|
1621: "code": "PS",
|
|
1622: "name": {
|
|
1623: "en": "Palestine",
|
|
1624: "fa": "فلسطین",
|
|
1625: "de": "Palästina"
|
|
1626: },
|
|
1627: "phoneCode": "970"
|
|
1628: },
|
|
1629: {
|
|
1630: "code": "IL",
|
|
1631: "name": {
|
|
1632: "en": "Israel",
|
|
1633: "fa": "اسرائیل",
|
|
1634: "de": "Israel"
|
|
1635: },
|
|
1636: "phoneCode": "972"
|
|
1637: },
|
|
1638: {
|
|
1639: "code": "CY",
|
|
1640: "name": {
|
|
1641: "en": "Cyprus",
|
|
1642: "fa": "قبرس",
|
|
1643: "de": "Zypern"
|
|
1644: },
|
|
1645: "phoneCode": "357"
|
|
1646: },
|
|
1647: {
|
|
1648: "code": "IS",
|
|
1649: "name": {
|
|
1650: "en": "Iceland",
|
|
1651: "fa": "ایسلند",
|
|
1652: "de": "Island"
|
|
1653: },
|
|
1654: "phoneCode": "354"
|
|
1655: },
|
|
1656: {
|
|
1657: "code": "LU",
|
|
1658: "name": {
|
|
1659: "en": "Luxembourg",
|
|
1660: "fa": "لوکزامبورگ",
|
|
1661: "de": "Luxemburg"
|
|
1662: },
|
|
1663: "phoneCode": "352"
|
|
1664: },
|
|
1665: {
|
|
1666: "code": "MT",
|
|
1667: "name": {
|
|
1668: "en": "Malta",
|
|
1669: "fa": "مالت",
|
|
1670: "de": "Malta"
|
|
1671: },
|
|
1672: "phoneCode": "356"
|
|
1673: },
|
|
1674: {
|
|
1675: "code": "MC",
|
|
1676: "name": {
|
|
1677: "en": "Monaco",
|
|
1678: "fa": "موناکو",
|
|
1679: "de": "Monaco"
|
|
1680: },
|
|
1681: "phoneCode": "377"
|
|
1682: },
|
|
1683: {
|
|
1684: "code": "SM",
|
|
1685: "name": {
|
|
1686: "en": "San Marino",
|
|
1687: "fa": "سان مارینو",
|
|
1688: "de": "San Marino"
|
|
1689: },
|
|
1690: "phoneCode": "378"
|
|
1691: },
|
|
1692: {
|
|
1693: "code": "VA",
|
|
1694: "name": {
|
|
1695: "en": "Vatican City",
|
|
1696: "fa": "واتیکان",
|
|
1697: "de": "Vatikanstadt"
|
|
1698: },
|
|
1699: "phoneCode": "379"
|
|
1700: },
|
|
1701: {
|
|
1702: "code": "AD",
|
|
1703: "name": {
|
|
1704: "en": "Andorra",
|
|
1705: "fa": "آندورا",
|
|
1706: "de": "Andorra"
|
|
1707: },
|
|
1708: "phoneCode": "376"
|
|
1709: },
|
|
1710: {
|
|
1711: "code": "LI",
|
|
1712: "name": {
|
|
1713: "en": "Liechtenstein",
|
|
1714: "fa": "لیختناشتاین",
|
|
1715: "de": "Liechtenstein"
|
|
1716: },
|
|
1717: "phoneCode": "423"
|
|
1718: },
|
|
1719: {
|
|
1720: "code": "MN",
|
|
1721: "name": {
|
|
1722: "en": "Mongolia",
|
|
1723: "fa": "مغولستان",
|
|
1724: "de": "Mongolei"
|
|
1725: },
|
|
1726: "phoneCode": "976"
|
|
1727: },
|
|
1728: {
|
|
1729: "code": "KP",
|
|
1730: "name": {
|
|
1731: "en": "North Korea",
|
|
1732: "fa": "کره شمالی",
|
|
1733: "de": "Nordkorea"
|
|
1734: },
|
|
1735: "phoneCode": "850"
|
|
1736: },
|
|
1737: {
|
|
1738: "code": "MM",
|
|
1739: "name": {
|
|
1740: "en": "Myanmar",
|
|
1741: "fa": "میانمار",
|
|
1742: "de": "Myanmar"
|
|
1743: },
|
|
1744: "phoneCode": "95"
|
|
1745: },
|
|
1746: {
|
|
1747: "code": "KH",
|
|
1748: "name": {
|
|
1749: "en": "Cambodia",
|
|
1750: "fa": "کامبوج",
|
|
1751: "de": "Kambodscha"
|
|
1752: },
|
|
1753: "phoneCode": "855"
|
|
1754: },
|
|
1755: {
|
|
1756: "code": "LA",
|
|
1757: "name": {
|
|
1758: "en": "Laos",
|
|
1759: "fa": "لائوس",
|
|
1760: "de": "Laos"
|
|
1761: },
|
|
1762: "phoneCode": "856"
|
|
1763: },
|
|
1764: {
|
|
1765: "code": "BN",
|
|
1766: "name": {
|
|
1767: "en": "Brunei",
|
|
1768: "fa": "برونئی",
|
|
1769: "de": "Brunei"
|
|
1770: },
|
|
1771: "phoneCode": "673"
|
|
1772: },
|
|
1773: {
|
|
1774: "code": "TL",
|
|
1775: "name": {
|
|
1776: "en": "Timor-Leste",
|
|
1777: "fa": "تیمور شرقی",
|
|
1778: "de": "Osttimor"
|
|
1779: },
|
|
1780: "phoneCode": "670"
|
|
1781: },
|
|
1782: {
|
|
1783: "code": "TG",
|
|
1784: "name": {
|
|
1785: "en": "Togo",
|
|
1786: "fa": "توگو",
|
|
1787: "de": "Togo"
|
|
1788: },
|
|
1789: "phoneCode": "228"
|
|
1790: },
|
|
1791: {
|
|
1792: "code": "BJ",
|
|
1793: "name": {
|
|
1794: "en": "Benin",
|
|
1795: "fa": "بنین",
|
|
1796: "de": "Benin"
|
|
1797: },
|
|
1798: "phoneCode": "229"
|
|
1799: }
|
|
1800: ]
|
|
</file>
|
|
|
|
<file path="database/seeders/index.ts">
|
|
1: import 'dotenv/config';
|
|
2: import { seedCountries } from './country.seeder';
|
|
3: import { seedAddressPredefined } from '@/server/database/seeders/address-predefined.seeder';
|
|
4: export const seeders = {
|
|
5: countries: seedCountries,
|
|
6: addressPredefined: seedAddressPredefined,
|
|
7: } satisfies Record<string, () => Promise<void>>;
|
|
8: type SeederName = keyof typeof seeders;
|
|
9: async function run(names: SeederName[]) {
|
|
10: for (const name of names) {
|
|
11: console.log(`\n▶ Running seeder: ${name}`);
|
|
12: await seeders[name]();
|
|
13: }
|
|
14: }
|
|
15: async function main() {
|
|
16: const seederArg = process.argv.find((arg) => arg.startsWith('--seeder='));
|
|
17: if (seederArg) {
|
|
18: const requested = seederArg.replace('--seeder=', '').split(',') as SeederName[];
|
|
19: for (const name of requested) {
|
|
20: if (!(name in seeders)) {
|
|
21: throw new Error(
|
|
22: `Unknown seeder "${name}". Available: ${Object.keys(seeders).join(', ')}`
|
|
23: );
|
|
24: }
|
|
25: }
|
|
26: await run(requested);
|
|
27: } else {
|
|
28: await run(Object.keys(seeders) as SeederName[]);
|
|
29: }
|
|
30: process.exit(0);
|
|
31: }
|
|
32: main().catch((err) => {
|
|
33: console.error(err);
|
|
34: process.exit(1);
|
|
35: });
|
|
</file>
|
|
|
|
<file path="database/seeders/schemas.ts">
|
|
1: import { z } from 'zod';
|
|
2: export const LocalizedLabelSchema = z.record(z.string(), z.string());
|
|
</file>
|
|
|
|
<file path="database/seeders/truncate.ts">
|
|
1: import 'dotenv/config';
|
|
2: import { is, sql } from 'drizzle-orm';
|
|
3: import { PgTable, getTableConfig } from 'drizzle-orm/pg-core';
|
|
4: import { db } from '@/server/database';
|
|
5: import * as schema from '@/server/database/schemas';
|
|
6: async function truncateAll() {
|
|
7: const tables = Object.values(schema).filter((value) => is(value, PgTable)) as unknown as PgTable[];
|
|
8: if (tables.length === 0) {
|
|
9: console.log('No tables found to truncate.');
|
|
10: return;
|
|
11: }
|
|
12: const tableNames = tables.map((t) => `"${getTableConfig(t).name}"`).join(', ');
|
|
13: await db.execute(sql.raw(`TRUNCATE TABLE ${tableNames} RESTART IDENTITY CASCADE`));
|
|
14: console.log(`Truncated: ${tableNames}`);
|
|
15: }
|
|
16: async function main() {
|
|
17: await truncateAll();
|
|
18: process.exit(0);
|
|
19: }
|
|
20: main().catch((err) => {
|
|
21: console.error(err);
|
|
22: process.exit(1);
|
|
23: });
|
|
</file>
|
|
|
|
<file path="infra/postgres.ts">
|
|
1: import { drizzle } from 'drizzle-orm/node-postgres';
|
|
2: import { Pool } from 'pg';
|
|
3: import { relations } from '@/server/database/relations';
|
|
4: import {databaseConfig} from "@/config/database.config";
|
|
5: const pool = new Pool({
|
|
6: connectionString: databaseConfig.url,
|
|
7: options: `-c timezone=${databaseConfig.timezone}`,
|
|
8: });
|
|
9: export const postgres = drizzle({
|
|
10: client: pool,
|
|
11: relations,
|
|
12: });
|
|
</file>
|
|
|
|
<file path="infra/redis.ts">
|
|
1: import Redis from "ioredis";
|
|
2: import { redisConfig } from "@/config";
|
|
3: export const redis = new Redis(redisConfig.url);
|
|
</file>
|
|
|
|
<file path="services/auth/backoffice/auth.service.ts">
|
|
1: import { cookies } from 'next/headers';
|
|
2: import { verifyCredentials } from '@/server/services/auth/credentials.service';
|
|
3: import { createSession, getSession, destroySession, refreshSession } from '@/server/services/session/session.service';
|
|
4: import type { LoginInput } from '@/server/validators/auth.validator';
|
|
5: import { cookieName as LOCALE_COOKIE, isLocale, type Locale } from '@/lib/i18n/settings';
|
|
6: const SESSION_PREFIX = 'backoffice-session';
|
|
7: const SESSION_TTL_SECONDS = 60 * 60 * 24 * 7;
|
|
8: export type BackofficeSessionData = {
|
|
9: userId: string;
|
|
10: name: string;
|
|
11: email: string | null;
|
|
12: phone: string | null;
|
|
13: locale?: Locale;
|
|
14: };
|
|
15: export async function login(input: LoginInput): Promise<{ sessionId: string; user: BackofficeSessionData }> {
|
|
16: const user = await verifyCredentials(input);
|
|
17: const cookieStore = await cookies();
|
|
18: const cookieLocale = cookieStore.get(LOCALE_COOKIE)?.value;
|
|
19: const locale = isLocale(cookieLocale) ? cookieLocale : undefined;
|
|
20: const sessionData: BackofficeSessionData = {
|
|
21: userId: user.id,
|
|
22: name: user.name,
|
|
23: email: user.email,
|
|
24: phone: user.phone,
|
|
25: locale,
|
|
26: };
|
|
27: const sessionId = await createSession(SESSION_PREFIX, sessionData, SESSION_TTL_SECONDS);
|
|
28: return { sessionId, user: sessionData };
|
|
29: }
|
|
30: export async function getCurrentSession(sessionId: string | undefined | null): Promise<BackofficeSessionData | null> {
|
|
31: return getSession<BackofficeSessionData>(SESSION_PREFIX, sessionId);
|
|
32: }
|
|
33: export async function logout(sessionId: string | undefined | null): Promise<void> {
|
|
34: return destroySession(SESSION_PREFIX, sessionId);
|
|
35: }
|
|
36: export async function refreshCurrentSession(sessionId: string): Promise<void> {
|
|
37: return refreshSession(SESSION_PREFIX, sessionId, SESSION_TTL_SECONDS);
|
|
38: }
|
|
</file>
|
|
|
|
<file path="services/auth/backoffice/constants.ts">
|
|
1: export const BACKOFFICE_SESSION_COOKIE = 'backoffice_sid';
|
|
</file>
|
|
|
|
<file path="services/auth/credentials.service.ts">
|
|
1: import bcrypt from 'bcrypt';
|
|
2: import { eq, or } from 'drizzle-orm';
|
|
3: import { db } from '@/server/database';
|
|
4: import { users, type User } from '@/server/database/schemas/user.schema';
|
|
5: import { loginSchema, type LoginInput } from '@/server/validators/auth.validator';
|
|
6: export class AuthError extends Error {}
|
|
7: export async function verifyCredentials(input: LoginInput): Promise<User> {
|
|
8: const parsed = loginSchema.parse(input);
|
|
9: const conditions = [];
|
|
10: if (parsed.email) conditions.push(eq(users.email, parsed.email));
|
|
11: if (parsed.phone) conditions.push(eq(users.phone, parsed.phone));
|
|
12: const [user]: User[] = await db
|
|
13: .select()
|
|
14: .from(users)
|
|
15: .where(or(...conditions))
|
|
16: .limit(1);
|
|
17: if (!user || !user.password) {
|
|
18: throw new AuthError('invalid_credentials');
|
|
19: }
|
|
20: const passwordMatches = await bcrypt.compare(parsed.password, user.password);
|
|
21: if (!passwordMatches) {
|
|
22: throw new AuthError('invalid_credentials');
|
|
23: }
|
|
24: if (parsed.email && !user.emailVerifiedAt) {
|
|
25: throw new AuthError('email_not_verified');
|
|
26: }
|
|
27: if (parsed.phone && !user.phoneVerifiedAt) {
|
|
28: throw new AuthError('phone_not_verified');
|
|
29: }
|
|
30: return user;
|
|
31: }
|
|
</file>
|
|
|
|
<file path="services/session/session.service.ts">
|
|
1: import { randomBytes } from 'crypto';
|
|
2: import { redis } from '@/server/infra/redis';
|
|
3: const DEFAULT_TTL_SECONDS = 60 * 60 * 24 * 7;
|
|
4: function buildKey(prefix: string, sessionId: string) {
|
|
5: return `${prefix}:${sessionId}`;
|
|
6: }
|
|
7: export function generateSessionId(): string {
|
|
8: return randomBytes(32).toString('hex');
|
|
9: }
|
|
10: export async function createSession<T>(
|
|
11: prefix: string,
|
|
12: data: T,
|
|
13: ttlSeconds: number = DEFAULT_TTL_SECONDS
|
|
14: ): Promise<string> {
|
|
15: const sessionId = generateSessionId();
|
|
16: await redis.set(buildKey(prefix, sessionId), JSON.stringify(data), 'EX', ttlSeconds);
|
|
17: return sessionId;
|
|
18: }
|
|
19: export async function getSession<T>(prefix: string, sessionId: string | undefined | null): Promise<T | null> {
|
|
20: if (!sessionId) return null;
|
|
21: const raw = await redis.get(buildKey(prefix, sessionId));
|
|
22: if (!raw) return null;
|
|
23: return JSON.parse(raw) as T;
|
|
24: }
|
|
25: export async function destroySession(prefix: string, sessionId: string | undefined | null): Promise<void> {
|
|
26: if (!sessionId) return;
|
|
27: await redis.del(buildKey(prefix, sessionId));
|
|
28: }
|
|
29: export async function refreshSession(
|
|
30: prefix: string,
|
|
31: sessionId: string,
|
|
32: ttlSeconds: number = DEFAULT_TTL_SECONDS
|
|
33: ): Promise<void> {
|
|
34: await redis.expire(buildKey(prefix, sessionId), ttlSeconds);
|
|
35: }
|
|
36: export async function updateSession<T extends object>(
|
|
37: prefix: string,
|
|
38: sessionId: string | undefined | null,
|
|
39: patch: Partial<T>
|
|
40: ): Promise<T | null> {
|
|
41: if (!sessionId) return null;
|
|
42: const key = buildKey(prefix, sessionId);
|
|
43: const raw = await redis.get(key);
|
|
44: if (!raw) return null;
|
|
45: const current = JSON.parse(raw) as T;
|
|
46: const updated = { ...current, ...patch };
|
|
47: const ttl = await redis.ttl(key);
|
|
48: await redis.set(key, JSON.stringify(updated), 'EX', ttl > 0 ? ttl : DEFAULT_TTL_SECONDS);
|
|
49: return updated;
|
|
50: }
|
|
</file>
|
|
|
|
<file path="services/translation/load.ts">
|
|
1: import { promises as fs } from 'fs';
|
|
2: import path from 'path';
|
|
3: import { TranslationTree } from './types';
|
|
4: const LOCALES_DIR = path.join(process.cwd(), 'locales');
|
|
5: const cache = new Map<string, TranslationTree>();
|
|
6: export async function loadTranslations(locale: string): Promise<TranslationTree> {
|
|
7: if (cache.has(locale)) return cache.get(locale)!;
|
|
8: const filePath = path.join(LOCALES_DIR, `${locale}.json`);
|
|
9: const raw = await fs.readFile(filePath, 'utf-8');
|
|
10: const json: TranslationTree = JSON.parse(raw);
|
|
11: cache.set(locale, json);
|
|
12: return json;
|
|
13: }
|
|
14: export function invalidateCache(locale: string) {
|
|
15: cache.delete(locale);
|
|
16: }
|
|
</file>
|
|
|
|
<file path="services/translation/types.ts">
|
|
1: export type TranslationTree = { [key: string]: string | TranslationTree };
|
|
</file>
|
|
|
|
<file path="services/translation/watch.ts">
|
|
1: import { watch } from 'fs';
|
|
2: import path from 'path';
|
|
3: import { invalidateCache } from './load';
|
|
4: const LOCALES_DIR = path.join(process.cwd(), 'locales');
|
|
5: export function startTranslationWatcher() {
|
|
6: watch(LOCALES_DIR, (event, filename) => {
|
|
7: if (!filename || !filename.endsWith('.json')) return;
|
|
8: const locale = filename.replace('.json', '');
|
|
9: invalidateCache(locale);
|
|
10: });
|
|
11: }
|
|
</file>
|
|
|
|
<file path="services/upload/upload.errors.ts">
|
|
1: export class UploadNotFoundError extends Error {
|
|
2: constructor(uploadId: string) {
|
|
3: super(`Upload not found: ${uploadId}`);
|
|
4: this.name = "UploadNotFoundError";
|
|
5: }
|
|
6: }
|
|
7: export class UploadReferencedError extends Error {
|
|
8: constructor(uploadId: string) {
|
|
9: super(`Upload ${uploadId} is still referenced elsewhere and cannot be hard-deleted`);
|
|
10: this.name = "UploadReferencedError";
|
|
11: }
|
|
12: }
|
|
13: export class UploadStorageError extends Error {
|
|
14: constructor(message: string, public readonly cause?: unknown) {
|
|
15: super(message);
|
|
16: this.name = "UploadStorageError";
|
|
17: }
|
|
18: }
|
|
</file>
|
|
|
|
<file path="services/upload/upload.helpers.ts">
|
|
1: import { createHash } from "node:crypto";
|
|
2: import path from "node:path";
|
|
3: const MIME_EXTENSION_MAP: Record<string, string> = {
|
|
4: "image/jpeg": ".jpg",
|
|
5: "image/png": ".png",
|
|
6: "image/webp": ".webp",
|
|
7: "image/gif": ".gif",
|
|
8: "image/svg+xml": ".svg",
|
|
9: "application/pdf": ".pdf",
|
|
10: "application/zip": ".zip",
|
|
11: "text/plain": ".txt",
|
|
12: "text/csv": ".csv",
|
|
13: "application/json": ".json",
|
|
14: };
|
|
15: export function resolveExtension(originalName: string, mimeType: string): string {
|
|
16: const fromName = path.extname(originalName);
|
|
17: if (fromName) return fromName.toLowerCase();
|
|
18: return MIME_EXTENSION_MAP[mimeType] ?? "";
|
|
19: }
|
|
20: export function computeChecksum(buffer: Buffer): string {
|
|
21: return createHash("sha256").update(buffer).digest("hex");
|
|
22: }
|
|
23: export function buildStorageKey(uploadId: string, extension: string): string {
|
|
24: return `${uploadId}${extension}`;
|
|
25: }
|
|
</file>
|
|
|
|
<file path="services/upload/upload.service.ts">
|
|
1: import { eq } from "drizzle-orm";
|
|
2: import {
|
|
3: DeleteObjectCommand,
|
|
4: GetObjectCommand,
|
|
5: PutObjectCommand,
|
|
6: } from "@aws-sdk/client-s3";
|
|
7: import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
8: import { db } from "@/server/database";
|
|
9: import { uploads, type Upload } from "@/server/database/schemas/upload.schema";
|
|
10: import { s3Client } from "@/lib/s3-client";
|
|
11: import { storageConfig } from "@/config/storage.config";
|
|
12: import {
|
|
13: UploadNotFoundError,
|
|
14: UploadReferencedError,
|
|
15: UploadStorageError,
|
|
16: } from "./upload.errors";
|
|
17: import {
|
|
18: buildStorageKey,
|
|
19: computeChecksum,
|
|
20: resolveExtension,
|
|
21: } from "./upload.helpers";
|
|
22: import type { CreateUploadInput, GetUploadUrlOptions } from "./upload.types";
|
|
23: const DEFAULT_URL_EXPIRY_SECONDS = 15 * 60;
|
|
24: const PG_FOREIGN_KEY_VIOLATION = "23503";
|
|
25: export class UploadService {
|
|
26: async create(input: CreateUploadInput): Promise<Upload> {
|
|
27: const bucket = input.bucket ?? storageConfig.defaultBucket;
|
|
28: const extension = resolveExtension(input.originalName, input.mimeType);
|
|
29: const checksum = computeChecksum(input.file);
|
|
30: const [pending] = await db
|
|
31: .insert(uploads)
|
|
32: .values({
|
|
33: bucket,
|
|
34: storageKey: "", // filled in once we know the generated id
|
|
35: checksum,
|
|
36: originalName: input.originalName,
|
|
37: mimeType: input.mimeType,
|
|
38: sizeBytes: input.file.byteLength,
|
|
39: status: "pending",
|
|
40: uploadedBy: input.uploadedBy,
|
|
41: })
|
|
42: .returning();
|
|
43: const storageKey = buildStorageKey(pending.id, extension);
|
|
44: try {
|
|
45: await s3Client.send(
|
|
46: new PutObjectCommand({
|
|
47: Bucket: bucket,
|
|
48: Key: storageKey,
|
|
49: Body: input.file,
|
|
50: ContentType: input.mimeType,
|
|
51: })
|
|
52: );
|
|
53: } catch (err) {
|
|
54: await db
|
|
55: .update(uploads)
|
|
56: .set({ status: "failed" })
|
|
57: .where(eq(uploads.id, pending.id));
|
|
58: throw new UploadStorageError(
|
|
59: `Failed to upload object for upload ${pending.id}`,
|
|
60: err
|
|
61: );
|
|
62: }
|
|
63: const [completed] = await db
|
|
64: .update(uploads)
|
|
65: .set({ storageKey, status: "completed" })
|
|
66: .where(eq(uploads.id, pending.id))
|
|
67: .returning();
|
|
68: return completed;
|
|
69: }
|
|
70: async rename(uploadId: string, newOriginalName: string): Promise<Upload> {
|
|
71: const [updated] = await db
|
|
72: .update(uploads)
|
|
73: .set({ originalName: newOriginalName })
|
|
74: .where(eq(uploads.id, uploadId))
|
|
75: .returning();
|
|
76: if (!updated) throw new UploadNotFoundError(uploadId);
|
|
77: return updated;
|
|
78: }
|
|
79: async softDelete(uploadId: string): Promise<Upload> {
|
|
80: const [updated] = await db
|
|
81: .update(uploads)
|
|
82: .set({ deletedAt: new Date() })
|
|
83: .where(eq(uploads.id, uploadId))
|
|
84: .returning();
|
|
85: if (!updated) throw new UploadNotFoundError(uploadId);
|
|
86: return updated;
|
|
87: }
|
|
88: async restore(uploadId: string): Promise<Upload> {
|
|
89: const [updated] = await db
|
|
90: .update(uploads)
|
|
91: .set({ deletedAt: null })
|
|
92: .where(eq(uploads.id, uploadId))
|
|
93: .returning();
|
|
94: if (!updated) throw new UploadNotFoundError(uploadId);
|
|
95: return updated;
|
|
96: }
|
|
97: async hardDelete(uploadId: string): Promise<void> {
|
|
98: const upload = await this.getByIdOrThrow(uploadId);
|
|
99: try {
|
|
100: await db.delete(uploads).where(eq(uploads.id, uploadId));
|
|
101: } catch (err) {
|
|
102: if (isForeignKeyViolation(err)) {
|
|
103: throw new UploadReferencedError(uploadId);
|
|
104: }
|
|
105: throw err;
|
|
106: }
|
|
107: try {
|
|
108: await s3Client.send(
|
|
109: new DeleteObjectCommand({
|
|
110: Bucket: upload.bucket,
|
|
111: Key: upload.storageKey,
|
|
112: })
|
|
113: );
|
|
114: } catch (err) {
|
|
115: throw new UploadStorageError(
|
|
116: `DB row for upload ${uploadId} was deleted, but removing the object from storage failed`,
|
|
117: err
|
|
118: );
|
|
119: }
|
|
120: }
|
|
121: async getUrl(uploadId: string, options: GetUploadUrlOptions): Promise<string> {
|
|
122: const upload = await this.getByIdOrThrow(uploadId);
|
|
123: const command = new GetObjectCommand({
|
|
124: Bucket: upload.bucket,
|
|
125: Key: upload.storageKey,
|
|
126: ResponseContentDisposition:
|
|
127: options.mode === "download"
|
|
128: ? `attachment; filename="${encodeURIComponent(upload.originalName)}"`
|
|
129: : "inline",
|
|
130: ResponseContentType: upload.mimeType,
|
|
131: });
|
|
132: return getSignedUrl(s3Client, command, {
|
|
133: expiresIn: options.expiresInSeconds ?? DEFAULT_URL_EXPIRY_SECONDS,
|
|
134: });
|
|
135: }
|
|
136: private async getByIdOrThrow(uploadId: string): Promise<Upload> {
|
|
137: const upload = await db.query.uploads.findFirst({
|
|
138: where: { id: uploadId },
|
|
139: });
|
|
140: if (!upload) throw new UploadNotFoundError(uploadId);
|
|
141: return upload;
|
|
142: }
|
|
143: }
|
|
144: function isForeignKeyViolation(err: unknown): boolean {
|
|
145: return (
|
|
146: typeof err === "object" &&
|
|
147: err !== null &&
|
|
148: "code" in err &&
|
|
149: (err as { code: unknown }).code === PG_FOREIGN_KEY_VIOLATION
|
|
150: );
|
|
151: }
|
|
152: export const uploadService = new UploadService();
|
|
</file>
|
|
|
|
<file path="services/upload/upload.types.ts">
|
|
1: export interface CreateUploadInput {
|
|
2: file: Buffer;
|
|
3: originalName: string;
|
|
4: mimeType: string;
|
|
5: uploadedBy: string;
|
|
6: bucket?: string;
|
|
7: }
|
|
8: export interface GetUploadUrlOptions {
|
|
9: mode: "read" | "download";
|
|
10: expiresInSeconds?: number;
|
|
11: }
|
|
</file>
|
|
|
|
<file path="tests/setup/db.ts">
|
|
1: import { drizzle } from 'drizzle-orm/node-postgres';
|
|
2: import { migrate } from 'drizzle-orm/node-postgres/migrator';
|
|
3: import { Pool } from 'pg';
|
|
4: import { relations } from '@/server/database/relations';
|
|
5: import {databaseConfig} from "@/config";
|
|
6: const pool = new Pool({ connectionString: databaseConfig.testUrl });
|
|
7: export const testDb = drizzle({
|
|
8: client: pool,
|
|
9: relations,
|
|
10: });
|
|
11: export async function runMigrations() {
|
|
12: await migrate(testDb, { migrationsFolder: './drizzle/migrations' });
|
|
13: }
|
|
14: export async function closeTestDb() {
|
|
15: await pool.end();
|
|
16: }
|
|
</file>
|
|
|
|
<file path="tests/setup/global.ts">
|
|
1: import { runMigrations } from './db';
|
|
2: import 'dotenv/config';
|
|
3: export default async function setup() {
|
|
4: await runMigrations();
|
|
5: }
|
|
</file>
|
|
|
|
<file path="tests/setup/reset.ts">
|
|
1: import { sql } from 'drizzle-orm';
|
|
2: import { testDb } from './db';
|
|
3: export async function resetDb() {
|
|
4: await testDb.execute(sql`TRUNCATE TABLE users RESTART IDENTITY CASCADE`);
|
|
5: }
|
|
</file>
|
|
|
|
<file path="validators/auth.validator.ts">
|
|
1: import { z } from 'zod';
|
|
2: export const loginSchema = z
|
|
3: .object({
|
|
4: email: z.email().optional(),
|
|
5: phone: z.string().min(6).optional(),
|
|
6: password: z.string().min(1, 'password_is_required'),
|
|
7: })
|
|
8: .superRefine((data, ctx) => {
|
|
9: if (!data.email && !data.phone) {
|
|
10: ctx.addIssue({
|
|
11: code: 'custom',
|
|
12: message: 'email_or_phone_is_required',
|
|
13: path: ['email'],
|
|
14: });
|
|
15: ctx.addIssue({
|
|
16: code: 'custom',
|
|
17: message: 'email_or_phone_is_required',
|
|
18: path: ['phone'],
|
|
19: });
|
|
20: }
|
|
21: });
|
|
22: export type LoginInput = z.infer<typeof loginSchema>;
|
|
</file>
|
|
|
|
</files>
|