Преглед изворни кода

Merge branch 'master' of github.com:serghey-rodin/vesta

Serghey Rodin пре 10 година
родитељ
комит
cd0dbb4671

+ 8 - 3
bin/v-change-user-language

@@ -19,9 +19,14 @@ source $VESTA/conf/vesta.conf
 
 
 is_language_valid() {
-    if [ ! -e "$VESTA/web/inc/i18n/$language.php" ]; then
-        echo "Error: language $language not exist"
-        log_event "$E_NOTEXIST $EVENT"
+    if ! [[ "$1" =~ ^[[:alnum:]_-]+$ ]]; then
+        echo "Error: language $1 is not valid"
+        log_event "$E_INVALID" "$EVENT"
+        exit $E_INVALID
+    fi
+    if [ ! -e "$VESTA/web/inc/i18n/$1.php" ]; then
+        echo "Error: language $1 doesn't exist"
+        log_event "$E_NOTEXIST" "$EVENT"
         exit $E_NOTEXIST
     fi
 }

+ 1 - 1
web/edit/user/index.php

@@ -62,7 +62,7 @@ exec (VESTA_CMD."v-list-user-packages json", $output, $return_var);
 $packages = json_decode(implode('', $output), true);
 unset($output);
 
-// List lanugages
+// List languages
 exec (VESTA_CMD."v-list-sys-languages json", $output, $return_var);
 $languages = json_decode(implode('', $output), true);
 unset($output);

+ 112 - 0
web/inc/i18n.php

