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";