0

我的问题可能很简单。但我从来没有对 XML 感兴趣。所以这对我来说是无法理解的。有一个安装程序,它的语言文件是xml格式。土耳其语文件比其他语言非常窄。所以我想将“turkish.xml”导入“general.xml”。在“general.xml”文件中,如果有相同的节点,节点值将被改变。如果没有,请保持不变。例如,这是我的 turkish.xml 的内容。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <DICTIONARY type="singlelanguage" lang="tr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="dictionary.xsd">
      <STRING id="AI.Directory.DefaultDefaultDir" value="Yeni Klasör"/>
      <STRING id="AI.Directory.Default32BitName" value="Otuziki bit"/>
    </DICTIONARY>

在“general.xml”文件下方:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DICTIONARY type="singlelanguage" lang="neutral" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="dictionary.xsd">
  <STRING id="AI.Directory.DefaultDefaultDir" value="New Folder"/>
  <STRING id="AI.Directory.Default32BitName" value="32-bit"/>
  <STRING id="AI.DuplicateFile.DestName" value="Duplicate%s of %s"/>
  <STRING id="AI.Feature.DefaultTitle" value="Feature"/>
  </DICTIONARY>

如果我管理它,它将是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DICTIONARY type="singlelanguage" lang="neutral" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="dictionary.xsd">
  <STRING id="AI.Directory.DefaultDefaultDir" value="Yeni Klasör"/>
  <STRING id="AI.Directory.Default32BitName" value="Otuziki bit"/>
  <STRING id="AI.DuplicateFile.DestName" value="Duplicate%s of %s"/>
   <STRING id="AI.Feature.DefaultTitle" value="Feature"/>
  </DICTIONARY>

我不知道我将如何管理它。亲切的问候。

4

2 回答 2

2

您可以尝试将这两个文件加载到 DOMDocument 中,然后循环浏览通用文件。在循环内部,您可以查看是否有土耳其值并替换它。见http://www.php.net/manual/en/book.dom.php

我会试一试。我没有测试过这段代码,但希望你能设法修复它。应该是这样的。

编辑我没有在循环中使用 $result 值,现在试试

    <?php
    $turkish = new DOMDocument();
    $turkish->load('turkish.xml');

    $general = new DOMDocument();
    $general->load('general.xml');   

    $strings = $general->getElementsByTagName('STRING');
    $turkstrings = $turkish->getElementsByTagName('STRING');
    foreach($strings as $string) {
        foreach($turkstrings as $turk) {
            if($turk->getAttribute("id") == $string->getAttribute("id")) {
                $string->setAttribute("value", $turk->getAttribute("value"));
            }
        }
    }
    echo $general->saveXML();
    ?>
于 2013-04-15T18:58:56.450 回答
1

我不确定您要求的内容是否真的有用,因为该软件应该已经使用默认设置完成了不完整的翻译文件。

但在技术上肯定是可能的,例如通过土耳其 XML 并更改通用 XML 中的每个相应条目:

$new = simplexml_load_string($general);

$elements = simplexml_load_string($turkish)->STRING;

foreach ($elements as $element)
{
    $xpath = sprintf('//STRING[@id="%s"]', $element['id']);

    if (list($found) = $new->xpath($xpath))
    {
        $found['value']    = $element['value'];
        $found['imported'] = 'turkish';
    }
}

$new->asXML('php://output');

此示例使用PHP的SimpleXML。输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DICTIONARY xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" type="singlelanguage" lang="neutral" xsi:noNamespaceSchemaLocation="dictionary.xsd">
  <STRING id="AI.Directory.DefaultDefaultDir" value="Yeni Klasör" imported="turkish"/>
  <STRING id="AI.Directory.Default32BitName" value="Otuziki bit" imported="turkish"/>
  <STRING id="AI.DuplicateFile.DestName" value="Duplicate%s of %s"/>
  <STRING id="AI.Feature.DefaultTitle" value="Feature"/>
</DICTIONARY>

在行动中看到它。

于 2013-04-15T19:08:29.210 回答