10/10/2018, 00:21

Hỏi về việc chuyễn đổi ngôn ngữ trong web

Chào các bạn. Mình có vấn đề này muốn hỏi : mình tạo 2 loại ngôn ngữ cho web : english và vietnamese, mình muốn khi mình đang đứng ở bất cứ page nào( trừ main page) và chọn ngôn ngữ khác(ngoài ngôn ngữ đang hiển thị) thì nội dung sẽ thay đổi sang ngôn ngữ đó nhưng vị trí đang đứng trên page đó vẫn được giữ nguyên. Ví dụ, mình đang đứng ở page about, khi mình muốn chuyển sang englisg lang, nội dung sẽ thay đổi nhưng không cần phải trả mình về lại main page ( mình đang bị vấn đề này). Mong các bạn chỉ giúp (web mình viết bằng PHP).
amida viết 02:22 ngày 10/10/2018
Cũng như cách truyền thống. Bạn dùng session để lưu language choice mà client request. Khi bạn click chuyển ngôn ngữ, bạn sẽ get ngôn ngữ từ url và cập nhật biến session. Khi đó bạn dùng header() để redirect lại chính cái script mà bạn đang chạy ($_SERVER['PHP_SELF']). Bạn cũng có thể truyền 1 parameter định vị trang bạn đang đứng vào phần xử lý ngôn ngữ trong index để dễ dàng redirect. Như vậy nó vẫn ở trang cũ chứ không hề chuyển về main page
goldensea80 viết 02:26 ngày 10/10/2018
Chắc giống http://ndvol.com/ có phải không.
THứ nhất, bạn phải lưu biến language bằng SESSION. Mỗi lần click và nút đổi ngôn ngữ thì sẽ reload loại trang với language mới.
THứ hai, có 2 loại localization, một là ngôn ngữ giao diện, thì dễ rồi, bạn chỉ cần dùng mảng associate hay dùng hàm gettext. Loại thứ hai là ngôn ngữ của nội dung, chẳng hạn bản tin, cái này bạn cần design database lấy .
QUYETC2 viết 02:23 ngày 10/10/2018
Xác định đầu tiên cần tạo:

- Lệnh gọi trang:

Code:
include("language/set.php");
- Thư mục language chứa các file sau:
+ vi.php
+ en.php
+ set.php
===============

Nội dung file:

+ Mỗi biến được gán một text show ra của biến đó với cả 2 trang en.php và vi.php cùng dùng chung biến.

- vi.php

Code:
<?php
$txtindex = "Trang chủ";
$txtdangnhap = "Đăng nhập";
$txtsubmit = "Chấp nhận";
$txtlamlai = "Làm lại";
$txttendangnhap = "Tên Đăng nhập";
$txthovaten = "Họ và tên";
$txtmatkhau = "Mật khẩu";
$txtkhachvt = "Khách viếng thăm";
$txtthanhvien = "Thành viên";
$txtthoatra = "Thoát ra";
$txtcchac = "Bạn có chắc chắn muốn thoát?";
$txtchao = "Chào";
$txtthemtvm = "Thêm thành viên";
$txtttdn = "Không tồn tại tên đăng nhập này, \\n Hoặc mật khẩu nhập vào không chính xác.\\n\\n \\tVui lòng nhập lại!";
$txttrdn = "Tên đăng nhập hoặc mật khẩu không được để trống.\\n\\n\\tVui lòng nhập lại!";
$txtsuatc = "Đã sửa thành công!";
$txtnhaplai = "Nhập lại";
$txthvtnotnull = "Họ và Tên không được để trống.\\n\\n\\tVui lòng nhập lại!";
$txtmatkhaukhacnhau = "Phải nhập 2 mật khẩu giống hệt nhau.";
$txtpassnhapsai = "Mật khẩu nhập sai kiểu ký tự.\\n\\nBạn có thể dùng a..z, 0..9,\\n dấu gạch dưới(_),\\n và 1 dấu chấm(.),\\n từ 6 đến 50 ký tự.";
$txtchoigame = "Vào chơi";
$txtdangky = "Đăng ký";
$txtauto = "Tự động chơi";
$txthuongdan = "Hướng dẫn";
$txttaodanhmuc = "Tạo danh mục";
$txttaodanhmuccon = "Tạo danh mục con";
$txtsuadanhmuc = "Sửa danh mục";
$txtsuadanhmuccon = "Sửa danh mục con";
?>
- en.php

