Opencart 2.0.1.1 bugfix: default language fallback

Если вы пользуетесь не только английским языком, то вам наверняка попадались отсутствующие строки наподобие 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, $_);