Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_Translate i Baza Danych

Witam serdecznie,

od paru dni zmagam się z pewnym problemem związanym z Zend_Translate, Bazą Danych i Zend_View. Mianowicie - chciałbym stworzyć tłumaczenia oparte o Zend_Translate i bazę danych (tu nie ma nic trudnego), problem mój polega na tym iż chciałbym przed wyrenderowaniem widoku pobrać z niego wszystkie klucze, które są osadzone w helperze $this->translate(), na ich podstawie wyciągnąć tłumaczenia i dopiero wyrenderować widok z już przetłumaczonymi tekstami.

Moje pytanko brzmi: czy jest coś takiego osiągalne w Zend_View?
Dodam iż w smartym zrealizowanie tego jest możliwe, nie wiem natomiast jak ugryźć Zend_View.

Ma ktoś pomysły?
Pozdrawiam
Piotr Rybałtowski

Piotr Rybałtowski Programista PHP,
Symfony, Zend
Expressive, Node.js

Temat: Zend_Translate i Baza Danych

Te tłumaczenia mają być wyciągnięte do jakiegoś arraya i po wyrenderowaniu mają być osobno dostępne, czy jaki jest cel tego zabiegu? Od celu może zależeć rozwiązanie. :)
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_Translate i Baza Danych

może być do array'a lub obiektu - bez różnicy - cały zabieg miałby działać na zasadzie:
1. wchodzę na stronę /controller/action gdzie w widoku użyty jest wielokrotnie view helper translate np.
$this->translate('translate_title');
$this->translate('translate_content');
itp.

2. jakiś pluginik - rozszerzenie view helpera translate znajduje mi wszystkie tlumaczenia na danej stronie
3. przeszukuje baze pod katem tych kluczy - w tym wypadku: translate_title i translate_content
4. znalezione translacje podmienia na tlumaczenia.

Tak to by z grubsza mialo dzialać.

konto usunięte

Temat: Zend_Translate i Baza Danych

A nie prościej będzie napisać własny adapter oparty o bazę danych - http://framework.zend.com/manual/en/zend.translate.ada...? Jeśli martwisz się o wydajność takiego rozwiązania, zawsze możesz wykorzystać cache, którego obsługa jest budowana w Zend_Translate.Maciej Wilgucki edytował(a) ten post dnia 18.05.11 o godzinie 19:48
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_Translate i Baza Danych

rozwiazanie ciekawe, nie menij jednak pozostaje problem pobrania wszystkich translacji kluczy z danego widoku. Jeśli będę to potrafił to prawdopodobnie skorzystam z twojego rozwiazania.

konto usunięte

Temat: Zend_Translate i Baza Danych

Problem pobrania wszystkich tłumaczeń możesz rozwiązać tworząc własny helper widoku, dziedziczący po zendowym translate. Możesz dodać w nim statyczną właściwość zbierającą wszystkie tłumaczenia, które wyciągniesz korzystając ze statycznej metody. Metodę tę wywołasz w pluginie w metodzie dispatchLoopShutdown.

Pisane na szybkiego bez głębszego zastanowienia, ale na pierwszy rzut oka powinno działać ;)
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_Translate i Baza Danych

Rozumiem że chodzi o to aby wyciągnąć już nie helper translate ale mój własny - problem pojawia się wtedy przy formularzach - domyślnie wszystkie formularze działaja z zend translate() więc wolałbym nie tworzyć nowego helpera. Jakiś pomysł na to ? Piotr Krajewski edytował(a) ten post dnia 21.05.11 o godzinie 08:41

konto usunięte

Temat: Zend_Translate i Baza Danych

Zend_Form posiada metodę setTranslator, do której możesz przekazać własny adapter.

edit
Poza tym jeśli dodasz do rejestru pod kluczem Zend_Translate własny adapter, będzie od domyślnie wykorzystywany.Maciej Wilgucki edytował(a) ten post dnia 21.05.11 o godzinie 13:19
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_Translate i Baza Danych


Zend_Form posiada metodę setTranslator, do której możesz przekazać własny adapter.


oo tego nie wiedziałem :) no to jest jakiś punkt zaczepienia. W razie czego będę pisał :)

Pozdrawiam
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_Translate i Baza Danych

okej, jakieś pierwsze kroki uczyniłem w kierunku zrealizowania mojego pomysłu i wygląda mniej więcej to tak:

Nowy view helper:

class Zend_View_Helper_Translator extends Zend_View_Helper_Translate{
protected static $_translateIds = array();
public function translator($translateId){
array_push(self::$_translateIds, $translateId);
return $this->translate($translateId);
}

public static function getTranslateIds(){
return self::$_translateIds;
}
}


Plugin:

class Core_Controller_Plugin_Translate extends Zend_Controller_Plugin_Abstract{
private $_translate = null;

public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$options = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getApplication()->getOptions();
$options = $options['resources'];
$locale = new Zend_Locale(isset($_COOKIE['lang']) ? $_COOKIE['lang'] : $options['locale']['default']);
$this->_translate = new Zend_Translate(array('adapter' => 'array', 'locale' => $locale));

if ($this->_translate->isAvailable($locale)){
$this->_translate->setLocale($locale);
}

Zend_Registry::set('Zend_Translate', $this->_translate);
Zend_Registry::set('Zend_Locale', $locale);
Zend_Registry::set('Zend_Currency', new Zend_Currency($locale));
}


public function dispatchLoopShutdown(){
$translationIds = Zend_View_Helper_Translator::getTranslateIds();
if (!empty($translationIds)){
$translate = new Model_Translation();
$translations = $translate->findAllByNames($translationIds);
$this->_translate->addTranslation($translations, 'pl_PL');
Zend_Registry::set('Zend_Translate', $this->_translate);
}
}
}


Widok:

<?php echo $this->translator('tmp1'); ?>
<?php echo $this->translator('tmp2'); ?>
<?php echo $this->translator('tmp3'); ?>


I teraz tak, z widoku wyciągam wszystkie klucze - to jest okej, następnie w bazie odnajduje tłumaczenia i daje do Zend_Translate. Natomiast nie wiem jak zwrócić spowrotem do widoku prztłumaczony tekst.

Masz może na to pomysł ?

konto usunięte

Temat: Zend_Translate i Baza Danych

Dobre pytanie. Spróbuj pokombinować z pluginem ViewRenderer. Na chwilę obecną nic innego mi do głowy nie przychodzi.

konto usunięte

Temat: Zend_Translate i Baza Danych

Rozwiązanie, o które Ci chodzi jest zrealizowane (i w dodatku świetnie działa) w pimcore (http://pimcore.org). Jeśli zechce Ci się poszukać w kodzie, jak to rozwiązali to znajdziesz odpowiedź - mi się nie chciało, skoro działa i nie trzeba nic zmieniać :P

Następna dyskusja:

Flex i Zend_Framework wymia...




Wyślij zaproszenie do