Browse Source

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

pull/8134/head
nupplaPhil 1 month ago
parent
commit
2838635d64
No account linked to committer's email address
30 changed files with 354 additions and 490 deletions
  1. +2
    -2
      doc/AddonStorageBackend.md
  2. +1
    -1
      src/App.php
  3. +1
    -1
      src/App/Authentication.php
  4. +6
    -6
      src/App/Module.php
  5. +1
    -1
      src/App/Page.php
  6. +2
    -2
      src/Console/ArchiveContact.php
  7. +1
    -1
      src/Console/GlobalCommunityBlock.php
  8. +1
    -1
      src/Console/NewPassword.php
  9. +1
    -1
      src/Console/PostUpdate.php
  10. +311
    -23
      src/Core/L10n.php
  11. +0
    -425
      src/Core/L10n/L10n.php
  12. +1
    -1
      src/Core/StorageManager.php
  13. +1
    -1
      src/DI.php
  14. +1
    -1
      src/Model/Notify.php
  15. +1
    -1
      src/Model/Storage/AbstractStorage.php
  16. +1
    -1
      src/Model/Storage/Database.php
  17. +1
    -1
      src/Model/Storage/Filesystem.php
  18. +7
    -6
      src/Model/User.php
  19. +1
    -1
      src/Module/Item/Ignore.php
  20. +1
    -1
      src/Module/Register.php
  21. +1
    -1
      static/dependencies.config.php
  22. +1
    -1
      tests/Util/SampleStorageBackend.php
  23. +1
    -1
      tests/Util/SampleStorageBackendInstance.php
  24. +1
    -1
      tests/src/Console/AutomaticInstallationConsoleTest.php
  25. +1
    -1
      tests/src/Content/Text/BBCodeTest.php
  26. +3
    -3
      tests/src/Core/InstallerTest.php
  27. +1
    -1
      tests/src/Core/L10n/L10nTest.php
  28. +1
    -1
      tests/src/Core/StorageManagerTest.php
  29. +1
    -1
      tests/src/Model/Storage/DatabaseStorageTest.php
  30. +1
    -1
      tests/src/Model/Storage/FilesystemStorageTest.php

+ 2
- 2
doc/AddonStorageBackend.md View File

@@ -145,7 +145,7 @@ class SampleStorageBackend implements IStorage

/** @var Config\IConfiguration */
private $config;
/** @var L10n\L10n */
/** @var \Friendica\Core\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
* 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->l10n = $l10n;

+ 1
- 1
src/App.php View File

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

+ 1
- 1
src/App/Authentication.php View File

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

/**

+ 6
- 6
src/App/Module.php View File

@@ -207,15 +207,15 @@ class Module
/**
* Run the determined module class and calls all hooks applied to
*
* @param Core\L10n\L10n $l10n The L10n instance
* @param App\BaseURL $baseUrl The Friendica Base URL
* @param LoggerInterface $logger The Friendica logger
* @param array $server The $_SERVER variable
* @param array $post The $_POST variables
* @param \Friendica\Core\L10n $l10n The L10n instance
* @param App\BaseURL $baseUrl The Friendica Base URL
* @param LoggerInterface $logger The Friendica logger
* @param array $server The $_SERVER variable
* @param array $post The $_POST variables
*
* @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) {
info($l10n->t("You must be logged in to use addons. "));

+ 1
- 1
src/App/Page.php View File

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

+ 2
- 2
src/Console/ArchiveContact.php View File

@@ -30,7 +30,7 @@ class ArchiveContact extends \Asika\SimpleConsole\Console
*/
private $dba;
/**
* @var L10n\L10n
* @var \Friendica\Core\L10n
*/
private $l10n;

@@ -51,7 +51,7 @@ 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);


+ 1
- 1
src/Console/GlobalCommunityBlock.php View File

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


+ 1
- 1
src/Console/NewPassword.php View File

@@ -3,7 +3,7 @@
namespace Friendica\Console;

use Friendica\App;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Database\Database;
use Friendica\Model\User;
use RuntimeException;

+ 1
- 1
src/Console/PostUpdate.php View File

@@ -4,7 +4,7 @@ namespace Friendica\Console;

use Friendica\App;
use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Core\Update;

/**

+ 311
- 23
src/Core/L10n.php View File

@@ -1,11 +1,12 @@
<?php
/**
* @file src/Core/L10n.php
*/

namespace Friendica\Core;

use Friendica\Core\L10n\L10n as L10nClass;
use Friendica\DI;
use Friendica\Core\Config\IConfiguration;
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
@@ -13,26 +14,198 @@ use Friendica\DI;
*/
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 static function getCurrentLang()
public function getCurrentLang()
{
return DI::l10n()->getCurrentLang();
return $this->lang;
}

/**
* @param string $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
*
* @return L10nClass The new L10n class with the new language
* First addon strings are loaded, then globals
*
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* Uses an App object shim since all the strings files refer to $a->strings
*
* @param string $lang language code to load
*
* @throws \Exception
*/
public static function withLang(string $lang)
private function loadTranslationTable($lang)
{
return DI::l10n()->withLang($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
*/
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
* @throws \Exception
*/
public static function tt(string $singular, string $plural, int $count)
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 DI::l10n()->tt($singular, $plural, $count);
return $n != 1;
}

/**
@@ -95,7 +320,20 @@ class L10n
*/
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.
*/
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.
*/
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
* value is array containing past tense verb, translation of present, translation of past
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @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;
}
}

