Dictionary – překladač

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
h4kuna
Backer | 740
+
0
-

Zdravim v jednom prispevku jsem cetl „konkurence neuskodi“ napsal jsem si vlastni prekladac textu.

  • staci pouze načíst tridu Nette\Object a rozhrani Nette\ITranslator at uz manualne nebo za pomoci autoloadingu
  • doporucuji po stazeni precist textak „readMe.txt“
  • lze vyuzivat s databazi nebo bez ni (k databazovemu uziti chybi GUI)
  • podporuje plural
  • vyuziva session z Nette
  • ke stažení
  • samotne spusteni je v Dictionary.php avsak to tu popisu
<?php
$lang=null;
if(isset($_GET['lang']))
{//zalezi na vas jak budete prijimat jazyk, zde je to naznacene pres GET
	$lang   =$_GET['lang'];
}
$language   =TranslationDB::loadDictionary($lang);//verze pro databazi
//$language   =Translation::loadDictionary($lang);//verze bez databaze

//v temp/lang se vytvori slovniky ktere dedi tridu TranslationDB
//pro verzi bez db si soubory musite vytvorit sami a dedit tridu Translation

//pokud si dobre vsimnete vzniknou metody a kazda vraci pole, podle nazvu metody si
//nactete slova ktera opravdu pouzijete a nemusite nacitat spousty neposdstatnych slov
$language   ->mergeWords('formular');
$language   ->mergeWords('title');
//je na vas jak si to sikovne rozdelite do skupin :)

//metoda ktera se nacita pokazde se jmenuje "globalWords" pro slova,
//ktera pouzijete vzdy napr pro preklad menu

//je potreba nastavit pro voleni v sablonach
$this->template->setTranslator($language);
?>

volani v sablone

<?php
<h1>{_'dog', 1} {_'dog', 2} {_'dog', 5}</h1>
?>
  • lze pouzit v prekladech %i, %s
  • (‚%i psů‘, 5) → vysledek 5 psů
  • vice php.net

mimo sablony

<?php
$language->translate('dog', 2);
?>

je potreba dat pozor na:

klic v poli se sestavuje dog1(jeden pes), dog2(dva psi), dog(vse ostatni) avsak v sablone se cislo u klice neudava jako je to v ukazce

Editoval matata (23. 8. 2009 20:42)

h4kuna
Backer | 740
+
0
-

ukázka

Editoval matata (28. 8. 2009 11:16)

ic
Člen | 430
+
0
-

No pěkná věc, akorát se pořád nějak nemůžu ztotožnit s předáváním identifikátoru jazyka pomocí session, myslím že řeč by bylo lepší předávat v url, takhle odeslané odkazy budou v defaultní řeči pokud odesílatel nebude odkaz odesílat prozřetelně i s pomocí ?lang=.... Nemluvě o problémech s prohlížeči které session z nějakého důvodu neuloží.

h4kuna
Backer | 740
+
0
-

ic napsal(a):

No pěkná věc, akorát se pořád nějak nemůžu ztotožnit s předáváním identifikátoru jazyka pomocí session, myslím že řeč by bylo lepší předávat v url, takhle odeslané odkazy budou v defaultní řeči pokud odesílatel nebude odkaz odesílat prozřetelně i s pomocí ?lang=.... Nemluvě o problémech s prohlížeči které session z nějakého důvodu neuloží.

lze jak pomoci session tak pomoci GET (url), kdyz neni vyplneny GET vyvola se zaznam ze session, to si volis co predas vznikajici instanci

kdyz budes mit v url /cz/…neco… tak si vytahnes hodnotu cz z url a predas ji do instance

Editoval matata (28. 8. 2009 12:07)

ic
Člen | 430
+
0
-

to jsem netušil… to jsou užitečné ‚nové‘ možnosti

EDIT: Jak nad tím přemýšlím to je vlastně jasné, řeč se přece přepíná přes GET tak to musí mít přednots

Editoval ic (28. 8. 2009 14:04)

h4kuna
Backer | 740
+
0
-

ic napsal(a):

to jsem netušil… to jsou užitečné ‚nové‘ možnosti

ok :)

johny
Člen | 12
+
0
-

Ahoj, jen ze zvědavosti, jaký výsledek vrátí pro počet 21 a pro 23?

h4kuna
Backer | 740
+
0
-

johny napsal(a):

Ahoj, jen ze zvědavosti, jaký výsledek vrátí pro počet 21 a pro 23?

21 psů

23 psů

ridi se to podle tehle metody

<?php
	public function czechDeclension($count)
	{
	    $count =abs($count);
	    switch ($count)
        {
            case 1:
                $count =1;
            break;

            case 2:
            case 3:
            case 4:
                $count =2;
            break;

            default:
                $count =null;
            break;
        }

        return $count;
	}
?>

jen jsem nevěděl jestli má být 2.5 psa nebo 2.5 psů???? kazdopadne to vrati psů :D

pro zmenu kdyz tam dosadim cloveka tak mi lip sedi 2.5 lidí nez 2.5 lidi

Editoval matata (28. 8. 2009 19:29)

Tomik
Nette Evangelist | 485
+
0
-

matata napsal(a):

pro zmenu kdyz tam dosadim cloveka tak mi lip sedi 2.5 lidí nez 2.5 lidi

Nechci šťourat, ale když už nemělo by tam být 2.5 člověka? :)

h4kuna
Backer | 740
+
0
-

Tomik napsal(a):

matata napsal(a):

pro zmenu kdyz tam dosadim cloveka tak mi lip sedi 2.5 lidí nez 2.5 lidi

Nechci šťourat, ale když už nemělo by tam být 2.5 člověka? :)

Klidne stourej ja fakt nevim… ikdyz clovek je jen jeden, to by chtelo cestinare…

