小程序 国际化_在国际化您的应用程序时忘记的一件事

小程序 国际化

The hidden bugs waiting to be found by your international users

您的国际用户正在等待发现的隐藏错误

While internationalizing our applications, we focus on the things we can see: text, tool-tips, error messages, and the like. But, hidden in our code there are places requiring internationalization that tend to be missed until found by our international users and reported as a bug.

在对我们的应用程序进行国际化的同时,我们专注于可以看到的内容:文本,工具提示,错误消息等。 但是,在我们的代码中隐藏着一些需要国际化的地方,在我们的国际用户发现并报告为错误之前,这些地方往往会被遗漏。

Here’s a big one: regular expressions. You likely use these handy, flexible, programming features to parse text entered by users. If your regular expressions are not internationalized, more specifically, if they are not written to handle Unicode characters, they will fail in subtle ways.

这是一个很大的:正则表达式。 您可能会使用这些方便,灵活的编程功能来解析用户输入的文本。 如果您的正则表达式没有被国际化,更具体地说,如果它们不被编写为处理Unicode字符,它们将以微妙的方式失败。

Here’s an example: imagine a commenting system in your application that allows users to type at-mentions of other users or user groups. People at-mentioned are notified that the comment needs their attention. Your system may have the requirement that the at-mention format is something like:

^ h ERE是一个例子:想象你的应用程序中的评论系统,允许用户输入其他用户或用户组的AT-提及。 通知所提及的人该评论需要引起他们的注意。 您的系统可能要求注意格式为:

Image for post

Writing a regular expression to find and parse the usernames out of these strings is the most direct way for handling this. In Java, JavaScript, and other languages, the regular expression might look like this:

编写正则表达式以从这些字符串中查找和解析用户名是处理此问题的最直接方法。 在Java,JavaScript和其他语言中,正则表达式可能如下所示:

Image for post

This expression specifies that we’re looking for an ‘@’ followed by a letter or number, followed by one or more letters, numbers, dashes, underscores, or dots, and ending with a letter or number. The parentheses tell the expression to capture this string and return it to us.

此表达式指定我们要查找的是“ @”,后跟一个字母或数字,然后是一个或多个字母,数字,破折号,下划线或点,并以字母或数字结尾。 括号告诉表达式捕获该字符串并将其返回给我们。

We can test it using the regex101 tester:

我们可以使用regex101测试仪进行测试:

Image for post
https://regex101.com/r/gVNS9f/1/https://regex101.com/r/gVNS9f/1/

So that regex works great! But now let’s test it against some comment text containing Unicode characters:

因此,正则表达式效果很好! 但是,现在让我们针对一些包含Unicode字符的注释文本进行测试:

“This comment mentions @Adriàn, @François, @Noël, @David, and @ひなた”

“此评论提到@Adriàn,@ François,@Noël,@ David和@ひなた”

Image for post
https://regex101.com/r/b4ZGY2/2/https://regex101.com/r/b4ZGY2/2/

Unicode characters are not matched, so we either get incomplete usernames or no username at all.

Unicode字符不匹配,因此我们得到的用户名不完整或根本没有用户名。

The solution:

吨他的解决方案:

Unicode is a character set that aims to define all characters and glyphs from all human languages, living and dead.”

Unicode是一种字符集,旨在定义所有人类语言(生与死)中的所有字符和字形。”

http://www.regular-expressions.info/unicode.html

http://www.regular-expressions.info/unicode.html

It would seem incredibly difficult to write a regular expression encompassing the Unicode mission statement quoted above, but it’s fairly straight forward. To match a single letter grapheme (a complete letter as rendered on screen), we use the \p{L} notation.

编写包含上面引用的Unicode Mission语句的正则表达式似乎非常困难,但这很简单。 为了匹配单个字母字素(屏幕上呈现的完整字母),我们使用\ p {L}表示法。

Updating our regex to use this Unicode friendly notation for letters, we get:

更新我们的正则表达式以对字母使用此Unicode友好符号,我们得到:

Image for post

Let’s try it out in the regex101 tester:

让我们在regex101测试仪中尝试一下:

Image for post
https://regex101.com/r/b4ZGY2/1https://regex101.com/r/b4ZGY2/1

Close! But @Adriàn is not getting fully parsed. In fact, the string returned from the capture group is ‘Adria’, so we’ve got an incomplete username and lost the grave accent over the a. What’s going on?

关! 但是@Adriàn尚未完全解析。 实际上,从捕获组返回的字符串是“ Adria”,因此我们的用户名不完整,并且丢失了a字母的重音。 这是怎么回事?

