diff --git a/package.json b/package.json index f56f23035..dbe209691 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "electron-log": "^5.4.1", "electron-store": "^10.1.0", "electron-updater": "^6.6.5", - "fast-xml-parser": "^5.3.6", + "fast-xml-parser": "^5.3.8", "fs-extra": "^11.3.0", "ftp-srv": "^4.6.3", "hpagent": "^1.2.0", diff --git a/src/lang/en/host.json b/src/lang/en/host.json index b3f74a1ea..7e0c9f1de 100644 --- a/src/lang/en/host.json +++ b/src/lang/en/host.json @@ -25,7 +25,6 @@ "noPhpWarning": "Check that no PHP version is selected, a static site will be created, and the PHP files will cannot be executed. Are you sure to continue?", "hostsWriteTips": "Enable / Disable all hosts in this list", "sort": "Sort", - "projectPhp": "PHP Projects", "projectJava": "Java Projects", "projectNode": "Node Projects", @@ -35,7 +34,7 @@ "projectDeno": "Deno Projects", "projectBun": "Bun Projects", "projectPerl": "Perl Projects", - + "projectErlang": "Erlang Projects", "jarPackagePath": "JAR Package Path", "jdkPath": "JDK Path", "pythonPath": "Python Path", diff --git a/src/lang/es/host.json b/src/lang/es/host.json index b55ce804a..002f100fd 100644 --- a/src/lang/es/host.json +++ b/src/lang/es/host.json @@ -34,6 +34,7 @@ "projectDeno": "Proyectos Deno", "projectBun": "Proyectos Bun", "projectPerl": "Proyectos Perl", + "projectErlang": "Proyectos Erlang", "jarPackagePath": "Ruta del paquete JAR", "jdkPath": "Ruta de JDK", "pythonPath": "Ruta de Python", diff --git a/src/lang/fi/host.json b/src/lang/fi/host.json index 77ad5054c..17ae7d226 100644 --- a/src/lang/fi/host.json +++ b/src/lang/fi/host.json @@ -34,6 +34,7 @@ "projectDeno": "Deno Projektit", "projectBun": "Suorita Projektit", "projectPerl": "Perl Projektit", + "projectErlang": "Erlang Projektit", "jarPackagePath": "Jar Paketin Polku", "jdkPath": "Jdk Polku", "pythonPath": "Python Path", diff --git a/src/lang/fr/host.json b/src/lang/fr/host.json index 59aa7f375..58876b722 100644 --- a/src/lang/fr/host.json +++ b/src/lang/fr/host.json @@ -34,6 +34,7 @@ "projectDeno": "Projets Deno", "projectBun": "Projets Bun", "projectPerl": "Projets Perl", + "projectErlang": "Projets Erlang", "jarPackagePath": "Chemin du package JAR", "jdkPath": "Chemin JDK", "pythonPath": "Chemin Python", diff --git a/src/lang/id/host.json b/src/lang/id/host.json index d716f2497..cf2fab364 100644 --- a/src/lang/id/host.json +++ b/src/lang/id/host.json @@ -31,9 +31,10 @@ "projectGo": "Proyek Go", "projectPython": "Proyek Python", "projectTomcat": "Proyek Tomcat", - "projectDeno": "Deno Projects", - "projectBun": "Bun Projects", - "projectPerl": "Perl Projects", + "projectDeno": "Proyek Deno", + "projectBun": "Proyek Bun", + "projectPerl": "Proyek Perl", + "projectErlang": "Proyek Erlang", "jarPackagePath": "Path Paket JAR", "jdkPath": "Path JDK", "pythonPath": "Path Python", diff --git a/src/lang/index.ts b/src/lang/index.ts index 75511b5d1..30a5ca84e 100644 --- a/src/lang/index.ts +++ b/src/lang/index.ts @@ -169,7 +169,6 @@ let i18n: I18n export const AppI18n = (l?: string): I18n => { if (!i18n) { i18n = createI18n({ - legacy: true, locale: l || 'en', fallbackLocale: 'en', messages: lang as any diff --git a/src/lang/it/host.json b/src/lang/it/host.json index d3eeaa902..2c28344ff 100644 --- a/src/lang/it/host.json +++ b/src/lang/it/host.json @@ -31,9 +31,10 @@ "projectGo": "Progetti Go", "projectPython": "Progetti Python", "projectTomcat": "Progetti Tomcat", - "projectDeno": "Deno Projects", - "projectBun": "Bun Projects", - "projectPerl": "Perl Projects", + "projectDeno": "Progetti Deno", + "projectBun": "Progetti Bun", + "projectPerl": "Progetti Perl", + "projectErlang": "Progetti Erlang", "jarPackagePath": "Percorso pacchetto JAR", "jdkPath": "Percorso JDK", "pythonPath": "Percorso Python", diff --git a/src/lang/ja/host.json b/src/lang/ja/host.json index 15d584a6f..47a8f9971 100644 --- a/src/lang/ja/host.json +++ b/src/lang/ja/host.json @@ -31,9 +31,10 @@ "projectGo": "Goプロジェクト", "projectPython": "Pythonプロジェクト", "projectTomcat": "Tomcatプロジェクト", - "projectDeno": "Deno Projects", - "projectBun": "Bun Projects", - "projectPerl": "Perl Projects", + "projectDeno": "Denoプロジェクト", + "projectBun": "Bunプロジェクト", + "projectPerl": "Perlプロジェクト", + "projectErlang": "Erlangプロジェクト", "jarPackagePath": "JARパッケージパス", "jdkPath": "JDKパス", "pythonPath": "Pythonパス", diff --git a/src/lang/nl/host.json b/src/lang/nl/host.json index 5e9d71532..db82b2ae4 100644 --- a/src/lang/nl/host.json +++ b/src/lang/nl/host.json @@ -34,6 +34,7 @@ "projectDeno": "Deno Projecten", "projectBun": "Bun Projecten", "projectPerl": "Projecten Perl", + "projectErlang": "Erlang Projecten", "jarPackagePath": "JAR pakketpad", "jdkPath": "JDK Pad", "pythonPath": "Python Path", diff --git a/src/lang/no/host.json b/src/lang/no/host.json index 99176e751..4bd9b0904 100644 --- a/src/lang/no/host.json +++ b/src/lang/no/host.json @@ -34,6 +34,7 @@ "projectDeno": "Deno prosjekter", "projectBun": "Bun Prosjekter", "projectPerl": "Perl prosjekter", + "projectErlang": "Erlang prosjekter", "jarPackagePath": "JAR pakkebane", "jdkPath": "JDK sti", "pythonPath": "Python Path", diff --git a/src/lang/pl/host.json b/src/lang/pl/host.json index e2f62cf03..ed4282d0d 100644 --- a/src/lang/pl/host.json +++ b/src/lang/pl/host.json @@ -34,6 +34,7 @@ "projectDeno": "Projekty Deno", "projectBun": "Projekty Bun", "projectPerl": "Projekty Perl", + "projectErlang": "Projekty Erlang", "jarPackagePath": "Ścieżka pakietu JAR", "jdkPath": "Ścieżka JDK", "pythonPath": "Python Path", diff --git a/src/lang/pt-br/host.json b/src/lang/pt-br/host.json index 3dffc63a0..4f49b1801 100644 --- a/src/lang/pt-br/host.json +++ b/src/lang/pt-br/host.json @@ -34,6 +34,7 @@ "projectDeno": "Projeto Deno", "projectBun": "Projeto Bun", "projectPerl": "Projeto Perl", + "projectErlang": "Projeto Erlang", "jarPackagePath": "Caminho do pacote jar", "jdkPath": "Caminho do JDK", "pythonPath": "Caminho do Python", diff --git a/src/lang/pt/host.json b/src/lang/pt/host.json index 4f08469aa..1c8e739df 100644 --- a/src/lang/pt/host.json +++ b/src/lang/pt/host.json @@ -34,6 +34,7 @@ "projectDeno": "Projeto Deno", "projectBun": "Projeto Bun", "projectPerl": "Projeto Perl", + "projectErlang": "Projeto Erlang", "jarPackagePath": "Caminho do pacote jar", "jdkPath": "Caminho do JDK", "pythonPath": "Caminho do Python", diff --git a/src/lang/ro/host.json b/src/lang/ro/host.json index 14fbb33ee..7dca5427e 100644 --- a/src/lang/ro/host.json +++ b/src/lang/ro/host.json @@ -34,6 +34,7 @@ "projectDeno": "Proiecte Deno", "projectBun": "Proiecte de Bun", "projectPerl": "Proiecte Perl", + "projectErlang": "Proiecte Erlang", "jarPackagePath": "Calea JAR a pachetului", "jdkPath": "Cale JDK", "pythonPath": "Python Path", diff --git a/src/lang/ru/host.json b/src/lang/ru/host.json index 695b738d8..b0dce5502 100644 --- a/src/lang/ru/host.json +++ b/src/lang/ru/host.json @@ -34,6 +34,7 @@ "projectDeno": "Проекты Deno", "projectBun": "Bun Проекты", "projectPerl": "Проекты Perl", + "projectErlang": "Проекты Erlang", "jarPackagePath": "Путь к пакету JAR", "jdkPath": "Путь JDK", "pythonPath": "Python Path", diff --git a/src/lang/sv/host.json b/src/lang/sv/host.json index 5246af414..5388c1341 100644 --- a/src/lang/sv/host.json +++ b/src/lang/sv/host.json @@ -31,9 +31,10 @@ "projectGo": "Go-projekt", "projectPython": "Python-projekt", "projectTomcat": "Tomcat-projekt", - "projectDeno": "Deno Projects", - "projectBun": "Bun Projects", - "projectPerl": "Perl Projects", + "projectDeno": "Deno-projekt", + "projectBun": "Bun-projekt", + "projectPerl": "Perl-projekt", + "projectErlang": "Erlang-projekt", "jarPackagePath": "JAR-paket sökväg", "jdkPath": "JDK-sökväg", "pythonPath": "Python-sökväg", diff --git a/src/lang/tr/host.json b/src/lang/tr/host.json index b2f9243c9..870962139 100644 --- a/src/lang/tr/host.json +++ b/src/lang/tr/host.json @@ -34,6 +34,7 @@ "projectDeno": "Deno Projeleri", "projectBun": "Bun Projeleri", "projectPerl": "Perl Projeleri", + "projectErlang": "Erlang Projeleri", "jarPackagePath": "JAR Paket Yolu", "jdkPath": "JDK Yolu", "pythonPath": "Python Yolu", diff --git a/src/lang/uk/host.json b/src/lang/uk/host.json index a3d190f0f..359b94750 100644 --- a/src/lang/uk/host.json +++ b/src/lang/uk/host.json @@ -34,6 +34,7 @@ "projectDeno": "Проекти Deno", "projectBun": "Проекти Bun", "projectPerl": "Проекти Perl", + "projectErlang": "Проекти Erlang", "jarPackagePath": "Шлях до пакета JAR", "jdkPath": "Шлях JDK", "pythonPath": "Шлях Python", diff --git a/src/lang/vi/host.json b/src/lang/vi/host.json index 819b89659..ee479ab0c 100644 --- a/src/lang/vi/host.json +++ b/src/lang/vi/host.json @@ -34,6 +34,7 @@ "projectDeno": "Dự án Deno", "projectBun": "Dự án Bun", "projectPerl": "Dự án Perl", + "projectErlang": "Dự án Erlang", "jarPackagePath": "Đường dẫn gói JAR", "jdkPath": "Đường dẫn JDK", "pythonPath": "Đường dẫn Python", @@ -67,5 +68,8 @@ "copyCommand": "Sao chép lệnh", "showFile": "Hiển thị tệp", "sticky": "Ghim", - "dbclickRowToEdit": "Nhấp đúp vào dòng này để chỉnh sửa" + "dbclickRowToEdit": "Nhấp đúp vào dòng này để chỉnh sửa", + + "OnlineDomain": "Tên miền trực tuyến", + "LocalDoman": "Tên miền Local" } diff --git a/src/lang/zh/host.json b/src/lang/zh/host.json index 87c7b7e84..d1bb362ba 100644 --- a/src/lang/zh/host.json +++ b/src/lang/zh/host.json @@ -34,6 +34,7 @@ "projectDeno": "Deno项目", "projectBun": "Bun项目", "projectPerl": "Perl项目", + "projectErlang": "Erlang项目", "jarPackagePath": "jar包路径", "jdkPath": "jdk路径", "pythonPath": "Python路径", diff --git a/src/render/App.vue b/src/render/App.vue index 7c3f02e51..59e6d0e97 100644 --- a/src/render/App.vue +++ b/src/render/App.vue @@ -11,7 +11,7 @@ import IPC from '@/util/IPC' import { AppStore } from '@/store/app' import { BrewStore } from '@/store/brew' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' import Base from '@/core/Base' import { MessageSuccess } from '@/util/Element' import FloatButton from '@/components/FloatBtn/index.vue' @@ -22,6 +22,7 @@ import { nativeTheme, shell } from '@/util/NodeFn' import localForage from 'localforage' + const { t } = useI18n() const appStore = AppStore() const brewStore = BrewStore() @@ -73,7 +74,7 @@ const showAbout = () => { Base.Dialog(import('./components/About/index.vue')) .className('about-dialog') - .title(I18nT('base.about')) + .title(t('base.about')) .width('665px') .noFooter() .show() @@ -144,7 +145,7 @@ console.log('sysetmProxy: ', res) const proxy = res?.data ?? {} if (Object.keys(proxy).length > 0) { - Base._Confirm(I18nT('tools.systemProxyCheck'), undefined, { + Base._Confirm(t('tools.systemProxyCheck'), undefined, { customClass: 'confirm-del', type: 'warning' }).then(() => { @@ -155,7 +156,7 @@ appStore.config.setup.proxy.on = true appStore.config.setup.proxy.proxy = arr.join(' ') appStore.saveConfig() - MessageSuccess(I18nT('tools.systemProxyUsed')) + MessageSuccess(t('tools.systemProxyUsed')) }) localStorage.setItem('FlyEnv-Checked-Proxy', 'true') } @@ -198,7 +199,7 @@ onMounted(() => { init() - brewStore.cardHeadTitle = I18nT('base.currentVersionLib') + brewStore.cardHeadTitle = t('base.currentVersionLib') }) onUnmounted(() => { diff --git a/src/render/components/Conf/drawer.vue b/src/render/components/Conf/drawer.vue index a7cc595f7..2ef342135 100644 --- a/src/render/components/Conf/drawer.vue +++ b/src/render/components/Conf/drawer.vue @@ -9,24 +9,24 @@
- + - + - + - + @@ -34,9 +34,9 @@ @@ -45,12 +45,12 @@ - + - + @@ -71,7 +71,8 @@ import { Document, Operation, FolderOpened } from '@element-plus/icons-vue' import type { AllAppModule } from '@/core/type' import { ConfSetup } from '@/components/Conf/setup' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() import type { SoftInstalled } from '@/store/brew' const props = withDefaults( diff --git a/src/render/components/Deno/Index.vue b/src/render/components/Deno/Index.vue index 87b3b6a5e..f4050e1c1 100644 --- a/src/render/components/Deno/Index.vue +++ b/src/render/components/Deno/Index.vue @@ -22,7 +22,7 @@ >
@@ -33,9 +33,10 @@ import Service from '@/components/ServiceManager/base.vue' import Manager from '../VersionManager/index.vue' import { AppModuleSetup } from '@/core/Module' - import { I18nT } from '@lang/index' import ProjectIndex from '@/components/LanguageProjects/index.vue' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() const { tab } = AppModuleSetup('deno') - const tabs = [I18nT('base.service'), I18nT('base.versionManager'), I18nT('host.projectDeno')] + const tabs = [t('base.service'), t('base.versionManager'), t('host.projectDeno')] diff --git a/src/render/components/Erlang/Index.vue b/src/render/components/Erlang/Index.vue index 59ca111b1..5ee20683e 100644 --- a/src/render/components/Erlang/Index.vue +++ b/src/render/components/Erlang/Index.vue @@ -21,7 +21,7 @@ > diff --git a/src/render/components/Mysql/Config.vue b/src/render/components/Mysql/Config.vue index d4e590f48..3f6bf956b 100644 --- a/src/render/components/Mysql/Config.vue +++ b/src/render/components/Mysql/Config.vue @@ -19,7 +19,9 @@ import Conf from '@/components/Conf/index.vue' import Common from '@/components/Conf/common.vue' import type { CommonSetItem } from '@/components/Conf/setup' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' + + const { t } = useI18n() import { debounce } from 'lodash-es' import { AppStore } from '@/store/app' import { uuid } from '@/util/Index' @@ -64,7 +66,7 @@ datadir=${dataDir}` value: '3306', enable: true, tips() { - return I18nT('mysql.port') + return t('mysql.port') } }, { @@ -73,7 +75,7 @@ datadir=${dataDir}` value: '64M', enable: true, tips() { - return I18nT('mysql.key_buffer_size') + return t('mysql.key_buffer_size') } }, { @@ -83,7 +85,7 @@ datadir=${dataDir}` enable: true, show: vm?.value?.startsWith('5.'), tips() { - return I18nT('mysql.query_cache_size') + return t('mysql.query_cache_size') } }, { @@ -92,7 +94,7 @@ datadir=${dataDir}` value: '64M', enable: true, tips() { - return I18nT('mysql.tmp_table_size') + return t('mysql.tmp_table_size') } }, { @@ -101,7 +103,7 @@ datadir=${dataDir}` value: '256M', enable: true, tips() { - return I18nT('mysql.innodb_buffer_pool_size') + return t('mysql.innodb_buffer_pool_size') } }, { @@ -110,7 +112,7 @@ datadir=${dataDir}` value: '32M', enable: true, tips() { - return I18nT('mysql.innodb_log_buffer_size') + return t('mysql.innodb_log_buffer_size') } }, { @@ -119,7 +121,7 @@ datadir=${dataDir}` value: '1M', enable: true, tips() { - return I18nT('mysql.sort_buffer_size') + return t('mysql.sort_buffer_size') } }, { @@ -128,7 +130,7 @@ datadir=${dataDir}` value: '1M', enable: true, tips() { - return I18nT('mysql.read_buffer_size') + return t('mysql.read_buffer_size') } }, { @@ -137,7 +139,7 @@ datadir=${dataDir}` value: '256K', enable: true, tips() { - return I18nT('mysql.read_rnd_buffer_size') + return t('mysql.read_rnd_buffer_size') } }, { @@ -146,7 +148,7 @@ datadir=${dataDir}` value: '32', enable: true, tips() { - return I18nT('mysql.thread_cache_size') + return t('mysql.thread_cache_size') } }, { @@ -155,7 +157,7 @@ datadir=${dataDir}` value: '256', enable: true, tips() { - return I18nT('mysql.table_open_cache') + return t('mysql.table_open_cache') } }, { @@ -164,7 +166,7 @@ datadir=${dataDir}` value: '500', enable: true, tips() { - return I18nT('mysql.max_connections') + return t('mysql.max_connections') } } ] diff --git a/src/render/components/Mysql/Group/Add.vue b/src/render/components/Mysql/Group/Add.vue index 40dcb11c2..7936d96ee 100644 --- a/src/render/components/Mysql/Group/Add.vue +++ b/src/render/components/Mysql/Group/Add.vue @@ -1,7 +1,7 @@ @@ -65,7 +65,9 @@ diff --git a/src/render/components/Nodejs/Config.vue b/src/render/components/Nodejs/Config.vue index 5944c7467..26e93a48e 100644 --- a/src/render/components/Nodejs/Config.vue +++ b/src/render/components/Nodejs/Config.vue @@ -19,7 +19,8 @@ import Conf from '@/components/Conf/index.vue' import Common from '@/components/Conf/common.vue' import type { CommonSetItem } from '@/components/Conf/setup' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() import { debounce } from 'lodash-es' import { uuid } from '@/util/Index' import { join } from '@/util/path-browserify' @@ -67,7 +68,7 @@ enable: true, options: baseOptions, tips() { - return I18nT('nodejs.registry') + return t('nodejs.registry') }, onChange(nv: any, ov: any) { if (watcher) { @@ -230,7 +231,7 @@ if (watcher) { watcher() } - let config = editConfig.replace(/\r\n/gm, '\n') + const config = editConfig.replace(/\r\n/gm, '\n') const arr = [...names].map((item) => { const regex = new RegExp(`^(?!\\s*#)\\s*${item.name}\\s*=(.*?)([^\\n])(\\n|$)`, 'gmu') const matchs = diff --git a/src/render/components/Nodejs/Index.vue b/src/render/components/Nodejs/Index.vue index 73dc28dd2..46d1b6247 100644 --- a/src/render/components/Nodejs/Index.vue +++ b/src/render/components/Nodejs/Index.vue @@ -21,16 +21,18 @@ import Versions from './List.vue' import Config from './Config.vue' import { AppModuleSetup } from '@/core/Module' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' + + const { t } = useI18n() import Create from './CreateProject.vue' import ProjectIndex from './projects/index.vue' const { tab } = AppModuleSetup('node') const tabs = [ - I18nT('base.service'), - I18nT('base.versionManager'), + t('base.service'), + t('base.versionManager'), '.npmrc', - I18nT('host.newProject'), - I18nT('host.projectNode') + t('host.newProject'), + t('host.projectNode') ] diff --git a/src/render/components/Nodejs/List.vue b/src/render/components/Nodejs/List.vue index 70864a069..d30487b53 100644 --- a/src/render/components/Nodejs/List.vue +++ b/src/render/components/Nodejs/List.vue @@ -29,10 +29,10 @@ @@ -40,7 +40,9 @@ - diff --git a/src/render/components/Nodejs/fnm/index.vue b/src/render/components/Nodejs/fnm/index.vue index f32d1307b..cc3a86322 100644 --- a/src/render/components/Nodejs/fnm/index.vue +++ b/src/render/components/Nodejs/fnm/index.vue @@ -6,21 +6,19 @@ - diff --git a/src/render/components/Nodejs/nvm/index.vue b/src/render/components/Nodejs/nvm/index.vue index 9ebc1ff8f..745824869 100644 --- a/src/render/components/Nodejs/nvm/index.vue +++ b/src/render/components/Nodejs/nvm/index.vue @@ -6,21 +6,21 @@ - diff --git a/src/render/components/Nodejs/projects/dependencies/index.vue b/src/render/components/Nodejs/projects/dependencies/index.vue index 405ad1615..7ab3a9ffa 100644 --- a/src/render/components/Nodejs/projects/dependencies/index.vue +++ b/src/render/components/Nodejs/projects/dependencies/index.vue @@ -10,12 +10,12 @@ :loading="checking" plain @click.stop="doCheck" - >{{ I18nT('nodejs.checkPackageJsonUpdate') }}{{ t('nodejs.checkPackageJsonUpdate') }} - + @@ -79,7 +79,8 @@ import { MessageError } from '@/util/Element' import { ElMessage } from 'element-plus' import type { TableInstance } from 'element-plus' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() import { join } from '@/util/path-browserify' import { shell, fs } from '@/util/NodeFn' import { asyncComputed } from '@vueuse/core' diff --git a/src/render/components/Ollama/Index.vue b/src/render/components/Ollama/Index.vue index dc356c49e..ca100f063 100644 --- a/src/render/components/Ollama/Index.vue +++ b/src/render/components/Ollama/Index.vue @@ -28,16 +28,17 @@ import Logs from './Logs.vue' import Manager from '../VersionManager/index.vue' import { AppModuleSetup } from '@/core/Module' - import { I18nT } from '@lang/index' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() import ModelsVM from './models/index.vue' const { tab, checkVersion } = AppModuleSetup('ollama') const tabs = [ - I18nT('base.service'), - I18nT('base.versionManager'), - I18nT('ollama.model'), - I18nT('base.configFile'), - I18nT('base.log') + t('base.service'), + t('base.versionManager'), + t('ollama.model'), + t('base.configFile'), + t('base.log') ] checkVersion() diff --git a/src/render/components/Ollama/models/all/index.vue b/src/render/components/Ollama/models/all/index.vue index f0d536776..c2db66117 100644 --- a/src/render/components/Ollama/models/all/index.vue +++ b/src/render/components/Ollama/models/all/index.vue @@ -17,21 +17,21 @@ > - - + + - +