Move L10n class from L10n subdir to Core (replacing old wrapper)

This commit is contained in:
nupplaPhil 2020-01-18 20:59:39 +01:00
parent 67f2066b8b
commit 2838635d64
No known key found for this signature in database
GPG key ID: D8365C3D36B77D90
30 changed files with 356 additions and 492 deletions

View file

@ -145,7 +145,7 @@ class SampleStorageBackend implements IStorage
/** @var Config\IConfiguration */ /** @var Config\IConfiguration */
private $config; private $config;
/** @var L10n\L10n */ /** @var \Friendica\Core\L10n */
private $l10n; private $l10n;
/** /**
@ -155,7 +155,7 @@ class SampleStorageBackend implements IStorage
* You can add here every dynamic class as dependency you like and add them to a private field * You can add here every dynamic class as dependency you like and add them to a private field
* Friendica automatically creates these classes and passes them as argument to the constructor * Friendica automatically creates these classes and passes them as argument to the constructor
*/ */
public function __construct(Config\IConfiguration $config, L10n\L10n $l10n) public function __construct(Config\IConfiguration $config, \Friendica\Core\L10n $l10n)
{ {
$this->config = $config; $this->config = $config;
$this->l10n = $l10n; $this->l10n = $l10n;

View file

@ -11,7 +11,7 @@ use Friendica\App\Authentication;
use Friendica\Core\Config\Cache\ConfigCache; use Friendica\Core\Config\Cache\ConfigCache;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\Config\IPConfiguration; use Friendica\Core\Config\IPConfiguration;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Theme; use Friendica\Core\Theme;
use Friendica\Database\Database; use Friendica\Database\Database;

View file

@ -22,7 +22,7 @@ use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network; use Friendica\Util\Network;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use LightOpenID; use LightOpenID;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
/** /**

View file

@ -207,15 +207,15 @@ class Module
/** /**
* Run the determined module class and calls all hooks applied to * Run the determined module class and calls all hooks applied to
* *
* @param Core\L10n\L10n $l10n The L10n instance * @param \Friendica\Core\L10n $l10n The L10n instance
* @param App\BaseURL $baseUrl The Friendica Base URL * @param App\BaseURL $baseUrl The Friendica Base URL
* @param LoggerInterface $logger The Friendica logger * @param LoggerInterface $logger The Friendica logger
* @param array $server The $_SERVER variable * @param array $server The $_SERVER variable
* @param array $post The $_POST variables * @param array $post The $_POST variables
* *
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public function run(Core\L10n\L10n $l10n, App\BaseURL $baseUrl, LoggerInterface $logger, array $server, array $post) public function run(Core\L10n $l10n, App\BaseURL $baseUrl, LoggerInterface $logger, array $server, array $post)
{ {
if ($this->printNotAllowedAddon) { if ($this->printNotAllowedAddon) {
info($l10n->t("You must be logged in to use addons. ")); info($l10n->t("You must be logged in to use addons. "));

View file

@ -10,7 +10,7 @@ use Friendica\Content\Nav;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\Config\IPConfiguration; use Friendica\Core\Config\IPConfiguration;
use Friendica\Core\Hook; use Friendica\Core\Hook;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Theme; use Friendica\Core\Theme;
use Friendica\Module\Special\HTTPException as ModuleHTTPException; use Friendica\Module\Special\HTTPException as ModuleHTTPException;

View file

@ -30,7 +30,7 @@ class ArchiveContact extends \Asika\SimpleConsole\Console
*/ */
private $dba; private $dba;
/** /**
* @var L10n\L10n * @var \Friendica\Core\L10n
*/ */
private $l10n; private $l10n;
@ -51,7 +51,7 @@ HELP;
return $help; return $help;
} }
public function __construct(App\Mode $appMode, Database $dba, L10n\L10n $l10n, array $argv = null) public function __construct(App\Mode $appMode, Database $dba, \Friendica\Core\L10n $l10n, array $argv = null)
{ {
parent::__construct($argv); parent::__construct($argv);

View file

@ -26,7 +26,7 @@ class GlobalCommunityBlock extends \Asika\SimpleConsole\Console
*/ */
private $appMode; private $appMode;
/** /**
* @var L10n\L10n * @var \Friendica\Core\L10n
*/ */
private $l10n; private $l10n;

View file

@ -3,7 +3,7 @@
namespace Friendica\Console; namespace Friendica\Console;
use Friendica\App; use Friendica\App;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Model\User; use Friendica\Model\User;
use RuntimeException; use RuntimeException;

View file

@ -4,7 +4,7 @@ namespace Friendica\Console;
use Friendica\App; use Friendica\App;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Update; use Friendica\Core\Update;
/** /**

View file

@ -1,11 +1,12 @@
<?php <?php
/**
* @file src/Core/L10n.php
*/
namespace Friendica\Core; namespace Friendica\Core;
use Friendica\Core\L10n\L10n as L10nClass; use Friendica\Core\Config\IConfiguration;
use Friendica\DI; use Friendica\Core\Session\ISession;
use Friendica\Database\Database;
use Friendica\Util\Strings;
use Psr\Log\LoggerInterface;
/** /**
* Provide Language, Translation, and Localization functions to the application * Provide Language, Translation, and Localization functions to the application
@ -13,26 +14,198 @@ use Friendica\DI;
*/ */
class L10n class L10n
{ {
/**
* A string indicating the current language used for translation:
* - Two-letter ISO 639-1 code.
* - Two-letter ISO 639-1 code + dash + Two-letter ISO 3166-1 alpha-2 country code.
*
* @var string
*/
private $lang = '';
/**
* An array of translation strings whose key is the neutral english message.
*
* @var array
*/
private $strings = [];
/**
* @var Database
*/
private $dba;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(IConfiguration $config, Database $dba, LoggerInterface $logger, ISession $session, array $server, array $get)
{
$this->dba = $dba;
$this->logger = $logger;
$this->loadTranslationTable(L10n::detectLanguage($server, $get, $config->get('system', 'language', 'en')));
$this->setSessionVariable($session);
$this->setLangFromSession($session);
}
/** /**
* Returns the current language code * Returns the current language code
* *
* @return string Language code * @return string Language code
*/ */
public static function getCurrentLang() public function getCurrentLang()
{ {
return DI::l10n()->getCurrentLang(); return $this->lang;
} }
/** /**
* @param string $lang * Sets the language session variable
*
* @return L10nClass The new L10n class with the new language
*
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function withLang(string $lang) private function setSessionVariable(ISession $session)
{ {
return DI::l10n()->withLang($lang); if ($session->get('authenticated') && !$session->get('language')) {
$session->set('language', $this->lang);
// we haven't loaded user data yet, but we need user language
if ($session->get('uid')) {
$user = $this->dba->selectFirst('user', ['language'], ['uid' => $_SESSION['uid']]);
if ($this->dba->isResult($user)) {
$session->set('language', $user['language']);
}
}
}
if (isset($_GET['lang'])) {
$session->set('language', $_GET['lang']);
}
}
private function setLangFromSession(ISession $session)
{
if ($session->get('language') !== $this->lang) {
$this->loadTranslationTable($session->get('language'));
}
}
/**
* Loads string translation table
*
* First addon strings are loaded, then globals
*
* Uses an App object shim since all the strings files refer to $a->strings
*
* @param string $lang language code to load
*
* @throws \Exception
*/
private function loadTranslationTable($lang)
{
$lang = Strings::sanitizeFilePathItem($lang);
// Don't override the language setting with empty languages
if (empty($lang)) {
return;
}
$a = new \stdClass();
$a->strings = [];
// load enabled addons strings
$addons = $this->dba->select('addon', ['name'], ['installed' => true]);
while ($p = $this->dba->fetch($addons)) {
$name = Strings::sanitizeFilePathItem($p['name']);
if (file_exists("addon/$name/lang/$lang/strings.php")) {
include __DIR__ . "/../../../addon/$name/lang/$lang/strings.php";
}
}
if (file_exists(__DIR__ . "/../../../view/lang/$lang/strings.php")) {
include __DIR__ . "/../../../view/lang/$lang/strings.php";
}
$this->lang = $lang;
$this->strings = $a->strings;
unset($a);
}
/**
* @brief Returns the preferred language from the HTTP_ACCEPT_LANGUAGE header
*
* @param string $sysLang The default fallback language
* @param array $server The $_SERVER array
* @param array $get The $_GET array
*
* @return string The two-letter language code
*/
public static function detectLanguage(array $server, array $get, string $sysLang = 'en')
{
$lang_variable = $server['HTTP_ACCEPT_LANGUAGE'] ?? null;
$acceptedLanguages = preg_split('/,\s*/', $lang_variable);
if (empty($acceptedLanguages)) {
$acceptedLanguages = [];
}
// Add get as absolute quality accepted language (except this language isn't valid)
if (!empty($get['lang'])) {
$acceptedLanguages[] = $get['lang'];
}
// return the sys language in case there's nothing to do
if (empty($acceptedLanguages)) {
return $sysLang;
}
// Set the syslang as default fallback
$current_lang = $sysLang;
// start with quality zero (every guessed language is more acceptable ..)
$current_q = 0;
foreach ($acceptedLanguages as $acceptedLanguage) {
$res = preg_match(
'/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i',
$acceptedLanguage,
$matches
);
// Invalid language? -> skip
if (!$res) {
continue;
}
// split language codes based on it's "-"
$lang_code = explode('-', $matches[1]);
// determine the quality of the guess
if (isset($matches[2])) {
$lang_quality = (float)$matches[2];
} else {
// fallback so without a quality parameter, it's probably the best
$lang_quality = 1;
}
// loop through each part of the code-parts
while (count($lang_code)) {
// try to mix them so we can get double-code parts too
$match_lang = strtolower(join('-', $lang_code));
if (file_exists(__DIR__ . "/../../../view/lang/$match_lang") &&
is_dir(__DIR__ . "/../../../view/lang/$match_lang")) {
if ($lang_quality > $current_q) {
$current_lang = $match_lang;
$current_q = $lang_quality;
break;
}
}
// remove the most right code-part
array_pop($lang_code);
}
}
return $current_lang;
} }
/** /**
@ -52,9 +225,22 @@ class L10n
* *
* @return string * @return string
*/ */
public static function t($s, ...$vars) public function t($s, ...$vars)
{ {
return DI::l10n()->t($s, ...$vars); if (empty($s)) {
return '';
}
if (!empty($this->strings[$s])) {
$t = $this->strings[$s];
$s = is_array($t) ? $t[0] : $t;
}
if (count($vars) > 0) {
$s = sprintf($s, ...$vars);
}
return $s;
} }
/** /**
@ -77,9 +263,48 @@ class L10n
* @return string * @return string
* @throws \Exception * @throws \Exception
*/ */
public static function tt(string $singular, string $plural, int $count) public function tt(string $singular, string $plural, int $count)
{ {
return DI::l10n()->tt($singular, $plural, $count); if (!empty($this->strings[$singular])) {
$t = $this->strings[$singular];
if (is_array($t)) {
$plural_function = 'string_plural_select_' . str_replace('-', '_', $this->lang);
if (function_exists($plural_function)) {
$i = $plural_function($count);
} else {
$i = $this->stringPluralSelectDefault($count);
}
// for some languages there is only a single array item
if (!isset($t[$i])) {
$s = $t[0];
} else {
$s = $t[$i];
}
} else {
$s = $t;
}
} elseif ($this->stringPluralSelectDefault($count)) {
$s = $plural;
} else {
$s = $singular;
}
$s = @sprintf($s, $count);
return $s;
}
/**
* Provide a fallback which will not collide with a function defined in any language file
*
* @param int $n
*
* @return bool
*/
private function stringPluralSelectDefault($n)
{
return $n != 1;
} }
/** /**
@ -95,7 +320,20 @@ class L10n
*/ */
public static function getAvailableLanguages() public static function getAvailableLanguages()
{ {
return L10nClass::getAvailableLanguages(); $langs = [];
$strings_file_paths = glob('view/lang/*/strings.php');
if (is_array($strings_file_paths) && count($strings_file_paths)) {
if (!in_array('view/lang/en/strings.php', $strings_file_paths)) {
$strings_file_paths[] = 'view/lang/en/strings.php';
}
asort($strings_file_paths);
foreach ($strings_file_paths as $strings_file_path) {
$path_array = explode('/', $strings_file_path);
$langs[$path_array[2]] = $path_array[2];
}
}
return $langs;
} }
/** /**
@ -105,9 +343,17 @@ class L10n
* *
* @return string Translated string. * @return string Translated string.
*/ */
public static function getDay($s) public function getDay($s)
{ {
return DI::l10n()->getDay($s); $ret = str_replace(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
[$this->t('Monday'), $this->t('Tuesday'), $this->t('Wednesday'), $this->t('Thursday'), $this->t('Friday'), $this->t('Saturday'), $this->t('Sunday')],
$s);
$ret = str_replace(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
[$this->t('January'), $this->t('February'), $this->t('March'), $this->t('April'), $this->t('May'), $this->t('June'), $this->t('July'), $this->t('August'), $this->t('September'), $this->t('October'), $this->t('November'), $this->t('December')],
$ret);
return $ret;
} }
/** /**
@ -117,9 +363,17 @@ class L10n
* *
* @return string Translated string. * @return string Translated string.
*/ */
public static function getDayShort($s) public function getDayShort($s)
{ {
return DI::l10n()->getDayShort($s); $ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
[$this->t('Mon'), $this->t('Tue'), $this->t('Wed'), $this->t('Thu'), $this->t('Fri'), $this->t('Sat'), $this->t('Sun')],
$s);
$ret = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
[$this->t('Jan'), $this->t('Feb'), $this->t('Mar'), $this->t('Apr'), $this->t('May'), $this->t('Jun'), $this->t('Jul'), $this->t('Aug'), $this->t('Sep'), $this->t('Oct'), $this->t('Nov'), $this->t('Dec')],
$ret);
return $ret;
} }
/** /**
@ -127,10 +381,44 @@ class L10n
* *
* @return array index is present tense verb * @return array index is present tense verb
* value is array containing past tense verb, translation of present, translation of past * value is array containing past tense verb, translation of present, translation of past
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @hook poke_verbs pokes array * @hook poke_verbs pokes array
*/ */
public static function getPokeVerbs() public function getPokeVerbs()
{ {
return DI::l10n()->getPokeVerbs(); // index is present tense verb
// value is array containing past tense verb, translation of present, translation of past
$arr = [
'poke' => ['poked', $this->t('poke'), $this->t('poked')],
'ping' => ['pinged', $this->t('ping'), $this->t('pinged')],
'prod' => ['prodded', $this->t('prod'), $this->t('prodded')],
'slap' => ['slapped', $this->t('slap'), $this->t('slapped')],
'finger' => ['fingered', $this->t('finger'), $this->t('fingered')],
'rebuff' => ['rebuffed', $this->t('rebuff'), $this->t('rebuffed')],
];
Hook::callAll('poke_verbs', $arr);
return $arr;
}
/**
* Creates a new L10n instance based on the given langauge
*
* @param string $lang The new language
*
* @return static A new L10n instance
* @throws \Exception
*/
public function withLang(string $lang)
{
// Don't create a new instance for same language
if ($lang === $this->lang) {
return $this;
}
$newL10n = clone $this;
$newL10n->loadTranslationTable($lang);
return $newL10n;
} }
} }

