gpt4 book ai didi

php - 在 PHP 中保留依赖于语言环境的字符串资源的最佳方法?

转载 作者:可可西里 更新时间:2023-11-01 00:52:32 24 4
gpt4 key购买 nike

假设您正在构建一个多语言网络应用程序,其中所有界面文本都应移动到与语言相关的资源并在需要时加载。字符串资源可能很大:假设您翻译了数千个字符串。在窗口环境(Windows、OS X、X11)中,您通常有操作系统或某些 API 提供的机制来执行此操作,它们通常称为字符串资源。那么 PHP 呢?

不过请记住,这里必须认真考虑性能,因为 PHP 会根据每个用户请求编译和执行所有模块。

我可以想到几种可能的方法。但首先,我要有一个全局变量 $LANGUAGE,它可以设置为“en”、“de”、“fr”等。我将使用这个变量在每个请求中包含一个特定于语言的模块作为

require_once "lang-$LANGUAGE.inc.php"

因此一些可能的解决方案包括:

(1) 在每个语言模块中将所有字符串定义为全局变量,例如

$str_signin = 'Sign in';
$str_welcome_user = 'Welcome, %s'!;
...

对于非技术人员(即翻译人员)而言,非常简单易读且相对容易上手。尽管存在一些全局空间污染,但它会稍微减慢您的全局变量查找速度。

(2) 相同但定义为一个巨大的数组,例如

$str['signin'] = 'Sign in';
$str['welcome_user'] = 'Welcome, %s'!;
...

可读性较差,在您的主代码中不太可用(涉及更多的输入)也会使您的代码更加困惑。这会更慢,因为这些不是简单的分配而是关联。数组赋值:与 (1) 相比,VM 在这里要执行的指令更多。

(3) PHP 5.3+:定义为常量,可能在类或命名空间中

class str {
const signin = 'Sign in';
const welcome_user = 'Welcome, %s'!;
const signin_to_a = self::signin . ' to area A'; // can't do this!
...
}

... 并将它们用作 str::signin 等。很好,我最喜欢这个,尽管也有一些小缺点:仅限 PHP 5.3+;不能使用表达式,只能使用单个值(在您的情况下可能没问题);不能在双引号字符串中使用 $-expansion(或者你可以吗?)。

(4) 数据库:将所有内容放入表中并通过某个 ID 检索,例如str_get(STR_SIGNIN)。丑陋、缓慢,需要将代码中的 ID 与数据库 ID 同步,但是当您的页面只需要几个字符串时,无需加载所有内容。老实说,不能说这是否是一个好的解决方案。

还有其他建议吗?另外,对这些有什么想法?

请记住简单、优雅和性能!

最佳答案

Zend Framework 有一个名为 Zend_Translate 的组件,它非常有用,它们的 manual page has a good write up关于存储字符串的不同方式,即使您决定不使用 ZF 组件也是如此。

如果您作为开发人员维护字符串,PHP 是性能最高的最佳解决方案。如果您与一家翻译公司合作,他们很可能希望使用 CSV 并来回发送这些文件。

我不知道数组或基于常量的解决方案哪个更好,但我的钱在数组上。一个快速基准很快就会告诉您。

关于php - 在 PHP 中保留依赖于语言环境的字符串资源的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com