Code:
<?php
$txtindex = "Home";
$txtdangnhap = "Login";
$txtsubmit = "Submit";
$txtlamlai = "Reset";
$txttendangnhap = "User Name";
$txthovaten = "Full Name";
$txtmatkhau = "Password";
$txtkhachvt = "Guest";
$txtthanhvien = "Member";
$txtthoatra = "Logout";
$txtcchac = "Do you want escape?";
$txtchao = "Hello";
$txtthemtvm = "Add member";
$txtttdn = "Sorry - But your login attempt failed.\\n \\tPlease try again!";
$txttrdn = "Sorry - But your login attempt failed.\\n \\tPlease try again!";
$txtsuatc = "Change success!";
$txtnhaplai = "Re-enter password";
$txthvtnotnull = "Full name is not null, please try again!";
$txtmatkhaukhacnhau = "Passwords do not match.";
$txtpassnhapsai = "Password has invalid characters.\\n\\nYou may use a..z, 0..9,\\n underscores(_),\\n and a single dot(.),\\n From 6 to 50 characters.";
$txtchoigame = "Play Games";
$txtdangky = "Register";
$txtauto = "Auto";
$txthuongdan = "Guide";
$txttaodanhmuc = "Create category";
$txttaodanhmuccon = "Create subcategory";
$txtsuadanhmuc = "Edit category";
$txtsuadanhmuccon = "Edit subcategory";
?>
Tại trang set.php:
+ Đầu tiên nếu giá trị của lang trên URL = "vi", $_SESSION["ngonngu"] sẽ được gán bằng "vi" và cùng lúc include file vi.php vào.
+ Khác đi nếu giá trị của lang trên URL = "en", $_SESSION["ngonngu"] sẽ được gán bằng "en" và cùng lúc include file en.php vào.
+ Khác đi khi không thỏa mãn cả 2 điều kiện trên tức $_GET["lang"] khác "vi" và "en" ta sẽ kiểm tra xem $_SESSION["ngonngu"] lúc này mang giá trị gì? Nếu $_SESSION["ngonngu"] khác trống tức có giá trị (chỉ có thể là "vi" hoặc "en") ta sẽ include file mang giá trị là $_SESSION["ngonngu"].
+ Khác đi khi không thỏa mãn mọi điều kiện trên ta bắt buộc phải đặt default ngôn ngữ là "vi", tất nhiên việc gán cho $_SESSION["ngonngu"] = "vi" lúc này là cần thiết.

+ Tag <div> xác định đặt link Tiếng Việt và English cách bên phải và bên trên màn hình 5px với chiều dài là 120px

- set.php

Code:
<?php
	if($_GET["lang"] == "vi")
	{
		$_SESSION["ngonngu"] = "vi";
		include("language/vi.php");
	}	
	elseif($_GET["lang"] == "en")
	{
		$_SESSION["ngonngu"] = "en";
		include("language/en.php");
	}
	elseif($_SESSION["ngonngu"] != null)
		include("language/".$_SESSION["ngonngu"].".php");
	else
	{
		$_SESSION["ngonngu"] = "vi";
		include("language/vi.php");
	}
	echo "
	<DIV class=\"text\" id=\"Layer1\" style=\"Z-INDEX: 1; right: 5px; WIDTH: 120px; POSITION: absolute; TOP: 5px; HEIGHT: 1px\">
	<a href=\"?lang=vi\" id=\"vietnam\" name=\"vietnam\">Tiếng Việt</a> | <a href=\"?lang=en\" id=\"eng\" name=\"eng\">English</a>
	</DIV>";
?>
- Sau khi hoàn thành ta chỉ việc add các biến trong 2 file vi.php và en.php vào vị trí của nó.
- Với cách làm này bạn sẽ không cần quan tâm đến file set.php lần thứ 2 và chỉ việc add thêm các biến vào 2 trang vi.php và en.php rất khỏe.

Chúc thành công!
amida viết 02:37 ngày 10/10/2018
Góp ý chút.
Việc tạo file lang *.php mà chứa toàn variable là không cần thiết. Tốt nhất bạn nên đưa vào mảng để dễ quản lý và sử dụng
webphp viết 02:22 ngày 10/10/2018
Sao mình làm theo cách hướng dẫn của bạn không được.
Chỉ thay đổi hiện tại khi click vào ngôn ngữ Tiếng Anh khi bấm và liên kết khác (chẳng hạn như liên hệ...) thì trở về ngôn ngữ mặc định(Tiếng việt).
Vậy bạn nào làm thành công load lên cho mình tham khảo nữa nhé
Thanks
hackson viết 02:24 ngày 10/10/2018
Bạn tạo các file ngôn ngữ có tên tương tự như thế này:
lang_vie.php , lang_eng.php ...

