Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Opencart 2.0.1.1 bugfix: default language fallback

Просмотров: 3443 RSS 2
Howto » Web development » E-commerce » OpenCart
, ,

Если вы пользуетесь не только английским языком, то вам наверняка попадались отсутствующие строки наподобие text_home, button_continue, button_login.

Раньше в этом случае вообще происходила ошибка и страница "ломалась": надо было следить за соответствием переводов и добавлять отсутствующие в переводе строки или дублировать файл целиком из английской версии модуля. В версиях Opencart 2.0 отсутствие некоторых строк в переводах наконец-то более-менее исправлено. Если раньше возникала ошибка, то сейчас берётся строка из языка по умолчанию (английского).

Но всё равно не учтён один момент. Если в английском работает логика наследования строки из english/default.php (например, переводы text_continue, text_yes, text_no и т.п. не дублируются в языковых файлах модулей и компонентах движка, а берутся из default.php), то в случае точно такой же ситуации в дополнительном языке языковый ресурс выбирается по неправльной цепочке:

  • надо: ru/module -> ru/default.php -> en/default.php
  • а происходит так: ru/module -> en/module

И вуаля: в русском строки нет (т.к. её не было в оригинале), в английском нет (т.к. там оно берётся из default.php), в результате - вывод служебного ключа строки, а не правильного перевода. Вот те самые text_home, button_continue, button_ok и тому подобные.

Лечится так:

commit b08fa836f2a55eb9ef2205ce8c3491b6d00c5319
Author: Ruslan Brest <rb@labtodo.com>
Date:   Tue Jan 13 11:01:54 2015 -0500
    [!][lang] fix language fallback:
    
    if translation string not found in lang/module/submodule,
    fall back to lang/default at first, then to english/default
diff --git a/html/extensions/system/library/language.php b/html/extensions/system/library/language.php
index c8ba268..5d10d50 100644
--- a/html/extensions/system/library/language.php
+++ b/html/extensions/system/library/language.php
@@ -15,16 +15,18 @@ class Language {
 	public function load($filename) {
 		$_ = array();
 
-		$file = DIR_LANGUAGE . $this->default . '/' . $filename . '.php';
 
-		if (file_exists($file)) {
-			require($file);
-		}
-
-		$file = DIR_LANGUAGE . $this->directory . '/' . $filename . '.php';
-
-		if (file_exists($file)) {
-			require($file);
+		$files = array(
+			DIR_LANGUAGE . $this->default   . '/' . $filename . '.php',
+			DIR_LANGUAGE . $this->directory . '/' . 'default.php',
+			DIR_LANGUAGE . $this->directory . '/' . $filename . '.php'
+			);
+
+		foreach($files as $file)
+		{
+			if (file_exists($file)) {
+				require($file);
+			}
 		}
 
 		$this->data = array_merge($this->data, $_);
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Комментариев: 2
  1. 2015-05-19 в 01:04:51 | Владимир

    Добрый день!

    В opencart 2.0.2.0 уже нет файла default.php. Вместо него, как и в 1.5 в папке english/english.php. В сборке, которой пользуюсь в папке с русским языком файл russian.php

    Как быть в этом случае?

  2. 2016-05-14 в 09:11:55 | Сергей

    Здравствуйте!

    У меня тажа проблема. В английском отображается иконка домика в русском text_home. Так же нету переводов на text_pagination, BUTTON_CART.

    З.Ы. Пока писал, решил проблему. Переустановил русский язык с офф сайта. Так же удалил старые default.php, они в новой сборке называются russian.php.

Оставьте комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)