deim Опубліковано: 10 січня 2017 Share Опубліковано: 10 січня 2017 При попытке отключить русский язык в чистом ocStore 2.3.0.2 без удаления файлов получаем несколько неприятных багов Описание в теме релиза https://opencartforum.com/topic/67981-%D1%80%D0%B5%D0%BB%D0%B8%D0%B7-ocstore-2302/page-11#entry647087 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 10 січня 2017 Автор Share Опубліковано: 10 січня 2017 (змінено) В продолжение к уже перечисленным добавлю только что найденные Итак, условия: Чистый ocStore 2.3.0.2, для каталога и админки указан английский язык в настройках магазина, после чего в локализации русский язык отключаем Баги: 1. Товары Заходим в список товаров, созданных при установке. Открываем любой и видим, что в редактировании от нас потребует заполнять всё на обоих языках Удаляем все товары 2. Неудаляемые Атрибуты Заходим в список атрибутов. Удаляем все атрибуты. Заходим в список групп атрибутов и не можем удалить ни одной, так как к ним привязаны атрибуты. Возвращаемся в список атрибутов. Тут пусто. Проверяем в базе таблицы _attribute и _attribute_description и видим, что атрибуты действительно существуют. В _attribute_description видим, что все атрибуты лишились своих описаний на английском языке, при этом описания на русском там остались. Итог: атрибуты есть, их не видно, группы атрибутов удалить нельзя Почему так происходит с атрибутами я честно говоря не понял. Ведь в контроллере админки в атрибутах для удаления в public function delete() вызывается $this->model_catalog_attribute->deleteAttribute($attribute_id); которая, как можете заметить, не содержит никаких упоминаний об language_id Проверил на всякий случай в модели public function deleteAttribute($attribute_id) { $this->db->query("DELETE FROM " . DB_PREFIX . "attribute WHERE attribute_id = '" . (int)$attribute_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "attribute_description WHERE attribute_id = '" . (int)$attribute_id . "'"); } Змінено 11 січня 2017 користувачем deim 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 10 січня 2017 Автор Share Опубліковано: 10 січня 2017 С атрибутами разобрался Виноват файл ocStore-2.3.0.2\upload\install\opencart.sql INSERT INTO `oc_attribute_description` (`attribute_id`, `language_id`, `name`) VALUES (1, 1, 'Description'), (2, 1, 'No. of Cores'), (4, 1, 'test 1'), (5, 1, 'test 2'), (6, 1, 'test 3'), (7, 1, 'test 4'), (8, 1, 'test 5'), (9, 1, 'test 6'), (10, 1, 'test 7'), (11, 1, 'test 8'), (3, 1, 'Clockspeed'); В нем просто напросто изначально отсутствуют названия атрибутов на английском языке. 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Собственно вопрос:почему в oc_language в code и в locale записано en-gb, а не en-us? catalog\controller\startup\startup.php // Language $code = ''; $this->load->model('localisation/language'); $languages = $this->model_localisation_language->getLanguages(); if (isset($this->session->data['language'])) { $code = $this->session->data['language']; } if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) { $code = $this->request->cookie['language']; } // Language Detection if (!empty($this->request->server['HTTP_ACCEPT_LANGUAGE']) && !array_key_exists($code, $languages)) { $detect = ''; $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); // Try using local to detect the language foreach ($browser_languages as $browser_language) { foreach ($languages as $key => $value) { if ($value['status']) { $locale = explode(',', $value['locale']); if (in_array($browser_language, $locale)) { $detect = $key; break 2; } } } } if (!$detect) { // Try using language folder to detect the language foreach ($browser_languages as $browser_language) { if (array_key_exists(strtolower($browser_language), $languages)) { $detect = strtolower($browser_language); break; } } } $code = $detect ? $detect : ''; } if (!array_key_exists($code, $languages)) { $code = $this->config->get('config_language'); } Вот этот кусочек на мой взгляд косячит $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); В результате которого $browser_language получает у меня значение для хромаArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.6 [3] => en;q=0.4 ) И для firefoxArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.5 [3] => en;q=0.3 ) это мой аргумент в пользу en-us вместо en-gb После чего в строке 63 у нас будет разбиваться на массив значение locale из oc_language en_US.UTF-8,en_US,en-gb,english Как видите, шансов на совпадение между элементами из $browser_language и explode(',', $value['locale']) нет ни малейшихСобственно для русского тоже ru_RU.UTF-8,ru_RU,russian Вероятно есть смысл проверять наличие ; в $browser_language и разбивать повторно на массив. Тогда после explode(';',$browser_language) у нас хотя бы будет шанс правильно определять и русский и английский в строчках 73-82 (для en-us вместо en-gb) Потому что иначе весь этот кусок кода при включенном русском языке будет цепляться в 76 строке только за ru-RU и сразу ставить русский язык дефолтом в шаблон вместо указанного в настройках админки (строка 88) Я уже сонный. Если в чем-то ошибся, то прошу поправить :) 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Кстати, с баннерами тот же косяк, что и с атрибутами У них при установке не указаны английские названия В итоге они скрываются из шаблона при выборе английского языка. Баг или фича? Точно не фича, так как validateForm() не пропустит банер с title меньше 2 символов 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 В admin\language\en-gb\en-gb.php пропущена $_['lang'] в результате в admin\controller\catalog\category.php получаем ошибку вот тут $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x / ocStore 2.x: Звіти про помилки Баги при выключении русского языка в чистом ocStore 2.3.0.2 Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
deim Опубліковано: 10 січня 2017 Автор Share Опубліковано: 10 січня 2017 (змінено) В продолжение к уже перечисленным добавлю только что найденные Итак, условия: Чистый ocStore 2.3.0.2, для каталога и админки указан английский язык в настройках магазина, после чего в локализации русский язык отключаем Баги: 1. Товары Заходим в список товаров, созданных при установке. Открываем любой и видим, что в редактировании от нас потребует заполнять всё на обоих языках Удаляем все товары 2. Неудаляемые Атрибуты Заходим в список атрибутов. Удаляем все атрибуты. Заходим в список групп атрибутов и не можем удалить ни одной, так как к ним привязаны атрибуты. Возвращаемся в список атрибутов. Тут пусто. Проверяем в базе таблицы _attribute и _attribute_description и видим, что атрибуты действительно существуют. В _attribute_description видим, что все атрибуты лишились своих описаний на английском языке, при этом описания на русском там остались. Итог: атрибуты есть, их не видно, группы атрибутов удалить нельзя Почему так происходит с атрибутами я честно говоря не понял. Ведь в контроллере админки в атрибутах для удаления в public function delete() вызывается $this->model_catalog_attribute->deleteAttribute($attribute_id); которая, как можете заметить, не содержит никаких упоминаний об language_id Проверил на всякий случай в модели public function deleteAttribute($attribute_id) { $this->db->query("DELETE FROM " . DB_PREFIX . "attribute WHERE attribute_id = '" . (int)$attribute_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "attribute_description WHERE attribute_id = '" . (int)$attribute_id . "'"); } Змінено 11 січня 2017 користувачем deim 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 10 січня 2017 Автор Share Опубліковано: 10 січня 2017 С атрибутами разобрался Виноват файл ocStore-2.3.0.2\upload\install\opencart.sql INSERT INTO `oc_attribute_description` (`attribute_id`, `language_id`, `name`) VALUES (1, 1, 'Description'), (2, 1, 'No. of Cores'), (4, 1, 'test 1'), (5, 1, 'test 2'), (6, 1, 'test 3'), (7, 1, 'test 4'), (8, 1, 'test 5'), (9, 1, 'test 6'), (10, 1, 'test 7'), (11, 1, 'test 8'), (3, 1, 'Clockspeed'); В нем просто напросто изначально отсутствуют названия атрибутов на английском языке. 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Собственно вопрос:почему в oc_language в code и в locale записано en-gb, а не en-us? catalog\controller\startup\startup.php // Language $code = ''; $this->load->model('localisation/language'); $languages = $this->model_localisation_language->getLanguages(); if (isset($this->session->data['language'])) { $code = $this->session->data['language']; } if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) { $code = $this->request->cookie['language']; } // Language Detection if (!empty($this->request->server['HTTP_ACCEPT_LANGUAGE']) && !array_key_exists($code, $languages)) { $detect = ''; $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); // Try using local to detect the language foreach ($browser_languages as $browser_language) { foreach ($languages as $key => $value) { if ($value['status']) { $locale = explode(',', $value['locale']); if (in_array($browser_language, $locale)) { $detect = $key; break 2; } } } } if (!$detect) { // Try using language folder to detect the language foreach ($browser_languages as $browser_language) { if (array_key_exists(strtolower($browser_language), $languages)) { $detect = strtolower($browser_language); break; } } } $code = $detect ? $detect : ''; } if (!array_key_exists($code, $languages)) { $code = $this->config->get('config_language'); } Вот этот кусочек на мой взгляд косячит $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); В результате которого $browser_language получает у меня значение для хромаArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.6 [3] => en;q=0.4 ) И для firefoxArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.5 [3] => en;q=0.3 ) это мой аргумент в пользу en-us вместо en-gb После чего в строке 63 у нас будет разбиваться на массив значение locale из oc_language en_US.UTF-8,en_US,en-gb,english Как видите, шансов на совпадение между элементами из $browser_language и explode(',', $value['locale']) нет ни малейшихСобственно для русского тоже ru_RU.UTF-8,ru_RU,russian Вероятно есть смысл проверять наличие ; в $browser_language и разбивать повторно на массив. Тогда после explode(';',$browser_language) у нас хотя бы будет шанс правильно определять и русский и английский в строчках 73-82 (для en-us вместо en-gb) Потому что иначе весь этот кусок кода при включенном русском языке будет цепляться в 76 строке только за ru-RU и сразу ставить русский язык дефолтом в шаблон вместо указанного в настройках админки (строка 88) Я уже сонный. Если в чем-то ошибся, то прошу поправить :) 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Кстати, с баннерами тот же косяк, что и с атрибутами У них при установке не указаны английские названия В итоге они скрываются из шаблона при выборе английского языка. Баг или фича? Точно не фича, так как validateForm() не пропустит банер с title меньше 2 символов 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 В admin\language\en-gb\en-gb.php пропущена $_['lang'] в результате в admin\controller\catalog\category.php получаем ошибку вот тут $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x / ocStore 2.x: Звіти про помилки Баги при выключении русского языка в чистом ocStore 2.3.0.2 Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
deim Опубліковано: 10 січня 2017 Автор Share Опубліковано: 10 січня 2017 С атрибутами разобрался Виноват файл ocStore-2.3.0.2\upload\install\opencart.sql INSERT INTO `oc_attribute_description` (`attribute_id`, `language_id`, `name`) VALUES (1, 1, 'Description'), (2, 1, 'No. of Cores'), (4, 1, 'test 1'), (5, 1, 'test 2'), (6, 1, 'test 3'), (7, 1, 'test 4'), (8, 1, 'test 5'), (9, 1, 'test 6'), (10, 1, 'test 7'), (11, 1, 'test 8'), (3, 1, 'Clockspeed'); В нем просто напросто изначально отсутствуют названия атрибутов на английском языке. 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Собственно вопрос:почему в oc_language в code и в locale записано en-gb, а не en-us? catalog\controller\startup\startup.php // Language $code = ''; $this->load->model('localisation/language'); $languages = $this->model_localisation_language->getLanguages(); if (isset($this->session->data['language'])) { $code = $this->session->data['language']; } if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) { $code = $this->request->cookie['language']; } // Language Detection if (!empty($this->request->server['HTTP_ACCEPT_LANGUAGE']) && !array_key_exists($code, $languages)) { $detect = ''; $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); // Try using local to detect the language foreach ($browser_languages as $browser_language) { foreach ($languages as $key => $value) { if ($value['status']) { $locale = explode(',', $value['locale']); if (in_array($browser_language, $locale)) { $detect = $key; break 2; } } } } if (!$detect) { // Try using language folder to detect the language foreach ($browser_languages as $browser_language) { if (array_key_exists(strtolower($browser_language), $languages)) { $detect = strtolower($browser_language); break; } } } $code = $detect ? $detect : ''; } if (!array_key_exists($code, $languages)) { $code = $this->config->get('config_language'); } Вот этот кусочек на мой взгляд косячит $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); В результате которого $browser_language получает у меня значение для хромаArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.6 [3] => en;q=0.4 ) И для firefoxArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.5 [3] => en;q=0.3 ) это мой аргумент в пользу en-us вместо en-gb После чего в строке 63 у нас будет разбиваться на массив значение locale из oc_language en_US.UTF-8,en_US,en-gb,english Как видите, шансов на совпадение между элементами из $browser_language и explode(',', $value['locale']) нет ни малейшихСобственно для русского тоже ru_RU.UTF-8,ru_RU,russian Вероятно есть смысл проверять наличие ; в $browser_language и разбивать повторно на массив. Тогда после explode(';',$browser_language) у нас хотя бы будет шанс правильно определять и русский и английский в строчках 73-82 (для en-us вместо en-gb) Потому что иначе весь этот кусок кода при включенном русском языке будет цепляться в 76 строке только за ru-RU и сразу ставить русский язык дефолтом в шаблон вместо указанного в настройках админки (строка 88) Я уже сонный. Если в чем-то ошибся, то прошу поправить :) 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Кстати, с баннерами тот же косяк, что и с атрибутами У них при установке не указаны английские названия В итоге они скрываются из шаблона при выборе английского языка. Баг или фича? Точно не фича, так как validateForm() не пропустит банер с title меньше 2 символов 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 В admin\language\en-gb\en-gb.php пропущена $_['lang'] в результате в admin\controller\catalog\category.php получаем ошибку вот тут $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x / ocStore 2.x: Звіти про помилки Баги при выключении русского языка в чистом ocStore 2.3.0.2 Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Собственно вопрос:почему в oc_language в code и в locale записано en-gb, а не en-us? catalog\controller\startup\startup.php // Language $code = ''; $this->load->model('localisation/language'); $languages = $this->model_localisation_language->getLanguages(); if (isset($this->session->data['language'])) { $code = $this->session->data['language']; } if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) { $code = $this->request->cookie['language']; } // Language Detection if (!empty($this->request->server['HTTP_ACCEPT_LANGUAGE']) && !array_key_exists($code, $languages)) { $detect = ''; $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); // Try using local to detect the language foreach ($browser_languages as $browser_language) { foreach ($languages as $key => $value) { if ($value['status']) { $locale = explode(',', $value['locale']); if (in_array($browser_language, $locale)) { $detect = $key; break 2; } } } } if (!$detect) { // Try using language folder to detect the language foreach ($browser_languages as $browser_language) { if (array_key_exists(strtolower($browser_language), $languages)) { $detect = strtolower($browser_language); break; } } } $code = $detect ? $detect : ''; } if (!array_key_exists($code, $languages)) { $code = $this->config->get('config_language'); } Вот этот кусочек на мой взгляд косячит $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']); В результате которого $browser_language получает у меня значение для хромаArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.6 [3] => en;q=0.4 ) И для firefoxArray ( [0] => ru-RU [1] => ru;q=0.8 [2] => en-US;q=0.5 [3] => en;q=0.3 ) это мой аргумент в пользу en-us вместо en-gb После чего в строке 63 у нас будет разбиваться на массив значение locale из oc_language en_US.UTF-8,en_US,en-gb,english Как видите, шансов на совпадение между элементами из $browser_language и explode(',', $value['locale']) нет ни малейшихСобственно для русского тоже ru_RU.UTF-8,ru_RU,russian Вероятно есть смысл проверять наличие ; в $browser_language и разбивать повторно на массив. Тогда после explode(';',$browser_language) у нас хотя бы будет шанс правильно определять и русский и английский в строчках 73-82 (для en-us вместо en-gb) Потому что иначе весь этот кусок кода при включенном русском языке будет цепляться в 76 строке только за ru-RU и сразу ставить русский язык дефолтом в шаблон вместо указанного в настройках админки (строка 88) Я уже сонный. Если в чем-то ошибся, то прошу поправить :) 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Кстати, с баннерами тот же косяк, что и с атрибутами У них при установке не указаны английские названия В итоге они скрываются из шаблона при выборе английского языка. Баг или фича? Точно не фича, так как validateForm() не пропустит банер с title меньше 2 символов 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 В admin\language\en-gb\en-gb.php пропущена $_['lang'] в результате в admin\controller\catalog\category.php получаем ошибку вот тут $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x / ocStore 2.x: Звіти про помилки Баги при выключении русского языка в чистом ocStore 2.3.0.2 Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich
deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 Кстати, с баннерами тот же косяк, что и с атрибутами У них при установке не указаны английские названия В итоге они скрываются из шаблона при выборе английского языка. Баг или фича? Точно не фича, так как validateForm() не пропустит банер с title меньше 2 символов 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 В admin\language\en-gb\en-gb.php пропущена $_['lang'] в результате в admin\controller\catalog\category.php получаем ошибку вот тут $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x / ocStore 2.x: Звіти про помилки Баги при выключении русского языка в чистом ocStore 2.3.0.2
deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 В admin\language\en-gb\en-gb.php пропущена $_['lang'] в результате в admin\controller\catalog\category.php получаем ошибку вот тут $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); 1 Надіслати Поділитися на інших сайтах More sharing options... deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
deim Опубліковано: 11 січня 2017 Автор Share Опубліковано: 11 січня 2017 А вот и виновник необходимости вводить описания на обоих языках admin\controller\catalog\category.php $this->load->model('localisation/language'); $data['languages'] = $this->model_localisation_language->getLanguages(); Вот код model_localisation_language->getLanguages() $language_data = $this->cache->get('language'); if (!$language_data) { $language_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language ORDER BY sort_order, name"); foreach ($query->rows as $result) { $language_data[$result['code']] = array( 'language_id' => $result['language_id'], 'name' => $result['name'], 'code' => $result['code'], 'locale' => $result['locale'], 'image' => $result['image'], 'directory' => $result['directory'], 'sort_order' => $result['sort_order'], 'status' => $result['status'] ); } $this->cache->set('language', $language_data); } return $language_data; То есть нет никакой проверки включен ли язык или отключен. А учитывая строчку с кэшем в начале мы получаем русскую рулетку. Иногда оно может просить все языки, иногда только включенные. Зависит это от любых других модулей или настроек, которые тоже используют кэш языка. Например от каталога. Просто посетитель заходит на сайт и языки в кэш попадают только включенные. И именно они отобразятся в админке. Если же кэша нет или он устарел, то языки в админке будут требоваться вообще ВСЕ В итоге потом в шаблоне админки получаем недоразумение с требованием заполнять описание на отключенных языках (так как в шаблоне тоже не проверяется включен ли язык) На примере всё тех же категорий admin\view\template\catalog\category_form.tpl <?php foreach ($languages as $language) { ?> <div class="tab-pane" id="language<?php echo $language['language_id']; ?>"> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-name<?php echo $language['language_id']; ?>"><?php echo $entry_name; ?></label> <div class="col-sm-10"> <input type="text" name="category_description[<?php echo $language['language_id']; ?>][name]" value="<?php echo isset($category_description[$language['language_id']]) ? $category_description[$language['language_id']]['name'] : ''; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name<?php echo $language['language_id']; ?>" class="form-control" /> <?php if (isset($error_name[$language['language_id']])) { ?> <div class="text-danger"><?php echo $error_name[$language['language_id']]; ?></div> <?php } ?> </div> </div> 1 Надіслати Поділитися на інших сайтах More sharing options... 2 years later... forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0
forlan Опубліковано: 9 жовтня 2019 Share Опубліковано: 9 жовтня 2019 @deim модуль который решает этот вопрос) Надіслати Поділитися на інших сайтах More sharing options...
Recommended Posts