2013-04-05 40 views
7

Trong Symfony/Twig, tôi có thể sử dụng thẻ bằng cách sử dụng tỷ lệ phần trăm trong khối dịch của tôi. Ví dụ:Sử dụng trình giữ chỗ trong bản dịch bằng cách sử dụng thẻ

Hello {{nickname}} 

sẽ trở thành

{% trans %}Hello %nickname%{% endtrans %} 

này hoạt động như mong đợi. Mảng có phần giữ chỗ mà tôi chuyển đến Twig, được tự động ánh xạ tới% placeHolder%. Không có thêm công việc liên quan. Vì vậy, đây làm việc với mảng PHP của tôi từ bộ điều khiển con người:

Array('nickname' => 'rolandow') 

Khi tôi muốn sử dụng các nickname bên trong khối dịch, tất cả tôi phải làm là bao quanh nó với tỷ lệ%. Thật không may, điều này dường như không hoạt động khi tôi chuyển nó đến trans.

Bây giờ tôi muốn dịch toàn bộ khối văn bản, sử dụng thẻ. Tôi không thể tìm ra cách tôi có thể sử dụng các thẻ trong bản dịch của mình. Vì vậy, cành lá của tôi sẽ giống như thế này:

{{ say.hello|trans }} 

Và bản dịch của tôi đoạn mã

<trans-unit id="1"> 
    <source>say.hello</source> 
    <target>Hello %nickName%, how are you doing today? lots-of-text-here</target> 
</trans-unit> 

tôi nhận nó làm việc bằng cách sử dụng này trong mẫu của tôi, nhưng nó cảm thấy như làm việc hai lần. Bây giờ tôi cần đặt mảng giữ chỗ vào hàm trans một lần nữa. Ví dụ:

{{ say.hello|trans('%nickName%' : nickName) }} 

Nếu tôi muốn sử dụng thẻ khác được trao cho cành trong bộ điều khiển của tôi, tôi cần phải vượt qua chúng để người dịch là tốt. Tôi không thể vượt qua mảng hoàn chỉnh bằng cách nào đó?

+0

Bạn có thực sự xây dựng một mảng như '$ tags = array ('% nickname%' => 'luke') 'trong bộ điều khiển của bạn? Nếu bạn chỉ có thể thực hiện '{{say.hello | trans (tags)}}' – Luke

+0

Hoặc khai báo biến 'tags' bằng từ khóa' set'. – eagleoneraptor

+0

@Luke, không có mảng nào giống như mảng ('nickname' => 'luke'). Đó thực sự là quan điểm của tôi, nó cảm thấy như mã hóa dư thừa để chạy qua mảng và thêm tỷ lệ phần trăm. Tôi đã hy vọng có một cách tốt hơn để làm điều này. Tôi nhận ra bây giờ mà làm điều này trong bộ điều khiển là một nơi tốt hơn nhiều so với trong mẫu mặc dù. – rolandow

Trả lời

1

Có một số câu hỏi ở đây để chúng ta hãy đề cập đến chúng.

1) Hành vi của Twig không giống như truy vấn Doctrine, trong đó mỗi tham số phải được bao bọc. Bạn có thể truyền một mảng chứa tham số không được sử dụng đến trans, vì vậy nếu bạn không muốn chỉ định {'key': 'value', 'key2': 'value2'...} cho bộ lọc, chỉ cần chuyển toàn bộ mảng (ví dụ: | trans(array)). Đó là điểm @Luke.

2) Bạn có thể dịch khối văn bản bằng nhiều cách, đơn giản nhất là {% set %}. Thẻ {% set %} thể được sử dụng theo hai cách:

  • {% set var = expression %} hoặc {% set var1, var2 = expression1, expression2 %} là cách gọi nhất và đã qua sử dụng: bạn chỉ cần đặt một số giá trị bên trong một hoặc nhiều biến.

  • {% set var %} khối văn bản {% endset %} cho phép bạn đặt toàn bộ khối văn bản bên trong biến đó. Điều này hữu ích nếu bạn muốn đặt khối đó vào bộ lọc (chẳng hạn như escape hoặc trong trường hợp của bạn là trans).

Vì vậy, để dịch một khối văn bản, bạn sẽ làm điều gì đó như:

{% set variable %} 
block to translate %placeholder% 
{% endset %} 
{{ variable | trans(array) }} 

Dù sao, tôi không thấy bất kỳ lợi ích của dịch toàn bộ một khối trong một thời gian: chúng tôi sử dụng | trans nói chung sau một thuộc tính (chẳng hạn như say.hello) và tôi không thể tưởng tượng tệp dịch xlf/yml của bạn có thiết kế như vậy. Nếu bạn muốn sử dụng dịch giả chỉ để thực hiện các trình giữ chỗ, chỉ cần sử dụng Twig như được viết cho công việc đó :-)

3) Giới thiệu thay thế placeholder bởi %placeholder% trong các phím của tham số của bạn: điểm của Twig là: bạn muốn giữ chỗ. Theo cách như vậy, nếu câu được dịch của bạn chứa nhiều số %, bạn có thể sử dụng $something$, #something# hoặc thậm chí something làm trình giữ chỗ.

Nếu các khóa mảng của bạn không chứa các số %, bạn cần thêm chúng, bạn không có bất kỳ lựa chọn nào. Nếu bạn thực sự muốn làm điều đó trên một tệp Twig, bạn có thể tạo macro sẽ thực hiện công việc cho bạn và đặt nó vào tệp bạn nhập trong bố cục cơ sở của mình.

Cái gì như:

{% macro trans_pct(property, params) %} 
    {% set newParams = [] } 
    {% if params %} 
    {% for key, value in params %} 
     {% set newParams['%' ~ key ~ '%'] = value %} 
    {% endfor %} 
    {% endif %} 
    {{ property | trans(newParams) }} 
{% endmacro %} 

Và sau đó sử dụng nó với {{ _self.trans_pct('hello.say', array) | trim }}.

Ghi chú:

  • _self là mẫu nơi được lưu trữ vĩ mô (xem documentation để biết thêm chi tiết).

  • trim được sử dụng vì tôi đã viết macro với thụt đầu dòng và ngắt dòng (dễ đọc hơn). Theo mặc định, các khoảng trắng đó được in.

+0

Cảm ơn bạn đã trả lời toàn diện. Lợi ích của việc dịch toàn bộ khối có thể là với tuyên bố từ chối trách nhiệm, thông báo trợ giúp hoặc chân trang email. Bởi vì ngữ pháp cũng thay đổi, nó sẽ yêu cầu một khối dịch được dịch toàn bộ. Quan điểm của tôi là khi bạn mô tả ở 3: tôi không có% trong mảng của mình. Khi sử dụng {% trans%} tôi không cần phải thêm chúng, vì vậy tôi đã hy vọng tôi có thể sử dụng Twig theo cách tương tự khi truyền với | trans. – rolandow

1

{{say.hello | xuyên ('% nickname%': 'rolandow')}}

Các vấn đề liên quan