2015-11-05 62 views
7

我在構建網站時多次遇到此問題。 我會解釋一下使用PHP和Laravel作爲例子,但這個問題是一個常見的多平臺。 這已經解決了幾個問題(post1,post2,post3,post4和其他一些),但帖子並沒有真正得到一個很好的答案。構建網站翻譯文件

現在的問題是:在語言文件中構建翻譯內容的最佳方式是什麼?

我目前使用Laravel(我不是提版本,因爲這兩個Laravel 4Laravel 5有類似的定位功能,至少是相似的足以讓這個話題的效果影響不大)。

本地化結構的內容跨越語言文件(en,es,de,fr ...),其中可能有多個.php文件包含返回多級字典結構的返回語句。

/lang 
    /en 
     messages.php 
    /es 
     messages.php 

和文件包含的東西是這樣的:

//Laravel 5  
trans('messages.example1'); //outputs 'example message for value exaple-key' 
trans('messages.example2.sub-example'); //outputs 'example message for example1.sub.example' 

//Laravel 4 
Lang::get('messages.example1'); //outputs 'example message for value exaple-key' 
Lang::get('messages.example2.sub-example'); //outputs 'example message for example1.sub.example' 

的分組浮現在腦海中的幾種方法:

<?php  
return [ 

    'example1' => 'example message for value exaple-key', 
    'example2' => [ 
     'sub-example' => 'example message for example1.sub.example', 
    ],  
]; 

並在此呼叫是通過做這樣的事情做:

  1. 通過網站內容

    例如:homepage.php, page1.php, page2.php...

  2. 通過邏輯域:

    例如:auth.php, validation.php, pagination.php...

  3. 通過HTML:

    例如:buttons.php, popup_messages.php, form_data.php...

  4. 例如:simple_words.php, phrases.php...,比包含前

所有這些都有一些明顯的優點和缺點,我喜歡'password-to-short' => 'your password is to long'

  • 提到的那些的一些混合/組合的內容通過直接翻譯中將不會嘗試去int,但5th選項最有可能是最好的解決方案,但仍然存在着在哪裏畫線以獲得最小重複的短語和內容的問題。

    另一個問題是如何解決在某些情況下大寫第一個字符和其他情況下小寫以及末尾標點符號的問題。

    我對此問題做了研究,但沒有明確的指導方針和/或可用的示例。

    歡迎您提出意見。

  • +0

    您是否認爲您提到的問題沒有提供明確答案,可能是因爲沒有包含項目中所有可能用例的權威解決方案?你已經列出了5種可能的解決方案,所有這些解決方案都是可行的。所以只要選擇一個最適合你的項目。至於你的問題的第二部分,它可以像使用['ucfirst'](http://php.net/manual/en/function.ucfirst.php)或['lcfirst'](http:/ /php.net/manual/en/function.lcfirst.php),如果需要,或者需要複雜的話,因爲再次沒有通用的解決方案。 – Bogdan

    +1

    我知道沒有確定的解決方案。儘管如此,即使如此,對於更復雜的用例,也應該存在一些指導方針和示例,或者至少應該有一個普遍認同的做法。 – Traveller

    +0

    這正是我所強調的,沒有「普遍認同的做事方式」_。這裏的地面工作由[Laravel的本地化](http://laravel.com/docs/5.1/localization)提供,就結構而言,這取決於您,以及最適合您項目的東西。因爲不同的應用程序有不同的內容,建議一個適合所有人的通用結構非常困難,並且通常你只會得到每個人的意見,這是[off-topic](http://stackoverflow.com/help/on-主題)在這裏堆棧溢出。 – Bogdan

    回答

    0

    根據我的經驗,除了試圖在其他地方使用您的翻譯外,沒有理由擁有不同的團體。我通常把我所有的項目信息放在一個名爲app的組中,對於我的每個共享庫我使用一個單獨的組名(因爲我可能在其他項目中使用它們)。 在我的網站AA失敗的登錄信息的一個例子是

    trans('app.username_and_password_do_not_match') 
    

    ,如果它在一個名爲驗證第三方庫這將是

    trans('auth.username_and_password_do_not_match') 
    

    記住寫完整的郵件爲您的信息而不是使用短名稱(如app.login.fail)。這樣你就不需要檢查每個翻譯的網站內容。

    我沒有完全理解你最後的問題,所以你可能想澄清一點。

    +0

    這很好,短文本,簡單的句子和短語。如何處理長內容。如何使它可重用,以及如何在不查看lang文件的情況下找到某些東西。你建議的方式工作得很好,直到你通過幾百個代理。 – Traveller

    +0

    @Traveller很長的內容不是由程序員寫的!給他們的網站管理員。讓他們把它放在他們的面板上。您不需要在翻譯字符串中設置長的HTML內容。 –

    +0

    @Traveller只要您生成不會成爲問題的翻譯文件。翻譯發生器處理所有事情。 –

    0

    我將與第4個選項去,所以你有這樣的事情:

    /lang/ 
        /en 
         messages.php 
         words.php 
        /fr 
         message.php 
         words.php 
        /de 
         messages.php 
         words.php 
    

    這做了幾件事情:

    • 它細分了一切非常清楚。你知道在哪裏找到哪種語言。你知道與該語言相關的文件中有什麼。
    • 以上內容使得維護工作更加輕鬆,因爲您可以找到相關內容。
    • 它爲您提供可通過語言單獨翻譯的文件。
    • 它把所有的信息放在一個明確定義的地方。

    需要注意的一件事是,如果您的應用程序真的很大且真的是國際化的,您可能需要使用ISO語言代碼。例如,歐洲葡萄牙語(pt_PT)和巴西葡萄牙葡萄酒是不同的,並且全球觀衆可能都想要覆蓋這兩者。

    +0

    是的,但這不是問題。 lang的結構方式是,語言位於具有相同子結構的單獨文件夾中,並且默認情況下完成。問題是:如何在特定語言(en,fr,de)內部構造東西? #4選項的問題是有兩個巨大的文件可以在長時間(或大型應用程序)中搜索不到。 – Traveller

    1

    我傾向於將我的Laravel應用程序中的功能組合爲自包含的「組件」。例如,我最近一直在爲應用程序開發電子郵件營銷活動功能,因此將服務提供商類,模型和服務類放在文件夾中的應用程序/電子郵件

    記住這一點,我以類似的方式組織我的翻譯。所以即使在這個項目中,我們也沒有翻譯字符串,如果是的話,我會創建一個resources/assets/lang/en/email.php文件,並將翻譯的字符串放在那裏。

    因此,在另一個項目中,我的目錄結構可能是這樣的:

    • /資源
      • /郎
        • /EN
          • auth.php
          • email.php
          • events.php
          • news.php
          • pagination.php
          • passwords.php
          • validation.php

    希望這會有所幫助。

    +0

    這是一個很好的結構,我在lang包中看到過類似的東西,但是如何解決重疊內容的問題?這是兩個區域共有的東西。另一個問題是,如果您必須針對不同的上下文環境具有相似但不同的內容(例如:管理視圖,註冊用戶視圖,訪問者視圖)。 – Traveller

    +0

    重疊內容:通用** messages.php **文件。不同的上下文並不重要,字符串'找不到結果'會將其轉換爲另一種語言,無論它在管理控制檯還是用戶帳戶中。 –

    +0

    ** messages.php ** - >會不會那個文件真的是一團糟?在我看來,** messages.php **最終會產生重要且常用的內容,但會在內部找到一些內容。關於管理員/用戶視圖的 – Traveller