+ 0
- 425
src/Core/L10n/L10n.php 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;
}
}

+ 1
- 1
src/Core/StorageManager.php View File

@@ -4,7 +4,7 @@ namespace Friendica\Core;

use Exception;
use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Database\Database;
use Friendica\Model\Storage;
use Psr\Log\LoggerInterface;

+ 1
- 1
src/DI.php View File

@@ -158,7 +158,7 @@ abstract class DI

public static function l10n()
{
return self::$dice->create(Core\L10n\L10n::class);
return self::$dice->create(Core\L10n::class);
}

/**

+ 1
- 1
src/Model/Notify.php View File

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

+ 1
- 1
src/Model/Storage/AbstractStorage.php View File

@@ -2,7 +2,7 @@

namespace Friendica\Model\Storage;

use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Psr\Log\LoggerInterface;

/**

+ 1
- 1
src/Model/Storage/Database.php View File

@@ -6,7 +6,7 @@

namespace Friendica\Model\Storage;

use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Psr\Log\LoggerInterface;
use Friendica\Database\Database as DBA;


+ 1
- 1
src/Model/Storage/Filesystem.php View File

@@ -7,7 +7,7 @@
namespace Friendica\Model\Storage;

use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Util\Strings;
use Psr\Log\LoggerInterface;


+ 7
- 6
src/Model/User.php View File

@@ -915,15 +915,16 @@ class User
*
* It's here as a function because the mail is sent from different parts
*
* @param L10n\L10n $l10n The used language
* @param array $user User record array
* @param string $sitename
* @param string $siteurl
* @param string $password Plaintext password
* @param \Friendica\Core\L10n $l10n The used language
* @param array $user User record array
* @param string $sitename
* @param string $siteurl
* @param string $password Plaintext password
*
* @return NULL|boolean from notification() and email() inherited
* @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(
'

+ 1
- 1
src/Module/Item/Ignore.php View File

@@ -4,7 +4,7 @@ namespace Friendica\Module\Item;

use Friendica\App;
use Friendica\BaseModule;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Core\Session;
use Friendica\Core\System;
use Friendica\Database\Database;

+ 1
- 1
src/Module/Register.php View File

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

+ 1
- 1
static/dependencies.config.php View File

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

+ 1
- 1
tests/Util/SampleStorageBackend.php View File

@@ -6,7 +6,7 @@ use Friendica\App;
use Friendica\Core\Hook;
use Friendica\Model\Storage\IStorage;

use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Mockery\MockInterface;

/**

+ 1
- 1
tests/Util/SampleStorageBackendInstance.php View File

@@ -3,7 +3,7 @@
// contains a test-hook call for creating a storage instance

use Friendica\App;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Test\Util\SampleStorageBackend;
use Mockery\MockInterface;


+ 1
- 1
tests/src/Console/AutomaticInstallationConsoleTest.php View File

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

+ 1
- 1
tests/src/Content/Text/BBCodeTest.php View File

@@ -4,7 +4,7 @@ namespace Friendica\Test\src\Content\Text;

use Friendica\App\BaseURL;
use Friendica\Content\Text\BBCode;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Test\MockedTest;
use Friendica\Test\Util\AppMockTrait;
use Friendica\Test\Util\VFSTrait;

+ 3
- 3
tests/src/Core/InstallerTest.php View File

@@ -17,7 +17,7 @@ class InstallerTest extends MockedTest
use VFSTrait;

/**
* @var \Friendica\Core\L10n\L10n|MockInterface
* @var \Friendica\Core\L10n|MockInterface
*/
private $l10nMock;

@@ -27,14 +27,14 @@ class InstallerTest extends MockedTest

$this->setUpVfsDir();

$this->l10nMock = \Mockery::mock(\Friendica\Core\L10n\L10n::class);
$this->l10nMock = \Mockery::mock(\Friendica\Core\L10n::class);

/** @var Dice|MockInterface $dice */
$dice = \Mockery::mock(Dice::class)->makePartial();
$dice = $dice->addRules(include __DIR__ . '/../../../static/dependencies.config.php');

$dice->shouldReceive('create')
->with(\Friendica\Core\L10n\L10n::class)
->with(\Friendica\Core\L10n::class)
->andReturn($this->l10nMock);

DI::init($dice);

+ 1
- 1
tests/src/Core/L10n/L10nTest.php View File

@@ -2,7 +2,7 @@

namespace src\Core\L10n;

use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Test\MockedTest;

class L10nTest extends MockedTest

+ 1
- 1
tests/src/Core/StorageManagerTest.php View File

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

+ 1
- 1
tests/src/Model/Storage/DatabaseStorageTest.php View File

@@ -2,7 +2,7 @@

namespace Friendica\Test\src\Model\Storage;

use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Factory\ConfigFactory;
use Friendica\Model\Storage\Database;
use Friendica\Model\Storage\IStorage;

+ 1
- 1
tests/src/Model/Storage/FilesystemStorageTest.php View File

@@ -3,7 +3,7 @@
namespace Friendica\Test\src\Model\Storage;

use Friendica\Core\Config\IConfiguration;
use Friendica\Core\L10n\L10n;
use Friendica\Core\L10n;
use Friendica\Model\Storage\Filesystem;
use Friendica\Model\Storage\IStorage;
use Friendica\Test\Util\VFSTrait;

Loading…
Cancel
Save