编写 babel 消息解析器和文件扩展名

Writing a babel message parser and file extension

我想让 babel 解析文件并找出以以下内容开头的翻译字符串:

(_ 

并结束于:

)

所以 file.myext 中的翻译部分可以是:

(_ "message")

字符串文字始终以双引号 (") 开头和结尾。

有一些参考:http://babel.pocoo.org/en/latest/messages.html?highlight=parser

但这似乎是一件极其复杂的事情。有人可以提供一个简单的例子来为具有上述约束的 babel 实现自己的消息提取器吗?

我可以从以下位置找到 Jinja2 解析器:https://github.com/pallets/jinja/blob/99498320871a290f5799d4f96a7774fc8a34381e/jinja2/ext.py

但是啊?!

Django 项目也有自己的提取器:https://github.com/python-babel/django-babel/blob/master/django_babel/extract.py

这些看起来很复杂的原因是因为它们使用 lexical analysis(又名 "lexers")来解析输入并找到字符串。这可能看起来过于复杂,但它是计算机科学的一个非常成熟的领域,也是完成这项工作的正确工具。大多数初学者从此类任务的正则表达式和自定义代码开始,如果他们坚持并从可用的内容中学习,最终会得到词法分析器和解析器。

对于您自己的定义,您正在寻找:

  1. 左括号(
  2. 一个下划线_
  3. 零个或多个白色space 字符(space、换行符、制表符等)
  4. 一个双引号"
  5. 您要提取的一些文本
  6. 结束语 "
  7. 零个或多个白色space 个字符
  8. 一个结束括号)

这对 many lexing / parsing libraries in Python 来说是个大问题,也是介绍这项技术的完美方式。

您还需要考虑其他一些情况:

(_ 'single quotes')
(_ '''multi
      line
      quotes''')
(_ "strings with \"escaped quotes\".")
(_ "strings with 'mixed quotes'")
(_ "strings that are just wrong')