To understand this, let’s take a look at how single characters rendered on a screen or page are represented in Unicode. The à is actually two Unicode characters, U+0061 representing the a and U+0300 representing the grave accent above the a. The grave accent is a combining mark. A character can be followed by any number of combining marks which will be assembled together when rendered.

为了理解这一点,让我们看一下屏幕或页面上呈现的单个字符如何以Unicode表示。 à实际上是两个 Unicode字符,U + 0061代表a ,U + 0300代表a上方的重音。 重音是一个结合的标志 。 字符后可以跟任意数量的组合标记,这些标记在渲染时将组装在一起。

Fortunately, our regex can look for combining marks as well with the \p{M} specifier. This matches on a Unicode character that is a combining mark. Our usernames as defined will never start with a combining mark, but we do need to check for them in the middle and at the end of the strings. The new regex looks like this:

幸运的是,我们的正则表达式也可以使用\ p {M}说明符来查找标记组合。 这与作为组合标记的Unicode字符匹配。 我们定义的用户名永远不会以组合标记开头,但是我们确实需要在字符串的中间和结尾检查它们。 新的正则表达式如下所示:

Image for post

Testing it:

测试它:

Image for post
https://regex101.com/r/uV38Y6/1https://regex101.com/r/uV38Y6/1

Success!

成功!

One detail worth knowing is that some combined characters like the à can also be specified in Unicode with a single character (U+00E0 in this case). But with our regex, it doesn’t matter. We’ll match the character if it has a single representation, with the /p{L} specifier, or if it is a combination of two characters, with the /p{M} specifier.

值得一提的一个细节是,也可以使用单个字符(在本例中为U + 00E0)在Unicode中指定诸如à之类的一些组合字符。 但是使用我们的正则表达式,没关系。 如果字符具有单个表示,则将其与/ p {L}说明符相匹配,或者,如果它是两个字符的组合,则将与/ p {M}说明符相匹配。

As long as we’re internationalizing, let’s deal with the digits as well. Unicode regex handling gives us a safe way to match any representation of the digits 0 through 9 using the \p{Nd} specifier. Using it, we get our final internationalized regular expression for matching and returning usernames in the body of a comment’s text:

只要我们正在国际化,我们也要处理数字。 Unicode正则表达式处理为我们提供了一种安全的方式,可以使用\ p {Nd}说明符来匹配数字0到9的任何表示形式。 使用它,我们得到了最终的国际化正则表达式,用于匹配和返回注释文本正文中的用户名:

Image for post

The exact details for handling Unicode in regular expressions can vary from language to language, so be sure to check out the differences for your code. The site regular-expressions.info is an excellent source for regular expression information in all programming languages and is what lead me to the solution I described in this article.

在不同的语言中,使用正则表达式处理Unicode的确切细节可能有所不同,因此请务必检查出代码的差异。 该网站regular-expressions.info是所有编程语言中正则表达式信息的绝佳来源,也是使我引向本文所述解决方案的原因。

翻译自: https://medium.com/@kennyflutes/the-one-thing-you-forgot-while-internationalizing-your-application-72c3323b253c

小程序 国际化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCA主成分分析Python实现

作者:拾毅者 出处:http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源码:https://github.com/csuldw/MachineLearning/tree/master/PCA PCA(principle component analysis) ,主成分分…

robo 3t连接_使用robo 3t studio 3t连接到地图集

robo 3t连接Robo 3T (formerly Robomongo) is a graphical application to connect to MongoDB. The newest version now includes support for TLS/SSL and SNI which is required to connect to Atlas M0 free tier clusters.Robo 3T(以前称为Robomongo )是用于连接MongoDB的…

软件需求规格说明书通用模版_通用需求挑战和机遇

软件需求规格说明书通用模版When developing applications there will be requirements that are needed on more than one application. Examples of such common requirements are non-functional, cookie consent and design patterns. How can we work with these types of…

python版PCA(主成分分析)

python版PCA(主成分分析) 在用统计分析方法研究这个多变量的课题时,变量个数太多就会增加课题的复杂性。人们自然希望变量个数较少而得到的信息较多。在很多情形,变量之间是有一定的相关关系的,当两个变量之间有一定…

干货|Spring Cloud Bus 消息总线介绍

