diff --git a/setup.py b/setup.py
index a32dbf1a05..9cbabb5ad7 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
- version="20201210.0",
+ version="20201212.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",
diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts
index 1b8530dcec..04eebc36a1 100644
--- a/src/components/data-table/ha-data-table.ts
+++ b/src/components/data-table/ha-data-table.ts
@@ -98,6 +98,12 @@ export class HaDataTable extends LitElement {
@property({ type: Boolean }) public hasFab = false;
+ /**
+ * Add an extra rows at the bottom of the datatabel
+ * @type {TemplateResult}
+ */
+ @property({ attribute: false }) public appendRow?;
+
@property({ type: Boolean, attribute: "auto-height" })
public autoHeight = false;
@@ -126,6 +132,8 @@ export class HaDataTable extends LitElement {
@query("slot[name='header']") private _header!: HTMLSlotElement;
+ private _items: DataTableRowData[] = [];
+
private _checkableRowsCount?: number;
private _checkedRows: string[] = [];
@@ -318,10 +326,13 @@ export class HaDataTable extends LitElement {
@scroll=${this._saveScrollPos}
>
${scroll({
- items: !this.hasFab
- ? this._filteredData
- : [...this._filteredData, ...[{ empty: true }]],
+ items: this._items,
renderItem: (row: DataTableRowData, index) => {
+ if (row.append) {
+ return html`
+
${row.content}
+ `;
+ }
if (row.empty) {
return html` `;
}
@@ -447,6 +458,20 @@ export class HaDataTable extends LitElement {
if (this.curRequest !== curRequest) {
return;
}
+
+ if (this.appendRow || this.hasFab) {
+ this._items = [...data];
+
+ if (this.appendRow) {
+ this._items.push({ append: true, content: this.appendRow });
+ }
+
+ if (this.hasFab) {
+ this._items.push({ empty: true });
+ }
+ } else {
+ this._items = data;
+ }
this._filteredData = data;
}
diff --git a/src/components/ha-relative-time.ts b/src/components/ha-relative-time.ts
index 1bd6e39afc..a2f9e403ca 100644
--- a/src/components/ha-relative-time.ts
+++ b/src/components/ha-relative-time.ts
@@ -13,7 +13,7 @@ import type { HomeAssistant } from "../types";
class HaRelativeTime extends UpdatingElement {
@property({ attribute: false }) public hass!: HomeAssistant;
- @property({ attribute: false }) public datetime?: string;
+ @property({ attribute: false }) public datetime?: string | Date;
private _interval?: number;
diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts
index e905f0c3ff..059fff683b 100644
--- a/src/dialogs/generic/dialog-box.ts
+++ b/src/dialogs/generic/dialog-box.ts
@@ -17,17 +17,17 @@ import "../../components/ha-switch";
import { PolymerChangedEvent } from "../../polymer-types";
import { haStyleDialog } from "../../resources/styles";
import { HomeAssistant } from "../../types";
-import { DialogParams } from "./show-dialog-box";
+import { DialogBoxParams } from "./show-dialog-box";
@customElement("dialog-box")
class DialogBox extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
- @internalProperty() private _params?: DialogParams;
+ @internalProperty() private _params?: DialogBoxParams;
@internalProperty() private _value?: string;
- public async showDialog(params: DialogParams): Promise {
+ public async showDialog(params: DialogBoxParams): Promise {
this._params = params;
if (params.prompt) {
this._value = params.defaultValue;
@@ -55,8 +55,8 @@ class DialogBox extends LitElement {
return html`
void;
}
-export interface ConfirmationDialogParams extends BaseDialogParams {
+export interface ConfirmationDialogParams extends BaseDialogBoxParams {
dismissText?: string;
confirm?: () => void;
cancel?: () => void;
}
-export interface PromptDialogParams extends BaseDialogParams {
+export interface PromptDialogParams extends BaseDialogBoxParams {
inputLabel?: string;
inputType?: string;
defaultValue?: string;
confirm?: (out?: string) => void;
}
-export interface DialogParams
+export interface DialogBoxParams
extends ConfirmationDialogParams,
PromptDialogParams {
confirm?: (out?: string) => void;
@@ -37,10 +37,10 @@ export const loadGenericDialog = () => import("./dialog-box");
const showDialogHelper = (
element: HTMLElement,
- dialogParams: DialogParams,
+ dialogParams: DialogBoxParams,
extra?: {
- confirmation?: DialogParams["confirmation"];
- prompt?: DialogParams["prompt"];
+ confirmation?: DialogBoxParams["confirmation"];
+ prompt?: DialogBoxParams["prompt"];
}
) =>
new Promise((resolve) => {
diff --git a/src/dialogs/more-info/controls/more-info-sun.ts b/src/dialogs/more-info/controls/more-info-sun.ts
index 80fa678ee4..c5e26348e7 100644
--- a/src/dialogs/more-info/controls/more-info-sun.ts
+++ b/src/dialogs/more-info/controls/more-info-sun.ts
@@ -44,7 +44,7 @@ class MoreInfoSun extends LitElement {
>
diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts
index 9af3dd8317..d11d01dafe 100644
--- a/src/layouts/hass-tabs-subpage-data-table.ts
+++ b/src/layouts/hass-tabs-subpage-data-table.ts
@@ -60,6 +60,12 @@ export class HaTabsSubpageDataTable extends LitElement {
*/
@property({ type: Boolean }) public hasFab = false;
+ /**
+ * Add an extra rows at the bottom of the datatabel
+ * @type {TemplateResult}
+ */
+ @property({ attribute: false }) public appendRow?;
+
/**
* Field with a unique id per entry in data.
* @type {String}
@@ -171,6 +177,7 @@ export class HaTabsSubpageDataTable extends LitElement {
.noDataText=${this.noDataText}
.dir=${computeRTLDirection(this.hass)}
.clickable=${this.clickable}
+ .appendRow=${this.appendRow}
>
${!this.narrow
? html`
diff --git a/src/panels/config/blueprint/dialog-import-blueprint.ts b/src/panels/config/blueprint/dialog-import-blueprint.ts
index ed65a04157..31f190c2f2 100644
--- a/src/panels/config/blueprint/dialog-import-blueprint.ts
+++ b/src/panels/config/blueprint/dialog-import-blueprint.ts
@@ -107,7 +107,16 @@ class DialogImportBlueprint extends LitElement {
${this._result.raw_data}
`
: html`${this.hass.localize(
- "ui.panel.config.blueprint.add.import_introduction"
+ "ui.panel.config.blueprint.add.import_introduction_link",
+ "community_link",
+ html`
${this.hass.localize(
+ "ui.panel.config.blueprint.add.community_forums"
+ )}`
)}
+
+ ${this.hass.localize(
+ "ui.panel.config.blueprint.overview.discover_more"
+ )}
+
+ `}
>
diff --git a/src/panels/config/tags/ha-config-tags.ts b/src/panels/config/tags/ha-config-tags.ts
index 50c971eb10..713b14d72a 100644
--- a/src/panels/config/tags/ha-config-tags.ts
+++ b/src/panels/config/tags/ha-config-tags.ts
@@ -84,7 +84,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) {
${tag.last_scanned_datetime
? html``
: this.hass.localize("ui.panel.config.tags.never_scanned")}
`
@@ -103,7 +103,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) {
${last_scanned_datetime
? html``
: this.hass.localize("ui.panel.config.tags.never_scanned")}
`,
diff --git a/src/translations/en.json b/src/translations/en.json
index aa10caf715..2d0f79b7ca 100755
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -1472,12 +1472,14 @@
"confirm_delete_text": "Are you sure you want to delete this blueprint?",
"add_blueprint": "Import blueprint",
"use_blueprint": "Create automation",
- "delete_blueprint": "Delete blueprint"
+ "delete_blueprint": "Delete blueprint",
+ "discover_more": "Discover more Blueprints"
},
"add": {
"header": "Import a blueprint",
"import_header": "Blueprint \"{name}\"",
- "import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.",
+ "import_introduction_link": "You can import blueprints of other users from Github and the {community_link}. Enter the URL of the blueprint below.",
+ "community_forums": "community forums",
"url": "URL of the blueprint",
"raw_blueprint": "Blueprint content",
"importing": "Loading blueprint...",
diff --git a/translations/frontend/bg.json b/translations/frontend/bg.json
index 71a02ceb06..9224f26966 100644
--- a/translations/frontend/bg.json
+++ b/translations/frontend/bg.json
@@ -1673,7 +1673,7 @@
"confirm_restart": "Сигурни ли сте, че искате да рестартирате Home Assistant?",
"confirm_stop": "Сигурни ли сте, че искате да спрете Home Assistant?",
"heading": "Управление на сървъра",
- "introduction": "Управляване на Home Assistant сървъра... от Home Assistant.",
+ "introduction": "Контрол на Home Assistant сървъра... от Home Assistant.",
"restart": "Рестартирай",
"stop": "Спри"
},
diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json
index 0468cdee32..32ffe88693 100644
--- a/translations/frontend/ca.json
+++ b/translations/frontend/ca.json
@@ -3184,7 +3184,7 @@
"close": "Tanca",
"empty_config": "Comença amb un panell buit",
"header": "Pren el control de la interfície d'usuari Lovelace",
- "para": "Aquest panell Lovelace s'està gestionant per Home Assistant. S'actualitza automàticament quan hi ha noves entitats o nous components de Lovelace disponibles. Si prens el control, aquest panell no s'actualitzarà automàticament. Sempre pots crear un nou panell a configuració i fer-hi proves.",
+ "para": "Aquest panell Lovelace està gestionat per Home Assistant. S'actualitza automàticament quan hi ha noves entitats o nous components de Lovelace disponibles. Si prens el control, aquest panell no s'actualitzarà automàticament. Sempre pots crear un nou panell a configuració i fer-hi proves.",
"para_sure": "Estàs segur que vols prendre el control de la interfície d'usuari?",
"save": "Prendre el control",
"yaml_config": "Per ajudar a familiaritzar-te, aquí tens la configuració actual del teu panell Lovelace:",
diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json
index d07fbd5fd0..8484990af1 100644
--- a/translations/frontend/fr.json
+++ b/translations/frontend/fr.json
@@ -1070,7 +1070,7 @@
},
"automation": {
"caption": "Automatisations",
- "description": "Créer et modifier des automatisations",
+ "description": "Créez des règles de comportement personnalisées pour votre maison",
"dialog_new": {
"blueprint": {
"use_blueprint": "Utiliser un plan"
@@ -1623,7 +1623,7 @@
},
"core": {
"caption": "Général",
- "description": "Changer la configuration générale de votre Home Assistant.",
+ "description": "Unités de mesure, emplacement, fuseau horaire et autres paramètres généraux",
"section": {
"core": {
"core_config": {
@@ -2281,7 +2281,7 @@
},
"script": {
"caption": "Scripts",
- "description": "Créer et modifier des scripts.",
+ "description": "Exécuter une séquence d'actions",
"editor": {
"alias": "Nom",
"default_name": "Nouveau script",
diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json
index dd28f4ad1b..4d2bb2f46b 100644
--- a/translations/frontend/nl.json
+++ b/translations/frontend/nl.json
@@ -901,6 +901,7 @@
"navigation": {
"areas": "Gebieden",
"automation": "Automatiseringen",
+ "blueprint": "Blueprints",
"core": "Algemeen",
"customize": "Aanpassingen",
"devices": "Apparaten",
@@ -1047,7 +1048,7 @@
"confirmation_text": "Alle apparaten in dit gebied zullen niet meer toegewezen zijn.",
"confirmation_title": "Weet je zeker dat je dit gebied wilt verwijderen?"
},
- "description": "Groepeer apparaten in gebieden",
+ "description": "Groepeer apparaten en entiteiten in gebieden",
"editor": {
"area_id": "Gebieds-ID",
"create": "Aanmaken",
@@ -1072,7 +1073,7 @@
"description": "Maak aangepaste gedragsregels voor uw huis",
"dialog_new": {
"blueprint": {
- "use_blueprint": "Gebruik een blauwdruk"
+ "use_blueprint": "Gebruik een Blueprint"
},
"header": "Een nieuwe automatisering maken",
"how": "Hoe wil je je nieuwe automatisering maken?",
@@ -1165,12 +1166,12 @@
},
"alias": "Naam",
"blueprint": {
- "blueprint_to_use": "Blauwdruk om te gebruiken",
- "header": "Blauwdruk",
+ "blueprint_to_use": "Blueprint om te gebruiken",
+ "header": "Blueprint",
"inputs": "Inputs",
"manage_blueprints": "Beheer Blueprints",
"no_blueprints": "Je hebt geen Blueprints",
- "no_inputs": "Deze blauwdruk heeft geen inputs."
+ "no_inputs": "Deze Blueprint heeft geen inputs."
},
"conditions": {
"add": "Voorwaarde toevoegen",
@@ -1416,33 +1417,33 @@
},
"blueprint": {
"add": {
- "error_no_url": "Voer de URL van de blauwdruk in.",
+ "error_no_url": "Voer de URL van de Blueprint in.",
"file_name": "Blueprint pad",
- "header": "Voeg een nieuwe blauwdruk toe",
- "import_btn": "Blauwdruk importeren",
- "import_header": "Importeer \"{name}\" (type: {domain})",
+ "header": "Voeg een nieuwe Blueprint toe",
+ "import_btn": "Bekijk een Blueprint",
+ "import_header": "Blueprint \"{name}\"",
"import_introduction": "U kunt Blueprints van andere gebruikers importeren vanuit Github en de communityforums. Voer de URL van de Blueprint hieronder in.",
- "importing": "Blauwdruk importeren ...",
+ "importing": "Blueprint importeren ...",
"raw_blueprint": "Blueprint inhoud",
- "save_btn": "Bewaar blauwdruk",
- "saving": "Blauwdruk opslaan ...",
+ "save_btn": "Blueprint importeren",
+ "saving": "Blueprint importeren ...",
"unsupported_blueprint": "Deze Blueprint wordt niet ondersteund",
- "url": "URL van de blauwdruk"
+ "url": "URL van de Blueprint"
},
"caption": "Blueprints",
"description": "Beheer Blueprints",
"overview": {
- "add_blueprint": "Blauwdruk importeren",
- "confirm_delete_header": "Deze blauwdruk verwijderen?",
+ "add_blueprint": "Blueprint importeren",
+ "confirm_delete_header": "Deze Blueprint verwijderen?",
"confirm_delete_text": "Weet je zeker dat je deze blauwdruk wilt verwijderen?",
"delete_blueprint": "Verwijder Blueprint",
- "header": "Blauwdrukeditor",
+ "header": "Blueprinteditor",
"headers": {
"domain": "Domein",
"file_name": "Bestandsnaam",
"name": "Naam"
},
- "introduction": "Met de blueprinteditor kunt je blueprints maken en bewerken.",
+ "introduction": "Met de Blueprinteditor kunt je Blueprints maken en bewerken.",
"learn_more": "Meer informatie over Blueprints",
"use_blueprint": "Automatisering maken"
}
diff --git a/translations/frontend/tr.json b/translations/frontend/tr.json
index f46946e019..1d2e44c45d 100644
--- a/translations/frontend/tr.json
+++ b/translations/frontend/tr.json
@@ -2,11 +2,13 @@
"config_entry": {
"disabled_by": {
"config_entry": "Config Girişi",
+ "device": "Cihaz",
"integration": "Entegrasyon",
"user": "Kullanıcı"
}
},
"groups": {
+ "owner": "Sahibi",
"system-admin": "Yöneticiler",
"system-read-only": "Salt Okunur Kullanıcılar",
"system-users": "Kullanıcılar"
@@ -714,6 +716,16 @@
"service-picker": {
"service": "Servis"
},
+ "target-picker": {
+ "add_area_id": "Alanı seç",
+ "add_device_id": "Cihazı seç",
+ "add_entity_id": "Varlığı seç",
+ "expand_area_id": "Bu alanı içerdiği ayrı cihazlarda ve varlıklarda genişletin. Genişletme sonrası, alan değiştiğinde cihazları ve varlıkları güncellemeyecektir.",
+ "expand_device_id": "Bu cihazı ayrı varlıklarda genişletin. Genişletme sonrası, cihaz değiştiğinde varlıklar güncellenmeyecektir.",
+ "remove_area_id": "Alanı kaldır",
+ "remove_device_id": "Cihazı kaldır",
+ "remove_entity_id": "Varlığı kaldır"
+ },
"user-picker": {
"add_user": "Kullanıcı Ekle",
"no_user": "Kullanıcı yok",
@@ -737,6 +749,7 @@
"editor": {
"confirm_delete": "Bu girişi silmek istediğinizden emin misiniz?",
"delete": "Sil",
+ "device_disabled": "Bu varlığın ait olduğu cihaz devre dışı.",
"enabled_cause": "{cause} tarafından devre dışı bırakılmış.",
"enabled_delay_confirm": "Etkinleştirilen varlıklar, {delay} saniye içinde Home Assistant'a eklenecek",
"enabled_description": "Devre dışı bırakılan varlıklar Home Assistant'a eklenmeyecek.",
@@ -747,6 +760,7 @@
"icon_error": "Simgeler 'önek: simge adı' biçiminde olmalıdır, örneğin 'mdi: home'",
"name": "Ad",
"note": "Not: Bu, tüm entegrasyonlarda henüz çalışmayabilir.",
+ "open_device_settings": "Cihaz ayarlarını aç",
"unavailable": "Bu varlık şu anda kullanılamıyor.",
"update": "Güncelle"
},
@@ -1404,11 +1418,13 @@
"blueprint": {
"add": {
"error_no_url": "Lütfen taslağın URL'sini girin.",
- "header": "Yeni taslak ekle",
+ "file_name": "Taslak Yolu",
+ "header": "Taslağı içeri aktar",
"import_btn": "Taslağı içe aktar",
- "import_header": "{name} ( {domain} ) içe aktar",
+ "import_header": "Taslak \"{name}\"",
"import_introduction": "Diğer kullanıcıların taslaklarını Github'dan ve topluluk forumlarından içe aktarabilirsiniz. Taslağın URL'sini aşağıya girin.",
"importing": "Taslak içe aktarılıyor...",
+ "raw_blueprint": "Taslak içeriği",
"save_btn": "Taslağı kaydet",
"saving": "Taslak kaydediliyor...",
"unsupported_blueprint": "Bu taslak desteklenmiyor",
@@ -1419,13 +1435,17 @@
"overview": {
"add_blueprint": "Taslak ekle",
"confirm_delete_header": "Bu taslak silinsin mi?",
- "confirm_delete_text": "Bu taslağı silmek istediğinizden emin misiniz",
+ "confirm_delete_text": "Bu taslağı silmek istediğinizden emin misiniz?",
+ "delete_blueprint": "Taslağı sil",
"header": "Taslak Düzenleyici",
"headers": {
+ "domain": "Alan adı",
+ "file_name": "Dosya adı",
"name": "Ad"
},
"introduction": "Taslak düzenleyici, taslakları oluşturmanıza ve düzenlemenize olanak tanır.",
- "learn_more": "Taslaklar hakkında daha fazla bilgi edinin"
+ "learn_more": "Taslaklar hakkında daha fazla bilgi edinin",
+ "use_blueprint": "Otomasyon oluşturun"
}
},
"cloud": {
@@ -1695,6 +1715,14 @@
"device_info": "Cihaz bilgisi",
"device_not_found": "Cihaz bulunamadı.",
"disabled": "Devre dışı",
+ "disabled_by": {
+ "config_entry": "Yapılandırma Girişi",
+ "integration": "Entegrasyon",
+ "user": "Kullanıcı"
+ },
+ "enabled_cause": "Cihaz {cause} tarafından devre dışı bırakıldı.",
+ "enabled_description": "Devre dışı bırakılan cihazlar gösterilmeyecek ve cihaza ait varlıklar devre dışı bırakılacak ve Home Assistant'a eklenmeyecek.",
+ "enabled_label": "Cihazı etkinleştir",
"entities": {
"add_entities_lovelace": "Tüm cihaz varlıklarını Lovelace kullanıcı arayüzüne ekle",
"disabled_entities": "+{count} {count, plural,\n one {engelli varlık}\n other {engelli varlıklar}\n}",
@@ -1707,6 +1735,7 @@
"picker": {
"filter": {
"filter": "Filtre",
+ "hidden_devices": "{number} gizli {number, plural,\n one {device}\n other {devices}\n}",
"show_all": "Tümünü göster",
"show_disabled": "Devre dışı bırakılan aygıtları göster"
},
@@ -1754,6 +1783,7 @@
},
"header": "Varlıklar",
"headers": {
+ "area": "Alan",
"entity_id": "Varlık kimliği",
"integration": "Entegrasyon",
"name": "Ad",
@@ -2419,19 +2449,24 @@
"system_generated_users_not_editable": "Sistem tarafından oluşturulan kullanıcılar güncellenemiyor.",
"system_generated_users_not_removable": "Sistem tarafından oluşturulan kullanıcılar kaldırılamıyor.",
"unnamed_user": "Adsız Kullanıcı",
- "update_user": "Güncelle"
+ "update_user": "Güncelle",
+ "username": "Kullanıcı Adı"
},
"picker": {
"add_user": "Kullanıcı Ekle",
"headers": {
"group": "Grup",
+ "is_active": "Etkin",
+ "is_owner": "Sahibi",
"name": "Ad",
- "system": "Sistem"
+ "system": "Sistem",
+ "username": "Kullanıcı Adı"
}
},
"users_privileges_note": "Kullanıcı grubu özelliği devam eden bir çalışmadır. Kullanıcı örneği Kullanıcı Arabirimi üzerinden yönetemez. Yöneticilere erişimi doğru şekilde sınırlandırdığından emin olmak için tüm yönetim API uç noktalarını denetlemeye devam ediyoruz."
},
"zha": {
+ "add_device": "Cihaz Ekle",
"add_device_page": {
"discovered_text": "Cihazlar keşfedildikten sonra burada görünecektir.",
"discovery_text": "Keşfedilen cihazlar burada görünecektir. Cihaz (lar) ınız için talimatları izleyin ve cihazları eşleştirme moduna getirin.",
@@ -2477,6 +2512,16 @@
"value": "Değer"
},
"description": "Zigbee Ev Otomasyonu ağ yönetimi",
+ "device_pairing_card": {
+ "CONFIGURED": "Yapılandırma Tamamlandı",
+ "CONFIGURED_status_text": "Başlatılıyor",
+ "INITIALIZED": "Başlatma Tamamlandı",
+ "INITIALIZED_status_text": "Cihaz kullanıma hazır",
+ "INTERVIEW_COMPLETE": "Görüşme Tamamlandı",
+ "INTERVIEW_COMPLETE_status_text": "Yapılandırılıyor",
+ "PAIRED": "Cihaz Bulundu",
+ "PAIRED_status_text": "Görüşme Başlatılıyor"
+ },
"devices": {
"header": "Zigbee Ev Otomasyonu - Cihaz"
},
@@ -2492,6 +2537,7 @@
"unbind_button_label": "Grubu Çöz"
},
"groups": {
+ "add_group": "Grup Ekle",
"add_members": "Üye ekle",
"adding_members": "Üye Ekleme",
"caption": "Gruplar",
@@ -2534,7 +2580,11 @@
"hint_wakeup": "Xiaomi sensörleri gibi bazı cihazlarda, onlarla etkileşime girerken cihazları uyanık tutan ~ 5 saniyelik aralıklarla basabileceğiniz bir uyanma düğmesi bulunur.",
"introduction": "Tek bir cihazı etkileyen ZHA komutlarını çalıştırın. Kullanılabilir komutların listesini görmek için bir cihaz seçin."
},
- "title": "Zigbee Ev Otomasyonu"
+ "title": "Zigbee Ev Otomasyonu",
+ "visualization": {
+ "caption": "Görselleştirme",
+ "header": "Ağ Görselleştirme"
+ }
},
"zone": {
"add_zone": "Bölge Ekle",