2013-05-31 12 views
5

Symfony2'de dize gösterimlerini ve sayısal kodların çevirilerini işlemenin en iyi yolu nedir? Ön uç ve sayısal kodlar ancak dizeleri göstermek istemiyorum SonataAdmin arka uçSymfony2 ve SonataAdmin içindeki sayısal durum kodlarını çevirmeAdmin

<?php 

class Message 
{ 
    const STATUS_NEW  = 0; 
    const STATUS_SENT  = 1; 
    const STATUS_DELIVERED = 2; 

    /** 
    * @var int 
    */ 
    private $status = self::STATUS_NEW; 

    public function getStatus() 
    { 
     return $this->status; 
    } 
} 

: Varsayalım

Böyle bir varlık var. E.g 'Yeni', 'Gönderildi' ve 'İletildi'. Ama ben de bu dizeleri (örneğin Hollandaca 'Nieuw', 'Verzonden' ve 'Afgeleverd') tercüme edebilmek istiyorum.

İki dönüşüm adımı vardır: önce sayısal koddan bir dizeye veya çeviri anahtarına ve sonra yerelleştirilmiş dizeye.

Bu dönüşümleri en iyi nerede ve nasıl yapabilirim? Her iki ön uç da kendi denetleyicilerim/görünümlerimde ve SonataAdmin tabanlı olarak destekleniyor mu?

+0

Kodunuzda bu dizeleri ('Yeni', 'Gönderildi' ve 'İletildi') zaten tanımladınız mı? Veya bir veritabanında mı? – cheesemacfly

+0

Hayır, henüz değil. Bunları koymak için en iyi yeri arıyorum. Bence çeviriler anlamaya en kolay olacak. Ama bu sayısal kodlardan dizelere gitmek için en iyi yer hangisidir? –

+1

Çeviri bölümünün kolay olanı size katılıyorum. Yaptığım şey, bu anahtar/değer çiftlerini, veritabanına doktrin fikstür paketi ile yüklediğim ve daha sonra DoctrineExtension paketinden Translatable uzantısını kullanarak çevirdiğim bir yapılandırma dosyasına koyar. Ama kesinlikle iyi bir çözüm olup olmadığından emin değilsiniz ... – cheesemacfly

cevap

6

olsam, ben

public function getStatusString() { 
    return 'message.status.'.$this->status; 
} 

Ve sonra benim Sınıf Mesaja bir yöntemi eklemek böyle çeviri dosyasında idare ediyorum:

message.en.xlf

<?xml version="1.0"?> 
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> 
    <file source-language="en" datatype="plaintext" original="file.ext"> 
     <body> 
      <trans-unit id="1"> 
       <source>message.status.0</source> 
       <target>New</target> 
      </trans-unit> 
      <trans-unit id="2"> 
       <source>message.status.1</source> 
       <target>Sent</target> 
      </trans-unit> 
      <trans-unit id="3"> 
       <source>message.status.2</source> 
       <target>Delivered</target> 
      </trans-unit> 
     </body> 
    </file> 
</xliff> 
+3

Bu iyi bir fikir: D – Rocco

0
YoH'un cevabı bu problem için güzel bir çözümdür.

Ancak durum kodlarımı uygularken, varlık sınıfımın hemen altında ileti ve durum kodlarını bulundurmayı seviyorum.

Bu nedenle, çözümümün YoH'ın çözümü kadar iyi olmayan bir çözümü göstermedim çünkü uluslararasılaşmadan yoksun ama benim için iyi çalışıyor.

->add('status', 'choice', array(
        'label' => "current Status", 
        'help' => "What's that status of the message ?", 
        'choices' => Message::getStatusCodes() 
       ) 
      ) 

Ve listede değerini göstermek isterseniz daha sonra configureListFields() değiştirin::

class Message 
{ 
    ... 
    const STATUS_NEW  = 0; 
    const STATUS_SENT  = 1; 
    const STATUS_DELIVERED = 2; 

    ... 
    public static $statusCodes = array(
     Message::STATUS_NEW => "New", 
     Message::STATUS_SENT => "Sent", 
     Message::STATUS_DELIVERED => "Delivered" 
    ); 

    public static function getStatusCodes() 
    { 
     return self::$statusCodes; 
    } 

    public function getReadableStatus() 
    { 
     if (!is_null($this->getStatus())) { 
      return self::$statusCodes[$this->getStatus()]; 
     } else { 
      return null; 
     } 
    } 
} 

Ve Mesaj için Sonat Yönetici Sınıf için) (configureFormFields alanına değiştirmek içinde

->add('status', 'string', array('template' => 'YourBundleName:Admin:message_list_status_field.html.twig')) 

Ve adı 'message_list_status_field.html.twig' bir dal oluşturun:

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %} 
{% block field %} 
    <div> 
     {{ object.readableStatus }} 
    </div> 
{% endblock %}