2关于your own answer:
尽量不要直接访问超级全局变量,而是使用filter_input
如果$_GET[\'lang\']
未设置,因此可以改进代码:
function toscho_change_language() {
return \'bn_BD\';
}
if ( filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING ) === \'bn\' ) {
add_filter( \'locale\', \'toscho_change_language\' );
}
或者如果您的服务器有PHP 5.3+
if ( filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING ) === \'bn\' ) {
add_filter( \'locale\', function() { return \'bn_BD\'; } );
}
最后,如果您认为将来可能需要支持其他语言,您可以用一种易于扩展的方式编写函数:
function gm_change_language( $locale ) {
$langs = array(
\'bn\' => \'bn_BD\',
\'sw\' => \'sw_TZ\' // Tanzania Swahili
);
$l = strtolower( filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING ) );
return $l && array_key_exists( $l, $langs ) ? $langs[$l] : $locale;
}
add_filter( \'locale\', \'gm_change_language\' );
此代码的问题是,单击内部链接时,语言参数丢失。一种可能的解决方案是使用cookie存储语言。
我将对最后一个代码段应用此改进,但也可以在前面的代码段中使用。
function gm_change_language( $locale ) {
$langs = array(
\'bn\' => \'bn_BD\',
\'sw\' => \'sw_TZ\' // Tanzania Swahili
);
$l = filter_input( INPUT_GET, \'lang\', FILTER_SANITIZE_STRING );
if ( ! empty( $l ) ) {
setcookie ( \'my_theme_lang\', $l, 0 );
} else {
$l = filter_input( INPUT_COOKIE, \'my_theme_lang\', FILTER_SANITIZE_STRING );
}
return $l && array_key_exists( $l, $langs ) ? $langs[$l] : $locale;
}
add_filter( \'locale\', \'gm_change_language\' );
当然,正如你所说,你需要
translate 您的主题并使用加载texdomain
load_theme_textdomain
.
而且,这只是给未来读者的一个提示,为了能够翻译主题中的字符串,所有这些字符串都必须使用i18n functions.