View file

@ -1,425 +0,0 @@
<?php
namespace Friendica\Core\L10n;
use Friendica\Core\Config\IConfiguration;
use Friendica\Core\Hook;
use Friendica\Core\Session\ISession;
use Friendica\Database\Database;
use Friendica\Util\Strings;
use Psr\Log\LoggerInterface;
/**
* Provide Language, Translation, and Localization functions to the application
* Localization can be referred to by the numeronym L10N (as in: "L", followed by ten more letters, and then "N").
*/
class L10n
{
/**
* A string indicating the current language used for translation:
* - Two-letter ISO 639-1 code.
* - Two-letter ISO 639-1 code + dash + Two-letter ISO 3166-1 alpha-2 country code.
*
* @var string
*/
private $lang = '';
/**
* An array of translation strings whose key is the neutral english message.
*
* @var array
*/
private $strings = [];
/**
* @var Database
*/
private $dba;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(IConfiguration $config, Database $dba, LoggerInterface $logger, ISession $session, array $server, array $get)
{
$this->dba = $dba;
$this->logger = $logger;
$this->loadTranslationTable(L10n::detectLanguage($server, $get, $config->get('system', 'language', 'en')));
$this->setSessionVariable($session);
$this->setLangFromSession($session);
}
/**
* Returns the current language code
*
* @return string Language code
*/
public function getCurrentLang()
{
return $this->lang;
}
/**
* Sets the language session variable
*/
private function setSessionVariable(ISession $session)
{
if ($session->get('authenticated') && !$session->get('language')) {
$session->set('language', $this->lang);
// we haven't loaded user data yet, but we need user language
if ($session->get('uid')) {
$user = $this->dba->selectFirst('user', ['language'], ['uid' => $_SESSION['uid']]);
if ($this->dba->isResult($user)) {
$session->set('language', $user['language']);
}
}
}
if (isset($_GET['lang'])) {
$session->set('language', $_GET['lang']);
}
}
private function setLangFromSession(ISession $session)
{
if ($session->get('language') !== $this->lang) {
$this->loadTranslationTable($session->get('language'));
}
}
/**
* Loads string translation table
*
* First addon strings are loaded, then globals
*
* Uses an App object shim since all the strings files refer to $a->strings
*
* @param string $lang language code to load
*
* @throws \Exception
*/
private function loadTranslationTable($lang)
{
$lang = Strings::sanitizeFilePathItem($lang);
// Don't override the language setting with empty languages
if (empty($lang)) {
return;
}
$a = new \stdClass();
$a->strings = [];
// load enabled addons strings
$addons = $this->dba->select('addon', ['name'], ['installed' => true]);
while ($p = $this->dba->fetch($addons)) {
$name = Strings::sanitizeFilePathItem($p['name']);
if (file_exists("addon/$name/lang/$lang/strings.php")) {
include __DIR__ . "/../../../addon/$name/lang/$lang/strings.php";
}
}
if (file_exists(__DIR__ . "/../../../view/lang/$lang/strings.php")) {
include __DIR__ . "/../../../view/lang/$lang/strings.php";
}
$this->lang = $lang;
$this->strings = $a->strings;
unset($a);
}
/**
* Returns the preferred language from the HTTP_ACCEPT_LANGUAGE header
*
* @param string $sysLang The default fallback language
* @param array $server The $_SERVER array
* @param array $get The $_GET array
*
* @return string The two-letter language code
*/
public static function detectLanguage(array $server, array $get, string $sysLang = 'en')
{
$lang_variable = $server['HTTP_ACCEPT_LANGUAGE'] ?? null;
$acceptedLanguages = preg_split('/,\s*/', $lang_variable);
if (empty($acceptedLanguages)) {
$acceptedLanguages = [];
}
// Add get as absolute quality accepted language (except this language isn't valid)
if (!empty($get['lang'])) {
$acceptedLanguages[] = $get['lang'];
}
// return the sys language in case there's nothing to do
if (empty($acceptedLanguages)) {
return $sysLang;
}
// Set the syslang as default fallback
$current_lang = $sysLang;
// start with quality zero (every guessed language is more acceptable ..)
$current_q = 0;
foreach ($acceptedLanguages as $acceptedLanguage) {
$res = preg_match(
'/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i',
$acceptedLanguage,
$matches
);
// Invalid language? -> skip
if (!$res) {
continue;
}
// split language codes based on it's "-"
$lang_code = explode('-', $matches[1]);
// determine the quality of the guess
if (isset($matches[2])) {
$lang_quality = (float)$matches[2];
} else {
// fallback so without a quality parameter, it's probably the best
$lang_quality = 1;
}
// loop through each part of the code-parts
while (count($lang_code)) {
// try to mix them so we can get double-code parts too
$match_lang = strtolower(join('-', $lang_code));
if (file_exists(__DIR__ . "/../../../view/lang/$match_lang") &&
is_dir(__DIR__ . "/../../../view/lang/$match_lang")) {
if ($lang_quality > $current_q) {
$current_lang = $match_lang;
$current_q = $lang_quality;
break;
}
}
// remove the most right code-part
array_pop($lang_code);
}
}
return $current_lang;
}
/**
* Return the localized version of the provided string with optional string interpolation
*
* This function takes a english string as parameter, and if a localized version
* exists for the current language, substitutes it before performing an eventual
* string interpolation (sprintf) with additional optional arguments.
*
* Usages:
* - DI::l10n()->t('This is an example')
* - DI::l10n()->t('URL %s returned no result', $url)
* - DI::l10n()->t('Current version: %s, new version: %s', $current_version, $new_version)
*
* @param string $s
* @param array $vars Variables to interpolate in the translation string
*
* @return string
*/
public function t($s, ...$vars)
{
if (empty($s)) {
return '';
}
if (!empty($this->strings[$s])) {
$t = $this->strings[$s];
$s = is_array($t) ? $t[0] : $t;
}
if (count($vars) > 0) {
$s = sprintf($s, ...$vars);
}
return $s;
}
/**
* Return the localized version of a singular/plural string with optional string interpolation
*
* This function takes two english strings as parameters, singular and plural, as
* well as a count. If a localized version exists for the current language, they
* are used instead. Discrimination between singular and plural is done using the
* localized function if any or the default one. Finally, a string interpolation
* is performed using the count as parameter.
*
* Usages:
* - DI::l10n()->tt('Like', 'Likes', $count)
* - DI::l10n()->tt("%s user deleted", "%s users deleted", count($users))
*
* @param string $singular
* @param string $plural
* @param int $count
*
* @return string
* @throws \Exception
*/
public function tt(string $singular, string $plural, int $count)
{
if (!empty($this->strings[$singular])) {
$t = $this->strings[$singular];
if (is_array($t)) {
$plural_function = 'string_plural_select_' . str_replace('-', '_', $this->lang);
if (function_exists($plural_function)) {
$i = $plural_function($count);
} else {
$i = $this->stringPluralSelectDefault($count);
}
// for some languages there is only a single array item
if (!isset($t[$i])) {
$s = $t[0];
} else {
$s = $t[$i];
}
} else {
$s = $t;
}
} elseif ($this->stringPluralSelectDefault($count)) {
$s = $plural;
} else {
$s = $singular;
}
$s = @sprintf($s, $count);
return $s;
}
/**
* Provide a fallback which will not collide with a function defined in any language file
*
* @param int $n
*
* @return bool
*/
private function stringPluralSelectDefault($n)
{
return $n != 1;
}
/**
* Return installed languages codes as associative array
*
* Scans the view/lang directory for the existence of "strings.php" files, and
* returns an alphabetical list of their folder names (@-char language codes).
* Adds the english language if it's missing from the list.
*
* Ex: array('de' => 'de', 'en' => 'en', 'fr' => 'fr', ...)
*
* @return array
*/
public static function getAvailableLanguages()
{
$langs = [];
$strings_file_paths = glob('view/lang/*/strings.php');
if (is_array($strings_file_paths) && count($strings_file_paths)) {
if (!in_array('view/lang/en/strings.php', $strings_file_paths)) {
$strings_file_paths[] = 'view/lang/en/strings.php';
}
asort($strings_file_paths);
foreach ($strings_file_paths as $strings_file_path) {
$path_array = explode('/', $strings_file_path);
$langs[$path_array[2]] = $path_array[2];
}
}
return $langs;
}
/**
* Translate days and months names.
*
* @param string $s String with day or month name.
*
* @return string Translated string.
*/
public function getDay($s)
{
$ret = str_replace(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
[$this->t('Monday'), $this->t('Tuesday'), $this->t('Wednesday'), $this->t('Thursday'), $this->t('Friday'), $this->t('Saturday'), $this->t('Sunday')],
$s);
$ret = str_replace(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
[$this->t('January'), $this->t('February'), $this->t('March'), $this->t('April'), $this->t('May'), $this->t('June'), $this->t('July'), $this->t('August'), $this->t('September'), $this->t('October'), $this->t('November'), $this->t('December')],
$ret);
return $ret;
}
/**
* Translate short days and months names.
*
* @param string $s String with short day or month name.
*
* @return string Translated string.
*/
public function getDayShort($s)
{
$ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
[$this->t('Mon'), $this->t('Tue'), $this->t('Wed'), $this->t('Thu'), $this->t('Fri'), $this->t('Sat'), $this->t('Sun')],
$s);
$ret = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
[$this->t('Jan'), $this->t('Feb'), $this->t('Mar'), $this->t('Apr'), $this->t('May'), $this->t('Jun'), $this->t('Jul'), $this->t('Aug'), $this->t('Sep'), $this->t('Oct'), $this->t('Nov'), $this->t('Dec')],
$ret);
return $ret;
}
/**
* Load poke verbs
*
* @return array index is present tense verb
* value is array containing past tense verb, translation of present, translation of past
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @hook poke_verbs pokes array
*/
public function getPokeVerbs()
{
// index is present tense verb
// value is array containing past tense verb, translation of present, translation of past
$arr = [
'poke' => ['poked', $this->t('poke'), $this->t('poked')],
'ping' => ['pinged', $this->t('ping'), $this->t('pinged')],
'prod' => ['prodded', $this->t('prod'), $this->t('prodded')],
'slap' => ['slapped', $this->t('slap'), $this->t('slapped')],
'finger' => ['fingered', $this->t('finger'), $this->t('fingered')],
'rebuff' => ['rebuffed', $this->t('rebuff'), $this->t('rebuffed')],
];
Hook::callAll('poke_verbs', $arr);
return $arr;
}
/**
* Creates a new L10n instance based on the given langauge
*
* @param string $lang The new language
*
* @return static A new L10n instance
* @throws \Exception
*/
public function withLang(string $lang)
{
// Don't create a new instance for same language
if ($lang === $this->lang) {
return $this;
}
$newL10n = clone $this;
$newL10n->loadTranslationTable($lang);
return $newL10n;
}
}

