Hướng dẫn
Quảng cáo

Viết website đa ngôn ngữ bằng PHP

Bài viết hướng dẫn các bạn từng bước thiết kết một website đa ngôn ngữ bằng lập trình PHP. Kèm code PHP mẫu cho các bạn tham khảo

Để tạo một trang web đa ngôn ngữ rất dễ thực hiện. Các trang web đa ngôn ngữ được sử dụng để tăng lượng người dùng được hỗ trợ cho một trang web. Hỗ trợ đa ngôn ngữ có thể được thực hiện theo nhiều cách khác nhau.

  • Chúng ta có thể có các trang trùng lặp với cùng một nội dung trong các ngôn ngữ được yêu cầu.
  • Chúng ta có thể thêm cấu hình ngôn ngữ (bản địa hóa) để thay đổi văn bản trong một ngôn ngữ khác.

Bản thân mình thì thích đi với tùy chọn thứ hai hơn. Thay vì sao chép các trang, hãy để có một cấu trúc trang chung và điền nội dung dựa trên ngôn ngữ được chọn bằng cách kéo nội dung cụ thể của ngôn ngữ từ các tệp lang (ngôn ngữ) và cơ sở dữ liệu.

Trong hướng dẫn này, chúng ta sẽ tạo một trang đa ngôn ngữ hiển thị cả dữ liệu tĩnh và dữ liệu động. Dữ liệu tĩnh được thay đổi trong cơ sở ngôn ngữ bằng cách sử dụng tệp cấu hình ngôn ngữ tương ứng. Dữ liệu động được quản lý bởi các cột cơ sở dữ liệu có tiền tố mã ngôn ngữ. Mình sẽ làm ví dụ về website hỗ trợ đa ngôn ngữ với hai ngôn ngữ tiếng Anh và tiếng Việt. Vì vậy, cơ sở dữ liệu column_name sẽ là en_column_name vi_column_name.

Trang HTML đa ngôn ngữ

Trang HTML này chứa một tiêu đề hiển thị tiêu đề và các liên kết ‘English‘, ‘Tiếng Việt‘ để thay đổi ngôn ngữ giữa tiếng Anh và tiếng Việt tương ứng. Ngoài ra, trang này đang hiển thị dữ liệu động từ cơ sở dữ liệu. Toàn bộ nội dung của trang này bao gồm nhãn tĩnh và kết quả cơ sở dữ liệu động sẽ được thay đổi dựa trên ngôn ngữ đã chọn.

Ví dụ

<div class="language-header">
	<div class="demo-page-title"><?php echo $language["LIST_TITLE"]; ?></div>
	<div class="language-link">
		<a class="language-link-item" href="index.php?lang=en" <?php if($lang == 'en'){?> style="color:#ff9900;" <?php } ?>>English</a> |
		<a class="language-link-item" href="index.php?lang=vi"  <?php if($lang == 'vi'){?> style="color:#ff9900;" <?php } ?>>Tiếng Việt</a>
	</div>
</div>
<?php
	if(!empty($result)){
		foreach($result as $k=>$v){
?>
	<div class="demo-row-data">
	<div><strong><?php echo $result[$k][$lang.'_title']; ?></strong></div>
	<p class="demo-row-description"><?php echo $result[$k][$lang.'_description']; ?>
	</p>
	</div>
<?php
		}
	} else {
?>
	<div class="no-result"><?php echo $language["NOTIFY_NO_RESULT"]; ?></div>
<?php
	}
?>


Thay đổi nội dung Trang bằng PHP, Dựa trên Ngôn ngữ

Trong ví dụ này, nó có hai loại dữ liệu. Một là văn bản tĩnh trong HTML như tiêu đề hoặc thông báo không có kết quả. Khác là dữ liệu động đọc từ cơ sở dữ liệu. Trong phần này, chúng ta sẽ thấy mã để thay đổi hai loại dữ liệu này dựa trên ngôn ngữ đã chọn.

Khi nhấp vào liên kết ngôn ngữ, tôi chuyển mã ngôn ngữ đã chọn trong Chuỗi truy vấn. Tôi đã tạo các tệp cấu hình ngôn ngữ (bản địa hóa) cho tiếng Anh và tiếng Việt (lang.en.php, lang.vi.php), chứa mảng văn bản được sử dụng trong HTML. Dựa trên ngôn ngữ đã chọn, tệp cấu hình phù hợp sẽ được đưa vào để lấy văn bản bằng ngôn ngữ đã chọn.

Ví dụ

<?php
	// include language configuration file based on selected language
	$lang = "en";
	if(isset($_GET['lang'])){
		$lang = $_GET['lang'];
	}
	require_once("lang.".$lang.".php");
?>
...
<div class="demo-page-title"><?php echo $language["LIST_TITLE"]; ?></div>
...
<div class="no-result"><?php echo $language["NOTIFY_NO_RESULT"]; ?></div>


Trong mã PHP, chúng tôi kết nối cơ sở dữ liệu và tìm nạp kết quả. Cơ sở dữ liệu chứa hai loại tiêu đề và mô tả thông tin. Tôi có các cột riêng để lưu trữ thông tin bằng nhiều ngôn ngữ.

