您的要求:
为了使我的网站能够
以经过身份验证的用户的多种语言工作,
我需要能够立即翻译使用t()函数在网站代码库中找到的所有翻译调用。
需求描述是否接近您的要求?
爬行者
就像有人说的那样-爬虫理论上可以遍历整个站点来强制注册所有t()调用。但是1)抓取工具不知道要抓取哪些页面;2)因此,我们不希望维护要爬网的页面列表;3)我们不想使用搜寻器。真是的 只是,eww。对?
问题
- 我们没有所有翻译字符串的列表。
- Drupal / PHP是一种动态语言,与C语言不同,后者是经过编译的。因此,我们无法举例:编译整个代码库,然后找到该函数的所有实例
t()
,然后在数据库中注册这些实例,然后一次翻译所有注册的实例t()
。我认为这不是我们餐桌上的选择。
- 静态代码分析工具由于爬虫无助的原因而将无助。我
t()
在此文件中找到了这个。大!它使用什么URL?上下文是什么?
使用当前的工具(Drupal和一些contrib模块)以及当前的约束条件(依靠实时主题调用->模板文件-> t()
调用)来解决问题,在这里看起来像是一条没有退出的通道。我们可能需要开箱即用。
我们需要的
- 我们需要一个数据源,一个模型,它可以告诉我我们当前拥有哪些翻译字符串,以及它们的上下文是什么-
- 主动数据模型。当前数据模型是反应性的(只要调用
t()
发生,该模型就会更新)。我们需要一种主动的数据模型-在这种模型中,应用程序会在t()
实例真正被客户执行之前负责寻找实例。
- 我们需要上下文。
t()
单靠它并不能解决问题-因为-我们不知道我们正在翻译'foo',但是我们要翻译的目标语言取决于t()
发生该错误的网址。即使我们可以t()
使用包装程序调用将目标语言硬编码到调用中,也无法满足您的目的。
我已经确定了一些工具-如果有的话-可以解决我们的问题。使用这些工具,我们可以进入数据模型并说:给我所有包装t()
好的尚未填充的字符串。现在插入这些翻译。谢谢。
下次客户来时,翻译就在那里。
我们将如何...构建这些工具?
约束条件
- 目标语言不能在模板上(由URL决定)。假设字符串必须支持任何语言。
- 转换后的字符串不能在模板上。翻译将保存在数据库中。
既然我已经对问题进行了更多的思考,并且确定了一些挑战和约束,那么我可以考虑研究现有的任何解决方案,或者制定任何定制的解决方案。
解决方案头脑风暴
我需要将“一切”联系在一起的东西。那实体呢?
- 实体可以保存需要翻译的产品。
- 实体可以提供需要翻译的产品与其上下文之间的关系(胶水)。
- 实体可以在字段中指定产品的默认URL位置。
- 令牌可用于指定产品将出现的替代位置(语言?)。
- 实体为我们提供了所需的主动数据模型及其上下文。反过来,这又使我们可以执行以下操作:进入数据库,获取所有产品实体,如果没有针对字段X,Y和Z的转换字符串,则创建这些转换字符串。
然后/pl/product/200
,当客户获取时,您将前往数据库,查找产品200,并获取已经存在的pl
翻译。您也有该产品的标题和标题字段吗?翻译也应该在那里。
请注意,关于您使用的翻译模块,我在这里非常含糊和通用。您很可能最终会使用自己的翻译模块-很有可能是这种情况。到目前为止,我在Drupal中看到的所有翻译模型(截至D7,尚未查看D8)都是被动的,不是主动的。
简而言之
从理论上讲,存在构建所需内容的工具,实体是将所有内容捆绑在一起的关键组件:-数据(翻译字符串),-目标语言。对于产品语言,不必一定是实体本身,最好是分类词汇。或其他实体的通用分类法。-上下文。实体出现的URL。该URL将包含一个令牌,该令牌又将引用目标语言分类法。
使用这三种成分,您可以说:抓取所有product
实体,前往 URL alias
字段,获取分类标记,循环所有可能的术语组合,使用非常大的丑陋形式(或AJAX)将所有组合呈现给当前用户,并多步骤表单(类似这样),并且当当前登录的用户翻译产品200的各种语言时,请将这些语言保存到数据库中的某个位置
数据库中的某个位置可能是实体中的Field API字段,属于每个实体的settings字段(不完全是Field API,但它仍然可以保存数据)或用于此目的的单独表。我认为将数据保存到Entity中可以使代码和数据更加整齐和容易。
构建它:可能的解决方案
- D8MI(Drupal 8多语言计划)
- 定制代码:t()通过以编程方式查询和呈现可用的包及其相关主题挂钩实现,从而使t()在模板中提供“索引”翻译。
伪码
Foreach实体(类型为x),
查找所有语言(与产品关联的分类法或核心语言),
渲染该实体,
-为了检测到它是t()翻译字符串
-渲染调用theme(),该主题处理以下语言的多语言表示层产品,而不是产品数据模型本身。
结果:
-首次调用每种语言的渲染实体模板将返回每次调用的默认语言实现。
-现在,模板上的t()参数已缓存在Drupal中,可以进行翻译了(对于每种语言实例,而不是每种产品实例)。
-具有“翻译”角色的用户现在可以转到翻译界面,并翻译每种语言的所有可用t()参数。
-网站所有者无需等待客户访问每个产品页面或手动访问每个产品页面,因为这是通过编程方式完成的。
公开问题:
-什么是背景?如果我对每个“产品”实体束都进行了对theme()的编程调用,它是否记录了进行调用的位置?它是否记录节点的URL?可以更改“上下文”吗?上下文记录在哪里?当您拥有“动态”模板时,即每种产品有多个模板时,会发生什么?如何检测这些变化?
与往常一样,理论化和伪代码仅适用于头脑风暴。但是在开发中,直到我们开始进行原型设计之前,我们几乎不知道我们真正要面对什么。因此,在草拟了两个约束,可能的解决方案以及可能的问题或疑问后,我现在可以继续实施概念证明或工作原型。上面的一些悬而未决的问题只能以这种方式回答,而我们最早的原型(无论成功或失败),我们都可以开始回答其中的一些问题-或完全改变方法。敬请期待〜
wget
或其他方式。骇人听闻的,但您确实说过是允许的(: