强制网站输入为英语是否可行?

10
我正在创建一个双语网站(Speedy Net),使用英文和希伯来语。我有一个输入字段(slug/用户名),必须使用英文(字母数字的拉丁字符)。当我用手机进入网站时,可以输入希伯来文字。在这个输入字段中,是否可能强制使用英文键盘?我注意到对于电子邮件地址(email输入)键盘默认已经是英文。
更新:在服务器端我们确实验证了输入内容。我不想通过客户端(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 /用户名(在电子邮件地址之后)时,如果之前处于希伯来语状态,则键盘会再次切换回希伯来语。这就是我想要避免的。


1
https://dev59.com/fYbca4cB1Zd3GeqPcfSo - misorude
2
你的意思是拉丁字母表中的字符还是英语单词? - Tom Blodget
1
@TomBlodget 字母数字字符(拉丁文)。 - Uri
我想主要防止希伯来语键盘。如果用户使用西班牙语或类似语言,我不介意。 - Uri
你想要一种非Web标准或浏览器文档记录的非常特定的行为。我认为你需要编写一些JavaScript,伙计。这是确保它在每个浏览器上都能一致工作的唯一方法。 - Andrew Koster
显示剩余3条评论
4个回答

13

在我看来,你有两个选项。

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

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/,以防止用户插入任何您不想要的数据,但无论如何,如果采用这种方法,您应该在后端验证数据。


10
您不能强制限制语言本身(文本输入只知道字符,对语言一无所知。实际上,用户名是一个相当随意的字符序列,不一定是现有语言中的单词),但您可以将允许的字符限制为ASCII码(这实际上是您真正的需求)。
在后端方面(Django),您可以使用现有代码来处理Slug(请参考models.SlugField和validators.validate_slug),或者根据特定需要编写自己的验证程序。
在前端方面,您可以选择一些传统的解决方案(例如这个),或使用输入的模式属性
注:请注意,我没有投票关闭您的问题,因为它包含了Django特定的后端部分,但您在发布问题之前确实应该进行搜索,因为这里和其他地方已经有了很多类似的问题...

1

在验证方面,<input>元素的"pattern"属性得到了广泛支持,并提供了纯CSS验证。

In terms of showing the correct on-screen keyboard, I think [mis]using type="email" in combination with above is your best bet at the moment* - out of all supported types it's the only one that auto-switches to Latin while allowing alphabetical input - while the browser would ideally take a hint and not show a regional keyboard if the pattern forbids that range, specification does require any specific effort in this regard.

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

*也就是说,除了像使用DOM和JS构建自定义OSK并通过立即给非输入元素焦点来挂起系统OSK这样的根本解决方案外。

0

这是一种有点暴力和不太优雅的解决方案...它会产生副作用(例如限制页面上可使用的字符范围-没有表情符号☹),但您可以使用 charset 元标记,并将其设置为类似于 US-ASCII 的内容。

<meta charset="US-ASCII">

你或许可以将输入字段/表单放入带有受限字符集的iframe中。

再次说明,这只是个折中的解决方案。


这将排除在希伯来语中显示提示。 - user10316640

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接