trong file lang.php được include trong các file php của bạn bạn viết như thế này:
PHP Code:
if(in_array($_GET***91;'lang'***93;, aray("eng""vie"))
$_SESSION***91;'lang'***93; = $_GET***91;'lang'***93;;

if(!
in_array($_SESION***91;'lang'***93;, aray("eng""vie"))
$_SESSION***91;'lang'***93; = "vie"// Default lang

include "lang_".$_SESSION***91;'lang'***93;.".php"
Về liên kết nếu nếu bạn không muốn dịch chuyển sang trang chuyển ngôn ngữ rồi sau đó back về trang hiện tại (như cách login của diễn đàn) thì bạn có thể làm theo cách sau:
PHP Code:

foreach($_GET as $k=>$v)
if(
$k!="lang"&& $v!="")
$uri .= "&".$k."=".$v;
$uri htmlspecialchars($uri);

echo 
"<a href='lang=vie{$uri}'>Tiếng Việt</a> | <a href='lang=eng{$uri}'>Tiếng Anh</a>"
Có thể dùng các giá trị trong biến $_SERVER (chẳng hạn argv) nhưng sẻ xảy ra lỗi khi người dùng vừa chuyển sang tiếng Anh sau đó chuyển về tiếng Việt thì url lúc này sẻ là /?page=..&lang=eng&lang=vie... thì hơi bị kì

còn nếu muốn chuyển sang trang chuyển đổi ngôn ngữ riêng rồi sau đó back lại trang vừa xem thì bạn có thể dùng header("location:".$_SERVER['HTTP_REFERER']); sau khi xử lý xong ngôn ngữ

[=========> Bổ sung bài viết <=========]

aray là array nhé, do bật telex nên viết nhầm
webphp viết 02:34 ngày 10/10/2018
Mình đã làm theo bạn hackson nhưng chỉ thay đổi ngôn ngữ khi click chuột mà thôi. còn việc click link sang trang khác thì không được.

Mình tạo 4 trang
lang_vie.php

<?php
define("_HOME","TRANG CHỦ");
define("_VOITINGS","THĂM DÒ DƯ LUẬN");
?>

lang_eng.php
<?php
define("_HOME","HOME");
define("_VOITINGS","VOITINGS");
?>

lang.php

<?php
foreach($_GET as $k=>$v)
if($k!="lang"&& $v!="")
$uri .= "&".$k."=".$v;
$uri = htmlspecialchars($uri);
if(in_array($_GET['lang'], array("eng", "vie")))
$_SESSION['lang'] = $_GET['lang'];

if(!in_array($_SESSION['lang'], array("eng", "vie")))
$_SESSION['lang'] = "vie"; // Default lang

include "lang_".$_SESSION['lang'].".php";

?>

index.php

<?php
include ('lang.php');
$modules=$HTTP_GET_VARS['modules'];

echo "<a href='?lang=vie{$uri}'>Tiếng Việt</a> | <a href='?lang=eng{$uri}'>Tiếng Anh</a>";
?>

<table width="423" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="29">&nbsp;</td>
<td width="190"><a href="index.php">Trang Chủ</a></td>
<td width="98"><a href="?modules=lienhe">Liên Hệ</a></td>
<td width="73"><a href="?modules=huongdan">Hướng Dẫn</a></td>
<td width="33">.......</td>
</tr>
</table>
<?php
if ($modules==lienhe)
{
echo "liên hệ";
echo "<br>";
echo _HOME;
echo "<br>";
echo _VOITINGS;
}
if ($modules==huongdan)
{
echo "hướng dẫn";
echo "<br>";
echo _HOME;
echo "<br>";
echo _VOITINGS;
}
?>



Vậy bạn giúp mình nhé.
Thanks
hackson viết 02:35 ngày 10/10/2018
Ở index.php bạn khởi tạo một phiên làm việc mới bằng hàm sesion_start(); hàm này được đặt ở dòng trên cùng (bên dưới thẻ <?php).
Tham khảo thêm về session ở đây: http://vn2.php.net/manual/en/book.session.php
và đây nữa
http://vn2.php.net/manual/en/reserved.variables.php
webphp viết 02:23 ngày 10/10/2018
Mình đã thêm session_start(); vào đầu rồi
nhưng báo lỗi

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\AppServ\www\NGONNGU\languages\index.php:1) in C:\AppServ\www\NGONNGU\languages\index.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\AppServ\www\NGONNGU\languages\index.php:1) in C:\AppServ\www\NGONNGU\languages\index.php on line 2


còn nếu thêm @ vào đầu
@session_start();
Thì vần như cũ
không thấy hiệu ứng gì cả
Bài liên quan
0