JavaScriptとCSSで言語切り替えする

関連

  • HTML
  • JavaScript/jQuery
  • CSS

概要

JavaScriptとCSSで言語切り替えをする方法のメモです(後日きれいにまとめるかも)。

Webアプリケーションのフレームワークが多言語対応しているケースが多いと思いますが、ここではあえてJavaScriptとCSSだけで実現する方法を考えてみます。多言語対応した静的なページをWebサーバで、なんてときに。

方法

  • index.html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<title>多言語対応テスト</title>
		<link rel="stylesheet" type="text/css" href="css/lang.css">
		<noscript>
			<link rel="stylesheet" href="css/noscript.css">
		</noscript>
		<script type="text/javascript" src="js/jquery.js"></script>
		<script type="text/javascript" src="js/multilingual.js"></script>
		<script type="text/javascript">
<!--
jQuery(function() {
	jQuery('#multilingual').multilingual();
});
// -->
		</script>
	</head>
	<body class="ja">
			<div id="multilingual"></div>
			<div id="header">
				<span id="m001-001"></span>
			</div>
			<div id="content">
				<span id="m001-002"></span>
			</div>
			<div id="footer">
				<span id="m001-003"></span>
			</div>
	</body>
</html>
  • css/lang.css
@charset "UTF-8";

body {
	display: none;
}

.ja #m001-001:after {
	content: "日本語ヘッダ";
}

.en #m001-001:after {
	content: "English Header";
}

.ja #m001-002:after {
	content: "日本語コンテント";
}

.en #m001-002:after {
	content: "English Content";
}

.ja #m001-003:after {
	content: "日本語フッタ";
}

.en #m001-003:after {
	content: "English Footer";
}
  • css/noscript.css
@charset "UTF-8";

body {
 	display: block;
}
  • js/multilingual.js
(function() {

	var langs = [
		{lang: 'ja', name: '日本語'},
		{lang: 'en', name: 'English'}
	];

	var setLang = function(lang) {
		if (! lang) {
			lang = langs[0].lang;
		}
		jQuery.each(langs, function() {
			jQuery('body').removeClass(this.lang);
		});
		jQuery('body').addClass(lang);
	};

	jQuery.fn.extend({
		multilingual: function(callback) {
			var target = jQuery('<ul />').appendTo(this);
			jQuery.each(langs, function() {
				jQuery(target).append(
					jQuery('<li />').append(
						jQuery('<a />')
						.attr('rel', this.lang)
						.text(this.name)
						.click(function() {
							var lang = jQuery(this).attr('rel');
							setLang(lang);
							if (callback) {
								callback(lang);
							}
						})
					)
				);
			});
		}
	});

	jQuery(function() {
		setLang(langs[1].lang);
		jQuery('body').css('display', 'block');
	});

})();

解説

  • 例では日本語をデフォルトにして全体を非表示(css/lang.css)
    • JavaScript有効の場合言語を設定して全体を表示(js/multilingual.js)
    • JavaScript無効の場合そのまま全体を表示(css/noscript.css)
      • linkをnoscriptでheadの中に書くためhtml5
  • ラベルのIDをつけたspanを置く(index.html)
    • :afterで言語ごとのテキストを定義する(css/style.css)
  • JavaScriptでbodyに設定する言語のクラスを切り替える(js/multilingual.js)

IE7以前で:afterが使えない

使えるようにするJavaScriptライブラリがあるようです。

  • http://code.google.com/p/ie7-js/
  • http://ash.jp/web/css/ie8_js.htm

meta(X-UA-COmpatible)でエラー

IEを最新のモードで表示させるためのmetaが次の文法エラーになりますが、.htaccessとかでなんとかできるようです。

Bad value X-UA-Compatible for attribute http-equiv on element meta
  • http://www.joshuawinn.com/fix-html5-validator-error-bad-value-x-ua-compatible-for-attribute-http-equiv-on-element-meta/

本文がからっぽで検索の対象にできない

あ。(→その2もどうぞ。)

参考

  • http://terkel.jp/archives/2012/07/styles-for-noscript/
作成日 2013-08-17