求教用C#实现多语言的程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教用C#实现多语言的程序相关的知识,希望对你有一定的参考价值。
我要用C#写一个界面支持中英文两种语言的程序,并且该程序要在WinCE下运行。请教大家有什么好的方法,谢谢各位!
写了配置文件和资源文件,和可执行文件放在了同一个目录下,但是WinCE下出现异常,好像不能识别ini和resources文件。
如果做成WinForm应用程序是没有问题的,但我需要做成智能设备应用程序在WinCE下跑。
支持多语言的 PHP 路由
【中文标题】支持多语言的 PHP 路由【英文标题】:PHP Routing with multilingual support 【发布时间】:2011-08-17 01:58:33 【问题描述】:我目前正在框架上创建 CMS。我制作了我的 .htaccess 文件,如下所示:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([A-Za-z]+)/(.*)$ index.php?url=$1 [PT,L]
</IfModule>
我的问题是:
1) 我的页面可以通过正常的 MVC URL 访问: http://example.com/pages/view/the-shorttag-of-the-page
2) 我的页面也可以通过路由访问: http://example.com/p/the-shorttag-of-the-page
我真正需要实现的是我可以通过两种方式访问它: http://example.com/the-shorttag-of-the-page 或有语言支持 http://example.com/lang/the-shorttag-of-the-page
我的问题是我不想更改 mod_rewrite - 我宁愿在 PHP 中创建路由,但我找不到如何在没有的情况下路由到 PageController->view() 方法的解决方案条件中的静态字母(上例中的“p”)。
你明白我的问题吗? 你有什么建议可以引导我走向正确的方向吗?
【问题讨论】:
【参考方案1】:听起来你需要实现某种路由器。
我自己也遇到过,这就是我让它工作得很好的方法:
某些路由器类解析 URL。它将 URL 部分 (/en/controller/action/param1/paramval1/
) 分解成碎片。它确定语言代码(如果未提供则默认)、控制器、操作等。
路由器还向系统的其他部分提供信息(控制器、动作名称、参数),尽管您可以为此目的实现特殊类(例如请求)。
现在系统的不同部分可以通过路由器或请求类访问给定的信息。从这里开始,实现多语言站点应该很容易。
再一次,重要的部分是将 URL 映射到控制器和操作。当然,如果您不想要像/controller/action/parameter1
这样的 URL,您应该有一些映射表(XML 文档/数据库表)将存根(页面短标签)映射到控制器和操作。是路由器读取这张表并根据给定的规则确定控制器、动作和其他参数。
希望我没有太复杂:)
更新:
就我自己而言,我已经使用 XML 文件实现了映射。让我进一步解释一下:路由器负责解析 URL。通常,您的 URL 将包含控制器和操作名称(在您的情况下,pages 是控制器,view 是操作)。
现在,在您的情况下,您只需要一个存根,因此路由器必须以某种方式获取有关正在调用哪个控制器和操作的信息。这就是映射的目的,将存根映射到适当的控制器和动作。
我已经将此实现为静态路由,手动写入 XML 文件,但您可以使用某种插件类来检查存根是否实际与页面相关。如果不是,那可能意味着两件事:它是控制器或请求无效。
让我进一步谈谈冲突:如果存根与任何控制器的名称相同,那么就会发生冲突。您应该使用给定的存根渲染页面,还是调用控制器?这必须以某种方式解决,也许您可以以编程方式限制用户拥有带有这种存根的页面。
另外,下次您使用 PHP 进行应用程序开发时,我建议您使用一些知名的 PHP 框架(如果您还没有,ofc.),例如Zend、Kohana 或 CodeIgniter。它们都提供路由器和许多其他组件,使开发应用程序变得更加容易、更快和更安全。
【讨论】:
最后一部分有点复杂——我为什么要有一个映射数据库?这样做的目的是什么?这是我第一次遇到语言支持问题,所以这不是我最擅长的.. 用更详细的映射说明更新了答案 Usoban:我现在更了解你的想法了。但我需要问一个小问题:这是否意味着我必须从我的数据库中获取所有短标签并检查其中是否有任何这些在 URL 中。如果没有,那么我应该创建一个调度程序,该调度程序路由到一个控制器(如果存在)。如果这些都不存在,则路由到错误页面。对吗? 是的,数据库中的每个页面都应该有存根(你称之为短标签:),它被剥离了页面标题(例如关于页面,我们的公司)。这只是一个 SQL 查询的问题。 对不起,英语不是我的母语。 “存根”是指“别名”吗?【参考方案2】:我通过将域之后的整个字符串传递给索引页面,并在 php 中处理它,而不是在 .htaccess 中处理它。我不是 .htaccess 专家,但这对我有用:
RewriteEngine On
RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f
RewriteRule ^.*$ ./index.php
我在设置中指定站点是否会使用语言支持,我认为在同一个站点中同时支持可能很难实现。
如果您需要更多详细信息,请询问我。
更新
丹尼斯,我正在阅读@usoban 的帖子,我可以说我有类似的方法。正如我所说,我得到了从 .htaccess 到我的 application
类的域之后的完整路径,并将其解析为一个数组。如果在配置中指定了“多语言”,我将采用第一个数组元素并加载该语言的“别名”表。
'alias' 表是一个映射别名控制器的关联数组,如下所示:
$lang_mods = array(
'home' => 'Home',
'contact' => 'Contact',
'sitemap' => 'Sitemap',
'about' => 'Section/about',
'terms' => 'Section/terms',
);
这样,我就可以得到一个完整翻译的url,即:
http://www.example.com/en/contact 和: http://www.example.com/es/contacto
因此,在从 url 数组中删除第一个语言元素后,我会根据别名表检查下一个元素。表中的最后两项是特殊情况,可用于简化 url,得到
http://www.example.com/en/about
代替
http://www.example.com/en/section/about
看起来更好,但都指向同一个 Section
控制器。
删除语言和别名后,数组中的剩余元素(如果有)将传递给控制器。示例中的“about”或“terms”被添加到参数数组中。根据控制器的不同,第一个参数可以是动作,也可以不是。
如果在此过程的某个步骤中,某些内容与允许的值不匹配,则会将其重定向到主页。
好的,在您的情况下,如果可以针对可用控制器检查第一个参数(如果站点是多语言,则为第二个参数),如果它不存在,您可以路由到“默认”控制器,并且然后检查数据库中的可用页面。通过这种方式,您可以避免在 url 中添加额外的 /p/
。
我想清楚,对不起,英语不是我的母语;)
【讨论】:
这就是我目前所做的。我的问题是,我需要 PHP 代码来完成它。我已经用语言做了一个表。如果有多种语言,那么应该有语言支持 我在我的框架中做,但我不能给你一个简短的答案,因为我的语言支持与许多其他功能集成。稍后我会尝试做一个简短的。 (对不起我的英语) 听起来真的很棒!这是我在 CMS 中的最后一次头痛……我真的不想让 som “OOPS”:P 我添加了更多细节,看看。 好的,现在我离终点更近了。 :P 好吧,你说的是:用“/”分解 URL,然后取第一部分。如果它不完全是 2 个字符,那么它不是一种语言 - 所以选择默认语言。如果它是 2 个字符长,则将语言中的每一页转储到您指定控制器、操作和例如的数组中。一些额外的变量?以上是关于求教用C#实现多语言的程序的主要内容,如果未能解决你的问题,请参考以下文章