Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
42.86% covered (danger)
42.86%
3 / 7
CRAP
50.91% covered (warning)
50.91%
28 / 55
language_file_loader
0.00% covered (danger)
0.00%
0 / 1
42.86% covered (danger)
42.86%
3 / 7
41.62
50.91% covered (warning)
50.91%
28 / 55
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 set_extension_manager
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 load
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 load_extension
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 7
 load_file
0.00% covered (danger)
0.00%
0 / 1
5.44
35.29% covered (danger)
35.29%
6 / 17
 get_language_file_path
0.00% covered (danger)
0.00%
0 / 1
7.54
53.33% covered (warning)
53.33%
8 / 15
 load_language_file
0.00% covered (danger)
0.00%
0 / 1
2.15
66.67% covered (warning)
66.67%
4 / 6
<?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
     *
     * @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;
        }
    }
}