View file

@ -4,7 +4,7 @@ namespace Friendica\Core;
use Exception; use Exception;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Model\Storage; use Friendica\Model\Storage;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;

View file

@ -158,7 +158,7 @@ abstract class DI
public static function l10n() public static function l10n()
{ {
return self::$dice->create(Core\L10n\L10n::class); return self::$dice->create(Core\L10n::class);
} }
/** /**

View file

@ -7,7 +7,7 @@ use Friendica\App;
use Friendica\Content\Text\BBCode; use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML; use Friendica\Content\Text\HTML;
use Friendica\Core\Config\IPConfiguration; use Friendica\Core\Config\IPConfiguration;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\Database; use Friendica\Database\Database;

View file

@ -2,7 +2,7 @@
namespace Friendica\Model\Storage; namespace Friendica\Model\Storage;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
/** /**

View file

@ -6,7 +6,7 @@
namespace Friendica\Model\Storage; namespace Friendica\Model\Storage;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Friendica\Database\Database as DBA; use Friendica\Database\Database as DBA;

View file

@ -7,7 +7,7 @@
namespace Friendica\Model\Storage; namespace Friendica\Model\Storage;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;

View file

@ -915,15 +915,16 @@ class User
* *
* It's here as a function because the mail is sent from different parts * It's here as a function because the mail is sent from different parts
* *
* @param L10n\L10n $l10n The used language * @param \Friendica\Core\L10n $l10n The used language
* @param array $user User record array * @param array $user User record array
* @param string $sitename * @param string $sitename
* @param string $siteurl * @param string $siteurl
* @param string $password Plaintext password * @param string $password Plaintext password
*
* @return NULL|boolean from notification() and email() inherited * @return NULL|boolean from notification() and email() inherited
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function sendRegisterOpenEmail(L10n\L10n $l10n, $user, $sitename, $siteurl, $password) public static function sendRegisterOpenEmail(\Friendica\Core\L10n $l10n, $user, $sitename, $siteurl, $password)
{ {
$preamble = Strings::deindent($l10n->t( $preamble = Strings::deindent($l10n->t(
' '

View file

@ -4,7 +4,7 @@ namespace Friendica\Module\Item;
use Friendica\App; use Friendica\App;
use Friendica\BaseModule; use Friendica\BaseModule;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Session; use Friendica\Core\Session;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\Database; use Friendica\Database\Database;

View file

@ -7,7 +7,7 @@ use Friendica\Content\Text\BBCode;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Hook; use Friendica\Core\Hook;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\L10n\L10n as L10nClass; use Friendica\Core\L10n as L10nClass;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Worker; use Friendica\Core\Worker;

View file

@ -4,7 +4,7 @@ use Dice\Dice;
use Friendica\App; use Friendica\App;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Lock\ILock; use Friendica\Core\Lock\ILock;
use Friendica\Core\Process; use Friendica\Core\Process;
use Friendica\Core\Session\ISession; use Friendica\Core\Session\ISession;

View file

@ -6,7 +6,7 @@ use Friendica\App;
use Friendica\Core\Hook; use Friendica\Core\Hook;
use Friendica\Model\Storage\IStorage; use Friendica\Model\Storage\IStorage;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Mockery\MockInterface; use Mockery\MockInterface;
/** /**

View file

@ -3,7 +3,7 @@
// contains a test-hook call for creating a storage instance // contains a test-hook call for creating a storage instance
use Friendica\App; use Friendica\App;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Test\Util\SampleStorageBackend; use Friendica\Test\Util\SampleStorageBackend;
use Mockery\MockInterface; use Mockery\MockInterface;

View file

@ -7,7 +7,7 @@ use Friendica\App;
use Friendica\Console\AutomaticInstallation; use Friendica\Console\AutomaticInstallation;
use Friendica\Core\Config\Cache\ConfigCache; use Friendica\Core\Config\Cache\ConfigCache;
use Friendica\Core\Installer; use Friendica\Core\Installer;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\DI; use Friendica\DI;

View file

@ -4,7 +4,7 @@ namespace Friendica\Test\src\Content\Text;
use Friendica\App\BaseURL; use Friendica\App\BaseURL;
use Friendica\Content\Text\BBCode; use Friendica\Content\Text\BBCode;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Test\MockedTest; use Friendica\Test\MockedTest;
use Friendica\Test\Util\AppMockTrait; use Friendica\Test\Util\AppMockTrait;
use Friendica\Test\Util\VFSTrait; use Friendica\Test\Util\VFSTrait;

View file

@ -17,7 +17,7 @@ class InstallerTest extends MockedTest
use VFSTrait; use VFSTrait;
/** /**
* @var \Friendica\Core\L10n\L10n|MockInterface * @var \Friendica\Core\L10n|MockInterface
*/ */
private $l10nMock; private $l10nMock;
@ -27,14 +27,14 @@ class InstallerTest extends MockedTest
$this->setUpVfsDir(); $this->setUpVfsDir();
$this->l10nMock = \Mockery::mock(\Friendica\Core\L10n\L10n::class); $this->l10nMock = \Mockery::mock(\Friendica\Core\L10n::class);
/** @var Dice|MockInterface $dice */ /** @var Dice|MockInterface $dice */
$dice = \Mockery::mock(Dice::class)->makePartial(); $dice = \Mockery::mock(Dice::class)->makePartial();
$dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php'); $dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');
$dice->shouldReceive('create') $dice->shouldReceive('create')
->with(\Friendica\Core\L10n\L10n::class) ->with(\Friendica\Core\L10n::class)
->andReturn($this->l10nMock); ->andReturn($this->l10nMock);
DI::init($dice); DI::init($dice);

