You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.6 KiB
PHP
119 lines
3.6 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
/**
|
|
* Provides translated language strings.
|
|
*/
|
|
class Strings {
|
|
|
|
private $language = "en";
|
|
private $strings = [];
|
|
|
|
public function __construct($language = "en") {
|
|
if (!preg_match("/[a-zA-Z\_\-]+/", $language)) {
|
|
throw new Exception("Invalid language code $language");
|
|
}
|
|
|
|
$this->load("en");
|
|
|
|
if (file_exists(__DIR__ . "/../langs/$language/")) {
|
|
$this->language = $language;
|
|
$this->load($language);
|
|
} else {
|
|
trigger_error("Language $language could not be found.", E_USER_WARNING);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load all JSON files for the specified language.
|
|
* @param string $language
|
|
*/
|
|
private function load(string $language) {
|
|
$files = glob(__DIR__ . "/../langs/$language/*.json");
|
|
foreach ($files as $file) {
|
|
$strings = json_decode(file_get_contents($file), true);
|
|
foreach ($strings as $key => $val) {
|
|
if (array_key_exists($key, $this->strings)) {
|
|
trigger_error("Language key \"$key\" is defined more than once.", E_USER_WARNING);
|
|
}
|
|
$this->strings[$key] = $val;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add language strings dynamically.
|
|
* @param array $strings ["key" => "value", ...]
|
|
*/
|
|
public function addStrings(array $strings) {
|
|
foreach ($strings as $key => $val) {
|
|
$this->strings[$key] = $val;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* I18N string getter. If the key isn't found, it outputs the key itself.
|
|
* @param string $key
|
|
* @param bool $echo True to echo the result, false to return it. Default is true.
|
|
* @return string
|
|
*/
|
|
public function get(string $key, bool $echo = true): string {
|
|
$str = $key;
|
|
if (array_key_exists($key, $this->strings)) {
|
|
$str = $this->strings[$key];
|
|
} else {
|
|
trigger_error("Language key \"$key\" does not exist in " . $this->language, E_USER_WARNING);
|
|
}
|
|
|
|
if ($echo) {
|
|
echo $str;
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
/**
|
|
* I18N string getter (with builder). If the key doesn't exist, outputs the key itself.
|
|
* @param string $key
|
|
* @param array $replace key-value array of replacements.
|
|
* If the string value is "hello {abc}" and you give ["abc" => "123"], the
|
|
* result will be "hello 123".
|
|
* @param bool $echo True to echo the result, false to return it. Default is true.
|
|
* @return string
|
|
*/
|
|
public function build(string $key, array $replace, bool $echo = true): string {
|
|
$str = $key;
|
|
if (array_key_exists($key, $this->strings)) {
|
|
$str = $this->strings[$key];
|
|
} else {
|
|
trigger_error("Language key \"$key\" does not exist in " . $this->language, E_USER_WARNING);
|
|
}
|
|
|
|
foreach ($replace as $find => $repl) {
|
|
$str = str_replace("{" . $find . "}", $repl, $str);
|
|
}
|
|
|
|
if ($echo) {
|
|
echo $str;
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
/**
|
|
* Builds and returns a JSON key:value string for the supplied array of keys.
|
|
* @param array $keys ["key1", "key2", ...]
|
|
*/
|
|
public function getJSON(array $keys): string {
|
|
$strings = [];
|
|
foreach ($keys as $k) {
|
|
$strings[$k] = $this->get($k, false);
|
|
}
|
|
return json_encode($strings);
|
|
}
|
|
|
|
}
|