mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-05-10 18:31:52 +00:00
feat: implement geofiles update in panel (#2971)
solves #2672 Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
parent
c3084aaece
commit
1aed2d8cdc
16 changed files with 186 additions and 38 deletions
|
@ -44,6 +44,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) {
|
||||||
g.POST("/stopXrayService", a.stopXrayService)
|
g.POST("/stopXrayService", a.stopXrayService)
|
||||||
g.POST("/restartXrayService", a.restartXrayService)
|
g.POST("/restartXrayService", a.restartXrayService)
|
||||||
g.POST("/installXray/:version", a.installXray)
|
g.POST("/installXray/:version", a.installXray)
|
||||||
|
g.POST("/updateGeofile/:fileName", a.updateGeofile)
|
||||||
g.POST("/logs/:count", a.getLogs)
|
g.POST("/logs/:count", a.getLogs)
|
||||||
g.POST("/getConfigJson", a.getConfigJson)
|
g.POST("/getConfigJson", a.getConfigJson)
|
||||||
g.GET("/getDb", a.getDb)
|
g.GET("/getDb", a.getDb)
|
||||||
|
@ -95,7 +96,13 @@ func (a *ServerController) getXrayVersion(c *gin.Context) {
|
||||||
func (a *ServerController) installXray(c *gin.Context) {
|
func (a *ServerController) installXray(c *gin.Context) {
|
||||||
version := c.Param("version")
|
version := c.Param("version")
|
||||||
err := a.serverService.UpdateXray(version)
|
err := a.serverService.UpdateXray(version)
|
||||||
jsonMsg(c, I18nWeb(c, "install")+" xray", err)
|
jsonMsg(c, I18nWeb(c, "pages.index.xraySwitchVersionPopover"), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *ServerController) updateGeofile(c *gin.Context) {
|
||||||
|
fileName := c.Param("fileName")
|
||||||
|
err := a.serverService.UpdateGeofile(fileName)
|
||||||
|
jsonMsg(c, I18nWeb(c, "pages.index.geofileUpdatePopover"), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ServerController) stopXrayService(c *gin.Context) {
|
func (a *ServerController) stopXrayService(c *gin.Context) {
|
||||||
|
|
|
@ -22,11 +22,14 @@
|
||||||
.ant-backup-list-item {
|
.ant-backup-list-item {
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
.ant-xray-version-list-item {
|
.ant-version-list-item {
|
||||||
--padding: 12px;
|
--padding: 12px;
|
||||||
padding: var(--padding) !important;
|
padding: var(--padding) !important;
|
||||||
gap: var(--padding);
|
gap: var(--padding);
|
||||||
}
|
}
|
||||||
|
.dark .ant-version-list-item svg{
|
||||||
|
color: var(--dark-color-text-primary);
|
||||||
|
}
|
||||||
.dark .ant-backup-list-item svg,
|
.dark .ant-backup-list-item svg,
|
||||||
.dark .ant-badge-status-text,
|
.dark .ant-badge-status-text,
|
||||||
.dark .ant-card-extra {
|
.dark .ant-card-extra {
|
||||||
|
@ -43,7 +46,7 @@
|
||||||
border-color: var(--color-primary-100);
|
border-color: var(--color-primary-100);
|
||||||
}
|
}
|
||||||
.dark .ant-backup-list,
|
.dark .ant-backup-list,
|
||||||
.dark .ant-xray-version-list,
|
.dark .ant-version-list,
|
||||||
.dark .ant-card-actions,
|
.dark .ant-card-actions,
|
||||||
.dark .ant-card-actions>li:not(:last-child) {
|
.dark .ant-card-actions>li:not(:last-child) {
|
||||||
border-color: var(--dark-color-stroke);
|
border-color: var(--dark-color-stroke);
|
||||||
|
@ -353,14 +356,25 @@
|
||||||
</a-layout>
|
</a-layout>
|
||||||
<a-modal id="version-modal" v-model="versionModal.visible" title='{{ i18n "pages.index.xraySwitch" }}' :closable="true"
|
<a-modal id="version-modal" v-model="versionModal.visible" title='{{ i18n "pages.index.xraySwitch" }}' :closable="true"
|
||||||
@ok="() => versionModal.visible = false" :class="themeSwitcher.currentTheme" footer="">
|
@ok="() => versionModal.visible = false" :class="themeSwitcher.currentTheme" footer="">
|
||||||
<a-alert type="warning" :style="{ marginBottom: '12px', width: '100%' }"
|
<a-collapse default-active-key="1">
|
||||||
message='{{ i18n "pages.index.xraySwitchClickDesk" }}' show-icon></a-alert>
|
<a-collapse-panel key="1" header='Xray'>
|
||||||
<a-list class="ant-xray-version-list" bordered :style="{ width: '100%' }">
|
<a-alert type="warning" :style="{ marginBottom: '12px', width: '100%' }" message='{{ i18n "pages.index.xraySwitchClickDesk" }}' show-icon></a-alert>
|
||||||
<a-list-item class="ant-xray-version-list-item" v-for="version, index in versionModal.versions">
|
<a-list class="ant-version-list" bordered :style="{ width: '100%' }">
|
||||||
|
<a-list-item class="ant-version-list-item" v-for="version, index in versionModal.versions">
|
||||||
<a-tag :color="index % 2 == 0 ? 'purple' : 'green'">[[ version ]]</a-tag>
|
<a-tag :color="index % 2 == 0 ? 'purple' : 'green'">[[ version ]]</a-tag>
|
||||||
<a-radio :class="themeSwitcher.currentTheme" :checked="version === `v${status.xray.version}`" @click="switchV2rayVersion(version)"></a-radio>
|
<a-radio :class="themeSwitcher.currentTheme" :checked="version === `v${status.xray.version}`" @click="switchV2rayVersion(version)"></a-radio>
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
</a-list>
|
</a-list>
|
||||||
|
</a-collapse-panel>
|
||||||
|
<a-collapse-panel key="2" header='Geofiles'>
|
||||||
|
<a-list class="ant-version-list" bordered :style="{ width: '100%' }">
|
||||||
|
<a-list-item class="ant-version-list-item" v-for="file, index in ['geosite.dat', 'geoip.dat', 'geosite_IR.dat', 'geoip_IR.dat', 'geosite_RU.dat', 'geoip_RU.dat']">
|
||||||
|
<a-tag :color="index % 2 == 0 ? 'purple' : 'green'">[[ file ]]</a-tag>
|
||||||
|
<a-icon type="reload" @click="updateGeofile(file)" :style="{ marginRight: '8px' }"/>
|
||||||
|
</a-list-item>
|
||||||
|
</a-list>
|
||||||
|
</a-collapse-panel>
|
||||||
|
</a-collapse>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
<a-modal id="log-modal" v-model="logModal.visible"
|
<a-modal id="log-modal" v-model="logModal.visible"
|
||||||
:closable="true" @cancel="() => logModal.visible = false"
|
:closable="true" @cancel="() => logModal.visible = false"
|
||||||
|
@ -645,7 +659,7 @@
|
||||||
switchV2rayVersion(version) {
|
switchV2rayVersion(version) {
|
||||||
this.$confirm({
|
this.$confirm({
|
||||||
title: '{{ i18n "pages.index.xraySwitchVersionDialog"}}',
|
title: '{{ i18n "pages.index.xraySwitchVersionDialog"}}',
|
||||||
content: '{{ i18n "pages.index.xraySwitchVersionDialogDesc"}}' + ` ${version}?`,
|
content: '{{ i18n "pages.index.xraySwitchVersionDialogDesc"}}'.replace('#version#', version),
|
||||||
okText: '{{ i18n "confirm"}}',
|
okText: '{{ i18n "confirm"}}',
|
||||||
class: themeSwitcher.currentTheme,
|
class: themeSwitcher.currentTheme,
|
||||||
cancelText: '{{ i18n "cancel"}}',
|
cancelText: '{{ i18n "cancel"}}',
|
||||||
|
@ -657,6 +671,21 @@
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
updateGeofile(fileName) {
|
||||||
|
this.$confirm({
|
||||||
|
title: '{{ i18n "pages.index.geofileUpdateDialog" }}',
|
||||||
|
content: '{{ i18n "pages.index.geofileUpdateDialogDesc" }}'.replace("#filename#", fileName),
|
||||||
|
okText: '{{ i18n "confirm"}}',
|
||||||
|
class: themeSwitcher.currentTheme,
|
||||||
|
cancelText: '{{ i18n "cancel"}}',
|
||||||
|
onOk: async () => {
|
||||||
|
versionModal.hide();
|
||||||
|
this.loading(true, '{{ i18n "pages.index.dontRefresh"}}');
|
||||||
|
await HttpUtil.post(`/server/updateGeofile/${fileName}`);
|
||||||
|
this.loading(false);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
async stopXrayService() {
|
async stopXrayService() {
|
||||||
this.loading(true);
|
this.loading(true);
|
||||||
const msg = await HttpUtil.post('server/stopXrayService');
|
const msg = await HttpUtil.post('server/stopXrayService');
|
||||||
|
|
|
@ -591,6 +591,66 @@ func (s *ServerService) ImportDB(file multipart.File) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ServerService) UpdateGeofile(fileName string) error {
|
||||||
|
files := []struct {
|
||||||
|
URL string
|
||||||
|
FileName string
|
||||||
|
}{
|
||||||
|
{"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat", "geoip.dat"},
|
||||||
|
{"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat", "geosite.dat"},
|
||||||
|
{"https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geoip.dat", "geoip_IR.dat"},
|
||||||
|
{"https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geosite.dat", "geosite_IR.dat"},
|
||||||
|
{"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat", "geoip_RU.dat"},
|
||||||
|
{"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat", "geosite_RU.dat"},
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadFile := func(url, destPath string) error {
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return common.NewErrorf("Failed to download Geofile from %s: %v", url, err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
file, err := os.Create(destPath)
|
||||||
|
if err != nil {
|
||||||
|
return common.NewErrorf("Failed to create Geofile %s: %v", destPath, err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(file, resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return common.NewErrorf("Failed to save Geofile %s: %v", destPath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileURL string
|
||||||
|
for _, file := range files {
|
||||||
|
if file.FileName == fileName {
|
||||||
|
fileURL = file.URL
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if fileURL == "" {
|
||||||
|
return common.NewErrorf("File '%s' not found in the list of Geofiles", fileName)
|
||||||
|
}
|
||||||
|
|
||||||
|
destPath := fmt.Sprintf("%s/%s", config.GetBinFolderPath(), fileName)
|
||||||
|
|
||||||
|
if err := downloadFile(fileURL, destPath); err != nil {
|
||||||
|
return common.NewErrorf("Error downloading Geofile '%s': %v", fileName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := s.RestartXrayService()
|
||||||
|
if err != nil {
|
||||||
|
return common.NewErrorf("Updated Geofile '%s' but Failed to start Xray: %v", fileName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *ServerService) GetNewX25519Cert() (any, error) {
|
func (s *ServerService) GetNewX25519Cert() (any, error) {
|
||||||
// Run the command
|
// Run the command
|
||||||
cmd := exec.Command(xray.GetBinaryPath(), "x25519")
|
cmd := exec.Command(xray.GetBinaryPath(), "x25519")
|
||||||
|
|
|
@ -122,8 +122,12 @@
|
||||||
"totalData" = "إجمالي البيانات"
|
"totalData" = "إجمالي البيانات"
|
||||||
"sent" = "مرسل"
|
"sent" = "مرسل"
|
||||||
"received" = "مستقبل"
|
"received" = "مستقبل"
|
||||||
"xraySwitchVersionDialog" = "تغيير نسخة Xray"
|
"xraySwitchVersionDialog" = "هل تريد حقًا تغيير إصدار Xray؟"
|
||||||
"xraySwitchVersionDialogDesc" = "متأكد إنك عايز تغير نسخة Xray لـ"
|
"xraySwitchVersionDialogDesc" = "سيؤدي هذا إلى تغيير إصدار Xray إلى #version#."
|
||||||
|
"xraySwitchVersionPopover" = "تم تحديث Xray بنجاح"
|
||||||
|
"geofileUpdateDialog" = "هل تريد حقًا تحديث ملف الجغرافيا؟"
|
||||||
|
"geofileUpdateDialogDesc" = "سيؤدي هذا إلى تحديث ملف #filename#."
|
||||||
|
"geofileUpdatePopover" = "تم تحديث ملف الجغرافيا بنجاح"
|
||||||
"dontRefresh" = "التثبيت شغال، متعملش Refresh للصفحة"
|
"dontRefresh" = "التثبيت شغال، متعملش Refresh للصفحة"
|
||||||
"logs" = "السجلات"
|
"logs" = "السجلات"
|
||||||
"config" = "الإعدادات"
|
"config" = "الإعدادات"
|
||||||
|
|
|
@ -122,8 +122,12 @@
|
||||||
"totalData" = "Total Data"
|
"totalData" = "Total Data"
|
||||||
"sent" = "Sent"
|
"sent" = "Sent"
|
||||||
"received" = "Received"
|
"received" = "Received"
|
||||||
"xraySwitchVersionDialog" = "Change Xray Version"
|
"xraySwitchVersionDialog" = "Do you really want to change the Xray version?"
|
||||||
"xraySwitchVersionDialogDesc" = "Are you sure you want to change the Xray version to"
|
"xraySwitchVersionDialogDesc" = "This will change the Xray version to #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray updated successfully"
|
||||||
|
"geofileUpdateDialog" = "Do you really want to update the geofile?"
|
||||||
|
"geofileUpdateDialogDesc" = "This will update the #filename# file."
|
||||||
|
"geofileUpdatePopover" = "Geofile updated successfully"
|
||||||
"dontRefresh" = "Installation is in progress, please do not refresh this page"
|
"dontRefresh" = "Installation is in progress, please do not refresh this page"
|
||||||
"logs" = "Logs"
|
"logs" = "Logs"
|
||||||
"config" = "Config"
|
"config" = "Config"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Datos totales"
|
"totalData" = "Datos totales"
|
||||||
"sent" = "Enviado"
|
"sent" = "Enviado"
|
||||||
"received" = "Recibido"
|
"received" = "Recibido"
|
||||||
"xraySwitchVersionDialog" = "Cambiar Versión de Xray"
|
"xraySwitchVersionDialog" = "¿Realmente deseas cambiar la versión de Xray?"
|
||||||
"xraySwitchVersionDialogDesc" = "¿Estás seguro de que deseas cambiar la versión de Xray a"
|
"xraySwitchVersionDialogDesc" = "Esto cambiará la versión de Xray a #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray se actualizó correctamente"
|
||||||
|
"geofileUpdateDialog" = "¿Realmente deseas actualizar el geofichero?"
|
||||||
|
"geofileUpdateDialogDesc" = "Esto actualizará el archivo #filename#."
|
||||||
|
"geofileUpdatePopover" = "Geofichero actualizado correctamente"
|
||||||
"dontRefresh" = "La instalación está en progreso, por favor no actualices esta página."
|
"dontRefresh" = "La instalación está en progreso, por favor no actualices esta página."
|
||||||
"logs" = "Registros"
|
"logs" = "Registros"
|
||||||
"config" = "Configuración"
|
"config" = "Configuración"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "دادههای کل"
|
"totalData" = "دادههای کل"
|
||||||
"sent" = "ارسال شده"
|
"sent" = "ارسال شده"
|
||||||
"received" = "دریافت شده"
|
"received" = "دریافت شده"
|
||||||
"xraySwitchVersionDialog" = "تغییر نسخه ایکسری"
|
"xraySwitchVersionDialog" = "آیا واقعاً میخواهید نسخه Xray را تغییر دهید؟"
|
||||||
"xraySwitchVersionDialogDesc" = "آیا از تغییر نسخه مطمئن هستید؟"
|
"xraySwitchVersionDialogDesc" = "این کار نسخه Xray را به #version# تغییر میدهد."
|
||||||
|
"xraySwitchVersionPopover" = "Xray با موفقیت بهروز شد"
|
||||||
|
"geofileUpdateDialog" = "آیا واقعاً میخواهید فایل جغرافیایی را بهروز کنید؟"
|
||||||
|
"geofileUpdateDialogDesc" = "این عمل فایل #filename# را بهروز میکند."
|
||||||
|
"geofileUpdatePopover" = "فایل جغرافیایی با موفقیت بهروز شد"
|
||||||
"dontRefresh" = "در حال نصب، لطفا صفحه را رفرش نکنید"
|
"dontRefresh" = "در حال نصب، لطفا صفحه را رفرش نکنید"
|
||||||
"logs" = "گزارشها"
|
"logs" = "گزارشها"
|
||||||
"config" = "پیکربندی"
|
"config" = "پیکربندی"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Total data"
|
"totalData" = "Total data"
|
||||||
"sent" = "Dikirim"
|
"sent" = "Dikirim"
|
||||||
"received" = "Diterima"
|
"received" = "Diterima"
|
||||||
"xraySwitchVersionDialog" = "Ganti Versi Xray"
|
"xraySwitchVersionDialog" = "Apakah Anda yakin ingin mengubah versi Xray?"
|
||||||
"xraySwitchVersionDialogDesc" = "Apakah Anda yakin ingin mengubah versi Xray menjadi"
|
"xraySwitchVersionDialogDesc" = "Ini akan mengubah versi Xray ke #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray berhasil diperbarui"
|
||||||
|
"geofileUpdateDialog" = "Apakah Anda yakin ingin memperbarui geofile?"
|
||||||
|
"geofileUpdateDialogDesc" = "Ini akan memperbarui file #filename#."
|
||||||
|
"geofileUpdatePopover" = "Geofile berhasil diperbarui"
|
||||||
"dontRefresh" = "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini"
|
"dontRefresh" = "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini"
|
||||||
"logs" = "Log"
|
"logs" = "Log"
|
||||||
"config" = "Konfigurasi"
|
"config" = "Konfigurasi"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "総データ量"
|
"totalData" = "総データ量"
|
||||||
"sent" = "送信"
|
"sent" = "送信"
|
||||||
"received" = "受信"
|
"received" = "受信"
|
||||||
"xraySwitchVersionDialog" = "Xrayバージョン切り替え"
|
"xraySwitchVersionDialog" = "Xrayのバージョンを本当に変更しますか?"
|
||||||
"xraySwitchVersionDialogDesc" = "Xrayのバージョンを切り替えますか?"
|
"xraySwitchVersionDialogDesc" = "Xrayのバージョンが#version#に変更されます。"
|
||||||
|
"xraySwitchVersionPopover" = "Xrayの更新が成功しました"
|
||||||
|
"geofileUpdateDialog" = "ジオファイルを本当に更新しますか?"
|
||||||
|
"geofileUpdateDialogDesc" = "これにより#filename#ファイルが更新されます。"
|
||||||
|
"geofileUpdatePopover" = "ジオファイルの更新が成功しました"
|
||||||
"dontRefresh" = "インストール中、このページをリロードしないでください"
|
"dontRefresh" = "インストール中、このページをリロードしないでください"
|
||||||
"logs" = "ログ"
|
"logs" = "ログ"
|
||||||
"config" = "設定"
|
"config" = "設定"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Dados totais"
|
"totalData" = "Dados totais"
|
||||||
"sent" = "Enviado"
|
"sent" = "Enviado"
|
||||||
"received" = "Recebido"
|
"received" = "Recebido"
|
||||||
"xraySwitchVersionDialog" = "Alterar Versão do Xray"
|
"xraySwitchVersionDialog" = "Você realmente deseja alterar a versão do Xray?"
|
||||||
"xraySwitchVersionDialogDesc" = "Tem certeza de que deseja alterar a versão do Xray para"
|
"xraySwitchVersionDialogDesc" = "Isso mudará a versão do Xray para #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray atualizado com sucesso"
|
||||||
|
"geofileUpdateDialog" = "Você realmente deseja atualizar o geofile?"
|
||||||
|
"geofileUpdateDialogDesc" = "Isso atualizará o arquivo #filename#."
|
||||||
|
"geofileUpdatePopover" = "Geofile atualizado com sucesso"
|
||||||
"dontRefresh" = "Instalação em andamento, por favor não atualize a página"
|
"dontRefresh" = "Instalação em andamento, por favor não atualize a página"
|
||||||
"logs" = "Logs"
|
"logs" = "Logs"
|
||||||
"config" = "Configuração"
|
"config" = "Configuração"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Общий объем данных"
|
"totalData" = "Общий объем данных"
|
||||||
"sent" = "Отправлено"
|
"sent" = "Отправлено"
|
||||||
"received" = "Получено"
|
"received" = "Получено"
|
||||||
"xraySwitchVersionDialog" = "Переключить версию Xray"
|
"xraySwitchVersionDialog" = "Вы действительно хотите изменить версию Xray?"
|
||||||
"xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?"
|
"xraySwitchVersionDialogDesc" = "Это изменит версию Xray на #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray успешно обновлён"
|
||||||
|
"geofileUpdateDialog" = "Вы действительно хотите обновить геофайл?"
|
||||||
|
"geofileUpdateDialogDesc" = "Это обновит файл #filename#."
|
||||||
|
"geofileUpdatePopover" = "Геофайл успешно обновлён"
|
||||||
"dontRefresh" = "Установка в процессе. Не обновляйте страницу"
|
"dontRefresh" = "Установка в процессе. Не обновляйте страницу"
|
||||||
"logs" = "Журнал"
|
"logs" = "Журнал"
|
||||||
"config" = "Конфигурация"
|
"config" = "Конфигурация"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Toplam veri"
|
"totalData" = "Toplam veri"
|
||||||
"sent" = "Gönderilen"
|
"sent" = "Gönderilen"
|
||||||
"received" = "Alınan"
|
"received" = "Alınan"
|
||||||
"xraySwitchVersionDialog" = "Xray Sürümünü Değiştir"
|
"xraySwitchVersionDialog" = "Xray sürümünü gerçekten değiştirmek istiyor musunuz?"
|
||||||
"xraySwitchVersionDialogDesc" = "Xray sürümünü değiştirmek istediğinizden emin misiniz"
|
"xraySwitchVersionDialogDesc" = "Bu işlem Xray sürümünü #version# olarak değiştirecektir."
|
||||||
|
"xraySwitchVersionPopover" = "Xray başarıyla güncellendi"
|
||||||
|
"geofileUpdateDialog" = "Geofile'ı gerçekten güncellemek istiyor musunuz?"
|
||||||
|
"geofileUpdateDialogDesc" = "Bu işlem #filename# dosyasını güncelleyecektir."
|
||||||
|
"geofileUpdatePopover" = "Geofile başarıyla güncellendi"
|
||||||
"dontRefresh" = "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin"
|
"dontRefresh" = "Kurulum devam ediyor, lütfen bu sayfayı yenilemeyin"
|
||||||
"logs" = "Günlükler"
|
"logs" = "Günlükler"
|
||||||
"config" = "Yapılandırma"
|
"config" = "Yapılandırma"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Загальний обсяг даних"
|
"totalData" = "Загальний обсяг даних"
|
||||||
"sent" = "Відправлено"
|
"sent" = "Відправлено"
|
||||||
"received" = "Отримано"
|
"received" = "Отримано"
|
||||||
"xraySwitchVersionDialog" = "Змінити версію Xray"
|
"xraySwitchVersionDialog" = "Ви дійсно хочете змінити версію Xray?"
|
||||||
"xraySwitchVersionDialogDesc" = "Ви впевнені, що бажаєте змінити версію Xray на"
|
"xraySwitchVersionDialogDesc" = "Це змінить версію Xray на #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray успішно оновлено"
|
||||||
|
"geofileUpdateDialog" = "Ви дійсно хочете оновити геофайл?"
|
||||||
|
"geofileUpdateDialogDesc" = "Це оновить файл #filename#."
|
||||||
|
"geofileUpdatePopover" = "Геофайл успішно оновлено"
|
||||||
"dontRefresh" = "Інсталяція триває, будь ласка, не оновлюйте цю сторінку"
|
"dontRefresh" = "Інсталяція триває, будь ласка, не оновлюйте цю сторінку"
|
||||||
"logs" = "Журнали"
|
"logs" = "Журнали"
|
||||||
"config" = "Конфігурація"
|
"config" = "Конфігурація"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "Tổng dữ liệu"
|
"totalData" = "Tổng dữ liệu"
|
||||||
"sent" = "Đã gửi"
|
"sent" = "Đã gửi"
|
||||||
"received" = "Đã nhận"
|
"received" = "Đã nhận"
|
||||||
"xraySwitchVersionDialog" = "Chuyển đổi Phiên bản Xray"
|
"xraySwitchVersionDialog" = "Bạn có chắc chắn muốn thay đổi phiên bản Xray không?"
|
||||||
"xraySwitchVersionDialogDesc" = "Bạn có chắc chắn muốn chuyển đổi phiên bản Xray sang"
|
"xraySwitchVersionDialogDesc" = "Hành động này sẽ thay đổi phiên bản Xray thành #version#."
|
||||||
|
"xraySwitchVersionPopover" = "Xray đã được cập nhật thành công"
|
||||||
|
"geofileUpdateDialog" = "Bạn có chắc chắn muốn cập nhật geofile không?"
|
||||||
|
"geofileUpdateDialogDesc" = "Hành động này sẽ cập nhật tệp #filename#."
|
||||||
|
"geofileUpdatePopover" = "Geofile đã được cập nhật thành công"
|
||||||
"dontRefresh" = "Đang tiến hành cài đặt, vui lòng không làm mới trang này."
|
"dontRefresh" = "Đang tiến hành cài đặt, vui lòng không làm mới trang này."
|
||||||
"logs" = "Nhật ký"
|
"logs" = "Nhật ký"
|
||||||
"config" = "Cấu hình"
|
"config" = "Cấu hình"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "总数据"
|
"totalData" = "总数据"
|
||||||
"sent" = "已发送"
|
"sent" = "已发送"
|
||||||
"received" = "已接收"
|
"received" = "已接收"
|
||||||
"xraySwitchVersionDialog" = "切换 Xray 版本"
|
"xraySwitchVersionDialog" = "您确定要更改Xray版本吗?"
|
||||||
"xraySwitchVersionDialogDesc" = "是否切换 Xray 版本至"
|
"xraySwitchVersionDialogDesc" = "这将把Xray版本更改为#version#。"
|
||||||
|
"xraySwitchVersionPopover" = "Xray 更新成功"
|
||||||
|
"geofileUpdateDialog" = "您确定要更新地理文件吗?"
|
||||||
|
"geofileUpdateDialogDesc" = "这将更新 #filename# 文件。"
|
||||||
|
"geofileUpdatePopover" = "地理文件更新成功"
|
||||||
"dontRefresh" = "安装中,请勿刷新此页面"
|
"dontRefresh" = "安装中,请勿刷新此页面"
|
||||||
"logs" = "日志"
|
"logs" = "日志"
|
||||||
"config" = "配置"
|
"config" = "配置"
|
||||||
|
|
|
@ -124,8 +124,12 @@
|
||||||
"totalData" = "總數據"
|
"totalData" = "總數據"
|
||||||
"sent" = "已發送"
|
"sent" = "已發送"
|
||||||
"received" = "已接收"
|
"received" = "已接收"
|
||||||
"xraySwitchVersionDialog" = "切換 Xray 版本"
|
"xraySwitchVersionDialog" = "您確定要變更Xray版本嗎?"
|
||||||
"xraySwitchVersionDialogDesc" = "是否切換 Xray 版本至"
|
"xraySwitchVersionDialogDesc" = "這將會把Xray版本變更為#version#。"
|
||||||
|
"xraySwitchVersionPopover" = "Xray 更新成功"
|
||||||
|
"geofileUpdateDialog" = "您確定要更新地理檔案嗎?"
|
||||||
|
"geofileUpdateDialogDesc" = "這將更新 #filename# 檔案。"
|
||||||
|
"geofileUpdatePopover" = "地理檔案更新成功"
|
||||||
"dontRefresh" = "安裝中,請勿重新整理此頁面"
|
"dontRefresh" = "安裝中,請勿重新整理此頁面"
|
||||||
"logs" = "日誌"
|
"logs" = "日誌"
|
||||||
"config" = "配置"
|
"config" = "配置"
|
||||||
|
|
Loading…
Reference in a new issue