@@ -0,0 +1,112 @@
+<?php
+// Functions for internationalization
+
+/**
+ * Translates string to given language in first parameter, key given in second parameter (dynamically loads required language). Works like spritf from second parameter
+ * @global array $LANG Associative array of language pharses
+ * @return string Translated string
+ */
+function _translate() {
+    global $LANG;
+
+    $args = func_get_args();
+    $l = $args[0];
+
+    if (!$l) return 'NO LANGUAGE DEFINED';
+    $key = $args[1];
+
+    if (!isset($LANG[$l])) {
+        require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$l.'.php');
+    }
+
+    if (!isset($LANG[$l][$key])) {
+        $text=$key;
+    } else {
+        $text=$LANG[$l][$key];
+    }
+
+    array_shift($args);
+    if (count($args)>1) {
+        $args[0] = $text;
+        return call_user_func_array("sprintf",$args);
+    } else {
+        return $text;
+    }
+}
+
+/**
+ * Translates string by a given key in first parameter to current session language. Works like sprintf
+ * @global array $LANG Associative array of language pharses
+ * @return string Translated string
+ * @see _translate()
+ */
+function __() {
+    $args = func_get_args();
+    array_unshift($args,$_SESSION['language']);
+    return call_user_func_array("_translate",$args);
+}
+
+/**
+ * Detects user language from Accept-Language HTTP header.
+ * @param string Fallback language (default: 'en')
+ * @return string Language code (such as 'en' and 'ja')
+ */
+function detect_user_language($fallback='en') {
+    static $user_lang = '';
+
+    // Already detected
+    if (!empty($user_lang)) return $user_lang;
+
+    // Check if Accept-Language header is available
+    if (!isset($_SERVER) ||
+        !isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
+        !is_string($_SERVER['HTTP_ACCEPT_LANGUAGE'])
+    ) {
+        // Store result for reusing
+        $user_lang = $fallback;
+        return $user_lang;
+    }
+
+    // Sort Accept-Language by `q` value
+    $accept_langs = explode(',', preg_replace('/\s/', '', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
+    $accept_langs_sorted = [];
+    foreach ($accept_langs as $lang) {
+        $div = explode(';q=', $lang, 2);
+        if (count($div) < 2) {
+            // `q` value was not specfied
+            // -> Set default `q` value (1)
+            $div[] = '1';
+        }
+        list($code, $q) = $div;
+        if (preg_match('/^[\w\-]+$/', $code)) {
+            // Acceptable language code
+            $accept_langs_sorted[$code] = (double)$q;
+        }
+    }
+    arsort($accept_langs_sorted);
+
+    // List languages
+    exec (VESTA_CMD."v-list-sys-languages json", $output, $return_var);
+    $languages = json_decode(implode('', $output), true);
+    unset($output);
+
+    // Find best matching language
+    foreach ($accept_langs_sorted as $user_lang => $dummy) {
+        $decision = '';
+        foreach ($languages as $prov_lang) {
+            if (strlen($decision) > strlen($prov_lang)) continue;
+            if (strpos($user_lang, $prov_lang) !== false) {
+                $decision = $prov_lang;
+            }
+        }
+        if (!empty($decision)) {
+            // Store result for reusing
+            $user_lang = $decision;
+            return $user_lang;
+        }
+    }
+
+    // Store result for reusing
+    $user_lang = $fallback;
+    return $user_lang;
+}

+ 168 - 168
web/inc/i18n/ja.php

@@ -27,7 +27,7 @@ $LANG['ja'] = array(
 
     'Add User'  => 'ユーザーを追加',
     'Add Domain'  => 'ドメインを追加',
-    'Add Web Domain'  => 'Webドメインを追加',
+    'Add Web Domain'  => 'ウェブドメインを追加',
     'Add DNS Domain'  => 'DNSドメインを追加',
     'Add DNS Record'  => 'DNSレコードを追加',
     'Add Mail Domain'  => 'メールドメインを追加',
@@ -62,8 +62,8 @@ $LANG['ja'] = array(
     'rebuild db'  => 'データベースを再構築',
     'rebuild cron'  => 'Cronを再構築',
     'update counters'  => 'カウンタを更新',
-    'suspend'  => '停止',
-    'unsuspend'  => '停止解除',
+    'suspend'  => '凍結',
+    'unsuspend'  => '凍結解除',
     'delete'  => '削除',
     'show per user'  => 'ユーザー別',
     'login as'  => '次のユーザーとしてログイン:',
@@ -71,9 +71,9 @@ $LANG['ja'] = array(
     'edit'  => '編集',
     'open webstats'  => 'ウェブ統計を開く',
     'view logs'  => 'ログを表示',
-    'list records'  => '%sのレコード',
+    'list records'  => '%sのレコード',
     'add record'  => 'レコードを追加',
-    'list accounts'  => '%sのアカウント',
+    'list accounts'  => '%sのアカウント',
     'add account'  => 'アカウントを追加',
     'open webmail'  => 'ウェブメールを開く',
     'list fail2ban' => 'fail2banリスト',
@@ -86,7 +86,7 @@ $LANG['ja'] = array(
     'restart'  => '再起動',
     'update'  => '更新',
     'generate'  => '生成',
-    'Generate CSR' => 'CSRを生成',
+    'Generate CSR' => '証明書署名要求を生成',
     'reread IP' => 'IPアドレスを再読み込み',
     'enable autoupdate' => '自動更新を有効化',
     'disable autoupdate' => '自動更新を無効化',
@@ -114,7 +114,7 @@ $LANG['ja'] = array(
     'Adding IP address'  => 'IPアドレスの追加',
     'Editing IP Address'  => 'IPアドレスの編集',
     'Editing Backup Exclusions' => 'バックアップ除外設定の編集',
-    'Generating CSR' => 'CSRの生成',
+    'Generating CSR' => '証明書署名要求の生成',
     'Listing'  => 'リスト中:',
     'Search Results'  => '検索結果',
     'Adding Firewall Rule' => 'ファイアウォールの規則の追加',
@@ -122,8 +122,8 @@ $LANG['ja'] = array(
     'Adding IP Address to Banlist' => 'BANリストへのIPアドレスの追加',
 
     'active'  => 'アクティブ',
-    'spnd'  => '停止中',
-    'suspended'  => '停止中',
+    'spnd'  => '凍結中',
+    'suspended'  => '凍結中',
     'running'  => '実行中',
     'stopped'  => '停止中',
     'outdated'  => '旧版',
@@ -155,9 +155,9 @@ $LANG['ja'] = array(
     'Backend Template'  => 'バックエンド テンプレート',
     'Proxy Template' =>'プロキシ テンプレート',
     'DNS Template'  => 'DNSテンプレート',
-    'Web Domains'  => 'Webドメイン',
+    'Web Domains'  => 'ウェブドメイン',
     'SSL Domains'  => 'SSLドメイン',
-    'Web Aliases'  => 'Webエイリアス',
+    'Web Aliases'  => 'ウェブエイリアス',
     'per domain'  => 'ドメインごと',
     'DNS Domains'  => 'DNSドメイン',
     'DNS Domains'  => 'DNSドメイン',
@@ -177,7 +177,7 @@ $LANG['ja'] = array(
     'Proxy Support'  => 'プロキシのサポート',
     'Proxy Extensions'  => 'プロキシ対象拡張子',
     'Web Statistics'  => 'ウェブアクセス統計',
-    'Additional FTP Account'  => '追加のFTP',
+    'Additional FTP Account'  => '追加のFTPアカウント',
     'SOA'  => 'SOA',
     'TTL'  => 'TTL',
     'Expire'  => '有効期限',
@@ -196,7 +196,7 @@ $LANG['ja'] = array(
     'Host'  => 'ホスト',
     'Charset'  => '文字セット',
     'Min'  => '分',
-    'Hour'  => '時',
+    'Hour'  => '時',
     'Day'  => '日',
     'Month'  => '月',
     'Day of week'  => '曜日',
@@ -239,7 +239,7 @@ $LANG['ja'] = array(
     'Release'  => 'リリース',
     'Architecture'  => 'アーキテクチャ',
     'Object'  => 'オブジェクト',
-    'Owner'  => '使用者',
+    'Owner'  => '所有者',
     'Username'  => 'ユーザー名',
     'Password'  => 'パスワード',
     'Email'  => 'メールアドレス',
@@ -247,9 +247,9 @@ $LANG['ja'] = array(
     'Language'  => '言語',
     'First Name'  => '名',
     'Last Name'  => '姓',
-    'Send login credentials to email address'  => 'ログイン認証資格をメールアドレスに送信',
-    'Default Template'  => 'デフォルトテンプレート',
-    'Default Name Servers'  => 'デフォルトネームサーバー',
+    'Send login credentials to email address'  => 'ログイン情報をメールアドレスに送信',
+    'Default Template'  => '規定のテンプレート',
+    'Default Name Servers'  => '規定のネームサーバー',
     'Domain'  => 'ドメイン',
     'DNS Support'  => 'DNSのサポート',
     'Mail Support'  => 'メールのサポート',
@@ -258,16 +258,16 @@ $LANG['ja'] = array(
     'SSL Certificate'  => 'SSL証明書',
     'SSL Key'  => 'SSL鍵',
     'SSL Certificate Authority / Intermediate'  => 'SSL認証局',
-    'SSL CSR' => 'SSL CSR',
+    'SSL CSR' => 'SSL証明書署名要求',
     'optional'  => '任意',
     'internal' => '内部',
     'Statistics Authorization'  => '統計の認証',
     'Statistics Auth'  => '統計の認証',
     'Account'  => 'アカウント',
     'Prefix will be automaticaly added to username'  => 'ユーザー名には接頭辞 %s が自動的に付加されます',
-    'Send FTP credentials to email'  => 'FTP認証資格をメールアドレスに送信',
+    'Send FTP credentials to email'  => 'FTPログイン情報をメールアドレスに送信',
     'Expiration Date'  => '有効期限',
-    'YYYY-MM-DD'  => 'YYYY/MM/DD',
+    'YYYY-MM-DD'  => 'YYYY-MM-DD',
     'Name servers'  => 'ネームサーバー',
     'Record'  => 'レコード',
     'IP or Value'  => 'IPアドレスまたは値',
@@ -297,7 +297,7 @@ $LANG['ja'] = array(
     'mail accounts'  => 'メールアカウント',
     'accounts'  => 'アカウント',
     'databases'  => 'データベース',
-    'cron jobs'  => 'cronジョブ',
+    'cron jobs'  => 'Cronジョブ',
     'backups'  => 'バックアップ',
     'quota'  => '割り当て量',
     'day of week'  => '曜日',
@@ -337,7 +337,7 @@ $LANG['ja'] = array(
     'Download ErrorLog' => 'ErrorLogをダウンロード',
     'Country' => '国',
     '2 letter code' => '2レターコード',
-    'State / Province' => '都道府県',
+    'State / Province' => '州 / 都道府県',
     'City / Locality' => '市区町村',
     'Organization' => '組織',
     'Action' => 'アクション',
@@ -347,41 +347,41 @@ $LANG['ja'] = array(
     'Banlist' => 'BANリスト',
     'ranges are acceptable' => '範囲指定が可能です',
     'CIDR format is supported' => 'CIDRフォーマットが使用できます',
-    'Add one more Name Server' => 'Add one more Name Server',
+    'Add one more Name Server' => 'ネームサーバーを追加',
 
     'unlimited'  => '無制限',
-    '1 account'  => '1のアカウント',
-    '%s accounts'  => '%sのアカウント',
-    '1 domain'  => '1のドメイン',
-    '%s domains'  => '%sのドメイン',
-    '1 record'  => '1のレコード',
-    '%s records'  => '%sのレコード',
-    '1 mail account'  => '1のメールアカウント',
-    '%s mail accounts'  => '%sのメールアカウント',
-    '1 database'  => '1のデータベース',
-    '%s databases'  => '%sのデータベース',
-    '1 cron job'  => '1つのcronジョブ',
-    '%s cron jobs'  => '%sつのcronジョブ',
-    '1 archive'  => '1のアーカイブ',
-    '%s archives'  => '%sのアーカイブ',
-    '1 package'  => '1のパッケージ',
-    '%s packages'  => '%sのパッケージ',
-    '1 IP address'  => '1のIPアドレス',
-    '%s IP addresses'  => '%sのIPアドレス',
+    '1 account'  => '1のアカウント',
+    '%s accounts'  => '%sのアカウント',
+    '1 domain'  => '1のドメイン',
+    '%s domains'  => '%sのドメイン',
+    '1 record'  => '1のレコード',
+    '%s records'  => '%sのレコード',
+    '1 mail account'  => '1のメールアカウント',
+    '%s mail accounts'  => '%sのメールアカウント',
+    '1 database'  => '1のデータベース',
+    '%s databases'  => '%sのデータベース',
+    '1 cron job'  => '1個のCronジョブ',
+    '%s cron jobs'  => '%s個のCronジョブ',
+    '1 archive'  => '1のアーカイブ',
+    '%s archives'  => '%sのアーカイブ',
+    '1 package'  => '1のパッケージ',
+    '%s packages'  => '%sのパッケージ',
+    '1 IP address'  => '1のIPアドレス',
+    '%s IP addresses'  => '%sのIPアドレス',
     '1 month'  => '1ヶ月',
     '%s months'  => '%sヶ月',
-    '1 log record'  => '1のログレコード',
-    '%s log records'  => '%sのログレコード',
-    '1 object'  => '1のオブジェクト',
-    '%s objects'  => '%sのオブジェクト',
+    '1 log record'  => '1のログレコード',
+    '%s log records'  => '%sのログレコード',
+    '1 object'  => '1のオブジェクト',
+    '%s objects'  => '%sのオブジェクト',
     'no exclusions' => '除外しない',
-    '1 rule' => '1の規則',
-    '%s rules' => '%sの規則',
+    '1 rule' => '1の規則',
+    '%s rules' => '%sの規則',
     'There are no currently banned IP' => '現在BANされているIPはありません',
 
     'USER_CREATED_OK'  => 'ユーザー <a href="/edit/user/?user=%s"><b>%s</b></a> は正常に作成されました',
     'WEB_DOMAIN_CREATED_OK'  => 'ドメイン <a href="/edit/web/?domain=%s"><b>%s</b></a> は正常に作成されました',
-    'DNS_DOMAIN_CREATED_OK'  => 'DNS ドメイン <a href="/list/dns/?domain=%s"><b>%s</b></a> は正常に作成されました',
+    'DNS_DOMAIN_CREATED_OK'  => 'DNSドメイン <a href="/list/dns/?domain=%s"><b>%s</b></a> は正常に作成されました',
     'DNS_RECORD_CREATED_OK'  => 'レコード <b>%s.%s</b> は正常に作成されました',
     'MAIL_DOMAIN_CREATED_OK'  => 'メールドメイン <a href="/list/mail/?domain=%s"><b>%s</b></a> は正常に作成されました',
     'MAIL_ACCOUNT_CREATED_OK'  => 'メールアカウント <a href="/edit/mail/?account=%s&domain=%s"><b>%s@%s</b></a> は正常に作成されました',
@@ -393,37 +393,37 @@ $LANG['ja'] = array(
     'RULE_CREATED_OK' => '規則は正常に作成されました',
     'Autoupdate has been successfully enabled' => '自動更新が有効化されました',
     'Autoupdate has been successfully disabled' => '自動更新が無効化されました',
-    'Cronjob email reporting has been successfully enabled' => 'Cronjobのメール報告が有効化されました',
-    'Cronjob email reporting has been successfully disabled' => 'Cronjobのメール報告が無効化されました',
+    'Cronjob email reporting has been successfully enabled' => 'Cronジョブのメール報告が有効化されました',
+    'Cronjob email reporting has been successfully disabled' => 'Cronジョブのメール報告が無効化されました',
     'Changes has been saved.'  => '変更が保存されました',
     'Confirmation'  => '確認',
     'DELETE_USER_CONFIRMATION' => 'ユーザー %s を削除してもよろしいですか?',
-    'SUSPEND_USER_CONFIRMATION' => 'ユーザー %s を停止してもよろしいですか?',
-    'UNSUSPEND_USER_CONFIRMATION' => 'ユーザー %s の停止を解除してもよろしいですか?',
+    'SUSPEND_USER_CONFIRMATION' => 'ユーザー %s を凍結してもよろしいですか?',
+    'UNSUSPEND_USER_CONFIRMATION' => 'ユーザー %s の凍結を解除してもよろしいですか?',
     'DELETE_DOMAIN_CONFIRMATION' => 'ドメイン %s を削除してもよろしいですか?',
-    'SUSPEND_DOMAIN_CONFIRMATION' => 'ドメイン %s を停止してもよろしいですか?',
-    'UNSUSPEND_DOMAIN_CONFIRMATION' => 'ドメイン %s の停止を解除してもよろしいですか?',
+    'SUSPEND_DOMAIN_CONFIRMATION' => 'ドメイン %s を凍結してもよろしいですか?',
+    'UNSUSPEND_DOMAIN_CONFIRMATION' => 'ドメイン %s の凍結を解除してもよろしいですか?',
     'DELETE_RECORD_CONFIRMATION' => 'レコード %s を削除してもよろしいですか?',
-    'SUSPEND_RECORD_CONFIRMATION' => 'レコード %s を停止してもよろしいですか?',
-    'UNSUSPEND_RECORD_CONFIRMATION' => 'レコード %s の停止を解除してもよろしいですか?',
+    'SUSPEND_RECORD_CONFIRMATION' => 'レコード %s を凍結してもよろしいですか?',
+    'UNSUSPEND_RECORD_CONFIRMATION' => 'レコード %s の凍結を解除してもよろしいですか?',
     'DELETE_MAIL_ACCOUNT_CONFIRMATION' => 'メールアカウント %s を削除してもよろしいですか?',
-    'SUSPEND_MAIL_ACCOUNT_CONFIRMATION' => 'メールアカウント %s を停止してもよろしいですか?',
-    'UNSUSPEND_MAIL_ACCOUNT_CONFIRMATION' => 'メールアカウント %s の停止を解除してもよろしいですか?',
+    'SUSPEND_MAIL_ACCOUNT_CONFIRMATION' => 'メールアカウント %s を凍結してもよろしいですか?',
+    'UNSUSPEND_MAIL_ACCOUNT_CONFIRMATION' => 'メールアカウント %s の凍結を解除してもよろしいですか?',
     'DELETE_DATABASE_CONFIRMATION' => 'データベース %s を削除してもよろしいですか?',
-    'SUSPEND_DATABASE_CONFIRMATION' => 'データベース %s を停止してもよろしいですか?',
-    'UNSUSPEND_DATABASE_CONFIRMATION' => 'データベース %s の停止を解除してもよろしいですか?',
+    'SUSPEND_DATABASE_CONFIRMATION' => 'データベース %s を凍結してもよろしいですか?',
+    'UNSUSPEND_DATABASE_CONFIRMATION' => 'データベース %s の凍結を解除してもよろしいですか?',
     'DELETE_CRON_CONFIRMATION' => 'Cronジョブを削除してもよろしいですか?',
-    'SUSPEND_CRON_CONFIRMATION' => 'Cronジョブを停止してもよろしいですか?',
-    'UNSUSPEND_CRON_CONFIRMATION' => 'Cronジョブの停止を解除してもよろしいですか?',
+    'SUSPEND_CRON_CONFIRMATION' => 'Cronジョブを凍結してもよろしいですか?',
+    'UNSUSPEND_CRON_CONFIRMATION' => 'Cronジョブの凍結を解除してもよろしいですか?',
     'DELETE_BACKUP_CONFIRMATION'  => 'バックアップ %s を削除してもよろしいですか?',
     'DELETE_EXCLUSION_CONFIRMATION' => 'バックアップ除外設定 %s を削除してもよろしいですか?',
     'DELETE_PACKAGE_CONFIRMATION'  => 'パッケージ %s を削除してもよろしいですか?',
     'DELETE_IP_CONFIRMATION'  => 'IPアドレス %s を削除してもよろしいですか?',
     'DELETE_RULE_CONFIRMATION' => '規則 #%s を削除してもよろしいですか?',
-    'SUSPEND_RULE_CONFIRMATION' => '規則 #%s を停止してもよろしいですか?',
-    'UNSUSPEND_RULE_CONFIRMATION' => '規則 %s の停止を解除してもよろしいですか?',
+    'SUSPEND_RULE_CONFIRMATION' => '規則 #%s を凍結してもよろしいですか?',
+    'UNSUSPEND_RULE_CONFIRMATION' => '規則 %s の凍結を解除してもよろしいですか?',
     'LEAVE_PAGE_CONFIRMATION' => 'ページを離れてもよろしいですか?',
-    'RESTART_CONFIRMATION' => '%s を再起動させてもよろしいですか?',
+    'RESTART_CONFIRMATION' => '%s を再起動てもよろしいですか?',
     'Welcome'  => 'ようこそ',
     'LOGGED_IN_AS'  => '%s としてログインしました',
     'Error'  => 'エラー',
@@ -435,8 +435,8 @@ $LANG['ja'] = array(
     'Password is too short.'  => 'パスワードが短すぎます(少なくとも6文字必要です)',
     'Error code:'  => 'エラーコード: %s',
     'SERVICE_ACTION_FAILED'  => '"%s" "%s" に失敗しました',
-    'IP address is in use' => 'IPアドレスはすでに使われています',
-    'BACKUP_SCHEDULED'  => 'タスクがキューに追加されました バックアップのダウンロードの準備が完了するとメールによる通知が送信されます',
+    'IP address is in use' => 'IPアドレスはに使われています',
+    'BACKUP_SCHEDULED'  => 'タスクがキューに追加されました バックアップがダウンロード可能になると、メールによる通知が送信されます',
     'BACKUP_EXISTS'  => '現在バックアップが実行中です バックアップが完了するまでお待ちください',
     'RESTORE_SCHEDULED'  => 'タスクがキューに追加されました 復元が完了するとメールによる通知が送信されます',
     'RESTORE_EXISTS'  => '現在復元作業が実行中です 再度操作を行う前に復元作業が完了するまでお待ちください',
@@ -444,21 +444,21 @@ $LANG['ja'] = array(
     'WEB_EXCLUSIONS' => "ドメイン名を一行ずつ入力してください&#10;すべてのドメインを除外するには*を使用してください&#10;特定のディレクトリを除外するには次の形式を用いてください: domain.com:public_html/cache:public_html/tmp",
     'DNS_EXCLUSIONS' => "ドメイン名を一行ずつ入力してください&#10;すべてのドメインを除外するには*を使用してください",
     'MAIL_EXCLUSIONS' => "ドメイン名を一行ずつ入力してください&#10;すべてのドメインを除外するには*を使用してください&#10;特定のアカウントを除外するには次の形式を用いてください: domain.com:info:support:postmaster",
-    'DB_EXCLUSIONS' => "データベース名をフルで一行ずつ入力してください&#10;すべてのデータベースを除外するには*を使用してください",
+    'DB_EXCLUSIONS' => "完全なデータベース名を一行ずつ入力してください&#10;すべてのデータベースを除外するには*を使用してください",
     'CRON_EXCLUSIONS' => "すべてのジョブを除外するには*を使用してください",
     'USER_EXCLUSIONS' => "ディレクトリ名を一行ずつ入力してください&#10;すべてのディレクトリを除外するには*を使用してください",
 
-    'Welcome to Vesta Control Panel'  => 'Vesta Control Panel ようこそ',
+    'Welcome to Vesta Control Panel'  => 'Vesta Control Panel ようこそ',
     'MAIL_FROM'  => 'Vesta Control Panel <noreply@%s>',
-    'GREETINGS_GORDON_FREEMAN' => "こんにちは %s %s さん\n",
+    'GREETINGS_GORDON_FREEMAN' => "こんにちは %s %s さん\n",
     'GREETINGS' => "こんにちは\n",
-    'ACCOUNT_READY' => "アカウントは正常に作成され、使用する準備ができました\n\nhttps://%s/login/\ユーザー名: %s\nパスワード: %s\n\n--\nVesta Control Panel\n",
+    'ACCOUNT_READY' => "アカウントは正常に作成され、使用する準備ができました\n\nhttps://%s/login/\nユーザー名: %s\nパスワード: %s\n\n--\nVesta Control Panel\n",
 
-    'FTP login credentials'  => 'FTPログイン認証資格',
-    'FTP_ACCOUNT_READY' => "FTPアカウントは正常に作成され、使用する準備ができました\n\ホスト名: %s\ユーザー名: %s_%s\nパスワード: %s\n\n--\nVesta Control Panel\n",
+    'FTP login credentials'  => 'FTPログイン情報',
+    'FTP_ACCOUNT_READY' => "FTPアカウントは正常に作成され、使用する準備ができました\n\nホスト名: %s\nユーザー名: %s_%s\nパスワード: %s\n\n--\nVesta Control Panel\n",
 
-    'Database Credentials'  => 'データベース認証資格',
-    'DATABASE_READY' => "データベースは正常に作成されました.\n\nデータベース: %s\nユーザー: %s\nパスワード: %s\n%s\n\n--\nVesta Control Panel\n",
+    'Database Credentials'  => 'データベースログイン情報',
+    'DATABASE_READY' => "データベースは正常に作成されました\n\nデータベース: %s\nユーザー: %s\nパスワード: %s\n%s\n\n--\nVesta Control Panel\n",
 
     'forgot password'  => 'パスワードを忘れた場合',
     'Confirm'  => '確認',
@@ -487,7 +487,7 @@ $LANG['ja'] = array(
     'Configuring Server' => 'サーバー設定',
     'Hostname' => 'ホスト名',
     'Time Zone' => 'タイムゾーン',
-    'Default Language' => 'デフォルトの言語',
+    'Default Language' => '規定の言語',
     'FileSystem Disk Quota ' => 'ディスク割り当て量',
     'Vesta Control Panel Plugins' => 'Vesta Control Panel プラグイン',
     'preview' => 'プレビュー',
@@ -496,108 +496,108 @@ $LANG['ja'] = array(
     'Template Manager' => 'テンプレートマネージャー',
     'Backup Migration Manager' => 'バックアップ移行マネージャー',
     'FileManager' => 'ファイルマネージャー',
-    'show: CPU / MEM / NET / DISK' => 'show: CPU / MEM / NET / DISK',
+    'show: CPU / MEM / NET / DISK' => '表示: CPU / MEM / NET / DISK',
 
     'sort by' => 'ソート',
     'Date' => '日付',
     'Starred' => 'スター付き',
     'Name' => '名前',
 
-    'File Manager' => 'File Manager',
-    'type' => 'type',
-    'size' => 'size',
-    'date' => 'date',
-    'name' => 'name',
-    'Initializing' => 'Initializing',
-    'UPLOAD' => 'UPLOAD',
-    'NEW FILE' => 'NEW FILE',
-    'NEW DIR' => 'NEW DIR',
-    'DELETE' => 'DELETE',
-    'RENAME' => 'RENAME',
-    'COPY' => 'COPY',
-    'ARCHIVE' => 'ARCHIVE',
-    'EXTRACT' => 'EXTRACT',
-    'DOWNLOAD' => 'DOWNLOAD',
-    'Hit' => 'Hit',
-    'to reload the page' => 'to reload the page',
-    'Directory name cannot be empty' => 'Directory name cannot be empty',
-    'File name cannot be empty' => 'File name cannot be empty',
-    'No file selected' => 'No file selected',
-    'No file or folder selected' => 'No file or folder selected',
-    'File type not supported' => 'File type not supported',
-    'Directory download not available in current version' => 'Directory download not available in current version',
-    'Directory not available' => 'Directory not available',
-    'Done' => 'Done',
-    'Close' => 'Close',
-    'Copy' => 'Copy',
-    'Cancel' => 'Cancel',
-    'Rename' => 'Rename',
-    'Delete' => 'Delete',
-    'Extract' => 'Extract',
-    'Create' => 'Create',
-    'Compress' => 'Compress',
+    'File Manager' => 'ファイルマネージャー',
+    'type' => '種類',
+    'size' => '容量',
+    'date' => '日付',
+    'name' => '名前',
+    'Initializing' => '初期化中',
+    'UPLOAD' => 'アップロード',
+    'NEW FILE' => '新規ファイル',
+    'NEW DIR' => '新規ディレクトリ',
+    'DELETE' => '削除',
+    'RENAME' => '名前の変更',
+    'COPY' => 'コピー',
+    'ARCHIVE' => 'アーカイブ',
+    'EXTRACT' => '展開',
+    'DOWNLOAD' => 'ダウンロード',
+    'Hit' => '',
+    'to reload the page' => 'を押すとページを再読み込みします',
+    'Directory name cannot be empty' => 'ディレクトリ名を入力してください',
+    'File name cannot be empty' => 'ファイル名を入力してください',
+    'No file selected' => 'ファイルが選択されていません',
+    'No file or folder selected' => 'ファイルやフォルダが選択されていません',
+    'File type not supported' => 'サポートされていないファイル形式です',
+    'Directory download not available in current version' => '現在のバージョンではディレクトリのダウンロードはできません',
+    'Directory not available' => 'ディレクトリが使用できません',
+    'Done' => '完了',
+    'Close' => '閉じる',
+    'Copy' => 'コピー',
+    'Cancel' => 'キャンセル',
+    'Rename' => '名前を変更',
+    'Delete' => '削除',
+    'Extract' => '展開',
+    'Create' => '作成',
+    'Compress' => '圧縮',
     'OK' => 'OK',
-    'Are you sure you want to copy' => 'Are you sure you want to copy',
-    'Are you sure you want to delete' => 'Are you sure you want to delete',
-    'into' => 'into',
-    'existing files will be replaced' => 'existing files will be replaced',
-    'Original name' => 'Original name',
-    'File' => 'File',
-    'already exists' => 'already exists',
-    'Create file' => 'Create file',
-    'Create directory' => 'Create directory',
+    'Are you sure you want to copy' => '次のファイルをコピーしてもよろしいですか',
+    'Are you sure you want to delete' => '次のファイルを削除してもよろしいですか',
+    'into' => 'から',
+    'existing files will be replaced' => '既に存在するファイルは置き換えられます',
+    'Original name' => '元の名前',
+    'File' => 'ファイル',
+    'already exists' => 'は既に存在します',
+    'Create file' => 'ファイルの作成',
+    'Create directory' => 'ディレクトリの作成',
 
-    'Add New object' => 'Add New object',
-    'Save Form' => 'Save Form',
-    'Cancel saving form' => 'Cancel saving form',
-    'Go to USER list' => 'Go to USER list',
-    'Go to WEB list' => 'Go to WEB list',
-    'Go to DNS list' => 'Go to DNS list',
-    'Go to MAIL list' => 'Go to MAIL list',
-    'Go to DB list' => 'Go to DB list',
-    'Go to CRON list' => 'Go to CRON list',
-    'Go to BACKUP list' => 'Go to BACKUP list',
-    'Focus on search' => 'Focus on search',
-    'Display/Close shortcuts' => 'Display/Close shortcuts',
-    'Move backward through top menu' => 'Move backward through top menu',
-    'Move forward through top menu' => 'Move forward through top menu',
-    'Enter focused element' => 'Enter focused element',
+    'Add New object' => '新しい項目を追加する',
+    'Save Form' => '変更を保存する',
+    'Cancel saving form' => '変更を破棄する',
+    'Go to USER list' => 'ユーザーの一覧に移動',
+    'Go to WEB list' => 'ウェブの一覧に移動',
+    'Go to DNS list' => 'DNSの一覧に移動',
+    'Go to MAIL list' => 'メールの一覧に移動',
+    'Go to DB list' => 'データベースの一覧に移動',
+    'Go to CRON list' => 'CRONの一覧に移動',
+    'Go to BACKUP list' => 'バックアップの一覧に移動',
+    'Focus on search' => '検索欄にフォーカスする',
+    'Display/Close shortcuts' => 'ショートカットの表示を切り替える',
+    'Move backward through top menu' => '上部のメニューにおいて後方の項目に移動します',
+    'Move forward through top menu' => '上部のメニューにおいて前方の項目に移動します',
+    'Enter focused element' => 'フォーカスされた項目に入ります',
 
-    'Upload' => 'Upload',
-    'New File' => 'New File',
-    'New Folder' => 'New Folder',
-    'Download' => 'Download',
-    'Rename' => 'Rename',
-    'Copy' => 'Copy',
-    'Archive' => 'Archive',
-    'Delete' => 'Delete',
-    'Save File (in text editor)' => 'Save File (in text editor)',
-    'Close Popup / Cancel' => 'Close Popup / Cancel',
-    'Move Cursor Up' => 'Move Cursor Up',
-    'Move Cursor Dow' => 'Move Cursor Dow',
-    'Switch to Left Tab' => 'Switch to Left Tab',
-    'Switch to Right Tab' => 'Switch to Right Tab',
-    'Switch Tab' => 'Switch Tab',
-    'Go to the Top of File List' => 'Go to the Top of File List',
-    'Go to the Last File' => 'Go to the Last File',
-    'Open File/Enter Directory' => 'Open File/Enter Directory',
-    'Go to Parent Directory' => 'Go to Parent Directory',
-    'Select Current File' => 'Select Current File',
-    'Select Bunch of Files' => 'Select Bunch of Files',
-    'Append File to the Current Selection' => 'Append File to the Current Selection',
-    'Select All Files' => 'Select All Files',
+    'Upload' => 'アップロード',
+    'New File' => 'ファイルの作成',
+    'New Folder' => 'フォルダの作成',
+    'Download' => 'ダウンロード',
+    'Rename' => '名前の変更',
+    'Copy' => 'コピー',
+    'Archive' => 'アーカイブ',
+    'Delete' => '削除',
+    'Save File (in text editor)' => 'ファイルの保存(テキストエディタ上で)',
+    'Close Popup / Cancel' => 'ポップアップを閉じる / キャンセルする',
+    'Move Cursor Up' => 'カーソルを上に移動する',
+    'Move Cursor Dow' => 'カーソルを下に移動する',
+    'Switch to Left Tab' => '左のタブに切り替える',
+    'Switch to Right Tab' => '右のタブに切り替える',
+    'Switch Tab' => 'タブを切り替える',
+    'Go to the Top of File List' => 'ファイルリストの先頭に移動する',
+    'Go to the Last File' => '最後のファイルに移動する',
+    'Open File/Enter Directory' => 'ファイルを開く / ディレクトリに入る',
+    'Go to Parent Directory' => '親ディレクトリに移動する',
+    'Select Current File' => 'ファイルを選択する',
+    'Select Bunch of Files' => 'ファイルを範囲選択する',
+    'Append File to the Current Selection' => 'ファイルを追加選択する',
+    'Select All Files' => 'すべてのファイルを選択する',
     'shortcuts are inspired by magnificent GNU <a href="https://www.midnight-commander.org/">Midnight Commander</a> file manager' =>
         'shortcuts are inspired by magnificent GNU <a href="https://www.midnight-commander.org/">Midnight Commander</a> file manager',
 
-    'Licence Key' => 'Licence Key',
-    'Enter License Key' => 'Enter License Key',
-    'Buy Licence' => 'Buy Licence',
-    'Buy Lifetime License' => 'Buy Lifetime License',
-    'Disable and Cancel Licence' => 'Disable and Cancel Licence',
-    'Licence Activated' => 'Licence Activated',
-    'Licence Deactivated' => 'Licence Deactivated',
-    'Restrict users so that they cannot use SSH and access only their home directory.' => 'Restrict users so that they cannot use SSH and access only their home directory.',
-    'Browse, copy, edit, view, and retrieve all of your web domain files using fully featured File Manager.' => 'Browse, copy, edit, view, and retrieve all of your web domain files using fully featured File Manager.',
-    'This is a commercial module, you would need to purchace license key to enable it.' => 'This is a commercial module, you would need to purchace license key to enable it.'
+    'Licence Key' => 'ライセンスキー',
+    'Enter License Key' => 'ライセンスキーを入力',
+    'Buy Licence' => 'ライセンスを購入',
+    'Buy Lifetime License' => '永久ライセンスを購入',
+    'Disable and Cancel Licence' => 'ライセンスをキャンセルして無効化する',
+    'Licence Activated' => 'ライセンスが有効化されました',
+    'Licence Deactivated' => 'ライセンスが無効化されました',
+    'Restrict users so that they cannot use SSH and access only their home directory.' => 'ユーザーによるSSHの使用を禁止し、各自のホームディレクトリにのみアクセスできるように制限します',
+    'Browse, copy, edit, view, and retrieve all of your web domain files using fully featured File Manager.' => '高機能なファイルマネージャーを用いてウェブ上のファイルを閲覧、コピー、編集、表示、復旧できます',
+    'This is a commercial module, you would need to purchace license key to enable it.' => 'これは有償の機能で、有効化するにはライセンスキーを購入する必要があります'
 
-);
+);

+ 2 - 48
web/inc/main.php

@@ -1,6 +1,8 @@
 <?php
 session_start();
 
+require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n.php');
+
 // Check system settings
 if ((!isset($_SESSION['VERSION'])) && (!defined('NO_AUTH_REQUIRED'))) {
     session_destroy();
@@ -14,63 +16,15 @@ if ((!isset($_SESSION['user'])) && (!defined('NO_AUTH_REQUIRED'))) {
     $_SESSION['request_uri'] = $_SERVER['REQUEST_URI'];
     header("Location: /login/");
     exit;
-
 }
 
 if (isset($_SESSION['user'])) {
-    require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$_SESSION['language'].'.php');
     if(!isset($_SESSION['token'])){
         $token = uniqid(mt_rand(), true);
         $_SESSION['token'] = $token;
     }
 }
 
-
-/**
- * Translates string by a given key in first parameter to current session language. Works like sprintf
- * @global array $LANG Associative array of language pharses
- * @return string Translated string
- * @see _translate()
- */
-function __() {
-   $args = func_get_args();
-   array_unshift($args,$_SESSION['language']);
-   return call_user_func_array("_translate",$args);
-}
-
-/**
- * Translates string to given language in first parameter, key given in second parameter (dynamically loads required language). Works like spritf from second parameter
- * @global array $LANG Associative array of language pharses
- * @return string Translated string
- */
-function _translate() {
-    global $LANG;
-
-    $args = func_get_args();
-    $l = $args[0];
-
-    if (!$l) return 'NO LANGUAGE DEFINED';
-    $key = $args[1];
-
-    if (!isset($LANG[$l])) {
-        require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$l.'.php');
-    }
-
-    if (!isset($LANG[$l][$key])) {
-        $text=$key;
-    } else {
-        $text=$LANG[$l][$key];
-    }
-
-    array_shift($args);
-    if (count($args)>1) {
-        $args[0] = $text;
-        return call_user_func_array("sprintf",$args);
-    } else {
-        return $text;
-    }
-}
-
 define('VESTA_CMD', '/usr/bin/sudo /usr/local/vesta/bin/');
 
 $i = 0;

+ 3 - 39
web/js/i18n.js.php

@@ -1,46 +1,10 @@
 <?php
 session_start();
-if (empty($_SESSION['language'])) {
-    $_SESSION['language'] = 'en';
-}
-require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$_SESSION['language'].'.php');
-
-if (!function_exists('_translate')) {
-    function _translate() {
-        global $LANG;
-
-        $args = func_get_args();
-        $l = $args[0];
-
-        if (!$l) return 'NO LANGUAGE DEFINED';
-        $key = $args[1];
 
-        if (!isset($LANG[$l])) {
-            require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$l.'.php');
-        }
+require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n.php');
 
-        if (!isset($LANG[$l][$key])) {
-            $text=$key;
-        } else {
-            $text=$LANG[$l][$key];
-        }
-
-        array_shift($args);
-        if (count($args)>1) {
-            $args[0] = $text;
-            return call_user_func_array("sprintf",$args);
-        } else {
-            return $text;
-        }
-    }
-}
-
-if (!function_exists('__')) {
-    function __() {
-        $args = func_get_args();
-        array_unshift($args,$_SESSION['language']);
-        return call_user_func_array("_translate",$args);
-    }
+if (empty($_SESSION['language'])) {
+    $_SESSION['language'] = detect_user_language();
 }
 ?>
 

+ 2 - 2
web/login/index.php

@@ -93,8 +93,8 @@ foreach ($sys_arr as $key => $value) {
     $_SESSION[$key] = $value;
 }
 
-// Set default language
-if (empty($_SESSION['language'])) $_SESSION['language']='en';
+// Detect language
+if (empty($_SESSION['language'])) $_SESSION['language'] = detect_user_language();
 
 require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$_SESSION['language'].'.php');
 require_once('../templates/header.html');

+ 2 - 8
web/reset/index.php

@@ -74,14 +74,8 @@ if ((!empty($_POST['user'])) && (!empty($_POST['code'])) && (!empty($_POST['pass
     }
 }
 
-// Set system language
-exec (VESTA_CMD . "v-list-sys-config json", $output, $return_var);
-$data = json_decode(implode('', $output), true);
-if (!empty( $data['config']['LANGUAGE'])) {
-    $_SESSION['language'] = $data['config']['LANGUAGE'];
-} else {
-    $_SESSION['language'] = 'en';
-}
+// Detect language
+if (empty($_SESSION['language'])) $_SESSION['language'] = detect_user_language();
 
 if (empty($_GET['action'])) {
     require_once '../templates/header.html';

+ 1 - 1
web/templates/admin/edit_user.html

@@ -125,7 +125,7 @@
                                                 if (( $value == $v_language ) || ( $svalue == $v_language)){
                                                     echo 'selected' ;
                                                 }
-                                                if (( $value == 'en' ) && (empty($v_language))){
+                                                if (( $value == detect_user_language() ) && (empty($v_language))){
                                                     echo 'selected' ;
                                                 }
                                                 echo ">".htmlentities($value)."</option>\n";

+ 1 - 1
web/templates/user/edit_user.html

@@ -104,7 +104,7 @@
                                                 if (( $value == $v_language ) || ( $svalue == $v_language)){
                                                     echo 'selected' ;
                                                 }
-                                                if (( $value == 'en' ) && (empty($v_language))){
+                                                if (( $value == detect_user_language() ) && (empty($v_language))){
                                                     echo 'selected' ;
                                                 }
                                                 echo ">".htmlentities($value)."</option>\n";