查看: 61|回复: 0

[其他] Flarum 支持中文用户名 / CJK、Unicode 用户名(同时支持艾特及 URL 访问)

[复制链接]

73

主题

12

回帖

287

积分

青铜会员

Rank: 2

积分
287
威望
0
金币
61
鲜花(1) 鸡蛋(1)
发表于 2024-9-25 13:55:14 | 显示全部楼层 |阅读模式
Flarum 核心代码是不支持英文或数字以外的用户名的,因此我们需要修改核心代码。

[dwarning title=警告 font=darkorange bg=#fff8c4 border=darkorange]强烈不建议修改核心代码!升级 Flarum 后,修改的代码会被覆盖还原。另外,已经有人提交了 PR 让原生 Flarum 支持 Unicode 用户名,如果您有很强大的耐心(逃 ,可以等等试试看 😂[/dwarning]

1. 允许注册 CJK 用户名
文件 /vendor/flarum/core/src/User/UserValidator.php

将 47 行的 'regex:/^[a-z0-9_-]+$/i' 替换为(三个方案选一个)
  1. // 1. CJK基础上,不允许全数字用户名出现,防止个人主页报错。
  2. 'regex:/^[-_a-zA-Z0-9\x7f-\xff]*[-_a-zA-Z\x7f-\xff][-_a-zA-Z0-9\x7f-\xff]*$/i',

  3. // 2. CJK基础上,允许全数字用户名
  4. 'regex:/^[-_a-zA-Z0-9\x7f-\xff]+$/i',

  5. // 3. Unicode 用户名
  6. 'alpha_dash'
复制代码


别把行尾的半角逗号忘了。

文件 /vendor/flarum/core/src/Forum/Auth/Registration.php

将 101 行 $username = preg_replace('/[^a-z0-9-_]/i', '', $username); 注释掉,
也就是改成 // $username = preg_replace('/[^a-z0-9-_]/i', '', $username);


2. 允许@艾特 CJK 用户名。
文件 /vendor/flarum/mentions/src/ConfigureMentions.php

  1. /\B@(?<username>[\p{L}\p{N}_-]+)(?!#)/ui
  2. 原始表达式:/\B@(?<username>[a-z0-9_-]+)(?!#)/i
复制代码


同文件大概 91 行,将 configurePostMentions 函数中 $config->reg->match 的正则表达式改为:
  1. /\B@(?<username>[\p{L}\p{N}_-]+)#(?<id>\d+)/ui
  2. 原始表达式:/\B@(?<username>[a-z0-9_-]+)#(?<id>\d+)/ui
复制代码


3. 增加 API URL CJK 编码转换支持。(很多时候点击 CJK/Unicode 用户链接提示“找不到此资源”就是这个问题)
文件 /vendor/flarum/core/src/Api/Controller/ShowUserController.php

Beta13 及以下
将 52 行的 getIdForUsername($id) 替换为 getIdForUsername(urldecode($id))。
Beta14 及以上
将 62 和 64 行的 $id 改为 urldecode($id)
稳定版
63 行 fromSlug($id, $actor) 改为 fromSlug(urldecode($id), $actor)


4. 清除缓存,必须有这一步!
终端运行 php flarum cache:clear 或其他方式。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表