i18n.js 5.39 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/**
 *  ABook Viewer for WEB
 *  国際化(言語切替)対応共通処理
 *
 *  言語リソースファイルは、指定する言語に合わせて以下のファイルを修正する
 *   - 日本語: lang-ja.json
 *   - 韓国語: lang-ko.json
 *   - 英語 : lang-en.json
 *
 *  Copyright (C) Agentec Co, Ltd. All rights reserved.
 */

13 14 15
//グローバルの名前空間用のオブジェクトを用意する
var I18N = {};

16 17 18
/**
 * 定数:言語ファイル配置場所
 */
19 20 21 22
I18N.avwsys_location = "";
I18N.avwsys_dir = "";
I18N.avwsys_storagekey = "";
I18N.avwsys_currLang = "";
23 24 25

/* 言語の初期化 */
$(function() {
Masaru Abe committed
26

27
	I18N.initi18n();
Masaru Abe committed
28 29 30 31

});

/** 言語リソース設定初期化 */
32
I18N.initi18n = function(){
Masaru Abe committed
33

34 35 36 37
	I18N.avwsys_location = "/common/json/lang";
	I18N.avwsys_dir = "/abvw";
	I18N.avwsys_storagekey = "AVWUS_Lang";
	I18N.avwsys_currLang = "AVW_CurrLang";
Masaru Abe committed
38

39 40
	// ログイン画面/直接アクセス対策
	var location = window.location.toString().toLowerCase();
41 42 43
	if (location.indexOf(I18N.avwsys_dir) < 0) {
		// I18N.avwsys_dirディレクトリ配下ではない場合は、I18N.avwsys_dirディレクトリをつける
		I18N.avwsys_location = "." + I18N.avwsys_dir + I18N.avwsys_location;
44
	} else {
45 46
		// I18N.avwsys_dirディレクトリ配下の場合は、相対パスに変換
		I18N.avwsys_location = "." + I18N.avwsys_location;
47 48 49 50 51
	}

	var lang = "en";
	var storage = window.localStorage;
	if(storage) {
52
		var lang = storage.getItem(I18N.avwsys_storagekey);
53
		if(!lang) {
54
			lang = I18N.getNavigatorLanguage();
55 56 57
		}
	}
	// 言語ファイルを初期化する
58
	I18N.loadLanguage(lang);
Masaru Abe committed
59

60
};
Masaru Abe committed
61

62
/* ブラウザの言語設定を取得する */
63 64
I18N.getNavigatorLanguage = function() {
	var lang = (navigator.browserLanguage || navigator.language || navigator.userLanguage);
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
	/* 対応言語 */
	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;
};

/* 言語リソースファイル読み込み */
82
I18N.loadLanguage = function(lang) {
83 84 85 86 87 88
	
	// 引数から言語ファイルを選択
	var langfile = "lang-" + lang + ".json";
	
	// 言語ファイルを読み込む
	$.ajax({
89
			url: I18N.avwsys_location + "/" + langfile,
90 91 92 93 94 95 96 97 98
			async: false,
			dataType: 'json',
			cache: false,
			success: function(data) {
				// lang属性の書換え
				document.documentElement.lang = lang;
				
				// html の言語データを書換える
				var jsonLangData = data;
99
				I18N.replaceText(jsonLangData);
100 101
				
				// 言語設定、言語データをストレージにキャッシュしておく
Masaru Abe committed
102
				I18N.storeCurrentLanguage(lang, jsonLangData);
103 104 105 106 107 108 109 110 111 112
			},
			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);
			}
		});
};

/* ページ内のテキストをすべて言語に合わせて置換する */
113
I18N.replaceText = function(jsonLangData) {
114 115 116 117 118 119 120
	
	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) {
Masaru Abe committed
121
				var langText = I18N.getLangText(jsonLangData, langId);
122 123 124 125 126 127 128 129 130 131 132 133 134 135
				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);
				}
			}
		}
	}
};
136

137
/* 現在設定されている言語でHTMLテキストを置き換える */
138
I18N.i18nReplaceText = function() {
139 140
	var storage = window.sessionStorage;
	if(storage) {
141
		var value = storage.getItem(I18N.avwsys_storagekey);
142 143
		if(value) {
			var json = JSON.parse(value);
144
			I18N.replaceText(json);
145 146 147
		}
	}
};
148

149
/* キーから文字列を取得 */
150
I18N.i18nText = function(key) {
151 152
	var storage = window.sessionStorage;
	if(storage) {
153
		var value = storage.getItem(I18N.avwsys_storagekey);
154 155
		if(value) {
			var json = JSON.parse(value);
Masaru Abe committed
156
			return I18N.getLangText(json, key);
157 158 159 160 161 162
		}
	}
	return "undefined";
};

/* 言語データのキー値から文字列を取得 */
Masaru Abe committed
163
I18N.getLangText = function(jsonLangData, key) {
164 165 166 167 168 169 170 171
	if(jsonLangData) {
		var text = jsonLangData[key];
		return text;
	}
	return "undefined.";
};

/* 言語データの切り替え */
Masaru Abe committed
172
I18N.changeLanguage = function(lang) {
173 174 175 176
	
	// 言語の切替を行った場合のみ選択言語をストアする
	var storage = window.localStorage;
	if(storage) {
177
		storage.setItem(I18N.avwsys_storagekey, lang);
178 179 180
	}
	
	// 言語ファイルを読み込み、テキスト文字列を変換する
181
	I18N.loadLanguage(lang);
182 183 184
};

/* 設定言語の保存 */
Masaru Abe committed
185
I18N.storeCurrentLanguage = function(lang, langData) {
186 187 188
	var ss = window.sessionStorage;
	if(ss) {
		// language data
189
		ss.setItem(I18N.avwsys_storagekey, JSON.stringify(langData));
190
		// current language
191
		ss.setItem(I18N.avwsys_currLang, lang);
192 193 194
	}
};
/* 設定言語の取得 */
Masaru Abe committed
195
I18N.getCurrentLanguage = function() {
196 197 198
	var lang;
	var storage = window.sessionStorage;
	if(storage) {
199
		lang = storage.getItem(I18N.avwsys_currLang);
200 201
	}
	if(!lang) {
202
		lang = I18N.getNavigatorLanguage();
203 204 205
	}
	return lang;
};
Masaru Abe committed
206