大家好,
我正在尝试使用 php 将我的网站国际化。我对 PHP 很陌生!
index.php
开头是这样的:
<?php session_start(); ?>
<?php include 'api/locale.php'; ?>
<html>
<!-- ... -->
<div><?php loc('foo') ?></div>
locale.php
看起来像这样:
<?php
if(isset($_GET['lang']) {
$_SESSION['lang'] = $_GET['lang'];
} else {
$_SESSION['lang'] = 'en'; // default value
}
// use the necessary language file
include('/locale/' . $_SESSION['lang'] . '.php');
// get phrase from URL
if (isset($_GET["phrase"]))
loc($_GET["phrase"];);
function loc($phrase)
{
global $lang;
if(array_key_exists($phrase, $lang)) {
echo $lang[$phrase];
} else {
echo $phrase;
}
}
?>
我的想法是我想使用该功能loc($phrase)
来获取德语或英语的内容。但问题是:
如果我有这样的代码,我总是会得到英文版本,因为locale.php
我无法lang
从 URL$_GET['lang']
中获取:未定义。因此,会话语言始终设置为默认语言 (en)。
但是,如果我将 移动session_start();
到文件locale.php
中,则国际化工作:
index.php
:
<?php include 'api/locale.php'; ?>
<html>
<!-- ... -->
<div><?php loc('foo') ?></div>
locale.php
:
<?php
session_start();
if(isset($_GET['lang']) {
$_SESSION['lang'] = $_GET['lang'];
// ... rest the same as above
为什么会这样?我在做一些概念上的错误吗?问题是我也在locale.php
ajax 调用中使用它来获取动态生成的 HTML 元素的国际内容:
function loc(phrase)
{
var locString;
$.ajax({
// force synchronous ajax call, to return with locString
async: false,
// url with to be translated id
url: "api/locale.php?phrase=" + phrase,
// "get" for small data (otherwise post)
method: "get",
// callback function after server has reveiced information
success: function (data)
{
locString = data;
}
});
return locString;
}
所以如果我locale.php
用这个 AJAX 调用一遍又一遍地调用,是不是有新的会话一遍又一遍地开始?我不确定我是否正确设计了我的功能。我很高兴有任何评论!
谢谢!
=============== 编辑===============
好的,我现在尝试了一种新方法:
session.php
// session starts at this point session_start(); // internationalisation in EN and DE $allowedLangs = array('en', 'de'); // check lang-parameter given in URL and set language from there if(isset($_GET['lang']) && in_array($_GET['lang'], $allowedLangs)) $_SESSION['lang'] = $_GET['lang']; if(!isset($_SESSION['lang'])) $_SESSION['lang'] = 'en'; // default value
locale.php
// include correct languguage file $root = realpath($_SERVER["DOCUMENT_ROOT"]) ; include($root . '/locale/' . $_SESSION['lang'] . '.php'); // get phrase from URL and translate it if (isset($_GET["phrase"])) { $phrase = $_GET["phrase"]; global $lang; if (array_key_exists($phrase, $lang)) echo $lang[$phrase]; else echo $phrase; }
这两个文件都包含在index.php
<?php include 'api/session.php'; ?>
<?php include 'api/locale.php'; ?>
但是,如果我现在使用 ajax 对短语进行本地化,则会出现以下错误消息:
Notice: Undefined variable: _SESSION in ... /locale.php on line 4
这个怎么可能?我以为$_SESSION
是超全球的?!?