translater/src/TranslaterLang.php

214 lines
6.6 KiB
PHP
Raw Normal View History

<?php
/**
* @brief translater, a plugin for Dotclear 2
2021-11-01 21:32:32 +00:00
*
* @package Dotclear
* @subpackage Plugin
2021-11-01 21:32:32 +00:00
*
* @author Jean-Christian Denis & contributors
2021-11-01 21:32:32 +00:00
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
2023-03-14 23:26:31 +00:00
declare(strict_types=1);
namespace Dotclear\Plugin\translater;
use files;
use l10n;
use path;
class TranslaterLang
{
2023-03-14 23:26:31 +00:00
/** @var Translater Translater instance */
public $translater = null;
2023-03-14 23:26:31 +00:00
/** @var TranslaterModule TranslaterModule instance */
public $module = null;
/** @var array Lang properies */
private $prop = [];
2023-03-14 23:26:31 +00:00
public function __construct(TranslaterModule $module, string $lang)
{
$this->translater = $module->translater;
2021-11-01 21:32:32 +00:00
$this->module = $module;
2021-11-01 21:32:32 +00:00
$this->prop['code'] = $lang;
$this->prop['name'] = l10n::getLanguageName($lang);
$this->prop['plural'] = explode(':', l10n::getLanguagePluralExpression($lang));
}
/**
* Get a lang property
2021-11-01 21:32:32 +00:00
*
* @param string $key The lang property key
* @return mixed The lang property value or null
*/
public function get(string $key)
2021-11-01 21:32:32 +00:00
{
return array_key_exists($key, $this->prop) ? $this->prop[$key] : null;
}
/**
* Magic get
*/
public function __get($key)
{
return $this->get($key);
}
/**
* Get a lang messages
2021-11-01 21:32:32 +00:00
*
* @return array The messages ids and translations
*/
public function getMessages(): array
{
$res = [];
$m_msgids = $this->getMsgIds();
$m_msgstrs = $this->getMsgStrs();
2021-11-01 21:32:32 +00:00
foreach ($this->translater->getModules() as $module) {
2023-03-14 23:26:31 +00:00
if ($module->id != $this->module->get('id')) {
$m_o_msgstrs[$module->get('id')] = $this->translater->getlang($module, $this->get('code'))->getMsgStrs();
}
}
2023-03-14 23:26:31 +00:00
$dc_module = new TranslaterModule($this->translater, ['id' => 'dotclear', 'root' => DC_ROOT]);
$dc_lang = new TranslaterLang($dc_module, $this->get('code'));
$m_o_msgstrs['dotclear'] = $dc_lang->getMsgStrs();
# From id list
2021-11-01 21:32:32 +00:00
foreach ($m_msgids as $rs) {
$res[$rs['msgid']]['files'][] = [trim($rs['file'], '/'), $rs['line']];
$res[$rs['msgid']]['group'] = 'main';
$res[$rs['msgid']]['plural'] = $rs['msgid_plural'];
$res[$rs['msgid']]['msgstr'] = [''];
$res[$rs['msgid']]['in_dc'] = false;
$res[$rs['msgid']]['o_msgstrs'] = [];
}
# From str list
2021-11-01 21:32:32 +00:00
foreach ($m_msgstrs as $rs) {
if (!isset($res[$rs['msgid']])) {
$res[$rs['msgid']]['files'][] = [];
$res[$rs['msgid']]['in_dc'] = false;
$res[$rs['msgid']]['o_msgstrs'] = [];
}
$res[$rs['msgid']]['group'] = $rs['group'];
$res[$rs['msgid']]['plural'] = $rs['msgid_plural'];
$res[$rs['msgid']]['msgstr'] = is_array($rs['msgstr']) ? $rs['msgstr'] : [$rs['msgstr']];
$res[$rs['msgid']]['in_dc'] = false;
}
# From others str list
2021-11-01 21:32:32 +00:00
foreach ($m_o_msgstrs as $o_module => $o_msgstrs) {
foreach ($o_msgstrs as $rs) {
if (!isset($res[$rs['msgid']])) {
continue;
}
$res[$rs['msgid']]['o_msgstrs'][] = [
'msgstr' => is_array($rs['msgstr']) ? $rs['msgstr'] : [$rs['msgstr']],
'module' => $o_module,
2022-11-13 17:40:31 +00:00
'file' => $rs['file'],
];
if ($o_module == 'dotclear') {
$res[$rs['msgid']]['in_dc'] = true;
}
}
}
2021-11-01 21:32:32 +00:00
return $res;
}
/**
* Get messages ids
2021-11-01 21:32:32 +00:00
*
* @return array The messages ids
*/
public function getMsgIds(): array
{
2021-11-01 21:32:32 +00:00
$res = [];
$scan_ext = ['php'];
2023-03-14 23:26:31 +00:00
if ($this->translater->get('scan_tpl')) {
2021-09-25 13:15:16 +00:00
$scan_ext[] = 'html';
}
2023-03-14 23:26:31 +00:00
$files = Translater::scandir($this->module->get('root'));
2021-11-01 21:32:32 +00:00
foreach ($files as $file) {
2021-09-25 13:15:16 +00:00
$extension = files::getExtension($file);
2023-03-14 23:26:31 +00:00
if (is_dir($this->module->get('root') . '/' . $file) || !in_array($extension, $scan_ext)) {
continue;
}
2023-03-14 23:26:31 +00:00
$contents = file_get_contents($this->module->get('root') . '/' . $file);
2022-11-13 17:40:31 +00:00
$msgs = [];
# php files
2021-09-25 13:15:16 +00:00
if ($extension == 'php') {
2023-03-14 23:26:31 +00:00
$msgs = Translater::extractPhpMsgs($contents);
2021-09-25 13:15:16 +00:00
# tpl files
} elseif ($extension == 'html') {
2023-03-14 23:26:31 +00:00
$msgs = Translater::extractTplMsgs($contents);
2021-09-25 13:15:16 +00:00
}
2021-11-01 21:32:32 +00:00
foreach ($msgs as $msg) {
$res[] = [
2023-03-14 23:26:31 +00:00
'msgid' => Translater::encodeMsg($msg[0][0]),
'msgid_plural' => empty($msg[0][1]) ? '' : Translater::encodeMsg($msg[0][1]),
'file' => $file,
2022-11-13 17:40:31 +00:00
'line' => $msg[1],
];
}
unset($contents);
}
2021-11-01 21:32:32 +00:00
return $res;
}
/**
* Get messages translations
2021-11-01 21:32:32 +00:00
*
* @return array The messages translations
*/
public function getMsgStrs(): array
{
$res = $exists = $scanned = [];
$langs = $this->module->getLangs(true);
2023-03-14 23:26:31 +00:00
if (!isset($langs[$this->get('code')])) {
return $res;
}
2023-03-14 23:26:31 +00:00
foreach ($langs[$this->get('code')] as $file) {
if (in_array($file, $scanned)) {
continue;
}
$scanned[] = $file;
2023-03-14 23:26:31 +00:00
$path = path::clean($this->module->get('locales') . '/' . $file);
2023-03-14 23:26:31 +00:00
if (Translater::isPoFile($file)) {
$po = l10n::parsePoFile($path);
if (!is_array($po)) {
continue;
}
$entries = $po[1];
2021-11-01 21:32:32 +00:00
foreach ($entries as $entry) {
$res[] = [
2021-11-01 21:32:32 +00:00
'msgid' => $entry['msgid'],
'msgid_plural' => $entry['msgid_plural'] ?? '',
2021-11-01 21:32:32 +00:00
'msgstr' => is_array($entry['msgstr']) ? $entry['msgstr'] : [$entry['msgstr']],
2023-03-14 23:26:31 +00:00
'lang' => $this->get('code'),
2021-11-01 21:32:32 +00:00
'type' => 'po',
'path' => $path,
'file' => basename($file),
2022-11-13 17:40:31 +00:00
'group' => str_replace('.po', '', basename($file)),
];
$exists[] = $entry['msgid'];
}
}
}
2021-11-01 21:32:32 +00:00
return $res;
}
2021-11-01 21:32:32 +00:00
}