- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑编写一个 PHP 库,它将通过 Packagist 或 Pear 发布。它面向在任意设置中使用它的同行开发人员。
这个库将包含一些为客户端确定的状态消息。我如何国际化此代码,以便使用该库的开发人员可以尽可能自由地插入他们自己的本地化方法?我不想假设任何事情,尤其是不想强制开发人员使用 gettext。
为了研究一个例子,让我们上这门课:
class Example {
protected $message = "I'd like to be translated in your client's language.";
public function callMe() {
return $this->message;
}
public function callMeToo($user) {
return sprintf('Hi %s, nice to meet you!', $user);
}
}
这里有两个问题:如何标记要翻译的私有(private) $message
,以及如何允许开发人员本地化 callMeToo()
中的字符串?
一个(非常不方便的)选项是,在构造函数中请求一些 i18n 方法,如下所示:
public function __construct($i18n) {
$this->i18n = $i18n;
$this->message = $this->i18n($this->message);
}
public function callMeToo($user) {
return sprintf($this->i18n('Hi %s, nice to meet you!'), $user);
}
但我非常希望有一个更优雅的解决方案。
编辑 1: 除了简单的字符串替换之外,i18n 的领域很广泛。前提是,我不想将任何 i18n 解决方案打包到我的库中,也不想强制用户专门选择一个来满足我的代码需求。
那么,我该如何构建我的代码,以便为不同方面提供最佳和最灵活的本地化:字符串翻译、数字和货币格式、日期和时间……?假设一个或另一个显示为我的图书馆的输出。消费开发者可以在哪个位置或界面插入她的本地化解决方案?
最佳答案
最常用的解决方案是字符串文件。例如。像下面这样:
# library
class Foo {
public function __construct($lang = 'en') {
$this->strings = require('path/to/langfile.' . $lang . '.php');
$this->message = $this->strings['callMeToo'];
}
public function callMeToo($user) {
return sprintf($this->strings['callMeToo'], $user);
}
}
# strings file
return Array(
'callMeToo' => 'Hi %s, nice to meet you!'
);
为了避免 $this->message
赋值,您还可以使用魔法 setter/getter :
# library again
class Foo {
# … code from above
function __get($name) {
if(!empty($this->strings[$name])) {
return $this->strings[$name];
}
return null;
}
}
您甚至可以添加一个 loadStrings
方法,该方法从用户那里获取一个字符串数组并将其与您的内部字符串表合并。
编辑 1:为了获得更大的灵 active ,我会稍微更改上述方法。我会添加一个翻译函数作为对象属性,并在我想本地化一个字符串时总是调用它。默认函数只是在字符串表中查找字符串,如果找不到本地化的字符串,则返回值本身,就像 gettext 一样。使用您的库的开发人员随后可以将函数更改为他自己提供的函数,以执行完全不同的本地化方法。
日期本地化不是问题。设置区域设置取决于您的库所使用的软件。格式本身是本地化的字符串,例如$this->translate('%Y-%m-%d')
将返回日期格式字符串的本地化版本。
数字本地化是通过设置正确的语言环境并使用像 sprintf()
这样的函数来完成的。
不过,货币本地化是个问题。我认为最好的方法是添加一个货币转换函数(并且,也许为了更好的灵 active ,还有另一个数字格式化函数),如果开发人员想要更改货币格式,他可以覆盖它。或者,您也可以为货币实现格式字符串。例如 %CUR %.02f
– 在此示例中,您将用货币符号替换 %CUR
。货币符号本身也是本地化字符串。
编辑 2:如果你不想使用 setlocale
你必须做很多工作......基本上你必须重写 strftime()
和 sprintf()
实现本地化的日期和数字。当然可能,但需要大量工作。
关于php - 如何国际化 PHP 第三方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503567/
我有一个 Java 字符串,但在处理时遇到了问题。我有一个字符串 s,它的值为丞(我随机选择的一个汉字,我不会说中文)。如果我打电话 String t = new String(s.getBytes(
在Qt中,所有的输入部件和文本绘制方式对Qt支持的所有语言都提供了内置的支持。Qt内置的字体引擎可以在同一时间正确而且精细地绘制不同的文本,这些文本可以包含来自众多不同书写系统的字符。如果想了解更多的
如何实现字段标签、帮助文本等的国际化支持。字段的标准乘法似乎不起作用例如文档中给出的用于创建联系表单的示例。我尝试为其他语言添加额外的字段(文档中描述的第一种方法) from django.db
是否有可能当我在操作类中使用“getText(”keyName”); 时,我可以指定仅从 ENGLISH 资源包中选择值。因为我只想将此值用于日志记录目的。 任何想法我怎么能做到这一点? BR 标准委
我有一些关于 GWT 的国际化解决方法的问题。 1) 处理直接写入 ui.xml 文件的静态文本的最佳方式是什么? 目前,我正在使用 Messages-Interface 来翻译 Java 生成的文本
我在 Symfony 2 中遇到了一个奇怪的翻译问题。 这是我的config.yml imports: - { resource: parameters.yml } - { resou
对于我的大部分应用程序,我可以使用 https://developers.google.com/web-toolkit/doc/latest/DevGuideI18n 中列出的推荐国际化技术。 (主要
我使用 Android Studio 创建了一个新的 Flutter 项目。我正在使用null-safety,并且正在物理设备上运行应用程序,但代码生成无法正常工作,没有flutter_gen.dar
这里是菜鸟。 我正在尝试对基于命令行的程序实现国际化。以下是 java 国际化路径中可用的内容。 import java.util.*; public class I18NSample { s
我使用 Android Studio 创建了一个新的 Flutter 项目。我正在使用null-safety,并且正在物理设备上运行应用程序,但代码生成无法正常工作,没有flutter_gen.dar
我正在开发一个需要多语言的应用程序。 我正在尝试关注 this国际化教程。但是,当我尝试“使用基本国际化”时, View 中没有列出我的 Storyboard。 我正在使用 XCode 4.6.3 我
我住在印度(有超过20种语言)我正在尝试在网站中实现java国际化。 但是在 Locale.getAvailableLocales() 中,本地语言不可用。我的情况是否可以实现国际化? 如果可能的话字
我有以下 SDN 4 实体: 决策、特征和值: @NodeEntity public class Value { private final static String SET_FOR = "
关于MySql,是否有支持所有或绝大多数语言的字符集? 最佳答案 统一码。它有几种编码:UTF-8、UTF-16 和 UTF-32。 来自 http://en.wikipedia.org/wiki/U
我目前正在使用 Vuepress。但是我想要在我的 Vuepress 站点中使用多种语言。经过 3 天的挣扎,我决定把我的问题放在这里。 (是的,我查看了 Vuepress 文档:https://vu
我需要返回一个 strftime() 调用,该调用使用与我本地机器/操作系统上设置的语言不同的语言。是否可以选择返回语言? 最佳答案 对于可靠的 i18n/L10N,可由必须在同一运行中提供不同本地化
我有一些按钮,按下它们后我想播放一些音频。按钮的名称是音频文件的名称 private func playAudio(title : String){ audioPlayer = AVAudio
如何更改 HTML5 的消息(或者它会根据浏览器的语言自动更改?) 例如: E-mail: 当我在 Opera 运行此代码(来自 W3schools)
我发现很多关于 url schemes 的话题,最常见的是: www.mysite.com/fr/products www.mysite.com/en/products www.mysite.com/
在 Android WebView 中处理国际化/本地化的最佳方式是什么。理想情况下,我想访问以下位置的所有字符串资源: res/values/strings.xmlres/values-de/str
我是一名优秀的程序员,十分优秀!