diff --git a/bin/v-change-user-language b/bin/v-change-user-language index c6e7b0cb..800b61a8 100755 --- a/bin/v-change-user-language +++ b/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 } diff --git a/web/edit/user/index.php b/web/edit/user/index.php index 5d04769f..c0ea9cd5 100644 --- a/web/edit/user/index.php +++ b/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); diff --git a/web/inc/i18n.php b/web/inc/i18n.php new file mode 100644 index 00000000..1dab4cae --- /dev/null +++ b/web/inc/i18n.php @@ -0,0 +1,112 @@ +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; +} \ No newline at end of file diff --git a/web/inc/i18n/ja.php b/web/inc/i18n/ja.php index fba1c3ab..7f664cb1 100644 --- a/web/inc/i18n/ja.php +++ b/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' => 'ユーザー %s は正常に作成されました', 'WEB_DOMAIN_CREATED_OK' => 'ドメイン %s は正常に作成されました', - 'DNS_DOMAIN_CREATED_OK' => 'DNS ドメイン %s は正常に作成されました', + 'DNS_DOMAIN_CREATED_OK' => 'DNSドメイン %s は正常に作成されました', 'DNS_RECORD_CREATED_OK' => 'レコード %s.%s は正常に作成されました', 'MAIL_DOMAIN_CREATED_OK' => 'メールドメイン %s は正常に作成されました', 'MAIL_ACCOUNT_CREATED_OK' => 'メールアカウント %s@%s は正常に作成されました', @@ -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' => "ドメイン名を一行ずつ入力してください すべてのドメインを除外するには*を使用してください 特定のディレクトリを除外するには次の形式を用いてください: domain.com:public_html/cache:public_html/tmp", 'DNS_EXCLUSIONS' => "ドメイン名を一行ずつ入力してください すべてのドメインを除外するには*を使用してください", 'MAIL_EXCLUSIONS' => "ドメイン名を一行ずつ入力してください すべてのドメインを除外するには*を使用してください 特定のアカウントを除外するには次の形式を用いてください: domain.com:info:support:postmaster", - 'DB_EXCLUSIONS' => "データベース名をフルで一行ずつ入力してください すべてのデータベースを除外するには*を使用してください", + 'DB_EXCLUSIONS' => "完全なデータベース名を一行ずつ入力してください すべてのデータベースを除外するには*を使用してください", 'CRON_EXCLUSIONS' => "すべてのジョブを除外するには*を使用してください", 'USER_EXCLUSIONS' => "ディレクトリ名を一行ずつ入力してください すべてのディレクトリを除外するには*を使用してください", - 'Welcome to Vesta Control Panel' => 'Vesta Control Panel へようこそ', + 'Welcome to Vesta Control Panel' => 'Vesta Control Panel にようこそ', 'MAIL_FROM' => 'Vesta Control Panel ', - '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 Midnight Commander file manager' => 'shortcuts are inspired by magnificent GNU Midnight Commander 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.' => 'これは有償の機能で、有効化するにはライセンスキーを購入する必要があります' -); \ No newline at end of file +); diff --git a/web/inc/main.php b/web/inc/main.php index 738c811d..b3453dce 100644 --- a/web/inc/main.php +++ b/web/inc/main.php @@ -1,6 +1,8 @@ 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; diff --git a/web/js/i18n.js.php b/web/js/i18n.js.php index d84c9580..34f52f18 100644 --- a/web/js/i18n.js.php +++ b/web/js/i18n.js.php @@ -1,46 +1,10 @@ 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); - } + $_SESSION['language'] = detect_user_language(); } ?> diff --git a/web/login/index.php b/web/login/index.php index 06617e2f..f084ae17 100644 --- a/web/login/index.php +++ b/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'); diff --git a/web/reset/index.php b/web/reset/index.php index f84fb38d..abde3c14 100644 --- a/web/reset/index.php +++ b/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'; diff --git a/web/templates/admin/edit_user.html b/web/templates/admin/edit_user.html index 894a8a2c..8717ce3f 100644 --- a/web/templates/admin/edit_user.html +++ b/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)."\n"; diff --git a/web/templates/user/edit_user.html b/web/templates/user/edit_user.html index d42998a4..66600bd9 100644 --- a/web/templates/user/edit_user.html +++ b/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)."\n";