2014-08-29 36 views
2

我正在建設一個PHP應用程序,我已經決定(遠程過程),以不同的語言提供。本地化一個HTML文檔(後視)

我的問題是這樣的:

我不想通過在模板文件中的所有HTML代碼涉水去尋找「字」我需要動態生成郎變量來代替。

是否有一個工具可以突出顯示HTML中使用的「單詞」,以使我的任務更輕鬆。

這樣,當我向下滾動HTML文檔時,我可以很容易地看到語言「詞」的位置。

通常情況下,當我創建一個應用程序,我想補充評論,因爲我的代碼,如下面

<label><!--lang-->Full Name</lable> 
<input type="submit" value="<!--lang-->Save Changes" name="submit"> 

,這樣,當我做,我可以通過運行,輕鬆地識別我需要添加動態位變量....不幸的是,我幾乎通過應用程序(HTML模板文件丟失),我沒有這樣做。

我使用一個模板引擎(tinybutstrong),所以我的HTML是很乾淨(即在它沒有PHP)

+0

我不知道有這樣做的一種方式!您可以使用查找並替換 – littleswany 2014-08-29 11:13:00

+1

@littleswany:XPath獲勝!獲得評論節點_is_可能,不確定屬性值中的註釋是否爲有效標記,儘管 – 2014-08-29 11:53:09

+0

@EliasVanOotegem,value屬性中的註釋是臨時的。我只用這些作爲標記。當我做實際的翻譯時,他們被刪除。 – fredmarks 2014-08-29 14:47:16

回答

0

你可以做到這一點,比較容易均勻,使用DOMDocument解析標記,DOMXPath來查詢所有的註釋節點,然後訪問每個節點的父,提取nodeValue,並列出了這些值「字符串翻譯」

$dom = new DOMDocument; 
$dom->load($file);//or loadHTML in case you're working with HTML strings 
$xpath = new DOMXPath($dom);//get XPath 
$comments = $xpath->query('//comment()');//get all comment nodes 
//this array will contain all to-translate texts 
$toTranslate = array(); 
foreach ($comments as $comment) 
{ 
    if (trim($comment->nodeValue) == 'lang') 
    {//trim, avoid spaces, use stristr !== false if you need case-insensitive matching 
     $parent = $comment->parentNode;//get parent node 
     $toTranslate[] = $parent->textContent;//get parent node's text content 
    } 
} 
var_dump($toTranslate); 

注意,這不能處理標記屬性使用的註釋。使用這個簡單的腳本,您將能夠提取那些需要在「常規」標記中翻譯的字符串。之後,您可以編寫一個腳本,查找標記屬性中的<!--lang--> ......我會看看是否還有使用XPath執行此操作的方法。但現在,這應該可以幫助你開始。

如果你還沒有評論,而不是<!--lang-->其他在您的標記,那麼你可以簡單地使用直接選擇那些註釋節點的父母的XPath表達式:

$commentsAndInput = $xpath->query('(//input|//option)[@value]|//comment()/..'); 
foreach ($commentsAndInput as $node) 
{ 
    if ($node->tagName !== 'input' && $node->tagName !== 'option') 
    {//get the textContent of the node 
     $toTranslate[] = $node->textContent; 
    } 
    else 
    {//get value attribute's value: 
     $toTranslate[] = $node->getAttributeNode('value')->value; 
    } 
} 

XPath表達式解釋說:

  • //:告訴xpath搜索與DOM中任意位置的其餘條件相匹配的節點
  • input:文字標籤名稱://input查找輸入標籤的DOM樹的任何地方
  • [@value]:所提到的標籤,只有當它有一個@value屬性
  • |匹配。//a|//input[@type="button"]匹配鏈接OR按鈕
  • //option[@value]:同上:與價值屬性選項相匹配
  • (//input|//option):組兩個表達式中,[@value]適用於所有的比賽在本次評選
  • //comment():在任何地方選擇意見dom
  • /..:選擇當前節點的父節點,因此//comment()/..與包含所選評論節點的父節點匹配。

保持在XPath表達式努力讓所有的內容,你需要翻譯

Proof of concept