php 中英文语言转换类
程序员文章站
2022-04-06 09:41:18
起初想到制成xml文档形式,这样操作也起来很容易。只是看到说xml效率不怎样 再者就是不同的模板,可这样也有个小问题,有些词汇比如时间提示是不确定,与可能是minute ,...
起初想到制成xml文档形式,这样操作也起来很容易。只是看到说xml效率不怎样
再者就是不同的模板,可这样也有个小问题,有些词汇比如时间提示是不确定,与可能是minute ,day。也有可能复数加 s
那好吧,做成数组,可数组就得做成在php文件的变量,很难做些扩展(我所知道所认为的是这样)
最后做成txt文本文件的形式,同样也为这样的效率担心,打开文件,搜索字符串,截取字符串这些,所幸最后运行了一下,一般机子大概0.0004秒,这让我很惊奇原以为会很慢,毕竟要调用多次。
好吧,上代码
class language
{
static $lanobject;
public $type; // unit , dashboard , menu ,other
public $lan; // language
private $special; // the common in the file
private function __construct()
{
if( isset($_get['hl']) || isset($_post['hl']) )
{
switch( isset($_get['hl'])?$_get['hl']:$_post['hl'] )
{
case 'en':
$this->lan = 'en';
case 'zh':
$this->lan = 'zh';
case 'all':
$this->lan = 'all';
default:
$this->error();
}
}
else
$this->lan = isset($_cookie['hl']) ? $_cookie['hl']:'zh';
}
public static function getobject()
{
if( !(self::$lanobject instanceof self) )
self::$lanobject = new language();
return self::$lanobject;
}
public function lto($key) //$key is english
{
if( $this->lan !== 'zh' )
return $key;
if( empty($this->special) ) // if the $special is null
{
if( isset($this->type) )
$this->special = file_get_contents($this->type.'.txt');
else
return $key;
}
echo $this->search($key);
}
private function search($searchtozh) // php string
{
$key_start = strpos($this->special,$searchtozh);
$key_end = strpos($this->special,' ',$key_start);
$len_str = strlen($searchtozh);
$for_sub = $key_start + $len_str + 1;
return substr($this->special, $for_sub, $key_end - $for_sub);
}
}
strpos(); 是找到字符串第一次出现的位置 比如 ‘wo' 在 ‘hello world' 中,返回值为 6
substr();是截取字符串的一部分
接下来是调试时加上的代码
$la = language::getobject();
$la->type = 'unit';
$la->lto('min');
echo '<br/>';
$la->lto('hello');
lto(这里面要翻译的英文);
unit.txt 文件的内容格式是
hello-你好 min-小 minute-分钟 minutes-分钟
$special设计为全局也是想到不止一次会调用lto() ,如果反复加载文件太浪费性能了。
$type设计为公有是考虑到加载的文件的效率问题,有的时候并不需要显示几天前这些,所以不如把这些按使用类型分开,比如有专门负责菜单翻译的menu.txt ,也有专门为操作,比如删除,收藏 翻译的txt文本。这样可以*设定要加载的文本
语言也可以*设定。
好吧,程序还可以改进,我没有按http请求中的客户端语言来设置$lan,
再者就是不同的模板,可这样也有个小问题,有些词汇比如时间提示是不确定,与可能是minute ,day。也有可能复数加 s
那好吧,做成数组,可数组就得做成在php文件的变量,很难做些扩展(我所知道所认为的是这样)
最后做成txt文本文件的形式,同样也为这样的效率担心,打开文件,搜索字符串,截取字符串这些,所幸最后运行了一下,一般机子大概0.0004秒,这让我很惊奇原以为会很慢,毕竟要调用多次。
好吧,上代码
复制代码 代码如下:
class language
{
static $lanobject;
public $type; // unit , dashboard , menu ,other
public $lan; // language
private $special; // the common in the file
private function __construct()
{
if( isset($_get['hl']) || isset($_post['hl']) )
{
switch( isset($_get['hl'])?$_get['hl']:$_post['hl'] )
{
case 'en':
$this->lan = 'en';
case 'zh':
$this->lan = 'zh';
case 'all':
$this->lan = 'all';
default:
$this->error();
}
}
else
$this->lan = isset($_cookie['hl']) ? $_cookie['hl']:'zh';
}
public static function getobject()
{
if( !(self::$lanobject instanceof self) )
self::$lanobject = new language();
return self::$lanobject;
}
public function lto($key) //$key is english
{
if( $this->lan !== 'zh' )
return $key;
if( empty($this->special) ) // if the $special is null
{
if( isset($this->type) )
$this->special = file_get_contents($this->type.'.txt');
else
return $key;
}
echo $this->search($key);
}
private function search($searchtozh) // php string
{
$key_start = strpos($this->special,$searchtozh);
$key_end = strpos($this->special,' ',$key_start);
$len_str = strlen($searchtozh);
$for_sub = $key_start + $len_str + 1;
return substr($this->special, $for_sub, $key_end - $for_sub);
}
}
strpos(); 是找到字符串第一次出现的位置 比如 ‘wo' 在 ‘hello world' 中,返回值为 6
substr();是截取字符串的一部分
接下来是调试时加上的代码
复制代码 代码如下:
$la = language::getobject();
$la->type = 'unit';
$la->lto('min');
echo '<br/>';
$la->lto('hello');
lto(这里面要翻译的英文);
unit.txt 文件的内容格式是
hello-你好 min-小 minute-分钟 minutes-分钟
$special设计为全局也是想到不止一次会调用lto() ,如果反复加载文件太浪费性能了。
$type设计为公有是考虑到加载的文件的效率问题,有的时候并不需要显示几天前这些,所以不如把这些按使用类型分开,比如有专门负责菜单翻译的menu.txt ,也有专门为操作,比如删除,收藏 翻译的txt文本。这样可以*设定要加载的文本
语言也可以*设定。
好吧,程序还可以改进,我没有按http请求中的客户端语言来设置$lan,
下一篇: Docker 数据卷,数据卷容器详细介绍