我正在开发一个应用程序,我需要有标签显示时间,本地化为用户的语言环境.这一切都可以通过使用NSDateFormatter()类来正常工作.
let timeFormatter = NSDateFormatter()
timeFormatter.dateStyle = NSDateFormatterStyle.NoStyle
timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
let timeStr: String = timeFormatter.stringFromDate(time)
Run Code Online (Sandbox Code Playgroud)
但NSDateFormatter()VoiceOver没有正确说出生成的字符串.这对美国英语来说还不错,但不是荷兰语(我的母语).
然后我尝试使用NSDateComponentsFormatter()该类并NSDateComponentsFormatterUnitsStyle.SpellOut为该unitsStyle属性指定.
let timeComponentFormatter = NSDateComponentsFormatter()
timeComponentFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.SpellOut
let accessibilityTimeStr: String = timeComponentFormatter.stringFromDateComponents(timeComponents)!
Run Code Online (Sandbox Code Playgroud)
虽然这会产生一个可以由VoiceOver说出的好字符串,但它并不像母语人士那样说时间.虽然它使用了正确的语言,但它并没有按照用户所在地区的文化惯例进行格式化.
当我在启用了VoiceOver的情况下点击锁定屏幕上的时间时,它会正确地说出时间,就像母语人士所说的那样,用我尝试过的每种语言.因此,iOS中必须有能够生成可由VoiceOver说出的正确字符串的内容.
我找不到这样做的公共API.我错过了什么,或者这可能是私有API?
我正在研究一个新项目的概念,我需要支持多语言URL.理想情况下,所有URL都需要使用用户的本地语言.因此,我们不想使用domain.com/en/contact和domain.com/es/contact,但我们喜欢domain.com/contact和domain.com/contactar(contactar是西班牙语以便联系).在内部,两者都应该路由到同一个ContactController类.
这可以通过为每种语言添加到Global.asax.cs的多个静态路由来处理,但我们希望使其非常动态,并希望系统用户能够通过内容管理更改URL的转换系统.所以我们需要从URL到控制器和动作的某种动态映射.
通过查看MVC3的源代码,我发现MvcHandler的ProcessRequestInit方法负责确定要创建哪个控制器.它只是在RouteData中查找控制器的名称.覆盖默认MVC路由的一种方法是创建使用自定义RouteHandler的简单默认路由.此RouteHandler强制MVC使用我自己的自定义子类MvcHandler,它会覆盖ProcessRequestInit方法.在重新调用原始ProcessRequestInit之前,此重写方法将我自己动态找到的控制器和操作插入到RouteData中.
我试过这个:
的Global.asax.cs
routes.Add(
new Route("{*url}", new MultilingualRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Default", action = "Default" })
}
);
Run Code Online (Sandbox Code Playgroud)
MultilingualRouteHandler.cs
public class MultilingualRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MultilingualMVCHandler(requestContext);
}
}
Run Code Online (Sandbox Code Playgroud)
MultilingualMvcHandler.cs
public class MultilingualMVCHandler : MvcHandler
{
public MultilingualMVCHandler(RequestContext context) …Run Code Online (Sandbox Code Playgroud)