'; // End of .txp-layout.;
}
/**
* Saves the active language.
*/
function save_language()
{
global $textarray, $locale;
extract(psa(array(
'language',
)));
if (safe_field("lang", 'txp_lang', "lang = '".doSlash($language)."' LIMIT 1")) {
$locale = Txp::get('\Textpattern\L10n\Locale')->getLanguageLocale($language);
$new_locale = $prefs['locale'] = Txp::get('\Textpattern\L10n\Locale')->setLocale(LC_ALL, array($language, 'C'))->getLocale();
set_pref('locale', $new_locale);
if ($new_locale == $locale) {
$msg = gTxt('preferences_saved');
} else {
$msg = array(gTxt('locale_not_available_for_language', array('{name}' => $language)), E_WARNING);
}
set_pref('language', $language);
$textarray = load_lang($language);
list_languages($msg);
return;
}
list_languages(array(gTxt('language_not_installed', array('{name}' => $language)), E_ERROR));
}
/**
* Installs a language from the RPC server or from a file.
*
* This function fetches language strings for the given language code from
* either the RPC server or a file.
*
* Action is taken based on three HTTP POST parameters: 'lang_code', 'force' and
* 'updating'. The 'lang_code' is the installed langauge, e.g. 'en-gb', 'fi-fi'.
* The 'force' when set to 'file' can be used force an installation from a local
* file. The 'updating' specifies whether only to install (0) or to update (1).
*/
function get_language()
{
global $prefs, $textarray;
require_once txpath.'/lib/IXRClass.php';
$lang_code = gps('lang_code');
$client = new IXR_Client(RPC_SERVER);
// $client->debug = true;
@set_time_limit(90); // TODO: 90 seconds: seriously?
if (gps('force') == 'file' || !$client->query('tups.getLanguage', $prefs['blog_uid'], $lang_code)) {
if ((gps('force') == 'file' || gps('updating') !== '1') && install_language_from_file($lang_code)) {
if (defined('LANG')) {
$textarray = load_lang(LANG);
}
callback_event('lang_installed', 'file', false, $lang_code);
return list_languages(gTxt($lang_code).sp.gTxt('updated'));
} else {
pagetop(gTxt('installing_language'));
echo graf(' '.gTxt('rpc_connect_error')."", array('class' => 'alert-block error'));
}
} else {
$response = $client->getResponse();
$lang_struct = unserialize($response);
if ($lang_struct === false) {
$errors = $size = 1;
} else {
array_walk($lang_struct, 'install_lang_key');
$size = count($lang_struct);
$errors = 0;
for ($i = 0; $i < $size; $i++) {
$errors += (!$lang_struct[$i]['ok']);
}
if (defined('LANG')) {
$textarray = load_lang(LANG);
}
}
$msg = gTxt($lang_code).sp.gTxt('updated');
callback_event('lang_installed', 'remote', false, $lang_code);
if ($errors > 0) {
$msg = array($msg.sprintf(" (%s errors, %s ok)", $errors, ($size-$errors)), E_ERROR);
}
list_languages($msg);
}
}
/**
* Writes a new language string to the database.
*
* The language is taken from a 'lang_code' HTTP POST or GET parameter.
*
* The '$value' argument takes a string as an array. This array consists of keys
* 'name', 'event', 'data', 'uLastmod'.
*
* @param array $value The string
* @param int $key Not used
*/
function install_lang_key(&$value, $key)
{
extract(gpsa(array(
'lang_code',
'updating',
)));
$exists = safe_field(
"name",
'txp_lang',
"name = '".doSlash($value['name'])."' AND lang = '".doSlash($lang_code)."'"
);
$q =
"name = '".doSlash($value['name'])."',
event = '".doSlash($value['event'])."',
data = '".doSlash($value['data'])."',
lastmod = '".doSlash(strftime('%Y%m%d%H%M%S', $value['uLastmod']))."'";
if ($exists !== false) {
$value['ok'] = safe_update(
'txp_lang',
$q,
"owner = '".doSlash(TEXTPATTERN_LANG_OWNER_SYSTEM)."' AND lang = '".doSlash($lang_code)."' AND name = '".doSlash($value['name'])."'"
);
} else {
$value['ok'] = safe_insert(
'txp_lang',
"$q, lang = '".doSlash($lang_code)."'"
);
}
}
/**
* Installs a Textpack.
*
* The Textpack is feeded by a 'textpack' HTTP POST parameter.
*
* @see install_textpack()
*/
function get_textpack()
{
$textpack = ps('textpack');
$n = install_textpack($textpack, true);
list_languages(gTxt('textpack_strings_installed', array('{count}' => $n)));
}
/**
* Remove all language strings for the given lang code.
*
* Removed language code is specified with 'lang_code' HTTP POST
* parameter.
*/
function remove_language()
{
$lang_code = ps('lang_code');
$ret = safe_delete('txp_lang', "lang = '".doSlash($lang_code)."'");
if ($ret) {
callback_event('lang_deleted', '', 0, $lang_code);
$msg = gTxt($lang_code).sp.gTxt('deleted');
} else {
$msg = gTxt('cannot_delete', array('{thing}' => $lang_code));
}
list_languages($msg);
}
/**
* Lists all language files in the 'lang' directory.
*
* @return array Available language filenames
*/
function get_lang_files()
{
$lang_dir = txpath.DS.'lang'.DS;
if (!is_dir($lang_dir)) {
trigger_error('Lang directory is not a directory: '.$lang_dir, E_USER_WARNING);
return array();
}
if (chdir($lang_dir)) {
if ($files = glob('*.{txt,textpack}', GLOB_BRACE)) {
return $files;
}
}
return array();
}