<?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
namespace Friendica\Core;
-use Friendica\Core\Config\IConfig;
-use Friendica\Core\Session\ISession;
+use Friendica\Core\Config\Capability\IManageConfigValues;
+use Friendica\Core\Session\Capability\IHandleSessions;
use Friendica\Database\Database;
use Friendica\Util\Strings;
-use Psr\Log\LoggerInterface;
/**
* Provide Language, Translation, and Localization functions to the application
*/
class L10n
{
+ /** @var string The default language */
+ const DEFAULT = 'en';
+ /** @var string[] The language names in their language */
+ const LANG_NAMES = [
+ 'ar' => 'العربية',
+ 'bg' => 'Български',
+ 'ca' => 'Català',
+ 'cs' => 'Česky',
+ 'da-dk' => 'Dansk (Danmark)',
+ 'de' => 'Deutsch',
+ 'en-gb' => 'English (United Kingdom)',
+ 'en-us' => 'English (United States)',
+ 'en' => 'English (Default)',
+ 'eo' => 'Esperanto',
+ 'es' => 'Español',
+ 'et' => 'Eesti',
+ 'fi-fi' => 'Suomi',
+ 'fr' => 'Français',
+ 'hu' => 'Magyar',
+ 'is' => 'Íslenska',
+ 'it' => 'Italiano',
+ 'ja' => '日本語',
+ 'nb-no' => 'Norsk bokmål',
+ 'nl' => 'Nederlands',
+ 'pl' => 'Polski',
+ 'pt-br' => 'Português Brasileiro',
+ 'ro' => 'Română',
+ 'ru' => 'Русский',
+ 'sv' => 'Svenska',
+ 'zh-cn' => '简体中文',
+ ];
+
/**
* A string indicating the current language used for translation:
* - Two-letter ISO 639-1 code.
*/
private $dba;
- /**
- * @var LoggerInterface
- */
- private $logger;
-
- public function __construct(IConfig $config, Database $dba, LoggerInterface $logger, ISession $session, array $server, array $get)
+ public function __construct(IManageConfigValues $config, Database $dba, IHandleSessions $session, array $server, array $get)
{
$this->dba = $dba;
- $this->logger = $logger;
- $this->loadTranslationTable(L10n::detectLanguage($server, $get, $config->get('system', 'language', 'en')));
+ $this->loadTranslationTable(L10n::detectLanguage($server, $get, $config->get('system', 'language', self::DEFAULT)));
$this->setSessionVariable($session);
$this->setLangFromSession($session);
}
/**
* Sets the language session variable
*/
- private function setSessionVariable(ISession $session)
+ private function setSessionVariable(IHandleSessions $session)
{
if ($session->get('authenticated') && !$session->get('language')) {
$session->set('language', $this->lang);
}
}
- private function setLangFromSession(ISession $session)
+ private function setLangFromSession(IHandleSessions $session)
{
if ($session->get('language') !== $this->lang) {
$this->loadTranslationTable($session->get('language'));
*
* @return string The two-letter language code
*/
- public static function detectLanguage(array $server, array $get, string $sysLang = 'en')
+ public static function detectLanguage(array $server, array $get, string $sysLang = self::DEFAULT)
{
$lang_variable = $server['HTTP_ACCEPT_LANGUAGE'] ?? null;
*/
public function tt(string $singular, string $plural, int $count)
{
+ $s = null;
+
if (!empty($this->strings[$singular])) {
$t = $this->strings[$singular];
if (is_array($t)) {
$i = $this->stringPluralSelectDefault($count);
}
- // for some languages there is only a single array item
- if (!isset($t[$i])) {
- $s = $t[0];
- } else {
+ if (isset($t[$i])) {
$s = $t[$i];
+ } elseif (count($t) > 0) {
+ // for some languages there is only a single array item
+ $s = $t[0];
}
+ // if $t is empty, skip it, because empty strings array are indended
+ // to make string file smaller when there's no translation
} else {
$s = $t;
}
- } elseif ($this->stringPluralSelectDefault($count)) {
+ }
+
+ if (is_null($s) && $this->stringPluralSelectDefault($count)) {
$s = $plural;
- } else {
+ } elseif (is_null($s)) {
$s = $singular;
}
*
* 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.
+ * Adds the english language if it's missing from the list. Folder names are
+ * replaced by nativ language names.
*
- * Ex: array('de' => 'de', 'en' => 'en', 'fr' => 'fr', ...)
+ * Ex: array('de' => 'Deutsch', 'en' => 'English', 'fr' => 'Français', ...)
*
* @return array
*/
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];
+ $langs[$path_array[2]] = self::LANG_NAMES[$path_array[2]] ?? $path_array[2];
}
}
return $langs;