开发者

My multilingual website with only basic php (without zend_translate, gettext, etc...) will I have problems in the future?

开发者 https://www.devze.com 2022-12-20 13:44 出处:网络
I tried gettext, but my free hosting doesn\'t allow it. I thought about Zend_translate, but I didn\'t want to use elements from frameworks since my page is mostly static.

I tried gettext, but my free hosting doesn't allow it. I thought about Zend_translate, but I didn't want to use elements from frameworks since my page is mostly static.

So, I ended up with this tutorial:

http://www.bitrepository.com/php-how-to-add-multi-language-support-to-a-website.html

Where the author only use basic php (not sure), and it seems to work, but I'm not quite sure if it a good (or common) practice or if it can cause me problems in the future (adding and deleting bun开发者_C百科ch of code).

Here it is:

common.php:

<?php
session_start();
header('Cache-control: private'); // IE 6 FIX

if(isSet($_GET['lang']))
{
$lang = $_GET['lang'];

// register the session and set the cookie
$_SESSION['lang'] = $lang;

setcookie("lang", $lang, time() + (3600 * 24 * 30));
}
else if(isSet($_SESSION['lang']))
{
$lang = $_SESSION['lang'];
}
else if(isSet($_COOKIE['lang']))
{
$lang = $_COOKIE['lang'];
}
else
{
$lang = 'en';
}

switch ($lang) {
  case 'en':
  $lang_file = 'lang.en.php';
  break;

  case 'de':
  $lang_file = 'lang.es.php';
  break;

  default:
  $lang_file = 'lang.en.php';

}

include_once 'languages/'.$lang_file;
?>

languages/lang.en.php:

<?php
/* 
-----------------
Language: English
-----------------
*/

define('GREETING, Hello World');
?>

languages/lang.es.php:

<?php
/* 
-----------------
Language: Espanol
-----------------
*/

define('GREETING, Hola Mundo');
?>

index.php:

include_once 'common.php';
<p><?php echo LANG_TEST; ?></p>

So, if I want to change it to Spanish I just add: ?lang=es in the URL (after index.php)


First off all, it will not work with your code. You would have to use

define('GREETING', 'Hello World').

Check the PHP manual for define.

Second, using contants for this is a horrible idea. You are littering the global namespace with tons of constants and risk constant nameclashing. See the Userland Naming Guide.

If you do not want to use Zend_Translate (you don't have to use the entire framework for this) and cannot use gettext, I suggest you use arrays for storing the translations, e.g. something like this:

$lang = array(
    'greeting'  => 'Hello World'
    'something' => 'else'
);

and then you can use it like this in your template:

<h1><?php echo $lang['greeting'] ?></h1>

This way, you only have to make sure, $lang is not already defined in the global scope.

Some people prefer to use the default language instead of translation ids, e.g. they prefer to write

<h1><?php echo t('Hello World') ?></h1>

where t would function mapping the input string to the output string. The translation array would have to contain the full sentences then and map these to the other languages, e.g.

$lang = array(
    'Hello World' => 'Hola Mundo'
);

But of course, you could just access this with $lang['Hello World'] as well. It just gets awkward for long strings. Many translation functions allow you to pass in additional params though, to allow for something like this:

$lang = array(
    'currentTime' => 'The current time is %s'
);

<h1><?php echo t('currentTime', date('H:i:s')) ?></h1>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号