このシリーズの目的
体系的なwebコーディングの訓練ができるようになるためにPHPの初学のきっかけかつ、PHPでログインフォームやフォームを実装することができるようになるために
上記のチュートリアルを進めているのでその備忘録。
内容
今回のチュートリアル
PHP Multi Language Website Tutorial: Create Dynamic Website In 20 Minutes
このチュートリアルでやること
Webサイトの言語切り替えを行えるようになる
成果物
<?php
require_once "config.php";
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $lang['title'] ?></title>
<link rel="stylesheet" type="text/css" href="css/index.css" media="all">
<link rel="stylesheet" type="text/css" href="css/reset.css" media="all">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">
</script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" type="text/javascript">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js">
</script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js">
</script>
</head>
<body>
<nav class="nav navbar navbar-expand-sm bg-dark navbar-dark ">
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link" href="#"><?php echo $lang['home'] ?></a></li>
<li class="nav-item"><a class="nav-link" href="#"><?php echo $lang['pricing'] ?></a></li>
<li class="nav-item"><a class="nav-link" href="#"><?php echo $lang['contact'] ?></a></li>
</ul>
</nav>
<div class="container">
<div class="row justify-content-center">
<div class="main col-md-6">
<h1><?php echo $lang['title'] ?></h1>
<p><?php echo $lang['description'] ?></p>
</div>
</div>
</div>
<div class="footer bg-dark">
<a class="footer-link" href="index.php?lang=en"><?php echo $lang['lang_en'] ?> </a>| <a class="footer-link" href="index.php?lang=ja"><?php echo $lang['lang_ja'] ?></a>
</div>
</body>
</html>
<?php
session_start();
if (!isset($_SESSION['lang']))
$_SESSION['lang'] = "en";
else if(isset($_GET['lang']) && $_SESSION['lang'] != $_GET['lang'] && !empty($_GET['lang'])) {
if ($_GET['lang'] == "en")
$_SESSION['lang'] = "en";
else if ($_GET['lang'] == "ja")
$_SESSION['lang'] = "ja";
}
require_once 'languages/'. $_SESSION['lang'] . ".php";
?>
<?php
$lang = array(
"title" => "ダイナミック・ウェブサイト",
"home" => "トップ",
"pricing" => "料金プラン",
"contact" => "ご連絡先",
"description" => "ようこそ、ダイナミック社のウェブサイトへ",
"lang_en" => "英語",
"lang_ja" => "日本語"
);
?>
<?php
$lang = array(
"title" => "Dynamic Website",
"home" => "Home",
"pricing" => "Pricing",
"contact" => "Contact",
"description" => "This is explanation about my amazing website!",
"lang_en" => "English",
"lang_ja" => "Japanese"
);
?>
手順
1.サーバーにlanguageフォルダを作りそこに言語設定が記載されたPHPファイルを作る。
(ja.php、en.php)
コード見ればわかるように連想配列にキー値の形で記載していく。
今回はen.phpを基準として、それの互換としてja.phpを作るという流れで見てもらえればわかりやすい。
2.Session変数を用いて条件分岐させる。
今回はページが読み込まれた時にはWebサイトを英語表記し、あとはGETで切り替えられるようにする。
3.HTML要素の切り替えさせたい部分をPHPタグで用いて変数とキーをechoで出力する形に置き換える、詳しくは後述。
今回のコードの注釈
・言語ファイルの作り方
<?php
$lang = array(
"title" => "ダイナミック・ウェブサイト",
"home" => "トップ",
"pricing" => "料金プラン",
"contact" => "ご連絡先",
"description" => "ようこそ、ダイナミック社のウェブサイトへ",
"lang_en" => "英語",
"lang_ja" => "日本語"
);
<?php
$lang = array(
"title" => "Dynamic Website",
"home" => "Home",
"pricing" => "Pricing",
"contact" => "Contact",
"description" => "This is explanation about my amazing website!",
"lang_en" => "English",
"lang_ja" => "Japanese"
);
?>
?>
言語切替させる箇所にそれぞれキーを設定して、そのキーを各言語共通にし、値をそれぞれの言語に合わせる形で書いていく。
そして、HTML要素の該当する部分をecho $lang['キー']の形でPHPタグを用いて置き換えていく。
こうすることで、キーさえ設定してまえばあとは実装したい言語に応じて基準となる言語と対照させてしまえば簡単に多言語に対応させることができるし、例えばページタイトルとメインタイトルには共通してtitleキーを設定することで一括して切り替えを行ったりすることもできる。
require_once 'languages/'. $_SESSION['lang'] . ".php";
require関数は指定されたパスのファイルを読み込む関数であるが、その派生のrequire_onceはファイルが既に読み込まれていた場合、そのファイルは読み込まないという処理が付随する。
今回はSessionにおいて最初に読み込まれるのはen.phpだということはコード見ればわかるが、ここで例えば英語orEngilishリンクをクリックしたとしても英語表示はそのままだがen.phpは読み込み直されることはない。
つまり、不必要な読み込みが行われないのでそれだけ処理は軽くなるということになる。
パスの指定方法は様々であるが同じ階層にあれば、そのままファイル名を、階層が違う場合は今回のようにパスを指定してファイル名を書く。
翻訳するとlanguageフォルダにある$_SESSION['lang']に代入された文字列.phpファイルを読み込むということになる。
ちなみに、PHPMaillerを使う際にも用いている関数なので、ここまでのチュートリアルを見直してみてほしい。
このチュートリアルを終えたら
Sessionについては過去のチュートリアルでも出てきたがここで一旦基本に立ち返って最低でも以下の2つの記事はしっかり理解しておきたい。
PHP $_SESSION(セッション変数)のすべて!【初心者向け基本】
私もそうだがそろそろコードを見れば何が行われているかが、新しい関数などが出てこない時などを除けばおおよそ苦もなく理解できるようになった頃なので、そろそろアルゴリズムを考える上で、コードを書くだけではなく概念の勉強もしていかないといけないと感じる。