Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
42.86% |
3 / 7 |
CRAP | |
55.81% |
24 / 43 |
language_file_loader | |
0.00% |
0 / 1 |
|
42.86% |
3 / 7 |
34.41 | |
55.81% |
24 / 43 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
set_extension_manager | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
load | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
load_extension | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 6 |
|||
load_file | |
0.00% |
0 / 1 |
5.10 | |
38.46% |
5 / 13 |
|||
get_language_file_path | |
0.00% |
0 / 1 |
6.60 | |
60.00% |
6 / 10 |
|||
load_language_file | |
0.00% |
0 / 1 |
2.06 | |
75.00% |
3 / 4 |
<?php | |
/** | |
* | |
* This file is part of the phpBB Forum Software package. | |
* | |
* @copyright (c) phpBB Limited <https://www.phpbb.com> | |
* @license GNU General Public License, version 2 (GPL-2.0) | |
* | |
* For full copyright and license information, please see | |
* the docs/CREDITS.txt file. | |
* | |
*/ | |
namespace phpbb\language; | |
use phpbb\language\exception\language_file_not_found; | |
/** | |
* Language file loader | |
*/ | |
class language_file_loader | |
{ | |
/** | |
* @var string Path to phpBB's root | |
*/ | |
protected $phpbb_root_path; | |
/** | |
* @var string Extension of PHP files | |
*/ | |
protected $php_ext; | |
/** | |
* @var \phpbb\extension\manager Extension manager | |
*/ | |
protected $extension_manager; | |
/** | |
* Constructor | |
* | |
* @param string $phpbb_root_path Path to phpBB's root | |
* @param string $php_ext Extension of PHP files | |
*/ | |
public function __construct($phpbb_root_path, $php_ext) | |
{ | |
$this->phpbb_root_path = $phpbb_root_path; | |
$this->php_ext = $php_ext; | |
$this->extension_manager = null; | |
} | |
/** | |
* Extension manager setter | |
* | |
* @param \phpbb\extension\manager $extension_manager Extension manager | |
*/ | |
public function set_extension_manager(\phpbb\extension\manager $extension_manager) | |
{ | |
$this->extension_manager = $extension_manager; | |
} | |
/** | |
* Loads language array for the given component | |
* | |
* @param string $component Name of the language component | |
* @param string|array $locale ISO code of the language to load, or array of ISO codes if you want to | |
* specify additional language fallback steps | |
* @param array $lang Array reference containing language strings | |
*/ | |
public function load($component, $locale, &$lang) | |
{ | |
$locale = (array) $locale; | |
// Determine path to language directory | |
$path = $this->phpbb_root_path . 'language/'; | |
$this->load_file($path, $component, $locale, $lang); | |
} | |
/** | |
* Loads language array for the given extension component | |
* | |
* @param string $extension Name of the extension | |
* @param string $component Name of the language component | |
* @param string|array $locale ISO code of the language to load, or array of ISO codes if you want to | |
* specify additional language fallback steps | |
* @param array $lang Array reference containing language strings | |
*/ | |
public function load_extension($extension, $component, $locale, &$lang) | |
{ | |
// Check if extension manager was loaded | |
if ($this->extension_manager === null) | |
{ | |
// If not, let's return | |
return; | |
} | |
$locale = (array) $locale; | |
// Determine path to language directory | |
$path = $this->extension_manager->get_extension_path($extension, true) . 'language/'; | |
$this->load_file($path, $component, $locale, $lang); | |
} | |
/** | |
* Prepares language file loading | |
* | |
* @param string $path Path to search for file in | |
* @param string $component Name of the language component | |
* @param array $locale Array containing language fallback options | |
* @param array $lang Array reference of language strings | |
*/ | |
protected function load_file($path, $component, $locale, &$lang) | |
{ | |
// This is BC stuff and not the best idea as it makes language fallback | |
// implementation quite hard like below. | |
if (strpos($this->phpbb_root_path . $component, $path) === 0) | |
{ | |
// Filter out the path | |
$path_diff = str_replace($path, '', dirname($this->phpbb_root_path . $component)); | |
$language_file = basename($component, '.' . $this->php_ext); | |
$component = ''; | |
// This step is needed to resolve language/en/subdir style $component | |
// $path already points to the language base directory so we need to eliminate | |
// the first directory from the path (that should be the language directory) | |
$path_diff_parts = explode('/', $path_diff); | |
if (count($path_diff_parts) > 1) | |
{ | |
array_shift($path_diff_parts); | |
$component = implode('/', $path_diff_parts) . '/'; | |
} | |
$component .= $language_file; | |
} | |
// Determine filename | |
$filename = $component . '.' . $this->php_ext; | |
// Determine path to file | |
$file_path = $this->get_language_file_path($path, $filename, $locale); | |
// Load language array | |
$this->load_language_file($file_path, $lang); | |
} | |
/** | |
* This function implements language fallback logic | |
* | |
* @param string $path Path to language directory | |
* @param string $filename Filename to load language strings from | |
* @param array $locales Array containing language fallback options | |
* | |
* @return string Relative path to language file | |
* | |
* @throws language_file_not_found When the path to the file cannot be resolved | |
*/ | |
protected function get_language_file_path($path, $filename, $locales) | |
{ | |
$language_file_path = $filename; | |
// Language fallback logic | |
foreach ($locales as $locale) | |
{ | |
$language_file_path = $path . $locale . '/' . $filename; | |
// If we are in install, try to use the updated version, when available | |
if (defined('IN_INSTALL')) | |
{ | |
$install_language_path = str_replace('language/', 'install/update/new/language/', $language_file_path); | |
if (file_exists($install_language_path)) | |
{ | |
return $install_language_path; | |
} | |
} | |
if (file_exists($language_file_path)) | |
{ | |
return $language_file_path; | |
} | |
} | |
// The language file is not exist | |
throw new language_file_not_found('Language file ' . $language_file_path . ' couldn\'t be opened.'); | |
} | |
/** | |
* Loads language file | |
* | |
* @param string $path Path to language file to load | |
* @param array $lang Reference of the array of language strings | |
*/ | |
protected function load_language_file($path, &$lang) | |
{ | |
// Do not suppress error if in DEBUG mode | |
if (defined('DEBUG')) | |
{ | |
include $path; | |
} | |
else | |
{ | |
@include $path; | |
} | |
} | |
} |