Cấu trúc bảng như sau:

Website đa ngôn ngữ bằng PHP

Phần này của ví dụ là để giúp bạn hiểu, làm thế nào để nội địa hóa bằng cơ sở dữ liệu.

Tên cột được tiền tố bởi mã ngôn ngữ en_ vi_ để lưu trữ thông tin bằng tiếng Anh và tiếng Việt. Trong mã PHP, chúng tôi sử dụng mã ngôn ngữ đã chọn để thêm vào đó với tiêu đề và mô tả để hiển thị nội dung bằng ngôn ngữ phù hợp.

Ví dụ

<?php
	if(!empty($result)){
		foreach($result as $k=>$v){
?>
	<div class="demo-row-data">
	<div><strong><?php echo $result[$k][$lang.'_title']; ?></strong></div>
	<p class="demo-row-description"><?php echo $result[$k][$lang.'_description']; ?>
	</p>
	</div>
<?php
		}
	}
?>

Code đầy đủ

Cơ sở dữ liệu

Ví dụ

CREATE TABLE IF NOT EXISTS `tbl_multi_lang` (
`id` int(11) NOT NULL,
  `en_title` varchar(255) NOT NULL,
  `en_description` varchar(255) NOT NULL,
  `vi_title` varchar(255) NOT NULL,
  `vi_description` varchar(255) NOT NULL
)
INSERT INTO `tbl_multi_lang` (`id`, `en_title`, `en_description`, `de_title`, `de_description`) VALUES
(1, 'Hello', 'Description about Hello', ' Xin chào', 'GIới thiệu về xin chào');
ALTER TABLE `tbl_multi_lang`
 ADD PRIMARY KEY (`id`);
ALTER TABLE `tbl_multi_lang`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=0;

dbcontroller.php

Ví dụ

<?php
class DBController {
	private $host = "localhost";
	private $user = "root";
	private $password = "";
	private $database = "vidu";
	private $conn;
	function __construct() {
		$this->conn = $this->connectDB();
		$this->conn->set_charset("utf8");
	}
	function connectDB() {
		$conn = mysqli_connect($this->host,$this->user,$this->password,$this->database);
		return $conn;
	}
	function runQuery($query) {
		$result = mysqli_query($this->conn,$query);
		while($row=mysqli_fetch_assoc($result)) {
			$resultset[] = $row;
		}
		if(!empty($resultset))
			return $resultset;
	}
}
?>

index.php

Ví dụ

<?php
require_once("dbcontroller.php");
$db_handle = new DBController();
$query = "select * from tbl_multi_lang";
$result = $db_handle->runquery($query);
?>
<?php
// include language configuration file based on selected language
$lang = "en";
if(isset($_GET['lang'])){
	$lang = $_GET['lang'];
}
require_once("lang.".$lang.".php");
?>
<html>
<head>
<title>Translator</title>
<style>
body {
    font-family: calibri;
	width:550px;
}
.language-header{
	height:50px;
	border-bottom:#3d6371 2px solid;
}
.demo-page-title{
	float: left;
    padding: 10px;
    color: #3d6371;
    font-size: 1.5em;
}
.language-link{
	text-align:right;
	padding-top: 15px;
	padding-right: 15px;
	color: #6aa8bf;
}
.language-link-item {
	text-decoration:none;
	color: #6aa8bf;
}
.demo-row-data{
	padding-top:20px;
	border-bottom:1px solid #e0e0e0;
}
.demo-row-description{
	color:#777;
	padding-top:5px;
}
.no-result {
	color:#FF0000;
	text-align:center;
	padding:30px;
}
</style>
</head>
<body>
<div class="language-header">
	<div class="demo-page-title"><?php echo $language["LIST_TITLE"]; ?></div>
	<div class="language-link">
		<a class="language-link-item" href="index.php?lang=en" <?php if($lang == 'en'){?> style="color:#ff9900;" <?php } ?>>English</a> |
		<a class="language-link-item" href="index.php?lang=de"  <?php if($lang == 'de'){?> style="color:#ff9900;" <?php } ?>>Deutsche</a>
	</div>
</div>
<?php
	if(!empty($result)){
		foreach($result as $k=>$v){
?>
	<div class="demo-row-data">
	<div><strong><?php echo $result[$k][$lang.'_title']; ?></strong></div>
	<p class="demo-row-description"><?php echo $result[$k][$lang.'_description']; ?>
	</p>
	</div>
<?php
		}
	} else {
?>
	<div class="no-result"><?php echo $language["NOTIFY_NO_RESULT"]; ?></div>
<?php
	}
?>
</body>
</html>

lang.en.php

Ví dụ

<?php
$language['LIST_TITLE'] = 'Popular Tutorial';
$language["NOTIFY_NO_RESULT"] = "No Results Found";
?>

lang.vi.php

Ví dụ

<?php
$language["LIST_TITLE"] = "Hướng dẫn phổ biến";
$language["NOTIFY_NO_RESULT"] = "Không có bài nào";
?>

Bài viết này đã giúp ích cho bạn?

Bài viết mới

Advertisements