在多语言(例如英语和法语)应用程序中抛出异常

时间:2011-05-06 14:20:28

标签: php exception-handling internationalization multilingual

在我的应用程序中,我使用Exception来控制流程。

我使用这样的东西:

throw new Exception("Unable to add new user, user already exist");

此方法适用于使用一种语言的应用程序。但是,当我打算制作多语言应用程序时,我不知道该怎么做。

上一行代码应该使用用户正在使用的默认语言生成一条消息。

有哪些可能的解决方案?

3 个答案:

答案 0 :(得分:5)

在将与多种人类语言一起使用的应用程序中,永远不要对用户可能会暴露的字符串进行硬编码。他们需要在某种资源文件中。如果愿意,您可以对SQL语句和内部日志记录信息进行硬编码,但用户可能看不到任何内容。我知道如何在Microsoft Windows中使用字符串资源文件(我将两个C#和一个C ++应用程序国际化),对于Mac OSX,Linux以及您可能使用的任何其他操作系统,必须有类似的东西。

在这样的情况下,你最好抛出类似UserAlreadyExists异常的东西,并在捕获它时将其交给某种错误显示例程。否则,您将在代码的处理部分处理UI,而这通常不是您想要做的。不要担心异常的多样性,因为如果您正在本地化应用程序,那么您将拥有多个字符串资源文件引用。

答案 1 :(得分:2)

答案 2 :(得分:1)

一般的解决方案是你有一些设置来指示消息应该显示的当前语言。然后你有一个文件或数据库表(尽管如果存储有关数据库连接错误的消息可能不太好数据库 - 您希望错误消息尽可能轻松访问 - 最好在应用程序启动时将它们全部加载到某个缓存中)包含所有错误字符串的地方,以及多种语言,例如:

userExists.English = "Unable to add new user, user already exist"
userExists.Spanish = "<my Spanish isn't good enough to even try>"
userExists.ClassicalMongolian = ...

然后当你抛出异常时,你会有类似

的东西
//currentLanguage indicates what the language of the current session is.
//the function lookupExceptionString must be able to look up the
//correct string based on the value of currentLanguage
exceptionString = lookupExceptionString(currentLanguage);
throw new Exception(exceptionString );

...但幸运的是,有些框架已经做了很多。在网上搜索“php国际化”或“php i18n”,我找到的第一个链接就是:

http://php-flp.sourceforge.net/getting_started_english.htm