i18n.js 4.92 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
/**
 *  ABook Viewer for WEB
 *  国際化(言語切替)対応共通処理
 *
 *  言語リソースファイルは、指定する言語に合わせて以下のファイルを修正する
 *   - 日本語: lang-ja.json
 *   - 韓国語: lang-ko.json
 *   - 英語 : lang-en.json
 *
 *  Copyright (C) Agentec Co, Ltd. All rights reserved.
 */

/**
 * 定数:言語ファイル配置場所
 */
var avwsys_location = "/common/json/lang";
var avwsys_dir = "/abvw";
var avwsys_storagekey = "AVWUS_Lang";
var avwsys_currLang = "AVW_CurrLang";

/* 言語の初期化 */
$(function() {
	// ログイン画面/直接アクセス対策
	var location = window.location.toString().toLowerCase();
	if (location.indexOf(avwsys_dir) < 0) {
		// avwsys_dirディレクトリ配下ではない場合は、avwsys_dirディレクトリをつける
		avwsys_location = "." + avwsys_dir + avwsys_location;
	} else {
		// avwsys_dirディレクトリ配下の場合は、相対パスに変換
		avwsys_location = "." + avwsys_location;
	}

	var lang = "en";
	var storage = window.localStorage;
	if(storage) {
		var lang = storage.getItem(avwsys_storagekey);
		if(!lang) {
			lang = getNavigatorLanguage();
		}
	}
	// 言語ファイルを初期化する
	loadLanguage(lang);
});
/* ブラウザの言語設定を取得する */
function getNavigatorLanguage() {
	var lang = (navigator.browserLanguage || navigator.language || navigator.userLanguage);			
	/* 対応言語 */
	var languages = ['ja','ko','en'];		// 対応言語を増やす場合はここを変更する
	if(lang.match(/ja|ko|en/g)) {
		for(var i = 0; i < languages.length; i++) {
			var index = lang.indexOf(languages[i]);
			if(index >= 0) {
				lang = lang.substring(index, 2);
				break;
			}
		}
	} else {
		lang = 'en'; 	// 対応言語が無ければ英語をデフォルトとする		
	}			
	return lang;
};

/* 言語リソースファイル読み込み */
function loadLanguage(lang) {
	
	// 引数から言語ファイルを選択
	var langfile = "lang-" + lang + ".json";
	
	// 言語ファイルを読み込む
	$.ajax({
			url: avwsys_location + "/" + langfile,
			async: false,
			dataType: 'json',
			cache: false,
			success: function(data) {
				// lang属性の書換え
				document.documentElement.lang = lang;
				
				// html の言語データを書換える
				var jsonLangData = data;
				replaceText(jsonLangData);
				
				// 言語設定、言語データをストレージにキャッシュしておく
				storeCurrentLanguage(lang, jsonLangData);
			},
			error: function(xhr, txtStatus, errorThrown) {
				var error = 'Could not load a language file ' + langfile + '. please check it.';
				error += '\n' + xhr.status + ' ' + txtStatus + ' ' + errorThrown + ' : ' + langfile;
				alert(error);
			}
		});
};

/* ページ内のテキストをすべて言語に合わせて置換する */
function replaceText(jsonLangData) {
	
	var itemCount = $('.lang').length;
	if(itemCount > 0) {
		for(var i = 0; i < itemCount; i++) {
			var obj = $('.lang:eq(' + i + ')');
			var langId = obj.attr('lang');
			if(langId) {
				var langText = getLangText(jsonLangData, langId);
				var tn = obj.get()[0].localName;
				if(tn == 'input') {
					if(obj.attr('type') == 'button' || obj.attr('type') == 'submit') {
						obj.val(langText);
					} else {
						obj.text(langText);
					}
				} else {
					obj.text(langText);
				}
			}
		}
	}
};
/* 現在設定されている言語でHTMLテキストを置き換える */
function i18nReplaceText() {
	var storage = window.sessionStorage;
	if(storage) {
		var value = storage.getItem(avwsys_storagekey);
		if(value) {
			var json = JSON.parse(value);
			replaceText(json);
		}
	}
};
/* キーから文字列を取得 */
function i18nText(key) {
	var storage = window.sessionStorage;
	if(storage) {
		var value = storage.getItem(avwsys_storagekey);
		if(value) {
			var json = JSON.parse(value);
			return getLangText(json, key);
		}
	}
	return "undefined";
};

/* 言語データのキー値から文字列を取得 */
function getLangText(jsonLangData, key) {
	if(jsonLangData) {
		var text = jsonLangData[key];
		return text;
	}
	return "undefined.";
};

/* 言語データの切り替え */
function changeLanguage(lang) {
	
	// 言語の切替を行った場合のみ選択言語をストアする
	var storage = window.localStorage;
	if(storage) {
		storage.setItem(avwsys_storagekey, lang);
	}
	
	// 言語ファイルを読み込み、テキスト文字列を変換する
	loadLanguage(lang);
};

/* 設定言語の保存 */
function storeCurrentLanguage(lang, langData) {
	var ss = window.sessionStorage;
	if(ss) {
		// language data
		ss.setItem(avwsys_storagekey, JSON.stringify(langData));
		// current language
		ss.setItem(avwsys_currLang, lang);
	}
};
/* 設定言語の取得 */
function getCurrentLanguage() {
	var lang;
	var storage = window.sessionStorage;
	if(storage) {
		lang = storage.getItem(avwsys_currLang);
	}
	if(!lang) {
		lang = getNavigatorLanguage();
	}
	return lang;
};