2019独角兽企业重金招聘Python工程师标准>>> 继上一篇 干货|Spring Cloud Stream 体系及原理介绍 之后,本期我们来了解下 Spring Cloud 体系中的另外一个组件 Spring Cloud Bus (建议先熟悉 Spring Cloud Stream,不然无法理解 Spr…

主成份分析(PCA)详解

主成分分析法(Principal Component Analysis)大多在数据维度比较高的时候,用来减少数据维度,因而加快模型训练速度。另外也有些用途,比如图片压缩(主要是用SVD,也可以用PCA来做)、因…

如何安装pylab:python如何导入matplotlib模块

pylab是python下挺不错的一个画图模块,使用也非常简单,记得Mit的计算机科学及编程导论有节课也是用到了这个工具,但这个工具安装不象用起来那么方便,小编就图文全程直播下吧 工具/原料 python2.7.10win10 32位方法/步骤 1缺省状态…

BP神经网络python简单实现

BP神经网络的原理在网上有很详细的说明,这里就不打算细说,这篇文章主要简单的方式设计及实现BP神经网络,并简单测试下在恒等计算(编码)作测试。 BP神经网络模型图如下 BP神经网络基本思想 BP神经网络学习过程由信息的…

golang的reflection(转)(一)

2019独角兽企业重金招聘Python工程师标准>>> 反射reflection 可以大大提高程序的灵活性,使得interface{}有更大的发挥余地反射可以使用TypeOf和ValueOf函数从接口中获取目标对象信息反射会将匿名字段作为独立字段(匿名字段的本质)…

datatables.js 简单使用--多选框和服务器端分页

说明:datatables是一款jQuery表格插件。感觉EasyUI的datagrid更易用 内容:多选框和服务器端分页 缘由:写这篇博客的原因是datatables的文档写的不怎么样,找东西很麻烦 环境:asp.net mvc , vs2015sqlserver2012 显示效…

python异常(高级) Exception

异常(高级) Exception 异常回顾:     try-except 语句 捕获(接收)异常通知,把异常流程变为正常流程     try-finally 语句 执行必须要执行的语句.     raise 语句 发送异常通知,同时进入异常流程     assert 语句 发送AssertionError异常     with 语句 wi…

从BMW Vision iNEXT 看宝马如何进军自动驾驶

安全很重要,空间也要很大,砍掉大量物理按键,内饰材料要环保,还要提供自动和主动两套驾驶方案。这些描述仅是BMW Vision iNEXT(下称Vision iNEXT)概念车的设计之冰山一角。 一款概念车当然无法完全代表未来…

CSS浮动(二)---Float

重新认识float 2.1. 误解和“误用” 既然提到“误用”,各位看官就此想想,自己平日是怎么使用float的?另外,既然“误用”加了引号,就说明这样的使用并不是真正的误用,而是误打误撞使用之后,带…

云原生生态周报 Vol. 2

业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目: Kubernetes External Secrets,简称KES。这个项目定义了ExternalSecrets API&#xff…

centos 7新机使用前操作

关闭防火墙 systemctl stop firewalld(停服务) systemctl status firewalld(看状态) systemctl disable firewalld.service (永久关闭) selinux getenforce(查状态) vi /etc/selinux…

软件架构演进

传统架构到分布式架构详解 软件架构演进软件架构的发展经历了从单体架构、垂直架构、SOA架构到微服务架构的过程,博客里写到了这四种架构的特点以及优缺点分析,个人学习之用,仅供参考! 1.1.1 单体架构 特点:1、所有的…

hadoop0.20.0第一个例子

这是Hadoop学习全程记录第2篇,在这篇里我将介绍一下如何在Eclipse下写第一个MapReduce程序。 新说明一下我的开发环境: 操作系统:在windows下使用wubi安装了ubuntu 10.10 hadoop版本:hadoop-0.20.2.tar.gz Eclipse版本&…

IDEA 修改JavaWeb的访问路径

问题描述 对于我这个刚刚使用IDEA不久的新手来说,能够正常运行就不错了,不过到了后面,可能会觉得IDEA给你分配的默认访问路径很不顺手,比如访问的时候需要通过: http://localhost:8080/web_war_exploded/ 来访问,对于web_w…

做一个vue的todolist列表

<template><div id"app"><input type"text" v-model"todo" ref"ip"/><button click"add()">新增</button><br/><br/><hr/><ul><li v-for"(item,key) in li…

一种解决 MacBook 里的 App Store 无法登录的问题

刚刚买回来的 2018 款带有 touchbar 的 MacBook Pro 15 inc 在用 App Store 安装 app 时一直无法登录成功&#xff08;网络链接都是好的&#xff09;&#xff0c;导致软件都无法更新&#xff0c;折腾了挺一会的。 后来发现是要退出设置里的 iCloud 登录&#xff0c;然后重新登录…