primo commit
This commit is contained in:
11
administrator/components/com_languages/access.xml
Normal file
11
administrator/components/com_languages/access.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<access component="com_languages">
|
||||
<section name="component">
|
||||
<action name="core.admin" title="JACTION_ADMIN" />
|
||||
<action name="core.manage" title="JACTION_MANAGE" />
|
||||
<action name="core.create" title="JACTION_CREATE" />
|
||||
<action name="core.delete" title="JACTION_DELETE" />
|
||||
<action name="core.edit" title="JACTION_EDIT" />
|
||||
<action name="core.edit.state" title="JACTION_EDITSTATE" />
|
||||
</section>
|
||||
</access>
|
||||
29
administrator/components/com_languages/config.xml
Normal file
29
administrator/components/com_languages/config.xml
Normal file
@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config>
|
||||
<help key="Languages:_Options"/>
|
||||
<fieldset
|
||||
name="permissions"
|
||||
label="JCONFIG_PERMISSIONS_LABEL"
|
||||
>
|
||||
|
||||
<field
|
||||
name="rules"
|
||||
type="rules"
|
||||
label="JCONFIG_PERMISSIONS_LABEL"
|
||||
filter="rules"
|
||||
validate="rules"
|
||||
component="com_languages"
|
||||
section="component"
|
||||
/>
|
||||
|
||||
<field
|
||||
type="hidden"
|
||||
name="site"
|
||||
/>
|
||||
|
||||
<field
|
||||
type="hidden"
|
||||
name="administrator"
|
||||
/>
|
||||
</fieldset>
|
||||
</config>
|
||||
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form>
|
||||
<field
|
||||
name="client_id"
|
||||
type="list"
|
||||
label="JSITEADMIN"
|
||||
class="js-select-submit-on-change"
|
||||
filtermode="selector"
|
||||
validate="options"
|
||||
>
|
||||
<option value="0">JSITE</option>
|
||||
<option value="1">JADMINISTRATOR</option>
|
||||
</field>
|
||||
<fields name="filter">
|
||||
<field
|
||||
name="search"
|
||||
type="text"
|
||||
inputmode="search"
|
||||
label="COM_LANGUAGES_INSTALLED_FILTER_SEARCH_LABEL"
|
||||
description="COM_LANGUAGES_INSTALLED_FILTER_SEARCH_DESC"
|
||||
hint="JSEARCH_FILTER"
|
||||
noresults="JGLOBAL_NO_MATCHING_RESULTS"
|
||||
/>
|
||||
</fields>
|
||||
<fields name="list">
|
||||
<field
|
||||
name="fullordering"
|
||||
type="list"
|
||||
label="JGLOBAL_SORT_BY"
|
||||
class="js-select-submit-on-change"
|
||||
default="name ASC"
|
||||
validate="options"
|
||||
>
|
||||
<option value="">JGLOBAL_SORT_BY</option>
|
||||
<option value="name ASC">COM_LANGUAGES_HEADING_TITLE_ASC</option>
|
||||
<option value="name DESC">COM_LANGUAGES_HEADING_TITLE_DESC</option>
|
||||
<option value="nativeName ASC">COM_LANGUAGES_HEADING_TITLE_NATIVE_ASC</option>
|
||||
<option value="nativeName DESC">COM_LANGUAGES_HEADING_TITLE_NATIVE_DESC</option>
|
||||
<option value="language ASC">COM_LANGUAGES_HEADING_LANG_TAG_ASC</option>
|
||||
<option value="language DESC">COM_LANGUAGES_HEADING_LANG_TAG_DESC</option>
|
||||
<option value="published ASC">COM_LANGUAGES_HEADING_DEFAULT_ASC</option>
|
||||
<option value="published DESC">COM_LANGUAGES_HEADING_DEFAULT_DESC</option>
|
||||
<option value="version ASC">COM_LANGUAGES_HEADING_VERSION_ASC</option>
|
||||
<option value="version DESC">COM_LANGUAGES_HEADING_VERSION_DESC</option>
|
||||
<option value="creationDate ASC">COM_LANGUAGES_HEADING_DATE_ASC</option>
|
||||
<option value="creationDate DESC">COM_LANGUAGES_HEADING_DATE_DESC</option>
|
||||
<option value="author ASC">COM_LANGUAGES_HEADING_AUTHOR_ASC</option>
|
||||
<option value="author DESC">COM_LANGUAGES_HEADING_AUTHOR_DESC</option>
|
||||
<option value="authorEmail ASC">COM_LANGUAGES_HEADING_AUTHOR_EMAIL_ASC</option>
|
||||
<option value="authorEmail DESC">COM_LANGUAGES_HEADING_AUTHOR_EMAIL_DESC</option>
|
||||
<option value="extension_id ASC">JGRID_HEADING_ID_ASC</option>
|
||||
<option value="extension_id DESC">JGRID_HEADING_ID_DESC</option>
|
||||
</field>
|
||||
<field
|
||||
name="limit"
|
||||
type="limitbox"
|
||||
label="JGLOBAL_LIST_LIMIT"
|
||||
default="25"
|
||||
class="js-select-submit-on-change"
|
||||
/>
|
||||
</fields>
|
||||
</form>
|
||||
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form>
|
||||
<fields name="filter">
|
||||
<field
|
||||
name="search"
|
||||
type="text"
|
||||
inputmode="search"
|
||||
label="JSEARCH_FILTER"
|
||||
description="COM_LANGUAGES_SEARCH_IN_TITLE"
|
||||
hint="JSEARCH_FILTER"
|
||||
/>
|
||||
<field
|
||||
name="published"
|
||||
type="status"
|
||||
label="JSTATUS"
|
||||
optionsFilter="1,0,-2,*"
|
||||
class="js-select-submit-on-change"
|
||||
>
|
||||
<option value="">JOPTION_SELECT_PUBLISHED</option>
|
||||
</field>
|
||||
<field
|
||||
name="access"
|
||||
type="accesslevel"
|
||||
label="JGRID_HEADING_ACCESS"
|
||||
class="js-select-submit-on-change"
|
||||
>
|
||||
<option value="">JOPTION_SELECT_ACCESS</option>
|
||||
</field>
|
||||
</fields>
|
||||
<fields name="list">
|
||||
<field
|
||||
name="fullordering"
|
||||
type="list"
|
||||
label="JGLOBAL_SORT_BY"
|
||||
class="js-select-submit-on-change"
|
||||
default="a.ordering ASC"
|
||||
validate="options"
|
||||
>
|
||||
<option value="">JGLOBAL_SORT_BY</option>
|
||||
<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
|
||||
<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
|
||||
<option value="a.published ASC">JSTATUS_ASC</option>
|
||||
<option value="a.published DESC">JSTATUS_DESC</option>
|
||||
<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
|
||||
<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
|
||||
<option value="a.title_native ASC">COM_LANGUAGES_HEADING_TITLE_NATIVE_ASC</option>
|
||||
<option value="a.title_native DESC">COM_LANGUAGES_HEADING_TITLE_NATIVE_DESC</option>
|
||||
<option value="a.lang_code ASC">COM_LANGUAGES_HEADING_LANG_TAG_ASC</option>
|
||||
<option value="a.lang_code DESC">COM_LANGUAGES_HEADING_LANG_TAG_DESC</option>
|
||||
<option value="a.sef ASC">COM_LANGUAGES_HEADING_LANG_CODE_ASC</option>
|
||||
<option value="a.sef DESC">COM_LANGUAGES_HEADING_LANG_CODE_DESC</option>
|
||||
<option value="a.image ASC">COM_LANGUAGES_HEADING_LANG_IMAGE_ASC</option>
|
||||
<option value="a.image DESC">COM_LANGUAGES_HEADING_LANG_IMAGE_DESC</option>
|
||||
<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
|
||||
<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
|
||||
<option value="l.home ASC">COM_LANGUAGES_HEADING_HOMEPAGE_ASC</option>
|
||||
<option value="l.home DESC">COM_LANGUAGES_HEADING_HOMEPAGE_DESC</option>
|
||||
<option value="a.lang_id ASC">JGRID_HEADING_ID_ASC</option>
|
||||
<option value="a.lang_id DESC">JGRID_HEADING_ID_DESC</option>
|
||||
</field>
|
||||
<field
|
||||
name="limit"
|
||||
type="limitbox"
|
||||
label="JGLOBAL_LIST_LIMIT"
|
||||
default="25"
|
||||
class="js-select-submit-on-change"
|
||||
/>
|
||||
</fields>
|
||||
</form>
|
||||
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form>
|
||||
<field
|
||||
name="language_client"
|
||||
type="languageclient"
|
||||
label="COM_LANGUAGES_OVERRIDE_SELECT_LANGUAGECLIENT"
|
||||
class="js-select-submit-on-change"
|
||||
filtermode="selector"
|
||||
addfieldprefix="Joomla\Component\Languages\Administrator\Field"
|
||||
>
|
||||
<option value="">COM_LANGUAGES_OVERRIDE_SELECT_LANGUAGE</option>
|
||||
</field>
|
||||
<fields name="filter">
|
||||
<field
|
||||
name="search"
|
||||
type="text"
|
||||
inputmode="search"
|
||||
label="JSEARCH_FILTER"
|
||||
description="COM_LANGUAGES_VIEW_OVERRIDES_FILTER_SEARCH_DESC"
|
||||
hint="JSEARCH_FILTER"
|
||||
/>
|
||||
</fields>
|
||||
<fields name="list">
|
||||
<field
|
||||
name="fullordering"
|
||||
type="list"
|
||||
label="JGLOBAL_SORT_BY"
|
||||
class="js-select-submit-on-change"
|
||||
default="key ASC"
|
||||
validate="options"
|
||||
>
|
||||
<option value="">JGLOBAL_SORT_BY</option>
|
||||
<option value="key ASC">COM_LANGUAGES_VIEW_OVERRIDES_KEY_ASC</option>
|
||||
<option value="key DESC">COM_LANGUAGES_VIEW_OVERRIDES_KEY_DESC</option>
|
||||
<option value="text ASC">COM_LANGUAGES_VIEW_OVERRIDES_TEXT_ASC</option>
|
||||
<option value="text DESC">COM_LANGUAGES_VIEW_OVERRIDES_TEXT_DESC</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="limit"
|
||||
type="limitbox"
|
||||
label="JGLOBAL_LIST_LIMIT"
|
||||
default="25"
|
||||
class="js-select-submit-on-change"
|
||||
/>
|
||||
</fields>
|
||||
</form>
|
||||
109
administrator/components/com_languages/forms/language.xml
Normal file
109
administrator/components/com_languages/forms/language.xml
Normal file
@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form>
|
||||
<fieldset>
|
||||
<field
|
||||
name="lang_id"
|
||||
type="text"
|
||||
label="JGLOBAL_FIELD_ID_LABEL"
|
||||
class="readonly"
|
||||
default="0"
|
||||
readonly="true"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="lang_code"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_FIELD_LANG_TAG_LABEL"
|
||||
description="COM_LANGUAGES_FIELD_LANG_TAG_DESC"
|
||||
maxlength="7"
|
||||
required="true"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="title"
|
||||
type="text"
|
||||
label="JGLOBAL_TITLE"
|
||||
maxlength="50"
|
||||
required="true"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="title_native"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_FIELD_TITLE_NATIVE_LABEL"
|
||||
maxlength="50"
|
||||
required="true"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="sef"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_FIELD_LANG_CODE_LABEL"
|
||||
description="COM_LANGUAGES_FIELD_LANG_CODE_DESC"
|
||||
maxlength="50"
|
||||
required="true"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="image"
|
||||
type="filelist"
|
||||
label="COM_LANGUAGES_FIELD_IMAGE_LABEL"
|
||||
stripext="1"
|
||||
directory="media/mod_languages/images/"
|
||||
hide_none="1"
|
||||
hide_default="1"
|
||||
fileFilter="\.gif$"
|
||||
validate="options"
|
||||
>
|
||||
<option value="">JNONE</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="description"
|
||||
type="textarea"
|
||||
label="JGLOBAL_DESCRIPTION"
|
||||
cols="80"
|
||||
rows="5"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="published"
|
||||
type="list"
|
||||
label="JSTATUS"
|
||||
class="form-select-color-state"
|
||||
default="1"
|
||||
validate="options"
|
||||
>
|
||||
<option value="1">JPUBLISHED</option>
|
||||
<option value="0">JUNPUBLISHED</option>
|
||||
<option value="-2">JTRASHED</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="access"
|
||||
type="accesslevel"
|
||||
label="JFIELD_ACCESS_LABEL"
|
||||
filter="UINT"
|
||||
validate="options"
|
||||
/>
|
||||
</fieldset>
|
||||
<fieldset name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
|
||||
<field
|
||||
name="metadesc"
|
||||
type="textarea"
|
||||
label="JFIELD_META_DESCRIPTION_LABEL"
|
||||
rows="3"
|
||||
cols="30"
|
||||
maxlength="300"
|
||||
charcounter="true"
|
||||
/>
|
||||
</fieldset>
|
||||
<fieldset name="site_name" label="COM_LANGUAGES_FIELDSET_SITE_NAME_LABEL">
|
||||
<field
|
||||
name="sitename"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_FIELD_SITE_NAME_LABEL"
|
||||
filter="string"
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
78
administrator/components/com_languages/forms/override.xml
Normal file
78
administrator/components/com_languages/forms/override.xml
Normal file
@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form>
|
||||
<fieldset>
|
||||
<field
|
||||
name="key"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_KEY_LABEL"
|
||||
required="true"
|
||||
filter="\Joomla\Component\Languages\Administrator\Helper\LanguagesHelper::filterKey"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="override"
|
||||
type="textarea"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_LABEL"
|
||||
cols="50"
|
||||
rows="5"
|
||||
filter="\Joomla\Component\Languages\Administrator\Helper\LanguagesHelper::filterText"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="both"
|
||||
type="checkbox"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_BOTH_LABEL"
|
||||
value="true"
|
||||
filter="boolean"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="searchstring"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_LABEL"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="searchtype"
|
||||
type="list"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_LABEL"
|
||||
default="value"
|
||||
validate="options"
|
||||
>
|
||||
<option value="constant">COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_CONSTANT</option>
|
||||
<option value="value">COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_TEXT</option>
|
||||
</field>
|
||||
|
||||
<field
|
||||
name="language"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_LABEL"
|
||||
filter="unset"
|
||||
readonly="true"
|
||||
class="readonly"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="client"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_LABEL"
|
||||
filter="unset"
|
||||
readonly="true"
|
||||
class="readonly"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="file"
|
||||
type="text"
|
||||
label="COM_LANGUAGES_OVERRIDE_FIELD_FILE_LABEL"
|
||||
filter="unset"
|
||||
readonly="true"
|
||||
class="readonly"
|
||||
/>
|
||||
|
||||
<field
|
||||
name="id"
|
||||
type="hidden"
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
33
administrator/components/com_languages/languages.xml
Normal file
33
administrator/components/com_languages/languages.xml
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<extension type="component" method="upgrade">
|
||||
<name>com_languages</name>
|
||||
<author>Joomla! Project</author>
|
||||
<creationDate>2006-04</creationDate>
|
||||
<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
|
||||
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
|
||||
<authorEmail>admin@joomla.org</authorEmail>
|
||||
<authorUrl>www.joomla.org</authorUrl>
|
||||
<version>4.0.0</version>
|
||||
<description>COM_LANGUAGES_XML_DESCRIPTION</description>
|
||||
<namespace path="src">Joomla\Component\Languages</namespace>
|
||||
<media destination="com_languages" folder="media">
|
||||
<folder>css</folder>
|
||||
<folder>js</folder>
|
||||
</media>
|
||||
<administration>
|
||||
<files folder="admin">
|
||||
<filename>access.xml</filename>
|
||||
<filename>config.xml</filename>
|
||||
<filename>languages.xml</filename>
|
||||
<folder>forms</folder>
|
||||
<folder>services</folder>
|
||||
<folder>src</folder>
|
||||
<folder>tmpl</folder>
|
||||
</files>
|
||||
<languages folder="admin">
|
||||
<language tag="en-GB">language/en-GB/com_languages.ini</language>
|
||||
<language tag="en-GB">language/en-GB/com_languages.sys.ini</language>
|
||||
</languages>
|
||||
</administration>
|
||||
</extension>
|
||||
|
||||
54
administrator/components/com_languages/services/provider.php
Normal file
54
administrator/components/com_languages/services/provider.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
\defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
|
||||
use Joomla\CMS\Extension\ComponentInterface;
|
||||
use Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
|
||||
use Joomla\CMS\Extension\Service\Provider\MVCFactory;
|
||||
use Joomla\CMS\HTML\Registry;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\Component\Languages\Administrator\Extension\LanguagesComponent;
|
||||
use Joomla\DI\Container;
|
||||
use Joomla\DI\ServiceProviderInterface;
|
||||
|
||||
/**
|
||||
* The language service provider.
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
return new class () implements ServiceProviderInterface {
|
||||
/**
|
||||
* Registers the service provider with a DI container.
|
||||
*
|
||||
* @param Container $container The DI container.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public function register(Container $container)
|
||||
{
|
||||
$container->registerServiceProvider(new MVCFactory('\\Joomla\\Component\\Languages'));
|
||||
$container->registerServiceProvider(new ComponentDispatcherFactory('\\Joomla\\Component\\Languages'));
|
||||
|
||||
$container->set(
|
||||
ComponentInterface::class,
|
||||
function (Container $container) {
|
||||
$component = new LanguagesComponent($container->get(ComponentDispatcherFactoryInterface::class));
|
||||
$component->setMVCFactory($container->get(MVCFactoryInterface::class));
|
||||
$component->setRegistry($container->get(Registry::class));
|
||||
|
||||
return $component;
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Controller.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class DisplayController extends BaseController
|
||||
{
|
||||
/**
|
||||
* @var string The default view.
|
||||
* @since 1.6
|
||||
*/
|
||||
protected $default_view = 'installed';
|
||||
|
||||
/**
|
||||
* Method to display a view.
|
||||
*
|
||||
* @param boolean $cachable If true, the view output will be cached.
|
||||
* @param array $urlparams An array of safe URL parameters and their variable types.
|
||||
* @see \Joomla\CMS\Filter\InputFilter::clean() for valid values.
|
||||
*
|
||||
* @return static|boolean This object to support chaining or false on failure.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public function display($cachable = false, $urlparams = false)
|
||||
{
|
||||
$view = $this->input->get('view', $this->default_view);
|
||||
$layout = $this->input->get('layout', 'default');
|
||||
$id = $this->input->getInt('id');
|
||||
|
||||
// Check for edit form.
|
||||
if ($view == 'language' && $layout == 'edit' && !$this->checkEditId('com_languages.edit.language', $id)) {
|
||||
// Somehow the person just went to the form - we don't allow that.
|
||||
if (!\count($this->app->getMessageQueue())) {
|
||||
$this->setMessage(Text::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id), 'error');
|
||||
}
|
||||
|
||||
$this->setRedirect(Route::_('index.php?option=com_languages&view=languages', false));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent::display();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Language;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Multilanguage;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Controller.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class InstalledController extends BaseController
|
||||
{
|
||||
/**
|
||||
* Task to set the default language.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setDefault()
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
$cid = (string) $this->input->get('cid', '', 'string');
|
||||
$model = $this->getModel('installed');
|
||||
|
||||
if ($model->publish($cid)) {
|
||||
// Switching to the new administrator language for the message
|
||||
if ($model->getState('client_id') == 1) {
|
||||
$language = Factory::getLanguage();
|
||||
$newLang = Language::getInstance($cid);
|
||||
Factory::$language = $newLang;
|
||||
$this->app->loadLanguage($language = $newLang);
|
||||
$newLang->load('com_languages', JPATH_ADMINISTRATOR);
|
||||
}
|
||||
|
||||
if (Multilanguage::isEnabled() && $model->getState('client_id') == 0) {
|
||||
$msg = Text::_('COM_LANGUAGES_MSG_DEFAULT_MULTILANG_SAVED');
|
||||
$type = 'message';
|
||||
} else {
|
||||
$msg = Text::_('COM_LANGUAGES_MSG_DEFAULT_LANGUAGE_SAVED');
|
||||
$type = 'message';
|
||||
}
|
||||
} else {
|
||||
$msg = $model->getError();
|
||||
$type = 'error';
|
||||
}
|
||||
|
||||
$clientId = $model->getState('client_id');
|
||||
$this->setRedirect('index.php?option=com_languages&view=installed&client=' . $clientId, $msg, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Task to switch the administrator language.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function switchAdminLanguage()
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
$cid = (string) $this->input->get('cid', '', 'string');
|
||||
$model = $this->getModel('installed');
|
||||
|
||||
// Fetching the language name from the langmetadata.xml or xx-XX.xml respectively.
|
||||
$file = JPATH_ADMINISTRATOR . '/language/' . $cid . '/langmetadata.xml';
|
||||
|
||||
if (!is_file($file)) {
|
||||
$file = JPATH_ADMINISTRATOR . '/language/' . $cid . '/' . $cid . '.xml';
|
||||
}
|
||||
|
||||
$info = LanguageHelper::parseXMLLanguageFile($file);
|
||||
|
||||
if ($model->switchAdminLanguage($cid)) {
|
||||
// Switching to the new language for the message
|
||||
$languageName = $info['nativeName'];
|
||||
$language = Factory::getLanguage();
|
||||
$newLang = Language::getInstance($cid);
|
||||
Factory::$language = $newLang;
|
||||
$this->app->loadLanguage($language = $newLang);
|
||||
$newLang->load('com_languages', JPATH_ADMINISTRATOR);
|
||||
|
||||
$msg = Text::sprintf('COM_LANGUAGES_MSG_SWITCH_ADMIN_LANGUAGE_SUCCESS', $languageName);
|
||||
$type = 'message';
|
||||
} else {
|
||||
$msg = $model->getError();
|
||||
$type = 'error';
|
||||
}
|
||||
|
||||
$this->setRedirect('index.php?option=com_languages&view=installed', $msg, $type);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\MVC\Controller\FormController;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages list actions controller.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class LanguageController extends FormController
|
||||
{
|
||||
/**
|
||||
* Gets the URL arguments to append to an item redirect.
|
||||
*
|
||||
* @param int $recordId The primary key id for the item.
|
||||
* @param string $key The name of the primary key variable.
|
||||
*
|
||||
* @return string The arguments to append to the redirect URL.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getRedirectToItemAppend($recordId = null, $key = 'lang_id')
|
||||
{
|
||||
return parent::getRedirectToItemAppend($recordId, $key);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Controller\AdminController;
|
||||
use Joomla\CMS\Response\JsonResponse;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages controller Class.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class LanguagesController extends AdminController
|
||||
{
|
||||
/**
|
||||
* Method to get a model object, loading it if required.
|
||||
*
|
||||
* @param string $name The model name. Optional.
|
||||
* @param string $prefix The class prefix. Optional.
|
||||
* @param array $config Configuration array for model. Optional.
|
||||
*
|
||||
* @return object The model.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getModel($name = 'Language', $prefix = 'Administrator', $config = ['ignore_request' => true])
|
||||
{
|
||||
return parent::getModel($name, $prefix, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the number of published languages for quickicons
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 4.3.0
|
||||
*/
|
||||
public function getQuickiconContent()
|
||||
{
|
||||
$model = $this->getModel('languages');
|
||||
|
||||
$model->setState('filter.published', 1);
|
||||
|
||||
$amount = (int) $model->getTotal();
|
||||
|
||||
$result = [];
|
||||
|
||||
$result['amount'] = $amount;
|
||||
$result['sronly'] = Text::plural('COM_LANGUAGES_N_QUICKICON_SRONLY', $amount);
|
||||
$result['name'] = Text::plural('COM_LANGUAGES_N_QUICKICON', $amount);
|
||||
|
||||
echo new JsonResponse($result);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,198 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\Application\CMSWebApplicationInterface;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Controller\FormController;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Override Controller
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class OverrideController extends FormController
|
||||
{
|
||||
/**
|
||||
* Method to edit an existing override.
|
||||
*
|
||||
* @param string $key The name of the primary key of the URL variable (not used here).
|
||||
* @param string $urlVar The name of the URL variable if different from the primary key (not used here).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function edit($key = null, $urlVar = null)
|
||||
{
|
||||
// Do not cache the response to this, its a redirect
|
||||
$this->app->allowCache(false);
|
||||
|
||||
$cid = (array) $this->input->post->get('cid', [], 'string');
|
||||
$context = "$this->option.edit.$this->context";
|
||||
|
||||
// Get the constant name.
|
||||
$recordId = (\count($cid) ? $cid[0] : $this->input->get('id'));
|
||||
|
||||
// Access check.
|
||||
if (!$this->allowEdit()) {
|
||||
$this->setMessage(Text::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'), 'error');
|
||||
$this->setRedirect(Route::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->app->setUserState($context . '.data', null);
|
||||
$this->setRedirect('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, 'id'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to save an override.
|
||||
*
|
||||
* @param string $key The name of the primary key of the URL variable (not used here).
|
||||
* @param string $urlVar The name of the URL variable if different from the primary key (not used here).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function save($key = null, $urlVar = null)
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
$app = $this->app;
|
||||
$model = $this->getModel();
|
||||
$data = $this->input->post->get('jform', [], 'array');
|
||||
$context = "$this->option.edit.$this->context";
|
||||
$task = $this->getTask();
|
||||
|
||||
$recordId = $this->input->get('id');
|
||||
$data['id'] = $recordId;
|
||||
|
||||
// Access check.
|
||||
if (!$this->allowSave($data, 'id')) {
|
||||
$this->setMessage(Text::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');
|
||||
$this->setRedirect(Route::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Validate the posted data.
|
||||
$form = $model->getForm($data, false);
|
||||
|
||||
if (!$form) {
|
||||
$app->enqueueMessage($model->getError(), 'error');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Test whether the data is valid.
|
||||
$validData = $model->validate($form, $data);
|
||||
|
||||
// Check for validation errors.
|
||||
if ($validData === false) {
|
||||
// Get the validation messages.
|
||||
$errors = $model->getErrors();
|
||||
|
||||
// Push up to three validation messages out to the user.
|
||||
for ($i = 0, $n = \count($errors); $i < $n && $i < 3; $i++) {
|
||||
if ($errors[$i] instanceof \Exception) {
|
||||
$app->enqueueMessage($errors[$i]->getMessage(), CMSWebApplicationInterface::MSG_ERROR);
|
||||
} else {
|
||||
$app->enqueueMessage($errors[$i], CMSWebApplicationInterface::MSG_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
// Save the data in the session.
|
||||
$app->setUserState($context . '.data', $data);
|
||||
|
||||
// Redirect back to the edit screen.
|
||||
$this->setRedirect(
|
||||
Route::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, 'id'), false)
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Attempt to save the data.
|
||||
if (!$model->save($validData)) {
|
||||
// Save the data in the session.
|
||||
$app->setUserState($context . '.data', $validData);
|
||||
|
||||
// Redirect back to the edit screen.
|
||||
$this->setMessage(Text::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()), 'error');
|
||||
$this->setRedirect(
|
||||
Route::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, 'id'), false)
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Add message of success.
|
||||
$this->setMessage(Text::_('COM_LANGUAGES_VIEW_OVERRIDE_SAVE_SUCCESS'));
|
||||
|
||||
// Redirect the user and adjust session state based on the chosen task.
|
||||
switch ($task) {
|
||||
case 'apply':
|
||||
// Set the record data in the session.
|
||||
$app->setUserState($context . '.data', null);
|
||||
|
||||
// Redirect back to the edit screen
|
||||
$this->setRedirect(
|
||||
Route::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($validData['key'], 'id'), false)
|
||||
);
|
||||
break;
|
||||
|
||||
case 'save2new':
|
||||
// Clear the record id and data from the session.
|
||||
$app->setUserState($context . '.data', null);
|
||||
|
||||
// Redirect back to the edit screen
|
||||
$this->setRedirect(
|
||||
Route::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend(null, 'id'), false)
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
// Clear the record id and data from the session.
|
||||
$app->setUserState($context . '.data', null);
|
||||
|
||||
// Redirect to the list screen.
|
||||
$this->setRedirect(Route::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to cancel an edit.
|
||||
*
|
||||
* @param string $key The name of the primary key of the URL variable (not used here).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function cancel($key = null)
|
||||
{
|
||||
$this->checkToken();
|
||||
|
||||
$context = "$this->option.edit.$this->context";
|
||||
|
||||
$this->app->setUserState($context . '.data', null);
|
||||
$this->setRedirect(Route::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Controller\AdminController;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Overrides Controller.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class OverridesController extends AdminController
|
||||
{
|
||||
/**
|
||||
* The prefix to use with controller messages.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $text_prefix = 'COM_LANGUAGES_VIEW_OVERRIDES';
|
||||
|
||||
/**
|
||||
* Method for deleting one or more overrides.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
// Get items to delete from the request.
|
||||
$cid = (array) $this->input->get('cid', [], 'string');
|
||||
|
||||
// Remove zero values resulting from input filter
|
||||
$cid = array_filter($cid);
|
||||
|
||||
if (empty($cid)) {
|
||||
$this->setMessage(Text::_($this->text_prefix . '_NO_ITEM_SELECTED'), 'warning');
|
||||
} else {
|
||||
// Get the model.
|
||||
$model = $this->getModel('overrides');
|
||||
|
||||
// Remove the items.
|
||||
if ($model->delete($cid)) {
|
||||
$this->setMessage(Text::plural($this->text_prefix . '_N_ITEMS_DELETED', \count($cid)));
|
||||
} else {
|
||||
$this->setMessage($model->getError(), 'error');
|
||||
}
|
||||
}
|
||||
|
||||
$this->setRedirect(Route::_('index.php?option=' . $this->option . '&view=' . $this->view_list, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to purge the overrider table.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 3.4.2
|
||||
*/
|
||||
public function purge()
|
||||
{
|
||||
// Check for request forgeries.
|
||||
$this->checkToken();
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\Model\OverridesModel $model */
|
||||
$model = $this->getModel('overrides');
|
||||
$model->purge();
|
||||
$this->setRedirect(Route::_('index.php?option=com_languages&view=overrides', false));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Controller;
|
||||
|
||||
use Joomla\CMS\MVC\Controller\AdminController;
|
||||
use Joomla\CMS\Response\JsonResponse;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Strings JSON Controller
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class StringsController extends AdminController
|
||||
{
|
||||
/**
|
||||
* Method for refreshing the cache in the database with the known language strings
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function refresh()
|
||||
{
|
||||
echo new JsonResponse($this->getModel('strings')->refresh());
|
||||
}
|
||||
|
||||
/**
|
||||
* Method for searching language strings
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function search()
|
||||
{
|
||||
echo new JsonResponse($this->getModel('strings')->search());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Extension;
|
||||
|
||||
use Joomla\CMS\Extension\BootableExtensionInterface;
|
||||
use Joomla\CMS\Extension\MVCComponent;
|
||||
use Joomla\CMS\HTML\HTMLRegistryAwareTrait;
|
||||
use Joomla\Component\Languages\Administrator\Service\HTML\Languages;
|
||||
use Psr\Container\ContainerInterface;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Component class for com_languages
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
class LanguagesComponent extends MVCComponent implements BootableExtensionInterface
|
||||
{
|
||||
use HTMLRegistryAwareTrait;
|
||||
|
||||
/**
|
||||
* Booting the extension. This is the function to set up the environment of the extension like
|
||||
* registering new class loaders, etc.
|
||||
*
|
||||
* If required, some initial set up can be done from services of the container, eg.
|
||||
* registering HTML services.
|
||||
*
|
||||
* @param ContainerInterface $container The container
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public function boot(ContainerInterface $container)
|
||||
{
|
||||
$this->getRegistry()->register('languages', new Languages());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Field;
|
||||
|
||||
use Joomla\CMS\Form\Field\ListField;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Client Language List field.
|
||||
*
|
||||
* @since 3.9.0
|
||||
*/
|
||||
class LanguageclientField extends ListField
|
||||
{
|
||||
/**
|
||||
* The form field type.
|
||||
*
|
||||
* @var string
|
||||
* @since 3.9.0
|
||||
*/
|
||||
protected $type = 'Languageclient';
|
||||
|
||||
/**
|
||||
* Cached form field options.
|
||||
*
|
||||
* @var array
|
||||
* @since 3.9.0
|
||||
*/
|
||||
protected $cache = [];
|
||||
|
||||
/**
|
||||
* Method to get the field options.
|
||||
*
|
||||
* @return array The field option objects.
|
||||
*
|
||||
* @since 3.9.0
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
// Try to load the data from our mini-cache.
|
||||
if (!empty($this->cache)) {
|
||||
return $this->cache;
|
||||
}
|
||||
|
||||
// Get all languages of frontend and backend.
|
||||
$languages = [];
|
||||
$site_languages = LanguageHelper::getKnownLanguages(JPATH_SITE);
|
||||
$admin_languages = LanguageHelper::getKnownLanguages(JPATH_ADMINISTRATOR);
|
||||
|
||||
// Create a single array of them.
|
||||
foreach ($site_languages as $tag => $language) {
|
||||
$languages[$tag . '0'] = Text::sprintf('COM_LANGUAGES_VIEW_OVERRIDES_LANGUAGES_BOX_ITEM', $language['name'], Text::_('JSITE'));
|
||||
}
|
||||
|
||||
foreach ($admin_languages as $tag => $language) {
|
||||
$languages[$tag . '1'] = Text::sprintf('COM_LANGUAGES_VIEW_OVERRIDES_LANGUAGES_BOX_ITEM', $language['name'], Text::_('JADMINISTRATOR'));
|
||||
}
|
||||
|
||||
// Sort it by language tag and by client after that.
|
||||
ksort($languages);
|
||||
|
||||
// Add the languages to the internal cache.
|
||||
$this->cache = array_merge(parent::getOptions(), $languages);
|
||||
|
||||
return $this->cache;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Helper;
|
||||
|
||||
use Joomla\CMS\Filter\InputFilter;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages component helper.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class LanguagesHelper
|
||||
{
|
||||
/**
|
||||
* Filter method for language keys.
|
||||
* This method will be called by \JForm while filtering the form data.
|
||||
*
|
||||
* @param string $value The language key to filter.
|
||||
*
|
||||
* @return string The filtered language key.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public static function filterKey($value)
|
||||
{
|
||||
$filter = InputFilter::getInstance([], [], InputFilter::ONLY_BLOCK_DEFINED_TAGS, InputFilter::ONLY_BLOCK_DEFINED_ATTRIBUTES);
|
||||
|
||||
return strtoupper($filter->clean($value, 'cmd'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter method for language strings.
|
||||
* This method will be called by \JForm while filtering the form data.
|
||||
*
|
||||
* @param string $value The language string to filter.
|
||||
*
|
||||
* @return string The filtered language string.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public static function filterText($value)
|
||||
{
|
||||
$filter = InputFilter::getInstance([], [], InputFilter::ONLY_BLOCK_DEFINED_TAGS, InputFilter::ONLY_BLOCK_DEFINED_ATTRIBUTES);
|
||||
|
||||
return $filter->clean($value);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,351 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Helper;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Log\Log;
|
||||
use Joomla\Registry\Registry;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Multilang status helper.
|
||||
*
|
||||
* @since 1.7.1
|
||||
*/
|
||||
abstract class MultilangstatusHelper
|
||||
{
|
||||
/**
|
||||
* Method to get the number of published home pages.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public static function getHomes()
|
||||
{
|
||||
// Check for multiple Home pages.
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true)
|
||||
->select('COUNT(*)')
|
||||
->from($db->quoteName('#__menu'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('home') . ' = 1',
|
||||
$db->quoteName('published') . ' = 1',
|
||||
$db->quoteName('client_id') . ' = 0',
|
||||
]
|
||||
);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
return $db->loadResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the number of published language switcher modules.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public static function getLangswitchers()
|
||||
{
|
||||
// Check if switcher is published.
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true)
|
||||
->select('COUNT(*)')
|
||||
->from($db->quoteName('#__modules'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('module') . ' = ' . $db->quote('mod_languages'),
|
||||
$db->quoteName('published') . ' = 1',
|
||||
$db->quoteName('client_id') . ' = 0',
|
||||
]
|
||||
);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
return $db->loadResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to return a list of published content languages.
|
||||
*
|
||||
* @return array of language objects.
|
||||
*/
|
||||
public static function getContentlangs()
|
||||
{
|
||||
// Check for published Content Languages.
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true)
|
||||
->select(
|
||||
[
|
||||
$db->quoteName('lang_code'),
|
||||
$db->quoteName('published'),
|
||||
$db->quoteName('sef'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__languages'));
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
return $db->loadObjectList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to return combined language status.
|
||||
*
|
||||
* @return array of language objects.
|
||||
*/
|
||||
public static function getStatus()
|
||||
{
|
||||
// Check for combined status.
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
// Select all fields from the languages table.
|
||||
$query->select(
|
||||
[
|
||||
$db->quoteName('a') . '.*',
|
||||
$db->quoteName('a.published'),
|
||||
$db->quoteName('a.lang_code'),
|
||||
$db->quoteName('e.enabled'),
|
||||
$db->quoteName('e.element'),
|
||||
$db->quoteName('l.home'),
|
||||
$db->quoteName('l.published', 'home_published'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__languages', 'a'))
|
||||
->join(
|
||||
'LEFT',
|
||||
$db->quoteName('#__menu', 'l'),
|
||||
$db->quoteName('l.language') . ' = ' . $db->quoteName('a.lang_code')
|
||||
. ' AND ' . $db->quoteName('l.home') . ' = 1 AND ' . $db->quoteName('l.language') . ' <> ' . $db->quote('*')
|
||||
)
|
||||
->join('LEFT', $db->quoteName('#__extensions', 'e'), $db->quoteName('e.element') . ' = ' . $db->quoteName('a.lang_code'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('e.client_id') . ' = 0',
|
||||
$db->quoteName('e.enabled') . ' = 1',
|
||||
$db->quoteName('e.state') . ' = 0',
|
||||
]
|
||||
);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
return $db->loadObjectList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to return a list of contact objects.
|
||||
*
|
||||
* @return array of contact objects.
|
||||
*/
|
||||
public static function getContacts()
|
||||
{
|
||||
$db = Factory::getDbo();
|
||||
$languages = \count(LanguageHelper::getLanguages());
|
||||
|
||||
// Get the number of contact with all as language
|
||||
$alang = $db->getQuery(true)
|
||||
->select('COUNT(*)')
|
||||
->from($db->quoteName('#__contact_details', 'cd'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('cd.user_id') . ' = ' . $db->quoteName('u.id'),
|
||||
$db->quoteName('cd.published') . ' = 1',
|
||||
$db->quoteName('cd.language') . ' = ' . $db->quote('*'),
|
||||
]
|
||||
);
|
||||
|
||||
// Get the number of languages for the contact
|
||||
$slang = $db->getQuery(true)
|
||||
->select('COUNT(DISTINCT ' . $db->quoteName('l.lang_code') . ')')
|
||||
->from($db->quoteName('#__languages', 'l'))
|
||||
->join('LEFT', $db->quoteName('#__contact_details', 'cd'), $db->quoteName('cd.language') . ' = ' . $db->quoteName('l.lang_code'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('cd.user_id') . ' = ' . $db->quoteName('u.id'),
|
||||
$db->quoteName('cd.published') . ' = 1',
|
||||
$db->quoteName('l.published') . ' = 1',
|
||||
]
|
||||
);
|
||||
|
||||
// Get the number of multiple contact/language
|
||||
$mlang = $db->getQuery(true)
|
||||
->select('COUNT(*)')
|
||||
->from($db->quoteName('#__languages', 'l'))
|
||||
->join('LEFT', $db->quoteName('#__contact_details', 'cd'), $db->quoteName('cd.language') . ' = ' . $db->quoteName('l.lang_code'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('cd.user_id') . ' = ' . $db->quoteName('u.id'),
|
||||
$db->quoteName('cd.published') . ' = 1',
|
||||
$db->quoteName('l.published') . ' = 1',
|
||||
]
|
||||
)
|
||||
->group($db->quoteName('l.lang_code'))
|
||||
->having('COUNT(*) > 1');
|
||||
|
||||
// Get the contacts
|
||||
$subQuery = $db->getQuery(true)
|
||||
->select('1')
|
||||
->from($db->quoteName('#__content', 'c'))
|
||||
->where($db->quoteName('c.created_by') . ' = ' . $db->quoteName('u.id'));
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->select(
|
||||
[
|
||||
$db->quoteName('u.name'),
|
||||
'(' . $alang . ') AS ' . $db->quoteName('alang'),
|
||||
'(' . $slang . ') AS ' . $db->quoteName('slang'),
|
||||
'(' . $mlang . ') AS ' . $db->quoteName('mlang'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__users', 'u'))
|
||||
->join('LEFT', $db->quoteName('#__contact_details', 'cd'), $db->quoteName('cd.user_id') . ' = ' . $db->quoteName('u.id'))
|
||||
->where('EXISTS (' . $subQuery . ')')
|
||||
->group(
|
||||
[
|
||||
$db->quoteName('u.id'),
|
||||
$db->quoteName('u.name'),
|
||||
]
|
||||
);
|
||||
|
||||
$db->setQuery($query);
|
||||
$warnings = $db->loadObjectList();
|
||||
|
||||
foreach ($warnings as $index => $warn) {
|
||||
if ($warn->alang == 1 && $warn->slang == 0) {
|
||||
unset($warnings[$index]);
|
||||
}
|
||||
|
||||
if ($warn->alang == 0 && $warn->slang == 0 && empty($warn->mlang)) {
|
||||
unset($warnings[$index]);
|
||||
}
|
||||
|
||||
if ($warn->alang == 0 && $warn->slang == $languages && empty($warn->mlang)) {
|
||||
unset($warnings[$index]);
|
||||
}
|
||||
}
|
||||
|
||||
return $warnings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the status of the module displaying the menutype of the default Home page set to All languages.
|
||||
*
|
||||
* @return boolean True if the module is published, false otherwise.
|
||||
*
|
||||
* @since 3.7.0
|
||||
*/
|
||||
public static function getDefaultHomeModule()
|
||||
{
|
||||
// Find Default Home menutype.
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true)
|
||||
->select($db->quoteName('menutype'))
|
||||
->from($db->quoteName('#__menu'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('home') . ' = 1',
|
||||
$db->quoteName('published') . ' = 1',
|
||||
$db->quoteName('client_id') . ' = 0',
|
||||
$db->quoteName('language') . ' = ' . $db->quote('*'),
|
||||
]
|
||||
);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
$menutype = $db->loadResult();
|
||||
|
||||
// Get published site menu modules titles.
|
||||
$query->clear()
|
||||
->select($db->quoteName('title'))
|
||||
->from($db->quoteName('#__modules'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('module') . ' = ' . $db->quote('mod_menu'),
|
||||
$db->quoteName('published') . ' = 1',
|
||||
$db->quoteName('client_id') . ' = 0',
|
||||
]
|
||||
);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
$menutitles = $db->loadColumn();
|
||||
|
||||
// Do we have a published menu module displaying the default Home menu item set to all languages?
|
||||
foreach ($menutitles as $menutitle) {
|
||||
$module = self::getModule('mod_menu', $menutitle);
|
||||
$moduleParams = new Registry($module->params);
|
||||
$param = $moduleParams->get('menutype', '');
|
||||
|
||||
if ($param && $param != $menutype) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module by name
|
||||
*
|
||||
* @param string $moduleName The name of the module
|
||||
* @param string $instanceTitle The title of the module, optional
|
||||
*
|
||||
* @return \stdClass The Module object
|
||||
*
|
||||
* @since 3.7.0
|
||||
*/
|
||||
public static function getModule($moduleName, $instanceTitle = null)
|
||||
{
|
||||
$db = Factory::getDbo();
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->select(
|
||||
[
|
||||
$db->quoteName('id'),
|
||||
$db->quoteName('title'),
|
||||
$db->quoteName('module'),
|
||||
$db->quoteName('position'),
|
||||
$db->quoteName('content'),
|
||||
$db->quoteName('showtitle'),
|
||||
$db->quoteName('params'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__modules'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('module') . ' = :module',
|
||||
$db->quoteName('published') . ' = 1',
|
||||
$db->quoteName('client_id') . ' = 0',
|
||||
]
|
||||
)
|
||||
->bind(':module', $moduleName);
|
||||
|
||||
if ($instanceTitle) {
|
||||
$query->where($db->quoteName('title') . ' = :title')
|
||||
->bind(':title', $instanceTitle);
|
||||
}
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$modules = $db->loadObject();
|
||||
} catch (\RuntimeException $e) {
|
||||
Log::add(Text::sprintf('JLIB_APPLICATION_ERROR_MODULE_LOAD', $e->getMessage()), Log::WARNING, 'jerror');
|
||||
}
|
||||
|
||||
return $modules;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,388 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Application\ApplicationHelper;
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Filesystem\Folder;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\CMS\MVC\Model\ListModel;
|
||||
use Joomla\CMS\Table\Table;
|
||||
use Joomla\Utilities\ArrayHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Component Languages Model
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class InstalledModel extends ListModel
|
||||
{
|
||||
/**
|
||||
* @var object user object
|
||||
*/
|
||||
protected $user = null;
|
||||
|
||||
/**
|
||||
* @var string option name
|
||||
*/
|
||||
protected $option = null;
|
||||
|
||||
/**
|
||||
* @var array languages description
|
||||
*/
|
||||
protected $data = null;
|
||||
|
||||
/**
|
||||
* @var integer total number of languages
|
||||
*/
|
||||
protected $total = null;
|
||||
|
||||
/**
|
||||
* @var string language path
|
||||
*/
|
||||
protected $path = null;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $config An optional associative array of configuration settings.
|
||||
* @param ?MVCFactoryInterface $factory The factory.
|
||||
*
|
||||
* @see \Joomla\CMS\MVC\Model\BaseDatabaseModel
|
||||
* @since 3.2
|
||||
*/
|
||||
public function __construct($config = [], ?MVCFactoryInterface $factory = null)
|
||||
{
|
||||
if (empty($config['filter_fields'])) {
|
||||
$config['filter_fields'] = [
|
||||
'name',
|
||||
'nativeName',
|
||||
'language',
|
||||
'author',
|
||||
'published',
|
||||
'version',
|
||||
'creationDate',
|
||||
'author',
|
||||
'authorEmail',
|
||||
'extension_id',
|
||||
'client_id',
|
||||
];
|
||||
}
|
||||
|
||||
parent::__construct($config, $factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @param string $ordering An optional ordering field.
|
||||
* @param string $direction An optional direction (asc|desc).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function populateState($ordering = 'name', $direction = 'asc')
|
||||
{
|
||||
// Special case for client id.
|
||||
$clientId = (int) $this->getUserStateFromRequest($this->context . '.client_id', 'client_id', 0, 'int');
|
||||
$clientId = (!\in_array($clientId, [0, 1])) ? 0 : $clientId;
|
||||
$this->setState('client_id', $clientId);
|
||||
|
||||
// Load the parameters.
|
||||
$params = ComponentHelper::getParams('com_languages');
|
||||
$this->setState('params', $params);
|
||||
|
||||
// List state information.
|
||||
parent::populateState($ordering, $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a store id based on model configuration state.
|
||||
*
|
||||
* This is necessary because the model is used by the component and
|
||||
* different modules that might need different sets of data or different
|
||||
* ordering requirements.
|
||||
*
|
||||
* @param string $id A prefix for the store id.
|
||||
*
|
||||
* @return string A store id.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getStoreId($id = '')
|
||||
{
|
||||
// Compile the store id.
|
||||
$id .= ':' . $this->getState('client_id');
|
||||
$id .= ':' . $this->getState('filter.search');
|
||||
|
||||
return parent::getStoreId($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the client object.
|
||||
*
|
||||
* @return object
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getClient()
|
||||
{
|
||||
return ApplicationHelper::getClientInfo($this->getState('client_id', 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the option.
|
||||
*
|
||||
* @return object
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getOption()
|
||||
{
|
||||
$option = $this->getState('option');
|
||||
|
||||
return $option;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get Languages item data.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
// Fetch language data if not fetched yet.
|
||||
if (\is_null($this->data)) {
|
||||
$this->data = [];
|
||||
|
||||
$isCurrentLanguageRtl = Factory::getLanguage()->isRtl();
|
||||
$params = ComponentHelper::getParams('com_languages');
|
||||
$installedLanguages = LanguageHelper::getInstalledLanguages(null, true, true, null, null, null);
|
||||
|
||||
// Compute all the languages.
|
||||
foreach ($installedLanguages as $clientId => $languages) {
|
||||
$defaultLanguage = $params->get(ApplicationHelper::getClientInfo($clientId)->name, 'en-GB');
|
||||
|
||||
foreach ($languages as $lang) {
|
||||
$row = new \stdClass();
|
||||
$row->language = $lang->element;
|
||||
$row->name = $lang->metadata['name'];
|
||||
$row->nativeName = $lang->metadata['nativeName'] ?? '-';
|
||||
$row->client_id = (int) $lang->client_id;
|
||||
$row->extension_id = (int) $lang->extension_id;
|
||||
$row->author = $lang->manifest['author'];
|
||||
$row->creationDate = $lang->manifest['creationDate'];
|
||||
$row->authorEmail = $lang->manifest['authorEmail'];
|
||||
$row->version = $lang->manifest['version'];
|
||||
$row->published = $defaultLanguage === $row->language ? 1 : 0;
|
||||
$row->checked_out = null;
|
||||
|
||||
// Fix wrongly set parentheses in RTL languages
|
||||
if ($isCurrentLanguageRtl) {
|
||||
$row->name = html_entity_decode($row->name . '‎', ENT_QUOTES, 'UTF-8');
|
||||
$row->nativeName = html_entity_decode($row->nativeName . '‎', ENT_QUOTES, 'UTF-8');
|
||||
}
|
||||
|
||||
$this->data[] = $row;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$installedLanguages = array_merge($this->data);
|
||||
|
||||
// Process filters.
|
||||
$clientId = (int) $this->getState('client_id');
|
||||
$search = $this->getState('filter.search');
|
||||
|
||||
foreach ($installedLanguages as $key => $installedLanguage) {
|
||||
// Filter by client id.
|
||||
if (\in_array($clientId, [0, 1])) {
|
||||
if ($installedLanguage->client_id !== $clientId) {
|
||||
unset($installedLanguages[$key]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Filter by search term.
|
||||
if (!empty($search)) {
|
||||
if (
|
||||
stripos($installedLanguage->name, $search) === false
|
||||
&& stripos($installedLanguage->nativeName, $search) === false
|
||||
&& stripos($installedLanguage->language, $search) === false
|
||||
) {
|
||||
unset($installedLanguages[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Process ordering.
|
||||
$listOrder = $this->getState('list.ordering', 'name');
|
||||
$listDirn = $this->getState('list.direction', 'ASC');
|
||||
$installedLanguages = ArrayHelper::sortObjects($installedLanguages, $listOrder, strtolower($listDirn) === 'desc' ? -1 : 1, true, true);
|
||||
|
||||
// Process pagination.
|
||||
$limit = (int) $this->getState('list.limit', 25);
|
||||
|
||||
// Sets the total for pagination.
|
||||
$this->total = \count($installedLanguages);
|
||||
|
||||
if ($limit !== 0) {
|
||||
$start = (int) $this->getState('list.start', 0);
|
||||
|
||||
return \array_slice($installedLanguages, $start, $limit);
|
||||
}
|
||||
|
||||
return $installedLanguages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the total number of Languages items.
|
||||
*
|
||||
* @return integer
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getTotal()
|
||||
{
|
||||
if (\is_null($this->total)) {
|
||||
$this->getData();
|
||||
}
|
||||
|
||||
return $this->total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to set the default language.
|
||||
*
|
||||
* @param integer $cid Id of the language to publish.
|
||||
*
|
||||
* @return boolean
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function publish($cid)
|
||||
{
|
||||
if ($cid) {
|
||||
$client = $this->getClient();
|
||||
|
||||
$params = ComponentHelper::getParams('com_languages');
|
||||
$params->set($client->name, $cid);
|
||||
|
||||
$table = Table::getInstance('extension', 'Joomla\\CMS\\Table\\');
|
||||
$id = $table->find(['element' => 'com_languages']);
|
||||
|
||||
// Load.
|
||||
if (!$table->load($id)) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$table->params = (string) $params;
|
||||
|
||||
// Pre-save checks.
|
||||
if (!$table->check()) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Save the changes.
|
||||
if (!$table->store()) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$this->setError(Text::_('COM_LANGUAGES_ERR_NO_LANGUAGE_SELECTED'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Clean the cache of com_languages and component cache.
|
||||
$this->cleanCache();
|
||||
$this->cleanCache('_system');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the folders.
|
||||
*
|
||||
* @return array Languages folders.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getFolders()
|
||||
{
|
||||
if (\is_null($this->folders)) {
|
||||
$path = $this->getPath();
|
||||
$this->folders = Folder::folders($path, '.', false, false, ['.svn', 'CVS', '.DS_Store', '__MACOSX', 'pdf_fonts', 'overrides']);
|
||||
}
|
||||
|
||||
return $this->folders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the path.
|
||||
*
|
||||
* @return string The path to the languages folders.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getPath()
|
||||
{
|
||||
if (\is_null($this->path)) {
|
||||
$client = $this->getClient();
|
||||
$this->path = LanguageHelper::getLanguagePath($client->path);
|
||||
}
|
||||
|
||||
return $this->path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to switch the administrator language.
|
||||
*
|
||||
* @param string $cid The language tag.
|
||||
*
|
||||
* @return boolean
|
||||
*
|
||||
* @since 3.5
|
||||
*/
|
||||
public function switchAdminLanguage($cid)
|
||||
{
|
||||
if ($cid) {
|
||||
$client = $this->getClient();
|
||||
|
||||
if ($client->name == 'administrator') {
|
||||
Factory::getApplication()->setUserState('application.lang', $cid);
|
||||
}
|
||||
} else {
|
||||
Factory::getApplication()->enqueueMessage(Text::_('COM_LANGUAGES_ERR_NO_LANGUAGE_SELECTED'), 'error');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,283 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Application\ApplicationHelper;
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\CMS\MVC\Model\AdminModel;
|
||||
use Joomla\CMS\Object\CMSObject;
|
||||
use Joomla\CMS\Plugin\PluginHelper;
|
||||
use Joomla\CMS\Table\Table;
|
||||
use Joomla\Utilities\ArrayHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Component Language Model
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class LanguageModel extends AdminModel
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $config An optional associative array of configuration settings.
|
||||
* @param ?MVCFactoryInterface $factory The factory.
|
||||
*
|
||||
* @see \Joomla\CMS\MVC\Model\BaseDatabaseModel
|
||||
* @since 3.2
|
||||
*/
|
||||
public function __construct($config = [], ?MVCFactoryInterface $factory = null)
|
||||
{
|
||||
$config = array_merge(
|
||||
[
|
||||
'event_after_save' => 'onExtensionAfterSave',
|
||||
'event_before_save' => 'onExtensionBeforeSave',
|
||||
'events_map' => [
|
||||
'save' => 'extension',
|
||||
],
|
||||
],
|
||||
$config
|
||||
);
|
||||
|
||||
parent::__construct($config, $factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Override to get the table.
|
||||
*
|
||||
* @param string $name Name of the table.
|
||||
* @param string $prefix Table name prefix.
|
||||
* @param array $options Array of options.
|
||||
*
|
||||
* @return Table
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getTable($name = '', $prefix = '', $options = [])
|
||||
{
|
||||
return Table::getInstance('Language', 'Joomla\\CMS\\Table\\');
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function populateState()
|
||||
{
|
||||
$app = Factory::getApplication();
|
||||
$params = ComponentHelper::getParams('com_languages');
|
||||
|
||||
// Load the User state.
|
||||
$langId = $app->getInput()->getInt('lang_id');
|
||||
$this->setState('language.id', $langId);
|
||||
|
||||
// Load the parameters.
|
||||
$this->setState('params', $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a member item.
|
||||
*
|
||||
* @param integer $langId The id of the member to get.
|
||||
*
|
||||
* @return mixed User data object on success, false on failure.
|
||||
*
|
||||
* @since 1.0
|
||||
*/
|
||||
public function getItem($langId = null)
|
||||
{
|
||||
$langId = (!empty($langId)) ? $langId : (int) $this->getState('language.id');
|
||||
|
||||
// Get a member row instance.
|
||||
$table = $this->getTable();
|
||||
|
||||
// Attempt to load the row.
|
||||
$return = $table->load($langId);
|
||||
|
||||
// Check for a table object error.
|
||||
if ($return === false && $table->getError()) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set a valid accesslevel in case '0' is stored due to a bug in the installation SQL (was fixed with PR 2714).
|
||||
if ($table->access == '0') {
|
||||
$table->access = (int) Factory::getApplication()->get('access');
|
||||
}
|
||||
|
||||
$properties = $table->getProperties(1);
|
||||
$value = ArrayHelper::toObject($properties, CMSObject::class);
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the group form.
|
||||
*
|
||||
* @param array $data Data for the form.
|
||||
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
|
||||
*
|
||||
* @return \Joomla\CMS\Form\Form|bool A Form object on success, false on failure.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getForm($data = [], $loadData = true)
|
||||
{
|
||||
// Get the form.
|
||||
$form = $this->loadForm('com_languages.language', 'language', ['control' => 'jform', 'load_data' => $loadData]);
|
||||
|
||||
if (empty($form)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the data that should be injected in the form.
|
||||
*
|
||||
* @return mixed The data for the form.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function loadFormData()
|
||||
{
|
||||
// Check the session for previously entered form data.
|
||||
$data = Factory::getApplication()->getUserState('com_languages.edit.language.data', []);
|
||||
|
||||
if (empty($data)) {
|
||||
$data = $this->getItem();
|
||||
}
|
||||
|
||||
$this->preprocessData('com_languages.language', $data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to save the form data.
|
||||
*
|
||||
* @param array $data The form data.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function save($data)
|
||||
{
|
||||
$langId = (!empty($data['lang_id'])) ? $data['lang_id'] : (int) $this->getState('language.id');
|
||||
$isNew = true;
|
||||
|
||||
PluginHelper::importPlugin($this->events_map['save']);
|
||||
|
||||
$table = $this->getTable();
|
||||
$context = $this->option . '.' . $this->name;
|
||||
|
||||
// Load the row if saving an existing item.
|
||||
if ($langId > 0) {
|
||||
$table->load($langId);
|
||||
$isNew = false;
|
||||
}
|
||||
|
||||
// Prevent white spaces, including East Asian double bytes.
|
||||
$spaces = ['/\xE3\x80\x80/', ' '];
|
||||
|
||||
$data['lang_code'] = str_replace($spaces, '', $data['lang_code']);
|
||||
|
||||
// Prevent saving an incorrect language tag
|
||||
if (!preg_match('#\b([a-z]{2,3})[-]([A-Z]{2})\b#', $data['lang_code'])) {
|
||||
$this->setError(Text::_('COM_LANGUAGES_ERROR_LANG_TAG'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$data['sef'] = str_replace($spaces, '', $data['sef']);
|
||||
$data['sef'] = ApplicationHelper::stringURLSafe($data['sef']);
|
||||
|
||||
// Prevent saving an empty url language code
|
||||
if ($data['sef'] === '') {
|
||||
$this->setError(Text::_('COM_LANGUAGES_ERROR_SEF'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Bind the data.
|
||||
if (!$table->bind($data)) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check the data.
|
||||
if (!$table->check()) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Trigger the before save event.
|
||||
$result = Factory::getApplication()->triggerEvent($this->event_before_save, [$context, &$table, $isNew]);
|
||||
|
||||
// Check the event responses.
|
||||
if (\in_array(false, $result, true)) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Store the data.
|
||||
if (!$table->store()) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Trigger the after save event.
|
||||
Factory::getApplication()->triggerEvent($this->event_after_save, [$context, &$table, $isNew]);
|
||||
|
||||
$this->setState('language.id', $table->lang_id);
|
||||
|
||||
// Clean the cache.
|
||||
$this->cleanCache();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom clean cache method.
|
||||
*
|
||||
* @param string $group Optional cache group name.
|
||||
* @param integer $clientId No longer used, will be removed without replacement
|
||||
* @deprecated 4.3 will be removed in 6.0
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function cleanCache($group = null, $clientId = 0)
|
||||
{
|
||||
parent::cleanCache('_system');
|
||||
parent::cleanCache('com_languages');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,236 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\CMS\MVC\Model\ListModel;
|
||||
use Joomla\CMS\Table\Table;
|
||||
use Joomla\Database\ParameterType;
|
||||
use Joomla\Database\QueryInterface;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Model Class
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class LanguagesModel extends ListModel
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $config An optional associative array of configuration settings.
|
||||
* @param ?MVCFactoryInterface $factory The factory.
|
||||
*
|
||||
* @see \Joomla\CMS\MVC\Model\BaseDatabaseModel
|
||||
* @since 3.2
|
||||
*/
|
||||
public function __construct($config = [], ?MVCFactoryInterface $factory = null)
|
||||
{
|
||||
if (empty($config['filter_fields'])) {
|
||||
$config['filter_fields'] = [
|
||||
'lang_id', 'a.lang_id',
|
||||
'lang_code', 'a.lang_code',
|
||||
'title', 'a.title',
|
||||
'title_native', 'a.title_native',
|
||||
'sef', 'a.sef',
|
||||
'image', 'a.image',
|
||||
'published', 'a.published',
|
||||
'ordering', 'a.ordering',
|
||||
'access', 'a.access', 'access_level',
|
||||
'home', 'l.home',
|
||||
];
|
||||
}
|
||||
|
||||
parent::__construct($config, $factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @param string $ordering An optional ordering field.
|
||||
* @param string $direction An optional direction (asc|desc).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function populateState($ordering = 'a.ordering', $direction = 'asc')
|
||||
{
|
||||
// Load the parameters.
|
||||
$params = ComponentHelper::getParams('com_languages');
|
||||
$this->setState('params', $params);
|
||||
|
||||
// List state information.
|
||||
parent::populateState($ordering, $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a store id based on model configuration state.
|
||||
*
|
||||
* This is necessary because the model is used by the component and
|
||||
* different modules that might need different sets of data or different
|
||||
* ordering requirements.
|
||||
*
|
||||
* @param string $id A prefix for the store id.
|
||||
*
|
||||
* @return string A store id.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getStoreId($id = '')
|
||||
{
|
||||
// Compile the store id.
|
||||
$id .= ':' . $this->getState('filter.search');
|
||||
$id .= ':' . $this->getState('filter.access');
|
||||
$id .= ':' . $this->getState('filter.published');
|
||||
|
||||
return parent::getStoreId($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to build an SQL query to load the list data.
|
||||
*
|
||||
* @return QueryInterface An SQL query
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getListQuery()
|
||||
{
|
||||
// Create a new query object.
|
||||
$db = $this->getDatabase();
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
// Select all fields from the languages table.
|
||||
$query->select(
|
||||
$this->getState(
|
||||
'list.select',
|
||||
[
|
||||
$db->quoteName('a') . '.*',
|
||||
]
|
||||
)
|
||||
)
|
||||
->select(
|
||||
[
|
||||
$db->quoteName('l.home'),
|
||||
$db->quoteName('ag.title', 'access_level'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__languages', 'a'))
|
||||
->join('LEFT', $db->quoteName('#__viewlevels', 'ag'), $db->quoteName('ag.id') . ' = ' . $db->quoteName('a.access'))
|
||||
->join(
|
||||
'LEFT',
|
||||
$db->quoteName('#__menu', 'l'),
|
||||
$db->quoteName('l.language') . ' = ' . $db->quoteName('a.lang_code')
|
||||
. ' AND ' . $db->quoteName('l.home') . ' = 1 AND ' . $db->quoteName('l.language') . ' <> ' . $db->quote('*')
|
||||
);
|
||||
|
||||
// Filter on the published state.
|
||||
$published = (string) $this->getState('filter.published');
|
||||
|
||||
if (is_numeric($published)) {
|
||||
$published = (int) $published;
|
||||
$query->where($db->quoteName('a.published') . ' = :published')
|
||||
->bind(':published', $published, ParameterType::INTEGER);
|
||||
} elseif ($published === '') {
|
||||
$query->where($db->quoteName('a.published') . ' IN (0, 1)');
|
||||
}
|
||||
|
||||
// Filter by search in title.
|
||||
if ($search = $this->getState('filter.search')) {
|
||||
$search = '%' . str_replace(' ', '%', trim($search)) . '%';
|
||||
$query->where($db->quoteName('a.title') . ' LIKE :search')
|
||||
->bind(':search', $search);
|
||||
}
|
||||
|
||||
// Filter by access level.
|
||||
if ($access = (int) $this->getState('filter.access')) {
|
||||
$query->where($db->quoteName('a.access') . ' = :access')
|
||||
->bind(':access', $access, ParameterType::INTEGER);
|
||||
}
|
||||
|
||||
// Add the list ordering clause.
|
||||
$query->order($db->quoteName($db->escape($this->getState('list.ordering', 'a.ordering')))
|
||||
. ' ' . $db->escape($this->getState('list.direction', 'ASC')));
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the published language(s).
|
||||
*
|
||||
* @param array $cid An array of language IDs.
|
||||
* @param integer $value The value of the published state.
|
||||
*
|
||||
* @return boolean True on success, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function setPublished($cid, $value = 0)
|
||||
{
|
||||
return Table::getInstance('Language', 'Joomla\\CMS\\Table\\')->publish($cid, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to delete records.
|
||||
*
|
||||
* @param array $pks An array of item primary keys.
|
||||
*
|
||||
* @return boolean Returns true on success, false on failure.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function delete($pks)
|
||||
{
|
||||
// Sanitize the array.
|
||||
$pks = (array) $pks;
|
||||
|
||||
// Get a row instance.
|
||||
$table = Table::getInstance('Language', 'Joomla\\CMS\\Table\\');
|
||||
|
||||
// Iterate the items to delete each one.
|
||||
foreach ($pks as $itemId) {
|
||||
if (!$table->delete((int) $itemId)) {
|
||||
$this->setError($table->getError());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Clean the cache.
|
||||
$this->cleanCache();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom clean cache method, 2 places for 2 clients.
|
||||
*
|
||||
* @param string $group Optional cache group name.
|
||||
* @param integer $clientId No longer used, will be removed without replacement
|
||||
* @deprecated 4.3 will be removed in 6.0
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function cleanCache($group = null, $clientId = 0)
|
||||
{
|
||||
parent::cleanCache('_system');
|
||||
parent::cleanCache('com_languages');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Language;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Model\AdminModel;
|
||||
use Joomla\Filesystem\Path;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Override Model
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class OverrideModel extends AdminModel
|
||||
{
|
||||
/**
|
||||
* Method to get the record form.
|
||||
*
|
||||
* @param array $data Data for the form.
|
||||
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
|
||||
*
|
||||
* @return \Joomla\CMS\Form\Form|bool A Form object on success, false on failure.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function getForm($data = [], $loadData = true)
|
||||
{
|
||||
// Get the form.
|
||||
$form = $this->loadForm('com_languages.override', 'override', ['control' => 'jform', 'load_data' => $loadData]);
|
||||
|
||||
if (empty($form)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$client = $this->getState('filter.client', 'site');
|
||||
$language = $this->getState('filter.language', 'en-GB');
|
||||
$langName = Language::getInstance($language)->getName();
|
||||
|
||||
if (!$langName) {
|
||||
// If a language only exists in frontend, its metadata cannot be
|
||||
// loaded in backend at the moment, so fall back to the language tag.
|
||||
$langName = $language;
|
||||
}
|
||||
|
||||
$form->setValue('client', null, Text::_('COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_' . strtoupper($client)));
|
||||
$form->setValue('language', null, Text::sprintf('COM_LANGUAGES_VIEW_OVERRIDE_LANGUAGE', $langName, $language));
|
||||
$form->setValue('file', null, Path::clean(\constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $language . '.override.ini'));
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the data that should be injected in the form.
|
||||
*
|
||||
* @return mixed The data for the form.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function loadFormData()
|
||||
{
|
||||
// Check the session for previously entered form data.
|
||||
$data = Factory::getApplication()->getUserState('com_languages.edit.override.data', []);
|
||||
|
||||
if (empty($data)) {
|
||||
$data = $this->getItem();
|
||||
}
|
||||
|
||||
$this->preprocessData('com_languages.override', $data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a single record.
|
||||
*
|
||||
* @param string $pk The key name.
|
||||
*
|
||||
* @return mixed Object on success, false otherwise.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function getItem($pk = null)
|
||||
{
|
||||
$input = Factory::getApplication()->getInput();
|
||||
$pk = !empty($pk) ? $pk : $input->get('id');
|
||||
$fileName = \constant('JPATH_' . strtoupper($this->getState('filter.client')))
|
||||
. '/language/overrides/' . $this->getState('filter.language', 'en-GB') . '.override.ini';
|
||||
$strings = LanguageHelper::parseIniFile($fileName);
|
||||
|
||||
$result = new \stdClass();
|
||||
$result->key = '';
|
||||
$result->override = '';
|
||||
|
||||
if (isset($strings[$pk])) {
|
||||
$result->key = $pk;
|
||||
$result->override = $strings[$pk];
|
||||
}
|
||||
|
||||
$oppositeFileName = \constant('JPATH_' . strtoupper($this->getState('filter.client') == 'site' ? 'administrator' : 'site'))
|
||||
. '/language/overrides/' . $this->getState('filter.language', 'en-GB') . '.override.ini';
|
||||
$oppositeStrings = LanguageHelper::parseIniFile($oppositeFileName);
|
||||
$result->both = isset($oppositeStrings[$pk]) && ($oppositeStrings[$pk] == $strings[$pk]);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to save the form data.
|
||||
*
|
||||
* @param array $data The form data.
|
||||
* @param boolean $oppositeClient Indicates whether the override should not be created for the current client.
|
||||
*
|
||||
* @return boolean True on success, false otherwise.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function save($data, $oppositeClient = false)
|
||||
{
|
||||
$app = Factory::getApplication();
|
||||
|
||||
if ($app->isClient('api')) {
|
||||
$client = $this->getState('filter.client');
|
||||
$language = $this->getState('filter.language');
|
||||
} else {
|
||||
$client = $app->getUserState('com_languages.overrides.filter.client', 0);
|
||||
$language = $app->getUserState('com_languages.overrides.filter.language', 'en-GB');
|
||||
}
|
||||
|
||||
// If the override should be created for both.
|
||||
if ($oppositeClient) {
|
||||
$client = 1 - $client;
|
||||
}
|
||||
|
||||
// Return false if the constant is a reserved word, i.e. YES, NO, NULL, FALSE, ON, OFF, NONE, TRUE
|
||||
$reservedWords = ['YES', 'NO', 'NULL', 'FALSE', 'ON', 'OFF', 'NONE', 'TRUE'];
|
||||
|
||||
if (\in_array($data['key'], $reservedWords)) {
|
||||
$this->setError(Text::_('COM_LANGUAGES_OVERRIDE_ERROR_RESERVED_WORDS'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$client = $client ? 'administrator' : 'site';
|
||||
|
||||
// Parse the override.ini file in order to get the keys and strings.
|
||||
$fileName = \constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $language . '.override.ini';
|
||||
$strings = LanguageHelper::parseIniFile($fileName);
|
||||
|
||||
if (isset($strings[$data['id']])) {
|
||||
// If an existent string was edited check whether
|
||||
// the name of the constant is still the same.
|
||||
if ($data['key'] == $data['id']) {
|
||||
// If yes, simply override it.
|
||||
$strings[$data['key']] = $data['override'];
|
||||
} else {
|
||||
// If no, delete the old string and prepend the new one.
|
||||
unset($strings[$data['id']]);
|
||||
$strings = [$data['key'] => $data['override']] + $strings;
|
||||
}
|
||||
} else {
|
||||
// If it is a new override simply prepend it.
|
||||
$strings = [$data['key'] => $data['override']] + $strings;
|
||||
}
|
||||
|
||||
// Write override.ini file with the strings.
|
||||
if (LanguageHelper::saveToIniFile($fileName, $strings) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the override should be stored for both clients save
|
||||
// it also for the other one and prevent endless recursion.
|
||||
if (isset($data['both']) && $data['both'] && !$oppositeClient) {
|
||||
return $this->save($data, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function populateState()
|
||||
{
|
||||
$app = Factory::getApplication();
|
||||
|
||||
if ($app->isClient('api')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$client = $app->getUserStateFromRequest('com_languages.overrides.filter.client', 'filter_client', 0, 'int') ? 'administrator' : 'site';
|
||||
$this->setState('filter.client', $client);
|
||||
|
||||
$language = $app->getUserStateFromRequest('com_languages.overrides.filter.language', 'filter_language', 'en-GB', 'cmd');
|
||||
$this->setState('filter.language', $language);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,254 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\CMS\MVC\Model\ListModel;
|
||||
use Joomla\Filesystem\File;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Overrides Model
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class OverridesModel extends ListModel
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $config An optional associative array of configuration settings.
|
||||
* @param ?MVCFactoryInterface $factory The factory.
|
||||
*
|
||||
* @see \Joomla\CMS\MVC\Model\BaseDatabaseModel
|
||||
* @since 2.5
|
||||
*/
|
||||
public function __construct($config = [], ?MVCFactoryInterface $factory = null)
|
||||
{
|
||||
if (empty($config['filter_fields'])) {
|
||||
$config['filter_fields'] = [
|
||||
'key',
|
||||
'text',
|
||||
];
|
||||
}
|
||||
|
||||
parent::__construct($config, $factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the overrides data
|
||||
*
|
||||
* @param boolean $all True if all overrides shall be returned without considering pagination, defaults to false
|
||||
*
|
||||
* @return array Array of objects containing the overrides of the override.ini file
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function getOverrides($all = false)
|
||||
{
|
||||
// Get a storage key.
|
||||
$store = $this->getStoreId();
|
||||
|
||||
// Try to load the data from internal storage.
|
||||
if (!empty($this->cache[$store])) {
|
||||
return $this->cache[$store];
|
||||
}
|
||||
|
||||
$client = strtoupper($this->getState('filter.client'));
|
||||
|
||||
// Parse the override.ini file in order to get the keys and strings.
|
||||
$fileName = \constant('JPATH_' . $client) . '/language/overrides/' . $this->getState('filter.language') . '.override.ini';
|
||||
$strings = LanguageHelper::parseIniFile($fileName);
|
||||
|
||||
// Delete the override.ini file if empty.
|
||||
if (file_exists($fileName) && $strings === []) {
|
||||
File::delete($fileName);
|
||||
}
|
||||
|
||||
// Filter the loaded strings according to the search box.
|
||||
$search = $this->getState('filter.search');
|
||||
|
||||
if ($search != '') {
|
||||
$search = preg_quote($search, '~');
|
||||
$matchvals = preg_grep('~' . $search . '~i', $strings);
|
||||
$matchkeys = array_intersect_key($strings, array_flip(preg_grep('~' . $search . '~i', array_keys($strings))));
|
||||
$strings = array_merge($matchvals, $matchkeys);
|
||||
}
|
||||
|
||||
// Consider the ordering
|
||||
if ($this->getState('list.ordering') == 'text') {
|
||||
if (strtoupper($this->getState('list.direction')) == 'DESC') {
|
||||
arsort($strings);
|
||||
} else {
|
||||
asort($strings);
|
||||
}
|
||||
} else {
|
||||
if (strtoupper($this->getState('list.direction')) == 'DESC') {
|
||||
krsort($strings);
|
||||
} else {
|
||||
ksort($strings);
|
||||
}
|
||||
}
|
||||
|
||||
// Consider the pagination.
|
||||
if (!$all && $this->getState('list.limit') && $this->getTotal() > $this->getState('list.limit')) {
|
||||
$strings = \array_slice($strings, $this->getStart(), $this->getState('list.limit'), true);
|
||||
}
|
||||
|
||||
// Add the items to the internal cache.
|
||||
$this->cache[$store] = $strings;
|
||||
|
||||
return $this->cache[$store];
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the total number of overrides.
|
||||
*
|
||||
* @return integer The total number of overrides.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function getTotal()
|
||||
{
|
||||
// Get a storage key.
|
||||
$store = $this->getStoreId('getTotal');
|
||||
|
||||
// Try to load the data from internal storage
|
||||
if (!empty($this->cache[$store])) {
|
||||
return $this->cache[$store];
|
||||
}
|
||||
|
||||
// Add the total to the internal cache.
|
||||
$this->cache[$store] = \count($this->getOverrides(true));
|
||||
|
||||
return $this->cache[$store];
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*
|
||||
* Note. Calling getState in this method will result in recursion.
|
||||
*
|
||||
* @param string $ordering An optional ordering field.
|
||||
* @param string $direction An optional direction (asc|desc).
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function populateState($ordering = 'key', $direction = 'asc')
|
||||
{
|
||||
// We call populate state first so that we can then set the filter.client and filter.language properties in afterwards
|
||||
parent::populateState($ordering, $direction);
|
||||
|
||||
$app = Factory::getApplication();
|
||||
|
||||
if ($app->isClient('api')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$language_client = $this->getUserStateFromRequest('com_languages.overrides.language_client', 'language_client', '', 'cmd');
|
||||
$client = substr($language_client, -1);
|
||||
$language = substr($language_client, 0, -1);
|
||||
|
||||
// Sets the search filter.
|
||||
$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
|
||||
$this->setState('filter.search', $search);
|
||||
|
||||
$this->setState('language_client', $language . $client);
|
||||
$this->setState('filter.client', $client ? 'administrator' : 'site');
|
||||
$this->setState('filter.language', $language);
|
||||
|
||||
// Add the 'language_client' value to the session to display a message if none selected
|
||||
$app->setUserState('com_languages.overrides.language_client', $language . $client);
|
||||
|
||||
// Add filters to the session because they won't be stored there by 'getUserStateFromRequest' if they aren't in the current request.
|
||||
$app->setUserState('com_languages.overrides.filter.client', $client);
|
||||
$app->setUserState('com_languages.overrides.filter.language', $language);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to delete one or more overrides.
|
||||
*
|
||||
* @param array $cids Array of keys to delete.
|
||||
*
|
||||
* @return integer Number of successfully deleted overrides, boolean false if an error occurred.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function delete($cids)
|
||||
{
|
||||
// Check permissions first.
|
||||
if (!$this->getCurrentUser()->authorise('core.delete', 'com_languages')) {
|
||||
$this->setError(Text::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$app = Factory::getApplication();
|
||||
|
||||
if ($app->isClient('api')) {
|
||||
$cids = (array) $cids;
|
||||
$client = $this->getState('filter.client');
|
||||
} else {
|
||||
$filterclient = Factory::getApplication()->getUserState('com_languages.overrides.filter.client');
|
||||
$client = $filterclient == 0 ? 'site' : 'administrator';
|
||||
}
|
||||
|
||||
// Parse the override.ini file in order to get the keys and strings.
|
||||
$fileName = \constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $this->getState('filter.language') . '.override.ini';
|
||||
$strings = LanguageHelper::parseIniFile($fileName);
|
||||
|
||||
// Unset strings that shall be deleted
|
||||
foreach ($cids as $key) {
|
||||
if (isset($strings[$key])) {
|
||||
unset($strings[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
// Write override.ini file with the strings.
|
||||
if (LanguageHelper::saveToIniFile($fileName, $strings) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->cleanCache();
|
||||
|
||||
return \count($cids);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all of the cached strings from the table.
|
||||
*
|
||||
* @return void|\RuntimeException
|
||||
*
|
||||
* @since 3.4.2
|
||||
*/
|
||||
public function purge()
|
||||
{
|
||||
$db = $this->getDatabase();
|
||||
|
||||
// Note: TRUNCATE is a DDL operation
|
||||
// This may or may not mean depending on your database
|
||||
try {
|
||||
$db->truncateTable('#__overrider');
|
||||
} catch (\RuntimeException $e) {
|
||||
return $e;
|
||||
}
|
||||
|
||||
Factory::getApplication()->enqueueMessage(Text::_('COM_LANGUAGES_VIEW_OVERRIDES_PURGE_SUCCESS'));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,184 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Model;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Filter\InputFilter;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
|
||||
use Joomla\Database\ParameterType;
|
||||
use Joomla\Filesystem\Folder;
|
||||
use Joomla\Filesystem\Path;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Languages Strings Model
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class StringsModel extends BaseDatabaseModel
|
||||
{
|
||||
/**
|
||||
* Method for refreshing the cache in the database with the known language strings.
|
||||
*
|
||||
* @return boolean|\Exception True on success, \Exception object otherwise.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function refresh()
|
||||
{
|
||||
$app = Factory::getApplication();
|
||||
$db = $this->getDatabase();
|
||||
|
||||
$app->setUserState('com_languages.overrides.cachedtime', null);
|
||||
|
||||
// Empty the database cache first.
|
||||
try {
|
||||
$db->truncateTable('#__overrider');
|
||||
} catch (\RuntimeException $e) {
|
||||
return $e;
|
||||
}
|
||||
|
||||
// Create the insert query.
|
||||
$query = $db->getQuery(true)
|
||||
->insert($db->quoteName('#__overrider'))
|
||||
->columns(
|
||||
[
|
||||
$db->quoteName('constant'),
|
||||
$db->quoteName('string'),
|
||||
$db->quoteName('file'),
|
||||
]
|
||||
);
|
||||
|
||||
// Initialize some variables.
|
||||
$client = $app->getUserState('com_languages.overrides.filter.client', 'site') ? 'administrator' : 'site';
|
||||
$language = $app->getUserState('com_languages.overrides.filter.language', 'en-GB');
|
||||
|
||||
$base = \constant('JPATH_' . strtoupper($client));
|
||||
$path = $base . '/language/' . $language;
|
||||
|
||||
$files = [];
|
||||
|
||||
// Parse common language directory.
|
||||
if (is_dir($path)) {
|
||||
$files = Folder::files($path, '.*ini$', false, true);
|
||||
}
|
||||
|
||||
// Parse language directories of components.
|
||||
$files = array_merge($files, Folder::files($base . '/components', '.*ini$', 3, true));
|
||||
|
||||
// Parse language directories of modules.
|
||||
$files = array_merge($files, Folder::files($base . '/modules', '.*ini$', 3, true));
|
||||
|
||||
// Parse language directories of templates.
|
||||
$files = array_merge($files, Folder::files($base . '/templates', '.*ini$', 3, true));
|
||||
|
||||
// Parse language directories of plugins.
|
||||
$files = array_merge($files, Folder::files(JPATH_PLUGINS, '.*ini$', 4, true));
|
||||
|
||||
// Parse all found ini files and add the strings to the database cache.
|
||||
foreach ($files as $file) {
|
||||
// Only process if language file is for selected language
|
||||
if (strpos($file, $language, \strlen($base)) === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$strings = LanguageHelper::parseIniFile($file);
|
||||
|
||||
if ($strings) {
|
||||
$file = Path::clean($file);
|
||||
|
||||
$query->clear('values')
|
||||
->clear('bounded');
|
||||
|
||||
foreach ($strings as $key => $string) {
|
||||
$query->values(implode(',', $query->bindArray([$key, $string, $file], ParameterType::STRING)));
|
||||
}
|
||||
|
||||
try {
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
} catch (\RuntimeException $e) {
|
||||
return $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update the cached time.
|
||||
$app->setUserState('com_languages.overrides.cachedtime.' . $client . '.' . $language, time());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method for searching language strings.
|
||||
*
|
||||
* @return array|\Exception Array of results on success, \Exception object otherwise.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function search()
|
||||
{
|
||||
$results = [];
|
||||
$input = Factory::getApplication()->getInput();
|
||||
$filter = InputFilter::getInstance();
|
||||
$db = $this->getDatabase();
|
||||
$searchTerm = $input->getString('searchstring');
|
||||
|
||||
$limitstart = $input->getInt('more');
|
||||
|
||||
try {
|
||||
$searchstring = '%' . $filter->clean($searchTerm, 'TRIM') . '%';
|
||||
|
||||
// Create the search query.
|
||||
$query = $db->getQuery(true)
|
||||
->select(
|
||||
[
|
||||
$db->quoteName('constant'),
|
||||
$db->quoteName('string'),
|
||||
$db->quoteName('file'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__overrider'));
|
||||
|
||||
if ($input->get('searchtype') === 'constant') {
|
||||
$query->where($db->quoteName('constant') . ' LIKE :search');
|
||||
} else {
|
||||
$query->where($db->quoteName('string') . ' LIKE :search');
|
||||
}
|
||||
|
||||
$query->bind(':search', $searchstring);
|
||||
|
||||
// Consider the limitstart according to the 'more' parameter and load the results.
|
||||
$query->setLimit(10, $limitstart);
|
||||
$db->setQuery($query);
|
||||
$results['results'] = $db->loadObjectList();
|
||||
|
||||
// Check whether there are more results than already loaded.
|
||||
$query->clear('select')
|
||||
->clear('limit')
|
||||
->select('COUNT(' . $db->quoteName('id') . ')');
|
||||
$db->setQuery($query);
|
||||
|
||||
if ($db->loadResult() > $limitstart + 10) {
|
||||
// If this is set a 'More Results' link will be displayed in the view.
|
||||
$results['more'] = $limitstart + 10;
|
||||
}
|
||||
} catch (\RuntimeException $e) {
|
||||
return $e;
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\Service\HTML;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Utility class working with languages
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class Languages
|
||||
{
|
||||
/**
|
||||
* Method to generate an information about the default language.
|
||||
*
|
||||
* @param boolean $published True if the language is the default.
|
||||
*
|
||||
* @return string HTML code.
|
||||
*/
|
||||
public function published($published)
|
||||
{
|
||||
if (!$published) {
|
||||
return ' ';
|
||||
}
|
||||
|
||||
return HTMLHelper::_('image', 'menu/icon-16-default.png', Text::_('COM_LANGUAGES_HEADING_DEFAULT'), null, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to generate an input radio button.
|
||||
*
|
||||
* @param integer $rowNum The row number.
|
||||
* @param string $language Language tag.
|
||||
*
|
||||
* @return string HTML code.
|
||||
*/
|
||||
public function id($rowNum, $language)
|
||||
{
|
||||
return '<input'
|
||||
. ' class="form-check-input"'
|
||||
. ' type="radio"'
|
||||
. ' id="cb' . $rowNum . '"'
|
||||
. ' name="cid"'
|
||||
. ' value="' . htmlspecialchars($language, ENT_COMPAT, 'UTF-8') . '"'
|
||||
. ' onclick="Joomla.isChecked(this.checked);"'
|
||||
. '>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to generate an array of clients.
|
||||
*
|
||||
* @return array of client objects.
|
||||
*/
|
||||
public function clients()
|
||||
{
|
||||
return [
|
||||
HTMLHelper::_('select.option', 0, Text::_('JSITE')),
|
||||
HTMLHelper::_('select.option', 1, Text::_('JADMINISTRATOR')),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of published state filter options.
|
||||
*
|
||||
* @return string The HTML code for the select tag.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function publishedOptions()
|
||||
{
|
||||
// Build the active state filter options.
|
||||
$options = [];
|
||||
$options[] = HTMLHelper::_('select.option', '1', 'JPUBLISHED');
|
||||
$options[] = HTMLHelper::_('select.option', '0', 'JUNPUBLISHED');
|
||||
$options[] = HTMLHelper::_('select.option', '-2', 'JTRASHED');
|
||||
$options[] = HTMLHelper::_('select.option', '*', 'JALL');
|
||||
|
||||
return $options;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\View\Installed;
|
||||
|
||||
use Joomla\CMS\Helper\ContentHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\View\GenericDataException;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\CMS\Toolbar\ToolbarHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Displays a list of the installed languages.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
/**
|
||||
* Option (component) name
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $option = null;
|
||||
|
||||
/**
|
||||
* The pagination object
|
||||
*
|
||||
* @var \Joomla\CMS\Pagination\Pagination
|
||||
*/
|
||||
protected $pagination;
|
||||
|
||||
/**
|
||||
* Languages information
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $rows = null;
|
||||
|
||||
/**
|
||||
* The model state
|
||||
*
|
||||
* @var \Joomla\Registry\Registry
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
protected $state;
|
||||
|
||||
/**
|
||||
* Form object for search filters
|
||||
*
|
||||
* @var \Joomla\CMS\Form\Form
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public $filterForm;
|
||||
|
||||
/**
|
||||
* The active search filters
|
||||
*
|
||||
* @var array
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public $activeFilters;
|
||||
|
||||
/**
|
||||
* Display the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->option = $this->get('Option');
|
||||
$this->pagination = $this->get('Pagination');
|
||||
$this->rows = $this->get('Data');
|
||||
$this->total = $this->get('Total');
|
||||
$this->state = $this->get('State');
|
||||
$this->filterForm = $this->get('FilterForm');
|
||||
$this->activeFilters = $this->get('ActiveFilters');
|
||||
|
||||
// Check for errors.
|
||||
if (\count($errors = $this->get('Errors'))) {
|
||||
throw new GenericDataException(implode("\n", $errors), 500);
|
||||
}
|
||||
|
||||
$this->addToolbar();
|
||||
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the page title and toolbar.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function addToolbar()
|
||||
{
|
||||
$canDo = ContentHelper::getActions('com_languages');
|
||||
$toolbar = $this->getDocument()->getToolbar();
|
||||
|
||||
if ((int) $this->state->get('client_id') === 1) {
|
||||
ToolbarHelper::title(Text::_('COM_LANGUAGES_VIEW_INSTALLED_ADMIN_TITLE'), 'comments langmanager');
|
||||
} else {
|
||||
ToolbarHelper::title(Text::_('COM_LANGUAGES_VIEW_INSTALLED_SITE_TITLE'), 'comments langmanager');
|
||||
}
|
||||
|
||||
if ($canDo->get('core.edit.state')) {
|
||||
$toolbar->makeDefault('installed.setDefault');
|
||||
$toolbar->divider();
|
||||
}
|
||||
|
||||
if ($canDo->get('core.admin')) {
|
||||
// Switch administrator language
|
||||
if ($this->state->get('client_id', 0) == 1) {
|
||||
$toolbar->standardButton('switch', 'COM_LANGUAGES_SWITCH_ADMIN', 'installed.switchadminlanguage')
|
||||
->icon('icon-refresh')
|
||||
->listCheck(true);
|
||||
$toolbar->divider();
|
||||
}
|
||||
|
||||
$toolbar->link('COM_LANGUAGES_INSTALL', 'index.php?option=com_installer&view=languages')
|
||||
->icon('icon-upload');
|
||||
$toolbar->divider();
|
||||
|
||||
$toolbar->preferences('com_languages');
|
||||
$toolbar->divider();
|
||||
}
|
||||
|
||||
$toolbar->help('Languages:_Installed');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\View\Language;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Helper\ContentHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\View\GenericDataException;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\CMS\Toolbar\Toolbar;
|
||||
use Joomla\CMS\Toolbar\ToolbarHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* HTML View class for the Languages component.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
/**
|
||||
* The active item
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
public $item;
|
||||
|
||||
/**
|
||||
* The Form object
|
||||
*
|
||||
* @var \Joomla\CMS\Form\Form
|
||||
*/
|
||||
public $form;
|
||||
|
||||
/**
|
||||
* The model state
|
||||
*
|
||||
* @var \Joomla\Registry\Registry
|
||||
*/
|
||||
public $state;
|
||||
|
||||
/**
|
||||
* The actions the user is authorised to perform
|
||||
*
|
||||
* @var \Joomla\Registry\Registry
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
protected $canDo;
|
||||
|
||||
/**
|
||||
* Display the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->item = $this->get('Item');
|
||||
$this->form = $this->get('Form');
|
||||
$this->state = $this->get('State');
|
||||
$this->canDo = ContentHelper::getActions('com_languages');
|
||||
|
||||
// Check for errors.
|
||||
if (\count($errors = $this->get('Errors'))) {
|
||||
throw new GenericDataException(implode("\n", $errors), 500);
|
||||
}
|
||||
|
||||
$this->addToolbar();
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the page title and toolbar.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function addToolbar()
|
||||
{
|
||||
Factory::getApplication()->getInput()->set('hidemainmenu', 1);
|
||||
$isNew = empty($this->item->lang_id);
|
||||
$canDo = $this->canDo;
|
||||
$toolbar = $this->getDocument()->getToolbar();
|
||||
|
||||
ToolbarHelper::title(
|
||||
Text::_($isNew ? 'COM_LANGUAGES_VIEW_LANGUAGE_EDIT_NEW_TITLE' : 'COM_LANGUAGES_VIEW_LANGUAGE_EDIT_EDIT_TITLE'),
|
||||
'comments-2 langmanager'
|
||||
);
|
||||
|
||||
if (($isNew && $canDo->get('core.create')) || (!$isNew && $canDo->get('core.edit'))) {
|
||||
$toolbar->apply('language.apply');
|
||||
}
|
||||
|
||||
$saveGroup = $toolbar->dropdownButton('save-group');
|
||||
|
||||
$saveGroup->configure(
|
||||
function (Toolbar $childBar) use ($canDo, $isNew) {
|
||||
if (($isNew && $canDo->get('core.create')) || (!$isNew && $canDo->get('core.edit'))) {
|
||||
$childBar->save('language.save');
|
||||
}
|
||||
|
||||
// If an existing item, can save to a copy only if we have create rights.
|
||||
if ($canDo->get('core.create')) {
|
||||
$childBar->save2new('language.save2new');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
if ($isNew) {
|
||||
$toolbar->cancel('language.cancel', 'JTOOLBAR_CANCEL');
|
||||
} else {
|
||||
$toolbar->cancel('language.cancel');
|
||||
}
|
||||
|
||||
$toolbar->divider();
|
||||
$toolbar->help('Languages:_Edit_Content_Language');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\View\Languages;
|
||||
|
||||
use Joomla\CMS\Helper\ContentHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\View\GenericDataException;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\CMS\Toolbar\Button\DropdownButton;
|
||||
use Joomla\CMS\Toolbar\ToolbarHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* HTML Languages View class for the Languages component.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
/**
|
||||
* An array of items
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $items;
|
||||
|
||||
/**
|
||||
* The pagination object
|
||||
*
|
||||
* @var \Joomla\CMS\Pagination\Pagination
|
||||
*/
|
||||
protected $pagination;
|
||||
|
||||
/**
|
||||
* The model state
|
||||
*
|
||||
* @var \Joomla\Registry\Registry
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
protected $state;
|
||||
|
||||
/**
|
||||
* Form object for search filters
|
||||
*
|
||||
* @var \Joomla\CMS\Form\Form
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public $filterForm;
|
||||
|
||||
/**
|
||||
* The active search filters
|
||||
*
|
||||
* @var array
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public $activeFilters;
|
||||
|
||||
/**
|
||||
* Display the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->items = $this->get('Items');
|
||||
$this->pagination = $this->get('Pagination');
|
||||
$this->state = $this->get('State');
|
||||
$this->filterForm = $this->get('FilterForm');
|
||||
$this->activeFilters = $this->get('ActiveFilters');
|
||||
|
||||
// Check for errors.
|
||||
if (\count($errors = $this->get('Errors'))) {
|
||||
throw new GenericDataException(implode("\n", $errors), 500);
|
||||
}
|
||||
|
||||
$this->addToolbar();
|
||||
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the page title and toolbar.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function addToolbar(): void
|
||||
{
|
||||
$canDo = ContentHelper::getActions('com_languages');
|
||||
$toolbar = $this->getDocument()->getToolbar();
|
||||
|
||||
ToolbarHelper::title(Text::_('COM_LANGUAGES_VIEW_LANGUAGES_TITLE'), 'comments langmanager');
|
||||
|
||||
if ($canDo->get('core.create')) {
|
||||
$toolbar->addNew('language.add');
|
||||
}
|
||||
|
||||
if ($canDo->get('core.edit.state')) {
|
||||
/** @var DropdownButton $dropdown */
|
||||
$dropdown = $toolbar->dropdownButton('status-group', 'JTOOLBAR_CHANGE_STATUS')
|
||||
->toggleSplit(false)
|
||||
->icon('icon-ellipsis-h')
|
||||
->buttonClass('btn btn-action')
|
||||
->listCheck(true);
|
||||
|
||||
$childBar = $dropdown->getChildToolbar();
|
||||
|
||||
$childBar->publish('languages.publish')->listCheck(true);
|
||||
$childBar->unpublish('languages.unpublish')->listCheck(true);
|
||||
|
||||
if ($this->state->get('filter.published') != -2) {
|
||||
$childBar->trash('languages.trash')->listCheck(true);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete')) {
|
||||
$toolbar->delete('languages.delete', 'JTOOLBAR_DELETE_FROM_TRASH')
|
||||
->message('JGLOBAL_CONFIRM_DELETE')
|
||||
->listCheck(true);
|
||||
}
|
||||
|
||||
if ($canDo->get('core.admin')) {
|
||||
// Add install languages link to the lang installer component.
|
||||
$toolbar->link('COM_LANGUAGES_INSTALL', 'index.php?option=com_installer&view=languages')
|
||||
->icon('icon-upload');
|
||||
$toolbar->divider();
|
||||
|
||||
$toolbar->preferences('com_languages');
|
||||
$toolbar->divider();
|
||||
}
|
||||
|
||||
$toolbar->help('Languages:_Content');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\View\Multilangstatus;
|
||||
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Multilanguage;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\Component\Languages\Administrator\Helper\MultilangstatusHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Displays the multilang status.
|
||||
*
|
||||
* @since 1.7.1
|
||||
*/
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
/**
|
||||
* Display the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->homes = MultilangstatusHelper::getHomes();
|
||||
$this->language_filter = Multilanguage::isEnabled();
|
||||
$this->switchers = MultilangstatusHelper::getLangswitchers();
|
||||
$this->listUsersError = MultilangstatusHelper::getContacts();
|
||||
$this->contentlangs = MultilangstatusHelper::getContentlangs();
|
||||
$this->site_langs = LanguageHelper::getInstalledLanguages(0);
|
||||
$this->statuses = MultilangstatusHelper::getStatus();
|
||||
$this->homepages = Multilanguage::getSiteHomePages();
|
||||
$this->defaultHome = MultilangstatusHelper::getDefaultHomeModule();
|
||||
$this->default_lang = ComponentHelper::getParams('com_languages')->get('site', 'en-GB');
|
||||
|
||||
parent::display($tpl);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\View\Override;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Helper\ContentHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\View\GenericDataException;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\CMS\Toolbar\Toolbar;
|
||||
use Joomla\CMS\Toolbar\ToolbarHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* View to edit a language override
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
/**
|
||||
* The form to use for the view.
|
||||
*
|
||||
* @var object
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $form;
|
||||
|
||||
/**
|
||||
* The item to edit.
|
||||
*
|
||||
* @var object
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $item;
|
||||
|
||||
/**
|
||||
* The model state.
|
||||
*
|
||||
* @var object
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $state;
|
||||
|
||||
/**
|
||||
* Displays the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->form = $this->get('Form');
|
||||
$this->item = $this->get('Item');
|
||||
$this->state = $this->get('State');
|
||||
|
||||
$app = Factory::getApplication();
|
||||
|
||||
$languageClient = $app->getUserStateFromRequest('com_languages.overrides.language_client', 'language_client');
|
||||
|
||||
if ($languageClient == null) {
|
||||
$app->enqueueMessage(Text::_('COM_LANGUAGES_OVERRIDE_FIRST_SELECT_MESSAGE'), 'warning');
|
||||
|
||||
$app->redirect('index.php?option=com_languages&view=overrides');
|
||||
}
|
||||
|
||||
// Check for errors.
|
||||
if (\count($errors = $this->get('Errors'))) {
|
||||
throw new GenericDataException(implode("\n", $errors));
|
||||
}
|
||||
|
||||
// Check whether the cache has to be refreshed.
|
||||
$cached_time = Factory::getApplication()->getUserState(
|
||||
'com_languages.overrides.cachedtime.' . $this->state->get('filter.client') . '.' . $this->state->get('filter.language'),
|
||||
0
|
||||
);
|
||||
|
||||
if (time() - $cached_time > 60 * 5) {
|
||||
$this->state->set('cache_expired', true);
|
||||
}
|
||||
|
||||
// Add strings for translations in \Javascript.
|
||||
Text::script('COM_LANGUAGES_VIEW_OVERRIDE_NO_RESULTS');
|
||||
Text::script('COM_LANGUAGES_VIEW_OVERRIDE_REQUEST_ERROR');
|
||||
|
||||
$this->addToolbar();
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the page title and toolbar.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function addToolbar()
|
||||
{
|
||||
Factory::getApplication()->getInput()->set('hidemainmenu', true);
|
||||
|
||||
$canDo = ContentHelper::getActions('com_languages');
|
||||
$toolbar = $this->getDocument()->getToolbar();
|
||||
|
||||
ToolbarHelper::title(Text::_('COM_LANGUAGES_VIEW_OVERRIDE_EDIT_TITLE'), 'comments langmanager');
|
||||
|
||||
if ($canDo->get('core.edit')) {
|
||||
$toolbar->apply('override.apply');
|
||||
}
|
||||
|
||||
$saveGroup = $toolbar->dropdownButton('save-group');
|
||||
|
||||
$saveGroup->configure(
|
||||
function (Toolbar $childBar) use ($canDo) {
|
||||
if ($canDo->get('core.edit')) {
|
||||
$childBar->save('override.save');
|
||||
}
|
||||
|
||||
// This component does not support Save as Copy.
|
||||
if ($canDo->get('core.edit') && $canDo->get('core.create')) {
|
||||
$childBar->save2new('override.save2new');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
if (empty($this->item->key)) {
|
||||
$toolbar->cancel('override.cancel', 'JTOOLBAR_CANCEL');
|
||||
} else {
|
||||
$toolbar->cancel('override.cancel');
|
||||
}
|
||||
|
||||
$toolbar->divider();
|
||||
$toolbar->help('Languages:_Edit_Override');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Languages\Administrator\View\Overrides;
|
||||
|
||||
use Joomla\CMS\Helper\ContentHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\View\GenericDataException;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\CMS\Toolbar\ToolbarHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* View for language overrides list.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
class HtmlView extends BaseHtmlView
|
||||
{
|
||||
/**
|
||||
* The items to list.
|
||||
*
|
||||
* @var array
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $items;
|
||||
|
||||
/**
|
||||
* The pagination object.
|
||||
*
|
||||
* @var object
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $pagination;
|
||||
|
||||
/**
|
||||
* The model state.
|
||||
*
|
||||
* @var object
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $state;
|
||||
|
||||
/**
|
||||
* An array containing all frontend and backend languages
|
||||
*
|
||||
* @var array
|
||||
* @since 4.0.0
|
||||
*/
|
||||
protected $languages;
|
||||
|
||||
/**
|
||||
* Form object for search filters
|
||||
*
|
||||
* @var \Joomla\CMS\Form\Form
|
||||
*/
|
||||
public $filterForm;
|
||||
|
||||
/**
|
||||
* The active search filters
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $activeFilters;
|
||||
|
||||
/**
|
||||
* Displays the view.
|
||||
*
|
||||
* @param string $tpl The name of the template file to parse.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->state = $this->get('State');
|
||||
$this->items = $this->get('Overrides');
|
||||
$this->languages = $this->get('Languages');
|
||||
$this->pagination = $this->get('Pagination');
|
||||
$this->filterForm = $this->get('FilterForm');
|
||||
$this->activeFilters = $this->get('ActiveFilters');
|
||||
|
||||
// Check for errors.
|
||||
if (\count($errors = $this->get('Errors'))) {
|
||||
throw new GenericDataException(implode("\n", $errors));
|
||||
}
|
||||
|
||||
$this->addToolbar();
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the page title and toolbar.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function addToolbar()
|
||||
{
|
||||
// Get the results for each action
|
||||
$canDo = ContentHelper::getActions('com_languages');
|
||||
$toolbar = $this->getDocument()->getToolbar();
|
||||
|
||||
ToolbarHelper::title(Text::_('COM_LANGUAGES_VIEW_OVERRIDES_TITLE'), 'comments langmanager');
|
||||
|
||||
if ($canDo->get('core.create')) {
|
||||
$toolbar->addNew('override.add');
|
||||
}
|
||||
|
||||
if ($canDo->get('core.delete') && $this->pagination->total) {
|
||||
$toolbar->delete('overrides.delete')
|
||||
->message('JGLOBAL_CONFIRM_DELETE');
|
||||
}
|
||||
|
||||
if ($this->getCurrentUser()->authorise('core.admin')) {
|
||||
$toolbar->standardButton('purge', 'COM_LANGUAGES_VIEW_OVERRIDES_PURGE', 'overrides.purge')
|
||||
->listCheck(false)
|
||||
->icon('icon-refresh');
|
||||
}
|
||||
|
||||
if ($canDo->get('core.admin')) {
|
||||
$toolbar->preferences('com_languages');
|
||||
}
|
||||
|
||||
$toolbar->divider();
|
||||
$toolbar->help('Languages:_Overrides');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\String\PunycodeHelper;
|
||||
use Joomla\CMS\Version;
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\View\Installed\HtmlView $this */
|
||||
|
||||
/** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */
|
||||
$wa = $this->getDocument()->getWebAssetManager();
|
||||
$wa->useScript('table.columns');
|
||||
|
||||
$user = $this->getCurrentUser();
|
||||
$listOrder = $this->escape($this->state->get('list.ordering'));
|
||||
$listDirn = $this->escape($this->state->get('list.direction'));
|
||||
?>
|
||||
<form action="<?php echo Route::_('index.php?option=com_languages&view=installed'); ?>" method="post" id="adminForm" name="adminForm">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div id="j-main-container" class="j-main-container">
|
||||
<?php echo LayoutHelper::render('joomla.searchtools.default', ['view' => $this]); ?>
|
||||
<?php if (empty($this->rows)) : ?>
|
||||
<div class="alert alert-info">
|
||||
<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
|
||||
<?php echo Text::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<table class="table">
|
||||
<caption class="visually-hidden">
|
||||
<?php echo Text::_('COM_LANGUAGES_INSTALLED_TABLE_CAPTION'); ?>,
|
||||
<span id="orderedBy"><?php echo Text::_('JGLOBAL_SORTED_BY'); ?> </span>,
|
||||
<span id="filteredBy"><?php echo Text::_('JGLOBAL_FILTERED_BY'); ?></span>
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="w-1">
|
||||
 
|
||||
</td>
|
||||
<th scope="col" class="w-15">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'JGLOBAL_TITLE', 'name', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-15 d-none d-md-table-cell">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_TITLE_NATIVE', 'nativeName', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_TAG', 'language', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-5 text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_DEFAULT', 'published', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-5 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_VERSION', 'version', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_DATE', 'creationDate', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_AUTHOR', 'author', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_AUTHOR_EMAIL', 'authorEmail', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-5 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'JGRID_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$version = new Version();
|
||||
$currentShortVersion = preg_replace('#^([0-9\.]+)(|.*)$#', '$1', $version->getShortVersion());
|
||||
foreach ($this->rows as $i => $row) :
|
||||
$canCreate = $user->authorise('core.create', 'com_languages');
|
||||
$canEdit = $user->authorise('core.edit', 'com_languages');
|
||||
$canChange = $user->authorise('core.edit.state', 'com_languages');
|
||||
?>
|
||||
<tr class="row<?php echo $i % 2; ?>">
|
||||
<td>
|
||||
<?php echo HTMLHelper::_('languages.id', $i, $row->language); ?>
|
||||
</td>
|
||||
<th scope="row">
|
||||
<label for="cb<?php echo $i; ?>">
|
||||
<?php echo $this->escape($row->name); ?>
|
||||
</label>
|
||||
</th>
|
||||
<td class="d-none d-md-table-cell">
|
||||
<?php echo $this->escape($row->nativeName); ?>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<?php echo $this->escape($row->language); ?>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<?php echo HTMLHelper::_('jgrid.isdefault', $row->published, $i, 'installed.', !$row->published && $canChange); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php $minorVersion = $version::MAJOR_VERSION . '.' . $version::MINOR_VERSION; ?>
|
||||
<?php // Display a Note if language pack version is not equal to Joomla version ?>
|
||||
<?php if (strpos($row->version, $minorVersion) !== 0 || strpos($row->version, $currentShortVersion) !== 0) : ?>
|
||||
<span class="badge bg-warning" title="<?php echo Text::_('JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM'); ?>"><?php echo $row->version; ?></span>
|
||||
<?php else : ?>
|
||||
<span class="badge bg-success"><?php echo $row->version; ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($row->creationDate); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($row->author); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape(PunycodeHelper::emailToUTF8($row->authorEmail)); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($row->extension_id); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<?php // load the pagination. ?>
|
||||
<?php echo $this->pagination->getListFooter(); ?>
|
||||
|
||||
<?php endif; ?>
|
||||
<input type="hidden" name="task" value="">
|
||||
<input type="hidden" name="boxchecked" value="0">
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata>
|
||||
<layout title="COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_TITLE">
|
||||
<message>
|
||||
<![CDATA[COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_DESC]]>
|
||||
</message>
|
||||
</layout>
|
||||
</metadata>
|
||||
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\View\Language\HtmlView $this */
|
||||
|
||||
/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
|
||||
$wa = $this->getDocument()->getWebAssetManager();
|
||||
$wa->useScript('keepalive')
|
||||
->useScript('form.validate')
|
||||
->useScript('com_languages.admin-language-edit-change-flag');
|
||||
|
||||
?>
|
||||
|
||||
<h2><?php echo $this->escape($this->form->getValue('title', null, Text::_('COM_LANGUAGES_LANGUAGE_NEW_LANGUAGE_TITLE'))); ?></h2>
|
||||
|
||||
<form action="<?php echo Route::_('index.php?option=com_languages&view=language&layout=edit&lang_id=' . (int) $this->item->lang_id); ?>" method="post" name="adminForm" id="language-form" aria-label="<?php echo Text::_('COM_LANGUAGES_LANGUAGE_FORM_' . ((int) $this->item->lang_id === 0 ? 'NEW' : 'EDIT'), true); ?>" class="main-card form-validate">
|
||||
|
||||
<?php echo HTMLHelper::_('uitab.startTabSet', 'myTab', ['active' => 'details', 'recall' => true, 'breakpoint' => 768]); ?>
|
||||
|
||||
<?php echo HTMLHelper::_('uitab.addTab', 'myTab', 'details', Text::_('JDETAILS')); ?>
|
||||
<fieldset id="fieldset-details" class="options-form">
|
||||
<legend><?php echo Text::_('JDETAILS'); ?></legend>
|
||||
<div>
|
||||
<?php echo $this->form->renderField('title'); ?>
|
||||
<?php echo $this->form->renderField('title_native'); ?>
|
||||
<?php echo $this->form->renderField('lang_code'); ?>
|
||||
<?php echo $this->form->renderField('sef'); ?>
|
||||
<div class="control-group">
|
||||
<div class="control-label">
|
||||
<?php echo $this->form->getLabel('image'); ?>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<?php echo $this->form->getInput('image'); ?>
|
||||
<span id="flag">
|
||||
<?php echo HTMLHelper::_('image', 'mod_languages/' . $this->form->getValue('image') . '.gif', $this->form->getValue('image'), null, true); ?>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php if ($this->canDo->get('core.edit.state')) : ?>
|
||||
<?php echo $this->form->renderField('published'); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->form->renderField('access'); ?>
|
||||
<?php echo $this->form->renderField('description'); ?>
|
||||
<?php echo $this->form->renderField('lang_id'); ?>
|
||||
</div>
|
||||
</fieldset>
|
||||
<?php echo HTMLHelper::_('uitab.endTab'); ?>
|
||||
|
||||
<?php echo HTMLHelper::_('uitab.addTab', 'myTab', 'metadata', Text::_('JGLOBAL_FIELDSET_OPTIONS')); ?>
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<fieldset id="fieldset-sitename" class="options-form">
|
||||
<legend><?php echo Text::_('COM_LANGUAGES_FIELDSET_SITE_NAME_LABEL'); ?></legend>
|
||||
<div>
|
||||
<?php echo $this->form->renderFieldset('site_name'); ?>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<fieldset id="fieldset-metadata" class="options-form">
|
||||
<legend><?php echo Text::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
|
||||
<div>
|
||||
<?php echo $this->form->renderFieldset('metadata'); ?>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo HTMLHelper::_('uitab.endTab'); ?>
|
||||
|
||||
<?php echo HTMLHelper::_('uitab.endTabSet'); ?>
|
||||
|
||||
<input type="hidden" name="task" value="">
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</form>
|
||||
@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Session\Session;
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\View\Languages\HtmlView $this */
|
||||
|
||||
/** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */
|
||||
$wa = $this->getDocument()->getWebAssetManager();
|
||||
$wa->useScript('table.columns')
|
||||
->useScript('multiselect');
|
||||
|
||||
$user = $this->getCurrentUser();
|
||||
$listOrder = $this->escape($this->state->get('list.ordering'));
|
||||
$listDirn = $this->escape($this->state->get('list.direction'));
|
||||
$saveOrder = $listOrder == 'a.ordering';
|
||||
|
||||
if ($saveOrder && !empty($this->items)) {
|
||||
$saveOrderingUrl = 'index.php?option=com_languages&task=languages.saveOrderAjax&tmpl=component&' . Session::getFormToken() . '=1';
|
||||
HTMLHelper::_('draggablelist.draggable');
|
||||
}
|
||||
|
||||
?>
|
||||
<form action="<?php echo Route::_('index.php?option=com_languages&view=languages'); ?>" method="post" name="adminForm" id="adminForm">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div id="j-main-container" class="j-main-container">
|
||||
<?php echo LayoutHelper::render('joomla.searchtools.default', ['view' => $this]); ?>
|
||||
<?php if (empty($this->items)) : ?>
|
||||
<div class="alert alert-info">
|
||||
<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
|
||||
<?php echo Text::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<table class="table" id="languageList">
|
||||
<caption class="visually-hidden">
|
||||
<?php echo Text::_('COM_LANGUAGES_CONTENT_TABLE_CAPTION'); ?>,
|
||||
<span id="orderedBy"><?php echo Text::_('JGLOBAL_SORTED_BY'); ?> </span>,
|
||||
<span id="filteredBy"><?php echo Text::_('JGLOBAL_FILTERED_BY'); ?></span>
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="w-1 text-center">
|
||||
<?php echo HTMLHelper::_('grid.checkall'); ?>
|
||||
</td>
|
||||
<th scope="col" class="w-1 text-center d-none d-md-table-cell">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-sort'); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-1 text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="title">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="title d-none d-md-table-cell">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_TITLE_NATIVE', 'a.title_native', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_TAG', 'a.lang_code', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_CODE', 'a.sef', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_IMAGE', 'a.image', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-10 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_HEADING_HOMEPAGE', 'l.home', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="w-5 d-none d-md-table-cell text-center">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.lang_id', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody<?php if ($saveOrder) :
|
||||
?> class="js-draggable" data-url="<?php echo $saveOrderingUrl; ?>" data-direction="<?php echo strtolower($listDirn); ?>"<?php
|
||||
endif; ?>>
|
||||
<?php
|
||||
foreach ($this->items as $i => $item) :
|
||||
$canCreate = $user->authorise('core.create', 'com_languages');
|
||||
$canEdit = $user->authorise('core.edit', 'com_languages');
|
||||
$canChange = $user->authorise('core.edit.state', 'com_languages');
|
||||
?>
|
||||
<tr class="row<?php echo $i % 2; ?>">
|
||||
<td>
|
||||
<?php echo HTMLHelper::_('grid.id', $i, $item->lang_id, false, 'cid', 'cb', $item->title); ?>
|
||||
</td>
|
||||
<td class="text-center d-none d-md-table-cell">
|
||||
<?php if ($canChange) :
|
||||
$disableClassName = '';
|
||||
$disabledLabel = '';
|
||||
|
||||
if (!$saveOrder) :
|
||||
$disabledLabel = Text::_('JORDERINGDISABLED');
|
||||
$disableClassName = 'inactive';
|
||||
endif; ?>
|
||||
<span class="sortable-handler <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
|
||||
<span class="icon-ellipsis-v" aria-hidden="true"></span>
|
||||
</span>
|
||||
<input type="text" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order hidden">
|
||||
<?php else : ?>
|
||||
<span class="sortable-handler inactive">
|
||||
<span class="icon-ellipsis-v" aria-hidden="true"></span>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<?php echo HTMLHelper::_('jgrid.published', $item->published, $i, 'languages.', $canChange); ?>
|
||||
</td>
|
||||
<th scope="row">
|
||||
<?php if ($canEdit) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_languages&task=language.edit&lang_id=' . (int) $item->lang_id); ?>" title="<?php echo Text::_('JACTION_EDIT'); ?> <?php echo $this->escape($item->title); ?>">
|
||||
<?php echo $this->escape($item->title); ?></a>
|
||||
<?php else : ?>
|
||||
<?php echo $this->escape($item->title); ?>
|
||||
<?php endif; ?>
|
||||
</th>
|
||||
<td class="d-none d-md-table-cell">
|
||||
<?php echo $this->escape($item->title_native); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($item->lang_code); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($item->sef); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell">
|
||||
<?php if ($item->image) : ?>
|
||||
<?php echo HTMLHelper::_('image', 'mod_languages/' . $item->image . '.gif', $item->image, ['class' => 'me-1'], true); ?><?php echo $this->escape($item->image); ?>
|
||||
<?php else : ?>
|
||||
<?php echo Text::_('JNONE'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($item->access_level); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo ($item->home == '1') ? Text::_('JYES') : Text::_('JNO'); ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell text-center">
|
||||
<?php echo $this->escape($item->lang_id); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<?php // load the pagination. ?>
|
||||
<?php echo $this->pagination->getListFooter(); ?>
|
||||
|
||||
<?php endif; ?>
|
||||
<input type="hidden" name="task" value="">
|
||||
<input type="hidden" name="boxchecked" value="0">
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata>
|
||||
<layout title="COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_TITLE">
|
||||
<message>
|
||||
<![CDATA[COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_DESC]]>
|
||||
</message>
|
||||
</layout>
|
||||
</metadata>
|
||||
@ -0,0 +1,330 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\View\Multilangstatus\HtmlView $this */
|
||||
|
||||
$notice_disabled = !$this->language_filter && ($this->homes > 1 || $this->switchers != 0);
|
||||
$notice_switchers = !$this->switchers && ($this->homes > 1 || $this->language_filter);
|
||||
|
||||
// Defining arrays
|
||||
$content_languages = array_column($this->contentlangs, 'lang_code');
|
||||
$sitelangs = array_column($this->site_langs, 'element');
|
||||
$home_pages = array_column($this->homepages, 'language');
|
||||
?>
|
||||
<div class="mod-multilangstatus">
|
||||
<?php if (!$this->language_filter && $this->switchers == 0) : ?>
|
||||
<?php if ($this->homes == 1) : ?>
|
||||
<div class="alert alert-info">
|
||||
<span class="icon-info-circle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_NONE'); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="alert alert-info">
|
||||
<span class="icon-info-circle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_USELESS_HOMES'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<?php if (!in_array($this->default_lang, $content_languages)) : ?>
|
||||
<div class="alert alert-error">
|
||||
<span class="icon-exclamation" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('ERROR'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_DEFAULT_CONTENT_LANGUAGE', $this->default_lang); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<?php foreach ($this->contentlangs as $contentlang) : ?>
|
||||
<?php if ($contentlang->lang_code == $this->default_lang && $contentlang->published != 1) : ?>
|
||||
<div class="alert alert-error">
|
||||
<span class="icon-exclamation" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('ERROR'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_DEFAULT_CONTENT_LANGUAGE', $this->default_lang); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($this->statuses as $status) : ?>
|
||||
<?php // Displays error when Site language and Content language are published but Home page is unpublished, trashed or missing. ?>
|
||||
<?php if ($status->lang_code && $status->published == 1 && $status->home_published != 1) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_HOME_UNPUBLISHED', $status->lang_code, $status->lang_code); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php // Displays error when both Content Language and Home page are unpublished. ?>
|
||||
<?php if ($status->lang_code && $status->published == 0 && $status->home_published != 1) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_HOME_UNPUBLISHED', $status->lang_code, $status->lang_code); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($notice_disabled) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER_DISABLED'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($notice_switchers) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_UNPUBLISHED'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($this->contentlangs as $contentlang) : ?>
|
||||
<?php if (array_key_exists($contentlang->lang_code, $this->homepages) && (!array_key_exists($contentlang->lang_code, $this->site_langs) || $contentlang->published != 1)) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE', $contentlang->lang_code); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if (!array_key_exists($contentlang->lang_code, $this->site_langs)) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_LANGUAGE_TAG', $contentlang->lang_code); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($contentlang->published == -2) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_TRASHED', $contentlang->lang_code); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if (empty($contentlang->sef)) : ?>
|
||||
<div class="alert alert-error">
|
||||
<span class="icon-exclamation" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('ERROR'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_SEF_MISSING', $contentlang->lang_code); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($this->listUsersError) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR_TIP'); ?>
|
||||
<ul>
|
||||
<?php foreach ($this->listUsersError as $user) : ?>
|
||||
<li>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR', $user->name); ?>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php // Displays error when the Content Language has been deleted ?>
|
||||
<?php foreach ($sitelangs as $sitelang) : ?>
|
||||
<?php if (!in_array($sitelang, $content_languages) && in_array($sitelang, $home_pages)) : ?>
|
||||
<div class="alert alert-warning">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php echo Text::sprintf('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_MISSING', $sitelang); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<table class="table table-sm">
|
||||
<caption class="visually-hidden"><?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_TABLE_CAPTION'); ?></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">
|
||||
<?php echo Text::_('JDETAILS'); ?>
|
||||
</th>
|
||||
<th class="text-center" scope="col">
|
||||
<?php echo Text::_('JSTATUS'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER'); ?>
|
||||
</th>
|
||||
<td class="text-center">
|
||||
<?php if ($this->language_filter) : ?>
|
||||
<?php echo Text::_('JENABLED'); ?>
|
||||
<?php else : ?>
|
||||
<?php echo Text::_('JDISABLED'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_PUBLISHED'); ?>
|
||||
</th>
|
||||
<td class="text-center">
|
||||
<?php if ($this->switchers != 0) : ?>
|
||||
<?php echo $this->switchers; ?>
|
||||
<?php else : ?>
|
||||
<?php echo Text::_('JNONE'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<?php if ($this->homes > 1) : ?>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_INCLUDING_ALL'); ?>
|
||||
<?php else : ?>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED'); ?>
|
||||
<?php endif; ?>
|
||||
</th>
|
||||
<td class="text-center">
|
||||
<?php if ($this->homes > 1) : ?>
|
||||
<?php echo $this->homes; ?>
|
||||
<?php else : ?>
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_ALL'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="table table-sm">
|
||||
<caption class="visually-hidden"><?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_TABLE_CAPTION'); ?></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">
|
||||
<?php echo Text::_('JGRID_HEADING_LANGUAGE'); ?>
|
||||
</th>
|
||||
<th class="text-center" scope="col">
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_SITE_LANG_PUBLISHED'); ?>
|
||||
</th>
|
||||
<th class="text-center" scope="col">
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_PUBLISHED'); ?>
|
||||
</th>
|
||||
<th class="text-center" scope="col">
|
||||
<?php echo Text::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($this->statuses as $status) : ?>
|
||||
<?php if ($status->element) : ?>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<?php echo $status->element; ?>
|
||||
</th>
|
||||
<?php endif; ?>
|
||||
<?php // Published Site languages ?>
|
||||
<?php if ($status->element) : ?>
|
||||
<td class="text-center">
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
</td>
|
||||
<?php else : ?>
|
||||
<td class="text-center">
|
||||
<?php echo Text::_('JNO'); ?>
|
||||
</td>
|
||||
<?php endif; ?>
|
||||
<?php // Published Content languages ?>
|
||||
<td class="text-center">
|
||||
<?php if ($status->lang_code && $status->published == 1) : ?>
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
<?php elseif ($status->lang_code && $status->published == 0) : ?>
|
||||
<span class="text-danger icon-times" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php elseif ($status->lang_code && $status->published == -2) : ?>
|
||||
<span class="icon-trash" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php else : ?>
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<?php // Published Home pages ?>
|
||||
<td class="text-center">
|
||||
<?php if ($status->home_published == 1) : ?>
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
<?php elseif ($status->home_published == 0) : ?>
|
||||
<span class="text-danger icon-times" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JNO'); ?></span>
|
||||
<?php elseif ($status->home_published == -2) : ?>
|
||||
<span class="icon-trash" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php else : ?>
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php foreach ($this->contentlangs as $contentlang) : ?>
|
||||
<?php if (!array_key_exists($contentlang->lang_code, $this->site_langs)) : ?>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<?php echo $contentlang->lang_code; ?>
|
||||
</th>
|
||||
<td class="text-center">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<?php if ($contentlang->published == 1) : ?>
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
<?php elseif ($contentlang->published == 0 && array_key_exists($contentlang->lang_code, $this->homepages)) : ?>
|
||||
<span class="text-danger icon-times" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JNO'); ?></span>
|
||||
<?php elseif ($contentlang->published == -2 && array_key_exists($contentlang->lang_code, $this->homepages)) : ?>
|
||||
<span class="icon-trash" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<?php if (!array_key_exists($contentlang->lang_code, $this->homepages)) : ?>
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
<?php else : ?>
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php // Display error when the Content Language has been deleted ?>
|
||||
<?php foreach ($sitelangs as $sitelang) : ?>
|
||||
<?php if (!in_array($sitelang, $content_languages) && in_array($sitelang, $home_pages)) : ?>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<?php echo $sitelang; ?>
|
||||
</th>
|
||||
<td class="text-center">
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="icon-exclamation-triangle" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('WARNING'); ?></span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="text-success icon-check" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('JYES'); ?></span>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\View\Override\HtmlView $this */
|
||||
|
||||
$expired = ($this->state->get('cache_expired') == 1 ) ? '1' : '';
|
||||
|
||||
/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
|
||||
$wa = $this->getDocument()->getWebAssetManager();
|
||||
$wa->useScript('keepalive')
|
||||
->useScript('form.validate')
|
||||
->usePreset('com_languages.overrider')
|
||||
->useScript('com_languages.admin-override-edit-refresh-searchstring');
|
||||
|
||||
?>
|
||||
|
||||
<form action="<?php echo Route::_('index.php?option=com_languages&id=' . $this->item->key); ?>" method="post" name="adminForm" id="override-form" aria-label="<?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_FORM_' . ((int) $this->item->key === 0 ? 'NEW' : 'EDIT'), true); ?>" class="main-card form-validate p-4 mt-4">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<fieldset id="fieldset-override" class="options-form">
|
||||
<legend><?php echo empty($this->item->key) ? Text::_('COM_LANGUAGES_VIEW_OVERRIDE_EDIT_NEW_OVERRIDE_LEGEND') : Text::_('COM_LANGUAGES_VIEW_OVERRIDE_EDIT_EDIT_OVERRIDE_LEGEND'); ?></legend>
|
||||
<div>
|
||||
<?php echo $this->form->renderField('language'); ?>
|
||||
<?php echo $this->form->renderField('client'); ?>
|
||||
<?php echo $this->form->renderField('key'); ?>
|
||||
<?php echo $this->form->renderField('override'); ?>
|
||||
<?php echo $this->form->renderField('both'); ?>
|
||||
<?php echo $this->form->renderField('file'); ?>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<fieldset id="fieldset-override-search" class="options-form">
|
||||
<legend><?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_LEGEND'); ?></legend>
|
||||
<div>
|
||||
<div class="alert alert-info">
|
||||
<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_TIP'); ?>
|
||||
</div>
|
||||
<?php echo $this->form->renderField('searchtype'); ?>
|
||||
<div class="control-group">
|
||||
<div class="control-label">
|
||||
<?php echo $this->form->getLabel('searchstring'); ?>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<div class="input-group">
|
||||
<?php echo $this->form->getInput('searchstring'); ?>
|
||||
<button type="submit" class="btn btn-primary" onclick="Joomla.overrider.searchStrings();return false;" formnovalidate>
|
||||
<?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_BUTTON'); ?>
|
||||
</button>
|
||||
<span id="refresh-status" class="form-text">
|
||||
<span class="icon-sync icon-spin" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_REFRESHING'); ?>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset id="results-container" class="adminform">
|
||||
<legend><?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_RESULTS_LEGEND'); ?></legend>
|
||||
<div id="overrider-spinner" class="overrider-spinner text-center" data-search-string-expired="<?php echo $expired; ?>"><span class="icon-spinner icon-spin" aria-hidden="true"></span></div>
|
||||
<span id="more-results" class="mt-2">
|
||||
<button type="button" id="more-results-button" class="btn btn-secondary" disabled>
|
||||
<span id="overrider-spinner-btn" class="overrider-spinner-btn icon-spinner icon-spin" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_LANGUAGES_VIEW_OVERRIDE_MORE_RESULTS'); ?>
|
||||
</button>
|
||||
</span>
|
||||
</fieldset>
|
||||
|
||||
<input type="hidden" name="task" value="">
|
||||
<input type="hidden" name="id" value="<?php echo $this->item->key; ?>">
|
||||
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_languages
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\LanguageHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
/** @var \Joomla\Component\Languages\Administrator\View\Overrides\HtmlView $this */
|
||||
|
||||
/** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */
|
||||
$wa = $this->getDocument()->getWebAssetManager();
|
||||
$wa->useScript('table.columns')
|
||||
->useScript('multiselect');
|
||||
|
||||
$client = $this->state->get('filter.client') == 'site' ? Text::_('JSITE') : Text::_('JADMINISTRATOR');
|
||||
$language = $this->state->get('filter.language');
|
||||
$listOrder = $this->escape($this->state->get('list.ordering'));
|
||||
$listDirn = $this->escape($this->state->get('list.direction'));
|
||||
|
||||
$oppositeClient = $this->state->get('filter.client') == 'administrator' ? Text::_('JSITE') : Text::_('JADMINISTRATOR');
|
||||
$oppositeFilename = constant('JPATH_' . strtoupper($this->state->get('filter.client') === 'site' ? 'administrator' : 'site'))
|
||||
. '/language/overrides/' . $this->state->get('filter.language', 'en-GB') . '.override.ini';
|
||||
$oppositeStrings = LanguageHelper::parseIniFile($oppositeFilename);
|
||||
?>
|
||||
|
||||
<form action="<?php echo Route::_('index.php?option=com_languages&view=overrides'); ?>" method="post" name="adminForm" id="adminForm">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div id="j-main-container" class="j-main-container">
|
||||
<?php echo LayoutHelper::render('joomla.searchtools.default', ['view' => $this, 'options' => ['selectorFieldName' => 'language_client']]); ?>
|
||||
<div class="clearfix"></div>
|
||||
<?php if (empty($this->items)) : ?>
|
||||
<div class="alert alert-info">
|
||||
<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
|
||||
<?php echo Text::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<table class="table" id="overrideList">
|
||||
<caption class="visually-hidden">
|
||||
<?php echo Text::_('COM_LANGUAGES_OVERRIDES_TABLE_CAPTION'); ?>,
|
||||
<span id="orderedBy"><?php echo Text::_('JGLOBAL_SORTED_BY'); ?> </span>,
|
||||
<span id="filteredBy"><?php echo Text::_('JGLOBAL_FILTERED_BY'); ?></span>
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="w-1 text-center">
|
||||
<?php echo HTMLHelper::_('grid.checkall'); ?>
|
||||
</td>
|
||||
<th scope="col" class="w-30">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_VIEW_OVERRIDES_KEY', 'key', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="d-none d-md-table-cell">
|
||||
<?php echo HTMLHelper::_('searchtools.sort', 'COM_LANGUAGES_VIEW_OVERRIDES_TEXT', 'text', $listDirn, $listOrder); ?>
|
||||
</th>
|
||||
<th scope="col" class="d-none d-md-table-cell">
|
||||
<?php echo Text::_('COM_LANGUAGES_FIELD_LANG_TAG_LABEL'); ?>
|
||||
</th>
|
||||
<th scope="col" class="d-none d-md-table-cell">
|
||||
<?php echo Text::_('JCLIENT'); ?>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php $canEdit = $this->getCurrentUser()->authorise('core.edit', 'com_languages'); ?>
|
||||
<?php $i = 0; ?>
|
||||
<?php foreach ($this->items as $key => $text) : ?>
|
||||
<tr class="row<?php echo $i % 2; ?>" id="overriderrow<?php echo $i; ?>">
|
||||
<td class="text-center">
|
||||
<?php echo HTMLHelper::_('grid.id', $i, $key, false, 'cid', 'cb', $key); ?>
|
||||
</td>
|
||||
<th scope="row">
|
||||
<?php if ($canEdit) : ?>
|
||||
<a id="key[<?php echo $this->escape($key); ?>]" href="<?php echo Route::_('index.php?option=com_languages&task=override.edit&id=' . $key); ?>" title="<?php echo Text::_('JACTION_EDIT'); ?> <?php echo $this->escape($key); ?>">
|
||||
<?php echo $this->escape($key); ?></a>
|
||||
<?php else : ?>
|
||||
<?php echo $this->escape($key); ?>
|
||||
<?php endif; ?>
|
||||
</th>
|
||||
<td class="d-none d-md-table-cell">
|
||||
<span id="string[<?php echo $this->escape($key); ?>]"><?php echo HTMLHelper::_('string.truncate', $this->escape($text), 200); ?></span>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell">
|
||||
<?php echo $language; ?>
|
||||
</td>
|
||||
<td class="d-none d-md-table-cell">
|
||||
<?php
|
||||
echo $client;
|
||||
if (isset($oppositeStrings[$key]) && $oppositeStrings[$key] === $text) :
|
||||
echo '/' . $oppositeClient;
|
||||
endif;
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i++; ?>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<?php // load the pagination. ?>
|
||||
<?php echo $this->pagination->getListFooter(); ?>
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
<input type="hidden" name="task" value="">
|
||||
<input type="hidden" name="boxchecked" value="0">
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata>
|
||||
<layout title="COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_TITLE">
|
||||
<message>
|
||||
<![CDATA[COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_DESC]]>
|
||||
</message>
|
||||
</layout>
|
||||
</metadata>
|
||||
Reference in New Issue
Block a user