View file

@ -2,7 +2,7 @@
namespace src\Core\L10n; namespace src\Core\L10n;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Test\MockedTest; use Friendica\Test\MockedTest;
class L10nTest extends MockedTest class L10nTest extends MockedTest

View file

@ -6,7 +6,7 @@ use Dice\Dice;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\Config\PreloadConfiguration; use Friendica\Core\Config\PreloadConfiguration;
use Friendica\Core\Hook; use Friendica\Core\Hook;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Core\Session\ISession; use Friendica\Core\Session\ISession;
use Friendica\Core\StorageManager; use Friendica\Core\StorageManager;
use Friendica\Database\Database; use Friendica\Database\Database;

View file

@ -2,7 +2,7 @@
namespace Friendica\Test\src\Model\Storage; namespace Friendica\Test\src\Model\Storage;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Factory\ConfigFactory; use Friendica\Factory\ConfigFactory;
use Friendica\Model\Storage\Database; use Friendica\Model\Storage\Database;
use Friendica\Model\Storage\IStorage; use Friendica\Model\Storage\IStorage;

View file

@ -3,7 +3,7 @@
namespace Friendica\Test\src\Model\Storage; namespace Friendica\Test\src\Model\Storage;
use Friendica\Core\Config\IConfiguration; use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n; use Friendica\Core\L10n;
use Friendica\Model\Storage\Filesystem; use Friendica\Model\Storage\Filesystem;
use Friendica\Model\Storage\IStorage; use Friendica\Model\Storage\IStorage;
use Friendica\Test\Util\VFSTrait; use Friendica\Test\Util\VFSTrait;