Kazdopadne co si mas presdstavit pod obojim??? :D

Chtelo by to dosati podstatny jmeno, ktery jde rozdelit na desetiny.

Editoval matata (30. 8. 2009 0:06)

h4kuna
Backer | 740
+
0
-

Tomik napsal(a):
Nechci šťourat, ale když už nemělo by tam být 2.5 člověka? :)

Nasel jsem specifikaci jak se sklonuje ve vsech statech, podle toho co tam pisou by to bylo 2.5 lidí budu se drzet tohoto ovsem vyjimky muzou byt :)

Husty to maj Arabove

Editoval matata (30. 8. 2009 13:12)

kravčo
Člen | 721
+
0
-

Mne pripadá správne to, čo písal Tomik, hlavne z dôvodu, ako sa čítajú desatinné čísla:

2,5 = dve celé a päť desatín

No a keď k tomu prihodíme podstatné meno, mohlo by to byť:

2,5 hrušky = dve celé a päť desatín hrušky

Toľko som objavil sedliackym rozumom :)

Tomik
Nette Evangelist | 485
+
0
-

matata napsal(a):

Nasel jsem specifikaci jak se sklonuje ve vsech statech, podle toho co tam pisou by to bylo 2.5 lidí budu se drzet tohoto ovsem vyjimky muzou byt :)

No, to nepovažuju za zákonodárný… :) Přeci jen český/slovenský jazyk je natolik komplexní, že si jen těžko představit, že by nějaký anglický standard mohl určit co je, a co není dobře. Ale našel jsem toto: http://www.ujc.cas.cz/…ni/index.php?… … hledejte dotaz týdne 22/2008 – desetinná čísla, je tam řečeno, že není přímo stanoveno, co je nutné použít, zda 2,5 kilometru, nebo 2,5 kilometrů, z toho, co se tam píše, jsem pochopil, že u menších číslovek je asi přirozenější používat jednotné číslo, u větších to množné, ale je možné používat obojí v obou případech. Bude tedy asi z hlediska „výpočetní síly“ lepší používat množné číslo… :)

Ale stejně jako kravčo bych selským rozumem řekl 2,5 hrušky. :)

Jakub Šulák
Člen | 222
+
0
-

Podle definice Příručky ÚJČ AV, je to následovně:

Shoda počítaného předmětu po desetinných číslech se v odborných textech řídí podle desetin, setin atd. Tvar počítaného předmětu je proto ve 2. p. j. č.: 1,1 metru, 1,2 metru, do 1,2 metru, skočit 1,3 metru, 2,4 litru, do 3,5 tuny, 10,548 milionu, 14,25 sekundy (čteme: jedna celá dvě desetiny metru, do dvou celých dvou desetin metru…).

V neodborných či stylově nižších textech se často objevuje počítaný předmět po desetinných číslech i ve tvaru 2. p. mn. č. nebo se zde uplatňuje pádová shoda podle číslovky nacházející se za desetinnou čárkou. Tento způsob lze zvláště v mluveném projevu tolerovat: 1,1 metrů/metr, 1,2 metrů/metry, do 1,2 metrů, skočit 1,2 metrů/metry, 2,4 litrů/litry, do 3,5 tun, 10,548 milionů, 14,25 sekund atd.

Takže i toto je určitým směrem kodifikováno.

h4kuna
Backer | 740
+
0
-

Tomik napsal(a):
Bude tedy asi z hlediska „výpočetní síly“ lepší používat množné číslo… :)

Jakub Šulák
Takže i toto je určitým směrem kodifikováno.
Tento způsob lze zvláště v mluveném projevu tolerovat: 1,1 metrů/metr, 1,2 metrů/metry, do 1,2 metrů, skočit 1,2 metrů/metry, 2,4 litrů/litry, do 3,5 tun, 10,548 milionů, 14,25 sekund atd.

Me prave prislo ze jsem slysel i to i to 2,4 litrů/litry

<?php
    /**
     * urci slovo pro ceske/slovenske sklonovani
     * @param float $count
     * @return int
     */
    public static function czechDeclension($count)
    {
        /*
        switch ($count)
        {
            case 1:
                $count =1;
            break;

            case 2:
            case 3:
            case 4:
                $count =2;
            break;

            default:
                $count =null;
            break;
        }*/

        $copy   =(int)$count;
        if( (int)$count == $count)
        {
            $last   =substr($count, -1);
            switch($last)
            {
                case 1:
                    $count =1;
                break;

                case 2:
                case 3:
                case 4:
                    $count =2;
                break;

                default:
                    $count =3;
                break;
            }
        }
        else
        {
            $count  =null;
        }

        return $count;
    }
?>

Je potreba si vybrat jednu variantu a tu dodzovat.

ic
Člen | 430
+
0
-

Tak tímto bude obstojeně zvládnutý plurál v češtině a možná i slovenštině… vzhledem k tomu jak nejasné je to v naší mateřštině mnohem složitější to bude v ostatních jazycích… nebo je třeba angličtina skutečně tak jednoduchá jak se tváří? žádné vyjímky?

h4kuna
Backer | 740
+
0
-

ic napsal(a):

Tak tímto bude obstojeně zvládnutý plurál v češtině a možná i slovenštině… vzhledem k tomu jak nejasné je to v naší mateřštině mnohem složitější to bude v ostatních jazycích… nebo je třeba angličtina skutečně tak jednoduchá jak se tváří? žádné vyjímky?

V tuto chvili delam novou verzi pro prekladani a metody na sklonovani budou volany jako callback, v teto stavajici verzi to neni jeste implementovane, ale je to uz vyresene :) Takze co jazyk to moznost nastavit sklonovani.

vyvojova verze ke staženi

Editoval matata (31. 8. 2009 11:09)