是否可以强制网站输入为英文?

Posted

技术标签:

【中文标题】是否可以强制网站输入为英文?【英文标题】:Is it possible to force a website input to be in English? 【发布时间】:2019-12-07 17:17:01 【问题描述】:

我正在用两种语言(英语和希伯来语)创建一个网站 (Speedy Net)。我有一个必须是英文(字母数字拉丁字符)的输入字段(slug/用户名)。当我从手机进入网站时,我可以用希伯来语写文字。是否可以在此输入字段中强制键盘为英文?我注意到对于电子邮件地址(电子邮件输入),键盘已经是英文的。

更新:在服务器端,我们会验证输入。我不想验证客户端的输入(使用 javascript)或阻止用户输入希伯来语字符(这可能会在以后完成),但我想导致(强制)默认键盘语言为英文.我注意到对于电子邮件和密码,当我将它们的方向设置为ltr 时,键盘的默认语言是英语。但不在 slug/用户名字段上。

电子邮件输入由我测试的浏览器自动验证为英文。你不能在那里使用希伯来语字符。

我在 Stack Overflow 或其他地方搜索并没有找到类似的问题。

slug 字段可以包含任何由服务器转换为破折号的非字母数字字符。例如,Aa=Bb!1@2#3$4%56 被服务器转换为aa-bb-1-2-3-4-56,这是 Speedy Net 上用户的有效 slug。但是,אא-בב-1-2-3-4-56 在 Speedy Net 上不是有效的 slug。用户的 slug 必须以至少 4 个拉丁字母开头。

当页面是希伯来语时,就会出现问题。如果页面是英文的,就没有问题。

在我的网站中输入名字和姓氏时,用户可以输入任何语言。键入电子邮件地址(电子邮件输入)时,键盘会自动切换到英文(在 Galaxy 上测试)。但是,当输入 slug/用户名(在电子邮件地址之后)时,如果在电子邮件输入之前(在 Galaxy 上)是希伯来语,则键盘会切换回希伯来语。这是我要防止的。

【问题讨论】:

***.com/questions/27976155/… 您指的是拉丁文字中的字符还是英语中的文字? @TomBlodget 字母数字字符(拉丁文)。 我想主要防止使用希伯来语的键盘。我不介意用户使用西班牙语或类似的东西。 您将寻求 Web 标准或浏览器未记录的非常具体的行为。我认为您将不得不编写一些Javascript,伙计。这是确保它在每个浏览器上始终如一地工作的唯一方法。 【参考方案1】:

在我看来你有两个选择。

第一个是让用户输入他们想要的任何内容,但在后端使用一个只接受带有拉丁字符的用户名的验证器。

class UsernameValidator(validators.RegexValidator):
    regex = r'^[\w.@+-]+\Z'
    message = _(
        'Enter a valid username. This value may contain only letters, '
        'numbers, and @/./+/-/_ characters.'
    )
    flags = 0


class YourUser(User):
    username = models.CharField(
            _('username'),
            max_length=150,
            unique=True,
            help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
            validators=[UsernameValidator()],
            error_messages=
                'unique': _("A user with that username already exists."),
            ,
        )

第二种方法是使用某种 JavaScript 掩码库,例如 https://imask.js.org/,这样您就可以防止用户插入任何您不希望他们插入的数据,但无论如何,如果出现以下情况,您应该在后端验证数据你遵循这个方法

【讨论】:

【参考方案2】:

您不能强制使用语言本身(文本输入只知道字符,它对语言一无所知,实际上用户名是相当任意的字符序列,不一定是现有语言中的现有单词),但您可以限制ascii 的允许字符(这实际上是您真正需要的)。

在后端 (django),您可以使用现有的 slug 代码(参见 models.SlugField 和 validators.validate_slug),或者编写自己的验证器以满足更具体的需求。

在前端,您可以选择一些plain old-school solution like this one 或use the pattern attribute of the input。

注意:请注意,由于特定于 django 的后端部分,我没有投票结束您的问题,但您确实应该在发布问题之前进行搜索,因为这里和其他地方已经有很多类似的问题...

【讨论】:

【参考方案3】:

在验证方面,<input> 元素中的 "pattern" attribute 是 widely supported,并提供纯 CSS 验证。

在显示正确的屏幕键盘方面,我认为 [mis] 将 type="email" 与上述结合使用是您目前最好的选择* - 在all supported types 中,它是唯一一个自动-在允许字母输入的同时切换到拉丁语 - 如果模式禁止该范围,浏览器理想情况下会提示并且不显示区域键盘,specification 在这方面确实需要任何特定的努力。

input:invalid 
outline: 2px solid red;
<input placeholder="username" title="English only!" pattern="[\x00-\x7F]+"/>

* 即没有激进的解决方案,例如从 DOM 和 JS 构建自定义 OSK 并通过立即给予非输入元素焦点来暂停系统 OSK。

【讨论】:

【参考方案4】:

有点蛮力和骇人听闻的答案......它会产生副作用(例如限制您可以在页面上使用的字符范围 - 没有表情符号☹)但您可以使用charset 元标记和将其设置为 US-ASCII 之类的内容。

<meta charset="US-ASCII">

您也许可以将输入字段/表单放入具有有限字符集的 iframe。

又是一个答案。

【讨论】:

这将排除以希伯来语显示的提示。

以上是关于是否可以强制网站输入为英文?的主要内容,如果未能解决你的问题,请参考以下文章

对使用 .htaccess 输入的任何 URI 强制使用 SSL 和 www 子域?

这个一个强制客户输入数字的效果

谷歌登录 API:强制输入密码?

强制用户使用 HTML5 视频输入捕获以低分辨率捕获视频

承诺 - 是不是可以强制取消承诺

是否可以将网站上的用户输入保存到 txt 文件中?