问题描述
我正在使用 Preside,它有一些 .properties
扩展文件用于标记和翻译网络内容。
在我们的应用程序中,我们可以有多个 xxx.properties
和其他 xxx_yy.properties
,其中 xxx
是属性名称,yy
是语言翻译。没有 yy
的是默认语言。
以下是带有西班牙语和法语翻译文件以及标签 add_usser,edit_user,delete_user
的默认属性文件示例:
user.properties
add_user = Add website user
edit_user = Edit website user
delete_user = Delete website user
user_sp.properties
add_user = Agregar usuario web
edit_user = Editar usuario web
delete_user = Eliminar usuario web
user_fr.properties
add_user = Ajouter un utilisateur du site Web
edit_user = Modifier l utilisateur du site Web
delete_user = Supprimer l utilisateur du site Web
我需要做的是创建一个独立的 cfml 文件,该文件检索应用程序上的所有 .properties
文件,并将每个默认的 .properties 文件与其其他翻译文件进行比较,并显示比较文件的缺失标签,如果它们存在。
到目前为止,我能做的就是使用 directoryList 检索具有名称和路径的查询中的所有属性文件,并打印它们中的每一个。
propertiesFiles = directoryList("/application/i18n/",true,"query","*.properties","Directory","all");
<cfoutput query="propertiesFiles">
#propertiesFiles.name &" "& propertiesFiles.Directory#
</cfoutput>
有人可以告诉我如何执行循环逻辑并使用coldfusion将默认文件的标签与他的翻译进行比较吗?或者告诉我一个简单的方法来做到这一点?也许嵌入 javascript?
提前致谢
解决方法
循环函数是一种选择。有问题的文件看起来像一堆由 cairraige 返回分隔的行。然后,每一行看起来像一个由等号分隔的列表。
此外,还有一个在线用户定义函数库可供使用。它包含一个名为 ListCompare 的函数,可以应用于这种情况。
我的方法的第一步是编写一个名为 getLabels
的函数,该函数返回每个文件的标签列表。它会
- 读取文件。
- 创建一个名为
labels
的变量,其值为空字符串。 - 将结果变量视为 chr(10) 分隔列表。循环遍历此列表并在每次迭代中使用
ListFirst(delimiter = "=") to get each label,and append that to the
labels` 变量。 - 返回
labels
变量
下一步是使用此函数从文件 user.properties
中获取标签。将此变量称为 AllLabels
。
然后开始遍历由您的 directoryList
命令创建的查询。使用 getLabels
函数从每个文件中获取标签,使用 listCompare
函数识别缺失的标签。
将每个文件加载到一个结构中,以便知道所有名称值对。
因此,对于每个文件,循环遍历一个结构上的所有键,看看它们是否在第二个结构中丢失。
另外,考虑将所有这些数据加载到数据库中。 DB 更擅长处理数据集。