Hi!
Here is my solution to globalization. It works good, if you only need a few
languages
It uses simple markup for html and php strings.

Hope this helps.

usages:

require_once( 'localize.inc"); // see belo

1.    loc( "en|In English|ru|In Russian|fr|Franci... i don't speak this
language actually :)", "ru" /*this argument can be skipped*/);

    Use this notation, if you work with internal strings, such as SQL or PHP
strings.
    It's quite simple even for non-programmers (editors and translators) to
use this markup.

2.    localize( "<p>Following text is in your language: <glob>en|In
English|ru|In Russian</glob></p>, "en" );

    Use this notation for HTML

3.    print(localize(implode( "", file("myfile_globalized.html")),
$_REQUEST['locale']));

       you can now call this file:
       http://localhost/site/myfile.php?locale=en
       do not send a file name in arguments, because it violates sequrity

example of globalized file:

------------------------------------
<html>
 <head>
  <title><glob>en|My Document - English|ru|My Document -
Russian</glob></title>
 </head>
 <body>

 <a href="<glob>en|english.htm|ru|russian.htm</glob>"><glob>en|In
English|ru|In Russian</glob></a>

 </body>
</html>
------------------------------------

These <glob> tags are not well formed xml tags!
Current limitation is that <glob></glob>  tag cannot span multiple lines

I'm using "UTF-8  without signature" encoding for all my html and php files

-------------------------------------------------------        localize.inc

<?php

$default_locale = "en";

function defLocale() { global $default_locale; return $default_locale; }

// add other locales, as you need

$supported_loc = explode(" ", "ru en" );
function search_loc($ag_str)
{
 global $supported_loc;
 while( list($k, $al) = each( $supported_loc ) ) { if ( preg_match( "/". $al
."/", $ag_str ) ) return $k; } return null;
}

function setup_user_locale()
{
 session_start();
 global $default_locale;
 global $supported_loc;

 session_start();
 // session_destroy(); // for debug purposes

 $key = null;

 global $lang_changed;

 if ( isset($_SESSION['lang']) && isset($_REQUEST['lang']) && (
$_SESSION['lang'] != $_REQUEST['lang'] ) )
  $lang_changed = TRUE;
 else
  $lang_changed = FALSE;

 if ( isset( $_REQUEST['lang'] ) )
 { if ( $_REQUEST['lang']!= '')
  {
  $key = search_loc( $_REQUEST['lang'] );
  $_SESSION['lang']=$_REQUEST['lang'];
  }
 }

 if ( isset( $_SESSION['lang'] ) & ! isset( $key ) ) { if (
$_SESSION['lang']!= '' )
 { $key = search_loc( $_SESSION['lang'] ); } }

 if ( ! isset($key) )
 {
  $key = search_loc( $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
 }

 if ( isset($key) ) $default_locale = $supported_loc[ $key ];
 else $default_locale = "en";
}

function loc_try( $in, $required_locale = null )
{
 global $default_locale; if ( ! $required_locale ) { $required_locale =
$default_locale; }
 $out = "";
 // $myPattern = '/('. $required_locale .'\|)([^(\|<)]+)/';
 $myPattern = '/('. $required_locale .'\|)([^(\|)]+)/';
 preg_match( $myPattern, $in, $matches );
 return (count($matches) == 0) ? null : $matches[2];
}

$all_language_dog = "en|text is not translated to your language|ru|????? ??
????????? ?? ??? ????";

// USAGE: loc( "en|In English|ru|In Russian" );
//

function loc( $in, $required_locale = null )
{
 global $all_language_dog;
 $good = loc_try($in,$required_locale);
 if ( ! $good )
 {
  $last_chance = loc_try( $in, "en" );
  return ($last_chance) ? $last_chance : loc( $all_language_dog,
$required_locale );
 }
 else
 {
  return $good;
 }
}

// syntax: localize( "<glob>en|In English|ru|In Russian</glob>" );
// this function is useful for entire html/xml files
// contents of myfile.php
//
// require( 'localize.inc' );
// print(localize(implode( "", file("myfile_globalized.html")),
$_REQUEST['locale']));//
//
// USAGE: http://www.qqq.org/myfile_localized.php?&locale=ru

function localize( $str, $required_locale = null )
{
 global $default_locale; if ( ! $required_locale ) { $required_locale =
$default_locale; }
 return preg_replace( "/(<glob>)(.+)(<\/glob>)/eU",
"loc('\\2','$required_locale')", $str );
}

setup_user_locale();

?>

------------------------------------------------------------ end of
localize.inc




------------------------------------------ localize_test.php


<?php

// ?? ??????

require( "localize.inc" );

function mix_query( $new_disasm )
{
 $old_disasm = array();

 parse_str( $_SERVER['QUERY_STRING'], $old_disasm );

 $super_query = array_merge( $old_disasm, $new_disasm );

 $out = array();
 foreach( $super_query as $key => $val )
 {
  if ( $val != "" )
  array_push( $out, $key . '=' . $val );
 }

 $out = implode( "&", $out );
 return $out;
}

function mix_path( $new_disasm ) { return path() . '?' . mix_query(
$new_disasm ); }

function path()
{
 $p = parse_url( $_SERVER['PATH_INFO'] );
 return $p['path'];
}

function switch_language()
{
 global $supported_loc;
 $language_name = array( "en" => "English", "ru" => "Russian" );

?>
<table border="0" cellpadding=0 cellspacing=0>
 <tr>
  <td bgcolor="white">
   language
  </td>
<?php
 foreach ( $supported_loc as $loc )
 {
?>
  <td bgcolor="<?php

  print( ($loc == defLocale() )? "c0c0c0" : "d0d0d0" );

  ?>">

  <?php

  print (
  ( $loc == defLocale() )
  ? ":[".$language_name[$loc]."]:"
  : "<a href=\"". mix_path( array( 'lang' => $loc ) ) ."\">". "::"
.$language_name[$loc]."::"."</a>" );
  ?>
  </td>
<?php
 }
?>

 </tr>
</table>
<?php
}

?>

<html>
<head><title><?php
print ( loc( "en|English|ru|Russian" ) );
?></title>
</head>
<body>

<pre>
<?php

switch_language();

?>

</pre>
<?php

print ( localize( "This is in English.<font color=\"green\"><glob>en|And
this is in <b>your</b> requested language|ru|Russian Bla bla
bla</glob></font>. Yeah" ) );

?>

</body>
</html>



------------------------------------------- end localize_test.php

"Steve Vernon" <[EMAIL PROTECTED]> wrote in message
000001c29558$78490ff0$2cfd87d9@extreme">news:000001c29558$78490ff0$2cfd87d9@extreme...
> Hmmmm,
>     This seems to be harder than I thought!
>
>     Thanks everyone for there help!
>
>     Carl this IBM international thing is very interesting, and many thanks
> for telling me about it. Just think it is a lot of work, especially since
I
> want my site to be on in January, not sure I can manage this with my other
> tasks. I will try and research it and maybe use it in the future.
>
>     Im probably going to use the Get Text, that Moriyoshi mentioned.
Thanks!
>
>     Basically Im an ameture at this international stuff, Iv'e never worked
> on an international project and no idea where to start. I could really do
> with some advice.
>
>     I am hosting my site in Germany, and need to know what to tell the
> server admin people. What should I tell them about MySQL and Apache and
PHP
> set up please (on linux).
>
>     And for my website, I assumed that you just alter the doctype say from
> <!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"> (im using 3.2 but had
> this to hand!) to the equivalent French one. Is this wrong? Do I need to
> specfy character sets and encoding??
>
>     Many Thanks,
>
>     Steve
>
> > Steve,
> >
> > A couple of years ago I developed extensions for PHP that sound like
what
> > you want.  It used ICU http://oss.software.ibm.com/icu/ to provide the
> i18n
> > services for PHP.
> >
> > First it also provided an override to the Apache mod_mime services to
> allow
> > it to work like other web servers and allow you to put different
language
> > web pages in different subdirectories rather than require a language
type
> on
> > each page.  You can have it override just certain types such as .php
pages
> > only.
> >
> > This way you can have:
> >
> >  ../site/en/contents/page.php
> >  ../site/fr/contents/page.php
> >
> > or full locales
> >
> >  ../site/en-uk/contents/page.php
> >  ../site/en-us/contents/page.php
> >  ../site/en-ca/contents/page.php
> >  ../site/fr-fr/contents/page.php
> >  ../site/fr-ca/contents/page.php
> >
> > It sets the locale on a per transaction bases.  It will not only work
with
> > Unicode with ICU but it will also work in code pages.
> >
> > You can have a terminal using Shift-JIS and Japanese pages in EUC and
> access
> > a UTF-8 database.  The same code will work with any code page or
Unicode.
> >
> > You can see code that I derived from the ICU interface portion of the
code
> > at http://www.xnetinc.com/xiua/
> >
> > The PHP changes also included a way to support charset more dynamically.
> >
> > Carl
> >
> >
> >
> >
> >
> >
> >
> >
> > > -----Original Message-----
> > > From: Steve Vernon [mailto:[EMAIL PROTECTED]]
> > > Sent: Sunday, November 24, 2002 7:20 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: [PHP-I18N] Multiple Languages
> > >
> > >
> > > Hiya,
> > >     I'm working on my first international PHP project, which is a
> > > site that
> > > displays differently in different languages. So I guess this is
> > > the place to
> > > ask adive.
> > >
> > >     Ive done the code with flags etc so people can select the
> > > country and so
> > > the language. But im not sure about the best way to handle the text
and
> > > things such as meta tages.
> > >
> > >     My origional idea was to have multiple include files named
> > > like uk.php,
> > > french.php with seperate variables for the text parts, or do sommat in
> XML
> > > which is basically the same.
> > >
> > >     I cant find any sources on the net about best ways to do a site
like
> > > this.
> > >
> > >     Help!
> > >
> > >     Thanks,
> > >
> > >     Steve
> > >
> > >
> > > --
> > > PHP Internationalization Mailing List (http://www.php.net/)
> > > To unsubscribe, visit: http://www.php.net/unsub.php
> > >
> > >
> >
> >
> >
> > --
> > PHP Internationalization Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
>



-- 
PHP Internationalization Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to